11

CI/CD로 커밋 기록하기

루프를 닫는 단계 — 코드가 머지되면 그 커밋이 건드린 노드 위로 다시 기록됩니다. 수동 정리는 없습니다.

Umtri는 job을 돌리거나 코드를 짜지 않습니다. 작은 CI 단계가 커밋 sha와 변경된 files 목록을 서버에 넘기면, 서버가 그 파일들을 각 노드의 metadata.implements와 매칭해서 해당 노드의 metadata.commits에 커밋을 누적합니다. 결과적으로 모든 노드가 자신을 만든 실제 커밋을 보여주는 트리가 됩니다.

매칭 방식

에이전트가 plan 노드를 실현할 때 작성한 파일을 metadata.implements에 기록합니다(umtri://rules/plan 참고). record_commit은 커밋의 변경 파일을 그 implements 항목과 비교해서, 노드의 파일 중 하나가 커밋에 들어 있으면 그 노드에 커밋을 기록합니다. 매칭되는 파일이 없는 노드는 건드리지 않으므로, 무관한 커밋이 트리를 오염시키지 않습니다.

GitHub Actions

저장소에 바로 쓸 수 있는 워크플로가 .github/workflows/umtri-record-commit.yml로 포함되어 있습니다. main에 push될 때마다 push 범위의 변경 파일을 계산해서 record-commit 엔드포인트로 POST합니다. 저장소 Settings에 다음 두 가지를 설정하기 전까지는 조용히 skip합니다:

설정종류
UMTRI_PATSecretwrite 스코프 Umtri PAT (Bearer 토큰으로 사용).
UMTRI_GROUND_SLUGVariable이 저장소에 대응하는 ground slug (예: umtri).

Settings → Secrets and variables → Actions에서 추가한 뒤 main에 push하면 됩니다.

이 단계는 git diff --name-only BEFORE..SHA(새 브랜치면 단일 커밋으로 폴백)로 파일 목록을 구해 JSON으로 만들어 POST합니다. 변경 파일이 없거나 secret/var가 없으면 API를 호출하지 않고 exit 0으로 끝납니다.

다른 CI에서

워크플로는 HTTP 호출 한 번을 감싼 얇은 래퍼일 뿐입니다. curl을 돌릴 수 있는 어떤 파이프라인에서든 동일하게 하면 됩니다:

curl -sS -X POST \
  "https://api.umtri.io/api/projects/<slug>/record-commit" \
  -H "Authorization: Bearer $UMTRI_PAT" \
  -H "Content-Type: application/json" \
  -d '{
    "sha": "9f2c1ab",
    "message": "feat(payments): add refund flow",
    "files": ["server/routes/payments.js", "www/src/pages/Refund.jsx"]
  }'

엔드포인트는 sha 기준으로 멱등합니다 — 같은 커밋을 다시 보내도 노드에 중복으로 쌓이지 않습니다. 같은 호출이 MCP 클라이언트에는 record_commit 도구로 노출되므로, CI를 붙이지 않았다면 에이전트가 직접 커밋을 기록할 수도 있습니다.

스코프와 안전. PAT는 write 스코프가 필요합니다. secret으로 보관하고, 커밋되는 YAML에 절대 넣지 마세요. 유출되면 app.umtri.io에서 폐기·재발급하세요.