# Milestone: Platformless Git Operation Engine

## 위치

- Roadmap: `agent-roadmap/ROADMAP.md`
- Phase: `agent-roadmap/phase/control-plane-foundation/PHASE.md`

## 목표

GitHub/GitLab/Gitea 같은 플랫폼 API 없이 Git CLI와 local bare repository만으로 Git operation을 실행하고 검증한다. 이 Milestone은 Gito의 모든 provider adapter가 의존할 platformless Git 기준선을 만든다.

## 상태

[완료]

## 승격 조건

- 없음

## 구현 잠금

- 상태: 해제
- 결정 필요: 없음

## 범위

- clone, fetch, pull, checkout, status, diff, commit, push operation
- revision cursor와 changed file scan
- operation input/output DTO
- command timeout과 stderr/stdout capture boundary
- local bare repo 기반 integration test

## 기능

### Epic: [ops] Git operations

Provider API에 의존하지 않는 Git command 기능을 만든다.

- [x] [clone-fetch] clone/fetch operation을 구현한다. 검증: local bare repo를 remote로 사용해 fetch 후 revision을 확인한다.
- [x] [status-diff] status/diff operation을 구현한다. 검증: staged/unstaged/clean workspace 상태를 테스트한다.
- [x] [commit-push] commit/push operation을 구현한다. 검증: local bare repo에 push한 revision이 remote branch에 반영된다.
- [x] [branch-checkout] branch checkout과 source branch 기준을 구현한다. 검증: branch 변경 후 worktree revision을 확인한다.

### Epic: [scan] Revision scan

branch revision 변화와 changed file을 normalized event 입력으로 만든다.

- [x] [cursor] repo/branch별 last seen revision cursor를 저장한다. 검증: `go test ./internal/controlplane ./internal/storage ./internal/gitengine`에서 cursor store와 scan cursor 상태를 확인한다.
- [x] [changed-files] `before..after` changed file scan을 구현한다. 검증: 여러 commit 사이 변경 파일 목록이 기대와 일치한다.
- [x] [event-input] scan 결과를 `RevisionEvent` 후보로 변환한다. 검증: `TestRuntimeScanBranchRevisionBuildsRevisionEvent`에서 revision bounds와 changed files를 확인한다.

## 완료 리뷰

- 상태: 승인됨
- 요청일: 2026-06-13
- 완료 근거:
  - `services/core/internal/storage`의 `RevisionCursorStore`와 Postgres 구현이 repo/branch cursor 저장과 조회를 지원한다.
  - `services/core/internal/controlplane`의 `ScanBranchRevision`이 cursor, changed file scan, `RevisionEvent` 변환을 연결한다.
  - 코드 레벨 완료 리뷰에서 `gitengine.CLI` timeout 경계와 `--name-status` path 파싱 edge case를 보완했다.
  - `go test ./...`와 `go vet ./...` 통과.
- 리뷰 필요:
  - [x] 사용자가 완료 결과를 확인했다
  - [x] archive 이동을 승인했다
- 리뷰 코멘트: 코드 레벨 리뷰와 보완 검증이 완료되어 archive 이동 대상으로 확정했다.

## 범위 제외

- PR/MR 생성
- provider webhook 처리
- IOP CLI 실행
- Flutter 표시

## 작업 컨텍스트

- 관련 경로: `services/core/internal/gitengine/`, `services/core/internal/core/`, `services/core/internal/storage/`
- 표준선(선택): webhook 없이도 `fetch + revision diff + scan`만으로 변경을 확인할 수 있어야 한다.
- 선행 작업: Repo Registry and Workspace Lease
- 후속 작업: Operation Event Outbox
- 확인 필요: 없음
