@jjlabsio/claude-crew 0.1.42 → 0.1.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,7 +11,7 @@
11
11
  "name": "claude-crew",
12
12
  "source": "./",
13
13
  "description": "오케스트레이터 + PM, 플래너, 개발, QA, 마케팅 에이전트 팀으로 단일 제품의 개발과 마케팅을 통합 관리",
14
- "version": "0.1.42",
14
+ "version": "0.1.44",
15
15
  "author": {
16
16
  "name": "Jaejin Song",
17
17
  "email": "wowlxx28@gmail.com"
@@ -28,5 +28,5 @@
28
28
  "category": "workflow"
29
29
  }
30
30
  ],
31
- "version": "0.1.42"
31
+ "version": "0.1.44"
32
32
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-crew",
3
- "version": "0.1.42",
3
+ "version": "0.1.44",
4
4
  "description": "1인 SaaS 개발자를 위한 멀티 에이전트 오케스트레이션 — 개발, 마케팅, 일정을 한 대화에서 통합 관리",
5
5
  "author": {
6
6
  "name": "Jaejin Song",
package/README.ko.md ADDED
@@ -0,0 +1,173 @@
1
+ # Claude Crew
2
+
3
+ 1인 SaaS 개발자를 위한 Claude Code 멀티 에이전트 오케스트레이션 플러그인.
4
+
5
+ [English](README.md)
6
+
7
+ ## 파이프라인
8
+
9
+ ```
10
+ crew-interview → crew-plan → crew-dev
11
+ WHAT HOW DO
12
+ ```
13
+
14
+ | 단계 | 역할 | 산출물 |
15
+ |------|------|--------|
16
+ | **crew-interview** | 무엇을 만드는가 — 요구사항 인터뷰, 제품 설계 | spec.md |
17
+ | **crew-plan** | 어떻게 만드는가 — 기술 분석, 태스크 분해 | contract.md |
18
+ | **crew-dev** | 만든다 — 구현, 코드 리뷰, QA | 동작하는 코드 + PR |
19
+
20
+ ## 설치
21
+
22
+ Claude Code에서:
23
+
24
+ ```
25
+ /plugin marketplace add jjlabsio/claude-crew
26
+ /plugin install claude-crew
27
+ ```
28
+
29
+ 또는 로컬에서 직접:
30
+
31
+ ```
32
+ /plugin install /path/to/claude-crew
33
+ ```
34
+
35
+ ## 초기 설정
36
+
37
+ 설치 후 반드시 한 번 실행:
38
+
39
+ ```
40
+ /crew-setup
41
+ ```
42
+
43
+ - `.gitignore` / `.gitattributes` 마이그레이션 (`.crew/` git tracked 전환)
44
+ - HUD statusline 설치
45
+ - 에이전트별 provider/model 설정
46
+
47
+ ## 사용
48
+
49
+ ### 개발 파이프라인
50
+
51
+ ```
52
+ /crew
53
+ ```
54
+
55
+ 오케스트레이터가 시작되고 현황을 브리핑합니다.
56
+
57
+ ### 간단 작업 즉시 위임
58
+
59
+ ```
60
+ /crew-do "로그인 에러 메시지 정리"
61
+ /crew-do # active task가 있으면 해당 task를 실행
62
+ ```
63
+
64
+ `/crew-do`는 기존 Dev 에이전트를 `direct` 모드로 호출해 작은 수정, 버그픽스, 테스트 실패 수정처럼 범위가 명확한 작업을 바로 위임합니다. Dev 기본 provider가 Codex이면 실제 코드 탐색, 수정, 검증은 Codex runtime에서 수행되고 Claude는 결과 요약과 후속 조율만 담당합니다.
65
+
66
+ `/task`는 계속 기억/queue 관리 전용입니다. 저장된 태스크를 실행하려면 `/task work {id}`로 active 상태로 만든 뒤 `/crew-do`를 실행합니다.
67
+
68
+ ### 태스크 관리
69
+
70
+ ```
71
+ /task add "설명" # 태스크 추가 (대화 컨텍스트 자동 캡처)
72
+ /task add "설명" --next # 긴급 — queue 맨 위 삽입
73
+ /task work 3 # 태스크 #3 작업 시작 (관련 파일 Read + 브리핑)
74
+ /task start # queue 최상단 태스크 작업 시작
75
+ /task done # active 태스크 완료 처리
76
+ /task bump 4 # 우선순위 한 칸 올리기
77
+ /task top 7 # queue 맨 위로 이동
78
+ /task note 3 "메모" # 태스크에 메모 추가
79
+ /task drop 3 # 태스크 삭제
80
+
81
+ /tasks # 프로젝트 태스크 보드
82
+ /tasks stale # 30일+ 방치 태스크 리뷰
83
+ /tasks clean # 완료 후 7일 경과 태스크 정리
84
+ ```
85
+
86
+ 태스크는 `.crew/tasks/` 디렉토리에 개별 파일로 관리된다. 각 파일이 상태, 우선순위, 컨텍스트를 포함하여 세션 간 작업 재개 시 컨텍스트 재입력이 불필요하다.
87
+
88
+ ## 에이전트 팀
89
+
90
+ | 에이전트 | 역할 | 소속 스킬 |
91
+ |---------|------|----------|
92
+ | **오케스트레이터** | 유저와 대화, 위임 판단, 파이프라인 진행 | 전체 |
93
+ | **Explorer** | 코드베이스 탐색 (read-only) | interview, plan |
94
+ | **Researcher** | 외부 리서치 (WebSearch) | interview, plan |
95
+ | **TechLead** | 기술 분석, 아키텍처 방향 판단 | plan |
96
+ | **Planner** | 태스크 분해, 구현 계획 | plan |
97
+ | **PlanEvaluator** | 계획 검증 (하드 임계값) | plan |
98
+ | **Dev** | 코드 구현 | dev |
99
+ | **CodeReviewer** | 코드 리뷰 | dev |
100
+ | **QA** | 실행 검증 | dev |
101
+
102
+ ## 두 가지 사용 모드
103
+
104
+ claude-crew는 **다른 프로젝트에 설치되어 사용되는 플러그인**이다. 두 가지 모드로 구분된다.
105
+
106
+ ### 사용자 모드
107
+
108
+ 이 plugin을 자기 프로젝트에 설치해서 SaaS 개발에 활용하는 일반 사용자.
109
+
110
+ - 직접 호출하는 슬래시 명령: `/crew`, `/crew-setup`, `/crew-do`, `/task`, `/tasks`, `/crew-interview`, `/crew-plan`, `/crew-dev`.
111
+ - 디버그용 직접 호출 가능 명령: `node scripts/crew-agent-runner.mjs resolve --role <role> --json` (provider/model/contract 통합 표 확인).
112
+ - plugin이 설치된 위치(`~/.claude/plugins/...` 등)에 무관하게 동작 — plugin script가 자기 위치를 자동으로 인식.
113
+
114
+ ### 개발자 모드
115
+
116
+ claude-crew 자체를 개발하는 사람 (이 repo 안에서 작업).
117
+
118
+ - `node scripts/crew-agent-runner.mjs build`: contracts/instructions에서 `agents/{role}.md` + `plugin.json` agents 배열 derive.
119
+ - `node scripts/crew-agent-runner.mjs validate`: build 결과와 현재 파일 정합성 검사 + sandbox 정합성 검증.
120
+ - `node scripts/crew-agent-runner.mjs install-hooks`: pre-commit hook 설치 (drift 차단).
121
+
122
+ 위 세 명령은 **plugin source repo 안에서만 동작**한다. 사용자 환경에서 호출하면 가드로 차단된다 (`.claude-plugin/plugin.json` + `package.json.name === "@jjlabsio/claude-crew"` 감지). 사용자에게는 의미 없는 명령이므로 정상이다.
123
+
124
+ ## 모델 설정
125
+
126
+ `/crew-setup`에서 에이전트별 provider/model을 설정합니다. 설정하지 않은 에이전트는 `data/provider-catalog.json`의 `agent_defaults`를 따릅니다.
127
+
128
+ 권장 기본값은 에이전트 역할의 성격에 따라 세 그룹으로 구분됩니다.
129
+
130
+ | 에이전트 | provider | model | reasoning | 역할 성격 |
131
+ |----------|----------|-------|-----------|---------|
132
+ | `techlead` | codex | gpt-5.5 | high | 판단/평가 — 아키텍처 방향 결정 |
133
+ | `code-reviewer` | codex | gpt-5.5 | high | 판단/평가 — 코드 품질 판정 |
134
+ | `pm` | codex | gpt-5.5 | medium | 계획/분석 — 요구사항 수집 |
135
+ | `planner` | codex | gpt-5.5 | medium | 계획/분석 — 구현 계획 작성 |
136
+ | `dev` | codex | gpt-5.5 | medium | 계획/분석 — 코드 구현 |
137
+ | `plan-evaluator` | codex | gpt-5.4-mini | high | 실행/검증 — 계획 기준 충족 판정 |
138
+ | `qa` | codex | gpt-5.4-mini | high | 실행/검증 — 빌드/테스트 실행 |
139
+ | `researcher` | codex | gpt-5.4-mini | high | 실행/검증 — 외부 정보 조사 |
140
+ | `explorer` | codex | gpt-5.3-codex-spark | low | 탐색 전용 — 코드베이스 검색 |
141
+
142
+ Claude 모델은 `opus`, `sonnet`, `haiku` latest alias와 `claude-opus-4-7` 같은 버전 고정 ID를 모두 선택할 수 있습니다.
143
+
144
+ Claude provider는 Claude Code `Agent`로 실행하고, Codex provider는 플러그인에 내장된 `scripts/crew-codex-companion.mjs` app-server runtime으로 실행합니다. 에이전트가 유저 질문이나 다른 에이전트 호출이 필요하면 직접 처리하지 않고 오케스트레이터가 이어받아 실행합니다.
145
+
146
+ Provider와 무관하게 에이전트 결과는 `complete`, `blocked_on_user`, `needs_agent`, `needs_tool`, `failed` 상태 중 하나로 해석합니다. Claude Code 전용 도구가 필요한 경우에도 Codex provider는 요청 상태를 반환하고, 실제 도구 실행은 오케스트레이터가 담당합니다.
147
+
148
+ ## 상태 파일
149
+
150
+ 프로젝트 로컬 `.crew/` 디렉토리에 마크다운 파일로 상태를 관리합니다 (git tracked). 플러그인 업데이트 시에도 학습 내용과 상태는 보존됩니다.
151
+
152
+ ```
153
+ .crew/
154
+ config.json # provider 설정 (gitignored)
155
+ tasks/ # 태스크 파일 (1개 = 1파일)
156
+ plans/ # 파이프라인 산출물 (spec, contract, dev-log, review)
157
+ ```
158
+
159
+ ## 설계 철학
160
+
161
+ **역할별 관점은 유지하되, 정보는 제한하지 않는다.**
162
+
163
+ 각 에이전트는 특정 관점(기획/기술/구현)에서 사고하지만, 활용할 수 있는 정보(코드 포함)는 제한하지 않는다. 실제 회사의 역할 분리를 모방하는 것이 아니라, 빠뜨리는 관점이 없도록 구조화된 사고를 강제하는 것이 목적이다.
164
+
165
+ ### 기타 원칙
166
+
167
+ - [Anthropic 하네스 설계 아티클](https://www.anthropic.com/engineering/harness-design)을 최우선 레퍼런스로 따름
168
+ - 가능한 단순하게 시작하고 필요할 때만 복잡성을 높임
169
+ - 모델이 발전하면 불필요해진 구성 요소를 제거
170
+
171
+ ## License
172
+
173
+ MIT. This project also includes Apache-2.0 third-party components under `scripts/crew-codex/`; see `THIRD_PARTY_NOTICES.md`.
package/README.md CHANGED
@@ -1,156 +1,172 @@
1
1
  # Claude Crew
2
2
 
3
- 1인 SaaS 개발자를 위한 Claude Code 멀티 에이전트 오케스트레이션 플러그인.
3
+ A Claude Code multi-agent orchestration plugin for solo SaaS developers.
4
4
 
5
- ## 파이프라인
5
+ [한국어](README.ko.md)
6
+
7
+ ## Pipeline
6
8
 
7
9
  ```
8
10
  crew-interview → crew-plan → crew-dev
9
11
  WHAT HOW DO
10
12
  ```
11
13
 
12
- | 단계 | 역할 | 산출물 |
13
- |------|------|--------|
14
- | **crew-interview** | 무엇을 만드는가요구사항 인터뷰, 제품 설계 | spec.md |
15
- | **crew-plan** | 어떻게 만드는가기술 분석, 태스크 분해 | contract.md |
16
- | **crew-dev** | 만든다구현, 코드 리뷰, QA | 동작하는 코드 + PR |
14
+ | Stage | Role | Output |
15
+ |-------|------|--------|
16
+ | **crew-interview** | What to build requirements interview, product design | spec.md |
17
+ | **crew-plan** | How to build it technical analysis, task decomposition | contract.md |
18
+ | **crew-dev** | Build it implementation, code review, QA | working code + PR |
17
19
 
18
- ## 설치
20
+ ## Installation
19
21
 
20
- Claude Code에서:
22
+ In Claude Code:
21
23
 
22
24
  ```
23
25
  /plugin marketplace add jjlabsio/claude-crew
24
26
  /plugin install claude-crew
25
27
  ```
26
28
 
27
- 또는 로컬에서 직접:
29
+ Or install locally:
28
30
 
29
31
  ```
30
32
  /plugin install /path/to/claude-crew
31
33
  ```
32
34
 
33
- ## 초기 설정
35
+ ## Initial Setup
34
36
 
35
- 설치 반드시 한 번 실행:
37
+ Run once after installation:
36
38
 
37
39
  ```
38
40
  /crew-setup
39
41
  ```
40
42
 
41
- - `.gitignore` / `.gitattributes` 마이그레이션 (`.crew/` git tracked 전환)
42
- - HUD statusline 설치
43
- - 에이전트별 provider/model 설정
43
+ - `.gitignore` / `.gitattributes` migration (`.crew/` git tracked)
44
+ - HUD statusline installation
45
+ - Per-agent provider/model configuration
44
46
 
45
- ## 사용
47
+ ## Usage
46
48
 
47
- ### 개발 파이프라인
49
+ ### Development Pipeline
48
50
 
49
51
  ```
50
52
  /crew
51
53
  ```
52
54
 
53
- 오케스트레이터가 시작되고 현황을 브리핑합니다.
55
+ The orchestrator starts and briefs the current status.
54
56
 
55
- ### 간단 작업 즉시 위임
57
+ ### Quick Task Delegation
56
58
 
57
59
  ```
58
- /crew-do "로그인 에러 메시지 정리"
59
- /crew-do # active task 있으면 해당 task를 실행
60
+ /crew-do "clean up login error messages"
61
+ /crew-do # runs the active task if one exists
60
62
  ```
61
63
 
62
- `/crew-do`는 기존 Dev 에이전트를 `direct` 모드로 호출해 작은 수정, 버그픽스, 테스트 실패 수정처럼 범위가 명확한 작업을 바로 위임합니다. Dev 기본 provider Codex이면 실제 코드 탐색, 수정, 검증은 Codex runtime에서 수행되고 Claude 결과 요약과 후속 조율만 담당합니다.
64
+ `/crew-do` invokes the Dev agent in `direct` mode for small fixes, bug patches, and clearly scoped tasks. If Dev's default provider is Codex, code exploration, editing, and verification happen inside the Codex runtime; Claude handles only result summarization and follow-up coordination.
63
65
 
64
- `/task`는 계속 기억/queue 관리 전용입니다. 저장된 태스크를 실행하려면 `/task work {id}`로 active 상태로 만든 뒤 `/crew-do`를 실행합니다.
66
+ `/task` remains dedicated to memory/queue management. To execute a saved task, mark it active with `/task work {id}` then run `/crew-do`.
65
67
 
66
- ### 태스크 관리
68
+ ### Task Management
67
69
 
68
70
  ```
69
- /task add "설명" # 태스크 추가 (대화 컨텍스트 자동 캡처)
70
- /task add "설명" --next # 긴급queue 삽입
71
- /task work 3 # 태스크 #3 작업 시작 (관련 파일 Read + 브리핑)
72
- /task start # queue 최상단 태스크 작업 시작
73
- /task done # active 태스크 완료 처리
74
- /task bump 4 # 우선순위 올리기
75
- /task top 7 # queue 위로 이동
76
- /task note 3 "메모" # 태스크에 메모 추가
77
- /task drop 3 # 태스크 삭제
71
+ /task add "description" # add a task (captures conversation context)
72
+ /task add "description" --next # urgentinsert at top of queue
73
+ /task work 3 # start working on task #3 (reads related files + briefs)
74
+ /task start # start working on the top-priority task
75
+ /task done # mark active task complete
76
+ /task bump 4 # raise priority by one
77
+ /task top 7 # move to top of queue
78
+ /task note 3 "note" # add a note to a task
79
+ /task drop 3 # delete a task
78
80
 
79
- /tasks # 프로젝트 태스크 보드
80
- /tasks stale # 30일+ 방치 태스크 리뷰
81
- /tasks clean # 완료 7 경과 태스크 정리
81
+ /tasks # project task board
82
+ /tasks stale # review tasks untouched for 30+ days
83
+ /tasks clean # clean up tasks completed 7+ days ago
82
84
  ```
83
85
 
84
- 태스크는 `.crew/tasks/` 디렉토리에 개별 파일로 관리된다. 파일이 상태, 우선순위, 컨텍스트를 포함하여 세션 작업 재개 컨텍스트 재입력이 불필요하다.
86
+ Tasks are managed as individual files in `.crew/tasks/`. Each file carries state, priority, and context so work can resume across sessions without re-entering context.
87
+
88
+ ## Agent Team
89
+
90
+ | Agent | Role | Used in |
91
+ |-------|------|---------|
92
+ | **Orchestrator** | Talks with the user, decides delegation, drives the pipeline | all |
93
+ | **Explorer** | Codebase exploration (read-only) | interview, plan |
94
+ | **Researcher** | External research (WebSearch) | interview, plan |
95
+ | **TechLead** | Technical analysis, architecture direction | plan |
96
+ | **Planner** | Task decomposition, implementation planning | plan |
97
+ | **PlanEvaluator** | Plan validation (hard thresholds) | plan |
98
+ | **Dev** | Code implementation | dev |
99
+ | **CodeReviewer** | Code review | dev |
100
+ | **QA** | Execution verification | dev |
85
101
 
86
- ## 에이전트
102
+ ## Two Modes
87
103
 
88
- | 에이전트 | 역할 | 소속 스킬 |
89
- |---------|------|----------|
90
- | **오케스트레이터** | 유저와 대화, 위임 판단, 파이프라인 진행 | 전체 |
91
- | **Explorer** | 코드베이스 탐색 (read-only) | interview, plan |
92
- | **Researcher** | 외부 리서치 (WebSearch) | interview, plan |
93
- | **TechLead** | 기술 분석, 아키텍처 방향 판단 | plan |
94
- | **Planner** | 태스크 분해, 구현 계획 | plan |
95
- | **PlanEvaluator** | 계획 검증 (하드 임계값) | plan |
96
- | **Dev** | 코드 구현 | dev |
97
- | **CodeReviewer** | 코드 리뷰 | dev |
98
- | **QA** | 실행 검증 | dev |
104
+ claude-crew is a **plugin installed into other projects**. It operates in two distinct modes.
99
105
 
100
- ## 가지 사용 모드
106
+ ### User Mode
101
107
 
102
- claude-crew는 **다른 프로젝트에 설치되어 사용되는 플러그인**이다. 가지 모드로 구분된다.
108
+ General users who install this plugin into their own project for SaaS development.
103
109
 
104
- ### 사용자 모드
110
+ - Slash commands to invoke directly: `/crew`, `/crew-setup`, `/crew-do`, `/task`, `/tasks`, `/crew-interview`, `/crew-plan`, `/crew-dev`.
111
+ - Debug command: `node scripts/crew-agent-runner.mjs resolve --role <role> --json` (shows combined provider/model/contract table).
112
+ - Works regardless of where the plugin is installed (`~/.claude/plugins/...` etc.) — the plugin script auto-detects its own location.
105
113
 
106
- plugin을 자기 프로젝트에 설치해서 SaaS 개발에 활용하는 일반 사용자.
114
+ ### Developer Mode
107
115
 
108
- - 직접 호출하는 슬래시 명령: `/crew`, `/crew-setup`, `/crew-do`, `/task`, `/tasks`, `/crew-interview`, `/crew-plan`, `/crew-dev`.
109
- - 디버그용 직접 호출 가능 명령: `node scripts/crew-agent-runner.mjs resolve --role <role> --json` (provider/model/contract 통합 표 확인).
110
- - plugin이 설치된 위치(`~/.claude/plugins/...` 등)에 무관하게 동작 — plugin script가 자기 위치를 자동으로 인식.
116
+ People developing claude-crew itself (working inside this repo).
111
117
 
112
- ### 개발자 모드
118
+ - `node scripts/crew-agent-runner.mjs build`: derives `agents/{role}.md` + `plugin.json` agents array from contracts/instructions.
119
+ - `node scripts/crew-agent-runner.mjs validate`: checks build output against source files + sandbox consistency.
120
+ - `node scripts/crew-agent-runner.mjs install-hooks`: installs pre-commit hook (prevents drift).
113
121
 
114
- claude-crew 자체를 개발하는 사람 (이 repo 안에서 작업).
122
+ These commands **only work inside the plugin source repo**. They are blocked when called from a user environment (detected via `.claude-plugin/plugin.json` + `package.json.name === "@jjlabsio/claude-crew"`).
115
123
 
116
- - `node scripts/crew-agent-runner.mjs build`: contracts/instructions에서 `agents/{role}.md` + `plugin.json` agents 배열 derive.
117
- - `node scripts/crew-agent-runner.mjs validate`: build 결과와 현재 파일 정합성 검사 + sandbox 정합성 검증.
118
- - `node scripts/crew-agent-runner.mjs install-hooks`: pre-commit hook 설치 (drift 차단).
124
+ ## Model Configuration
119
125
 
120
- 명령은 **plugin source repo 안에서만 동작**한다. 사용자 환경에서 호출하면 가드로 차단된다 (`.claude-plugin/plugin.json` + `package.json.name === "@jjlabsio/claude-crew"` 감지). 사용자에게는 의미 없는 명령이므로 정상이다.
126
+ Configure per-agent provider/model via `/crew-setup`. Agents without explicit configuration fall back to `agent_defaults` in `data/provider-catalog.json`.
121
127
 
122
- ## 모델 설정
128
+ Default recommendations are grouped by the nature of each agent's role:
123
129
 
124
- `/crew-setup`에서 에이전트별 provider/model을 설정합니다. 설정하지 않은 에이전트는 `data/provider-catalog.json`의 `agent_defaults`를 따릅니다.
130
+ | Agent | Provider | Model | Reasoning | Role type |
131
+ |-------|----------|-------|-----------|-----------|
132
+ | `techlead` | codex | gpt-5.5 | high | Judgment — architecture direction |
133
+ | `code-reviewer` | codex | gpt-5.5 | high | Judgment — code quality assessment |
134
+ | `pm` | codex | gpt-5.5 | medium | Planning — requirements gathering |
135
+ | `planner` | codex | gpt-5.5 | medium | Planning — implementation planning |
136
+ | `dev` | codex | gpt-5.5 | medium | Planning — code implementation |
137
+ | `plan-evaluator` | codex | gpt-5.4-mini | high | Execution — plan threshold checks |
138
+ | `qa` | codex | gpt-5.4-mini | high | Execution — build/test verification |
139
+ | `researcher` | codex | gpt-5.4-mini | high | Execution — external research |
140
+ | `explorer` | codex | gpt-5.3-codex-spark | low | Exploration — codebase search |
125
141
 
126
- 기본값은 기존 에이전트 frontmatter 모델을 따르되, Dev와 CodeReviewer는 Codex `gpt-5.5 medium`을 사용합니다. Claude 모델은 `opus`, `sonnet`, `haiku` latest alias와 `claude-opus-4-7` 같은 버전 고정 ID를 모두 선택할 수 있습니다.
142
+ For Claude models, both latest aliases (`opus`, `sonnet`, `haiku`) and pinned version IDs like `claude-opus-4-7` are supported.
127
143
 
128
- Claude provider Claude Code `Agent`로 실행하고, Codex provider 플러그인에 내장된 `scripts/crew-codex-companion.mjs` app-server runtime으로 실행합니다. 에이전트가 유저 질문이나 다른 에이전트 호출이 필요하면 직접 처리하지 않고 오케스트레이터가 이어받아 실행합니다.
144
+ The Claude provider runs agents via Claude Code's `Agent` tool. The Codex provider runs via the bundled `scripts/crew-codex-companion.mjs` app-server runtime. When an agent needs to ask the user a question or invoke another agent, it does not handle this directly — the orchestrator takes over.
129
145
 
130
- Provider와 무관하게 에이전트 결과는 `complete`, `blocked_on_user`, `needs_agent`, `needs_tool`, `failed` 상태 하나로 해석합니다. Claude Code 전용 도구가 필요한 경우에도 Codex provider 요청 상태를 반환하고, 실제 도구 실행은 오케스트레이터가 담당합니다.
146
+ Regardless of provider, agent results are interpreted as one of: `complete`, `blocked_on_user`, `needs_agent`, `needs_tool`, or `failed`. Even when a Claude Code-specific tool is required, the Codex provider returns a request status and the orchestrator handles the actual tool execution.
131
147
 
132
- ## 상태 파일
148
+ ## State Files
133
149
 
134
- 프로젝트 로컬 `.crew/` 디렉토리에 마크다운 파일로 상태를 관리합니다 (git tracked). 플러그인 업데이트 시에도 학습 내용과 상태는 보존됩니다.
150
+ State is managed as Markdown files in the project-local `.crew/` directory (git tracked). Learning and state are preserved across plugin updates.
135
151
 
136
152
  ```
137
153
  .crew/
138
- config.json # provider 설정 (gitignored)
139
- tasks/ # 태스크 파일 (1개 = 1파일)
140
- plans/ # 파이프라인 산출물 (spec, contract, dev-log, review)
154
+ config.json # provider configuration (gitignored)
155
+ tasks/ # task files (one file per task)
156
+ plans/ # pipeline artifacts (spec, contract, dev-log, review)
141
157
  ```
142
158
 
143
- ## 설계 철학
159
+ ## Design Philosophy
144
160
 
145
- **역할별 관점은 유지하되, 정보는 제한하지 않는다.**
161
+ **Preserve per-role perspective; do not restrict information.**
146
162
 
147
- 에이전트는 특정 관점(기획/기술/구현)에서 사고하지만, 활용할 있는 정보(코드 포함) 제한하지 않는다. 실제 회사의 역할 분리를 모방하는 것이 아니라, 빠뜨리는 관점이 없도록 구조화된 사고를 강제하는 것이 목적이다.
163
+ Each agent thinks from a specific viewpoint (product / technical / implementation), but the information it can use (including code) is not restricted. The goal is not to mimic real-world org chart separation, but to enforce structured thinking so no perspective is missed.
148
164
 
149
- ### 기타 원칙
165
+ ### Other Principles
150
166
 
151
- - [Anthropic 하네스 설계 아티클](https://www.anthropic.com/engineering/harness-design) 최우선 레퍼런스로 따름
152
- - 가능한 단순하게 시작하고 필요할 때만 복잡성을 높임
153
- - 모델이 발전하면 불필요해진 구성 요소를 제거
167
+ - [Anthropic harness design article](https://www.anthropic.com/engineering/harness-design) is the primary reference
168
+ - Start as simple as possible; add complexity only when needed
169
+ - Remove components that become unnecessary as models improve
154
170
 
155
171
  ## License
156
172
 
@@ -27,14 +27,14 @@
27
27
  },
28
28
  "agent_defaults": {
29
29
  "pm": { "provider": "codex", "model": "gpt-5.5", "reasoning": "medium" },
30
- "techlead": { "provider": "codex", "model": "gpt-5.5", "reasoning": "medium" },
30
+ "techlead": { "provider": "codex", "model": "gpt-5.5", "reasoning": "high" },
31
31
  "planner": { "provider": "codex", "model": "gpt-5.5", "reasoning": "medium" },
32
- "plan-evaluator": { "provider": "claude", "model": "sonnet" },
32
+ "plan-evaluator": { "provider": "codex", "model": "gpt-5.4-mini", "reasoning": "high" },
33
33
  "explorer": { "provider": "codex", "model": "gpt-5.3-codex-spark", "reasoning": "low" },
34
34
  "researcher": { "provider": "codex", "model": "gpt-5.4-mini", "reasoning": "high" },
35
- "qa": { "provider": "claude", "model": "sonnet" },
35
+ "qa": { "provider": "codex", "model": "gpt-5.4-mini", "reasoning": "high" },
36
36
  "dev": { "provider": "codex", "model": "gpt-5.5", "reasoning": "medium" },
37
- "code-reviewer": { "provider": "codex", "model": "gpt-5.5", "reasoning": "medium" }
37
+ "code-reviewer": { "provider": "codex", "model": "gpt-5.5", "reasoning": "high" }
38
38
  },
39
39
  "agent_runtime": {
40
40
  "pm": { "codex_sandbox": "read-only" },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlabsio/claude-crew",
3
- "version": "0.1.42",
3
+ "version": "0.1.44",
4
4
  "description": "1인 SaaS 개발자를 위한 멀티 에이전트 오케스트레이션 — 개발, 마케팅, 일정을 한 대화에서 통합 관리",
5
5
  "author": "Jaejin Song <wowlxx28@gmail.com>",
6
6
  "license": "MIT",
@@ -13,6 +13,7 @@ import {
13
13
  persistCrewArtifact,
14
14
  ArtifactPersistError
15
15
  } from "./lib/artifacts.mjs";
16
+ import { checkpoint, CheckpointError } from "./lib/checkpoint.mjs";
16
17
  import {
17
18
  dispatch,
18
19
  DispatchError,
@@ -50,6 +51,10 @@ async function main(argv) {
50
51
  return persistArtifactCommand(flags);
51
52
  }
52
53
 
54
+ if (command === "checkpoint") {
55
+ return checkpointCommand(flags);
56
+ }
57
+
53
58
  if (command === "render-followup") {
54
59
  return renderFollowupCommand(flags);
55
60
  }
@@ -332,7 +337,8 @@ async function dispatchCommand(flags) {
332
337
  request,
333
338
  resolved,
334
339
  contract: resolved.contract,
335
- resumeHandle: flags["resume-handle"]
340
+ resumeHandle: flags["resume-handle"],
341
+ noCheckpoint: flags["no-checkpoint"] === true
336
342
  });
337
343
 
338
344
  writeDispatchResult(agentResult, flags);
@@ -350,6 +356,33 @@ async function dispatchCommand(flags) {
350
356
  }
351
357
  }
352
358
 
359
+ async function checkpointCommand(flags) {
360
+ if (typeof flags.message !== "string" || flags.message.length === 0) {
361
+ console.error("Missing required --message <text>");
362
+ return 1;
363
+ }
364
+
365
+ try {
366
+ const result = await checkpoint({ message: flags.message });
367
+
368
+ if (flags.json) {
369
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
370
+ } else if (result.committed) {
371
+ process.stdout.write(`${result.hash} ${result.message}\n`);
372
+ } else {
373
+ process.stdout.write("Nothing to commit.\n");
374
+ }
375
+ return 0;
376
+ } catch (error) {
377
+ if (error instanceof CheckpointError) {
378
+ console.error(error.message);
379
+ return 1;
380
+ }
381
+ console.error(error.message);
382
+ return 1;
383
+ }
384
+ }
385
+
353
386
  function renderCommand(flags) {
354
387
  if (typeof flags.role !== "string" || flags.role.length === 0) {
355
388
  console.error("Missing required --role <name>");
@@ -437,11 +470,14 @@ function usage() {
437
470
  " crew-agent-runner render-followup --previous-result <file> --new-input <file>"
438
471
  );
439
472
  console.error(
440
- " crew-agent-runner dispatch --role <name> --request-file <path> [--json] [--resume-handle <thread-id>]"
473
+ " crew-agent-runner dispatch --role <name> --request-file <path> [--json] [--resume-handle <thread-id>] [--no-checkpoint]"
441
474
  );
442
475
  console.error(
443
476
  " crew-agent-runner persist-artifact --role <name> --result-file <path> --request-file <path>"
444
477
  );
478
+ console.error(
479
+ " crew-agent-runner checkpoint --message <text> [--json]"
480
+ );
445
481
  }
446
482
 
447
483
  const exitCode = await main(process.argv.slice(2));
@@ -18,7 +18,7 @@ export async function persistCrewArtifact({ workspaceRoot, contract, request, ag
18
18
  return null;
19
19
  }
20
20
 
21
- const resolvedTarget = replaceTaskId(target, request?.taskId);
21
+ const resolvedTarget = resolveTemplateTarget(target, request);
22
22
  const absolutePath = validateTargetPath(workspaceRoot, resolvedTarget);
23
23
 
24
24
  await mkdir(dirname(absolutePath), { recursive: true });
@@ -57,11 +57,34 @@ function findArtifactTarget(contract) {
57
57
  return null;
58
58
  }
59
59
 
60
- function replaceTaskId(target, taskId) {
61
- if (typeof taskId === "string" && taskId.length > 0) {
62
- return target.replace(/\{task-id\}/g, taskId);
60
+ function resolveTemplateTarget(target, request) {
61
+ const values = {
62
+ "task-id": firstString(request?.taskId, request?.task_id, request?.["task-id"]),
63
+ "run-id": firstString(request?.runId, request?.run_id, request?.["run-id"])
64
+ };
65
+
66
+ const resolved = target.replace(/\{(task-id|run-id)\}/g, (match, name) => {
67
+ const value = values[name];
68
+ return value ?? match;
69
+ });
70
+
71
+ const unresolved = resolved.match(/\{[^}/\\]+\}/);
72
+ if (unresolved) {
73
+ throw new ArtifactPersistError(
74
+ `Unresolved template variable ${unresolved[0]} in artifact target: ${target}`
75
+ );
76
+ }
77
+
78
+ return resolved;
79
+ }
80
+
81
+ function firstString(...values) {
82
+ for (const value of values) {
83
+ if (typeof value === "string" && value.length > 0) {
84
+ return value;
85
+ }
63
86
  }
64
- return target;
87
+ return null;
65
88
  }
66
89
 
67
90
  function validateTargetPath(workspaceRoot, target) {
@@ -0,0 +1,36 @@
1
+ import { execFile } from "node:child_process";
2
+
3
+ export class CheckpointError extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = "CheckpointError";
7
+ }
8
+ }
9
+
10
+ export async function checkpoint({ message, cwd }) {
11
+ const workDir = cwd ?? process.cwd();
12
+
13
+ await git(["add", "-A"], workDir);
14
+
15
+ const status = await git(["status", "--porcelain"], workDir);
16
+ if (status.trim() === "") {
17
+ return { committed: false, hash: null, message: null };
18
+ }
19
+
20
+ await git(["commit", "--no-verify", "-m", message], workDir);
21
+
22
+ const hash = (await git(["rev-parse", "--short", "HEAD"], workDir)).trim();
23
+ return { committed: true, hash, message };
24
+ }
25
+
26
+ function git(args, cwd) {
27
+ return new Promise((resolve, reject) => {
28
+ execFile("git", args, { cwd, encoding: "utf8" }, (error, stdout, stderr) => {
29
+ if (error) {
30
+ reject(new CheckpointError(`git ${args[0]} failed: ${stderr || error.message}`));
31
+ return;
32
+ }
33
+ resolve(stdout);
34
+ });
35
+ });
36
+ }
@@ -5,6 +5,7 @@ import { basename, join } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
 
7
7
  import { persistCrewArtifact, ArtifactPersistError } from "./artifacts.mjs";
8
+ import { checkpoint } from "./checkpoint.mjs";
8
9
  import { renderPrompt } from "./render.mjs";
9
10
 
10
11
  const DEFAULT_COMPANION = fileURLToPath(
@@ -86,11 +87,20 @@ export async function dispatch(input) {
86
87
  }
87
88
 
88
89
  const artifactPath = await persistArtifactSafe(input, agentResult);
89
- if (artifactPath) {
90
- return { ...agentResult, artifact_path: artifactPath };
90
+ const result = artifactPath ? { ...agentResult, artifact_path: artifactPath } : agentResult;
91
+
92
+ if (!input.noCheckpoint && agentResult.status === "complete") {
93
+ const taskId = input.request?.taskId ?? input.request?.["task-id"] ?? input.request?.task_id ?? null;
94
+ const label = [input.role, taskId].filter(Boolean).join(" ");
95
+ const ckpt = await checkpointSafe(
96
+ `chore(crew): ${label} checkpoint`
97
+ );
98
+ if (ckpt) {
99
+ return { ...result, checkpoint: ckpt };
100
+ }
91
101
  }
92
102
 
93
- return agentResult;
103
+ return result;
94
104
  } finally {
95
105
  await rm(tmpDir, { recursive: true, force: true });
96
106
  }
@@ -259,6 +269,14 @@ async function persistArtifactSafe(input, agentResult) {
259
269
  }
260
270
  }
261
271
 
272
+ async function checkpointSafe(message) {
273
+ try {
274
+ return await checkpoint({ message });
275
+ } catch {
276
+ return null;
277
+ }
278
+ }
279
+
262
280
  function isNodeScript(value) {
263
281
  const name = basename(String(value));
264
282
  return name.endsWith(".mjs") || name.endsWith(".js");
@@ -30,7 +30,7 @@ crew-dev의 모든 에이전트 실행은 역할이나 phase와 무관하게 아
30
30
 
31
31
  1. `{ role, taskId, inputs, instruction, successGate, failureHandling }` 형태의 `request-file`을 작성한다.
32
32
  2. `node "$CLAUDE_PLUGIN_ROOT/scripts/crew-agent-runner.mjs" prepare --role <role> --request-file <request-file> --json`을 실행한다.
33
- 3. `action == dispatch`이면 prepare가 반환한 command 실행하고 AgentResult를 처리한다.
33
+ 3. `action == dispatch`이면 prepare가 반환한 command `--no-checkpoint`를 추가하여 실행하고 AgentResult를 처리한다. crew-dev는 US 단위 체크포인트를 직접 관리하므로 dispatch 자동 체크포인트를 사용하지 않는다.
34
34
  4. `action == agent`이면 prepare가 반환한 `subagent_type`, `model`, `prompt`로 runner 계약의 Claude 경로를 실행하고 AgentResult로 정규화한다.
35
35
 
36
36
  이 순서를 생략하고 직접 하위 에이전트를 호출하지 않는다.
@@ -69,6 +69,8 @@ provider 선택, 런타임 선택, AgentResult 반환 형식, 후속 입력 주
69
69
  qa-report-{n}.md # US 단위 FAIL 시 아카이브
70
70
  final-review-report.md # CodeReviewer: 최종 전체 리뷰 결과
71
71
  final-qa-report.md # QA: 최종 전체 검증 결과
72
+ requests/ # Dev/CodeReviewer/QA 실행 request-file 보존
73
+ runs/ # Dev/CodeReviewer/QA 실행 결과/메타 보존
72
74
  .dev_loop_count # US별 개발 루프 카운터, US PASS 시 리셋
73
75
  .dev_crash_count # US별 구현 crash 카운터, US PASS 시 리셋
74
76
  .dev_crash_provider # crash 발생 시 현재 사용 중인 provider 기록
@@ -150,7 +152,7 @@ role instructions:
150
152
  - **Phase 2b Step 1a — crash 감지 + retry**: Dev 실행이 비정상 종료되거나 자체 검증 결과가 불명확하면 crash로 판정한다. 오케스트레이터는 부분 변경을 마지막 체크포인트로 되돌리고 crash 카운터를 갱신한다. 동일 provider 재시도, provider fallback, 사용자 escalation은 runner 정책과 phase 카운터 규칙을 함께 적용한다.
151
153
  - **Phase 2b Step 2 — CodeReviewer + QA 병렬 검증**: CodeReviewer와 QA는 동시에 실행한다. CodeReviewer는 `.crew/` 메타 변경을 제외한 코드 변경분과 인라인 가드레일만 보고 품질을 판정한다. QA는 `plan.md` 산출물에서 현재 US의 테스트 시나리오를 확인하고 빌드, 린트, 타입 체크, 전체 테스트, 테스트 전략 준수, US 시나리오 검증을 직접 실행한다. 두 역할은 파일을 직접 작성하지 않고 결과 텍스트를 반환하며, 오케스트레이터가 각 보고서 산출물로 저장한다.
152
154
  - **Phase 2b Step 3 — 판정**: 오케스트레이터는 CodeReviewer PASS와 QA PASS가 모두 충족될 때만 US PASS로 판정한다. 하나라도 FAIL이면 US FAIL로 판정한다.
153
- - **Phase 2b Step 4 — 체크포인트 commit**: US PASS 즉시 전체 변경을 stage하고 `--no-verify` 옵션으로 `feat({task-id}): US-{k} {US 제목}` 커밋을 만든다. US 루프 카운터와 crash 카운터 산출물이 있으면 삭제한다.
155
+ - **Phase 2b Step 4 — 체크포인트 commit**: US PASS 즉시 US 루프 카운터와 crash 카운터 산출물이 있으면 삭제한 뒤 `git add -A`로 전체 변경을 stage한다. 특히 `.crew/plans/{task-id}/requests/`, `.crew/plans/{task-id}/runs/`, 보고서, 카운터 파일처럼 새로 생긴 untracked 파이프라인 산출물이 체크포인트에서 누락되면 안 된다. stage 후 `git status --porcelain --untracked-files=all .crew/plans/{task-id}/`를 확인하고 출력이 남아 있으면 누락 산출물 경고와 함께 커밋하지 않고 실패 처리한다. 이상이 없을 때만 `git commit --no-verify -m "feat({task-id}): US-{k} {US 제목}"` 커밋을 만든다.
154
156
  - **Phase 2b Step 5 — FAIL 처리**: 오케스트레이터는 루프 카운터를 읽고, 상한 초과 또는 같은 기준 3회 연속 실패를 확인한다. 계속 진행 가능하면 최신 review/qa 보고서를 번호가 붙은 산출물로 아카이브하고 카운터를 증가시킨 뒤 Dev retry로 돌아간다. Dev retry에는 해당 US의 피드백만 전달한다.
155
157
 
156
158
  success gate:
@@ -214,9 +216,9 @@ output:
214
216
 
215
217
  role instructions:
216
218
  - **4a. 최종 판정**: CodeReviewer PASS와 QA PASS가 모두 충족될 때만 완료 처리한다. 하나라도 FAIL이면 Phase 3 failure handling을 적용한다.
217
- - **4b. PR 생성**: US 단위 커밋은 Phase 2에서 이미 완료되었으므로 추가 커밋은 만들지 않는다. 현재 브랜치를 push하고 PR을 생성한다.
219
+ - **4b. 최종 checkpoint**: Phase 3에서 저장한 최종 보고서(`final-review-report.md`, `final-qa-report.md`)와 `contract.md` 상태를 `DONE`으로 갱신한 뒤, push 전에 `node "$CLAUDE_PLUGIN_ROOT/scripts/crew-agent-runner.mjs" checkpoint --message "chore(crew-dev): {task-id} final"` 를 실행하여 모든 산출물을 커밋한다.
220
+ - **4c. PR 생성**: 현재 브랜치를 push하고 PR을 생성한다.
218
221
  - PR 본문에는 구현 요약, 완료한 US 목록, 검증 결과, 최종 보고서 위치를 포함한다.
219
- - PR 생성 후 `contract.md` 상태를 `DONE`으로 갱신한다.
220
222
 
221
223
  success gate:
222
224
  - 원격 브랜치가 push되었다.
@@ -152,6 +152,8 @@ active task와 연결된 경우:
152
152
  active task가 없는 경우:
153
153
  - `.crew/runs/{run-id}/result.md`에 결과를 저장한다.
154
154
 
155
+ dispatch 경로(`action == dispatch`)에서 `complete`로 완료되면 자동으로 checkpoint 커밋을 생성한다. agent 경로(`action == agent`)에서는 자동 checkpoint가 없으므로, 오케스트레이터가 결과 처리 후 `node "$CLAUDE_PLUGIN_ROOT/scripts/crew-agent-runner.mjs" checkpoint --message "chore(crew-do): {run-id} complete"` 를 직접 호출한다. 어느 경로든 오케스트레이터의 후처리(result.md 저장, task log 업데이트) 후에도 커밋되지 않은 변경이 남아 있으면 추가 checkpoint를 실행한다.
156
+
155
157
  `blocked_on_user`이면 questions를 사용자에게 전달하고, 답변을 받은 뒤 runner의 followup 절차로 같은 dev 실행에 주입한다.
156
158
 
157
159
  `needs_agent` 또는 `needs_tool`이면 중앙 runner 계약에 따라 오케스트레이터가 처리한다.
@@ -163,7 +165,7 @@ active task가 없는 경우:
163
165
  - 오케스트레이터가 코드를 직접 작성하지 않는다.
164
166
  - `dev`는 필요한 탐색, 수정, 검증을 직접 수행한다.
165
167
  - 요청 범위를 넘는 리팩터링을 하지 않는다.
166
- - 의존성 추가, 마이그레이션, 대규모 삭제, commit, push, PR 생성은 사용자 승인 없이 하지 않는다.
168
+ - `dev` 에이전트는 의존성 추가, 마이그레이션, 대규모 삭제, commit, push, PR 생성을 하지 않는다. 완료 checkpoint 커밋은 오케스트레이터의 워크플로우 동작이며 별도 승인이 필요하지 않다.
167
169
  - 검증 가능한 명령을 실행하고, 실행하지 못한 검증은 이유를 보고한다.
168
170
  - `plan.md` 또는 `contract.md`가 없다는 이유로 direct mode를 실패 처리하지 않는다.
169
171
  - 위험하거나 되돌리기 어려운 변경은 `blocked_on_user`로 중단한다.
@@ -45,7 +45,7 @@ crew-interview의 모든 에이전트 실행은 역할이나 phase와 무관하
45
45
 
46
46
  1. `{ role, taskId, inputs, instruction, successGate, failureHandling }` 형태의 `request-file`을 작성한다.
47
47
  2. `node "$CLAUDE_PLUGIN_ROOT/scripts/crew-agent-runner.mjs" prepare --role <role> --request-file <request-file> --json`을 실행한다.
48
- 3. `action == dispatch`이면 prepare가 반환한 command 실행하고 AgentResult를 처리한다.
48
+ 3. `action == dispatch`이면 prepare가 반환한 command `--no-checkpoint`를 추가하여 실행하고 AgentResult를 처리한다. crew-interview는 다단계 워크플로우이므로 dispatch 자동 체크포인트를 사용하지 않고 워크플로우 완료 시 한 번만 checkpoint한다.
49
49
  4. `action == agent`이면 prepare가 반환한 `subagent_type`, `model`, `prompt`로 runner 계약의 Claude 경로를 실행하고 AgentResult로 정규화한다.
50
50
 
51
51
  이 순서를 생략하고 직접 하위 에이전트를 호출하지 않는다.
@@ -448,6 +448,16 @@ spec.md를 작성했습니다. 검토해주세요.
448
448
 
449
449
  ---
450
450
 
451
+ ## 워크플로우 완료 시 checkpoint
452
+
453
+ 오케스트레이터가 COMPLETE, ABORTED, 또는 ESCALATE를 반환하기 직전에, 워크플로우 중 생성된 모든 산출물(brief.md, spec.md, request-file 등)을 checkpoint 커밋한다.
454
+
455
+ ```
456
+ node "$CLAUDE_PLUGIN_ROOT/scripts/crew-agent-runner.mjs" checkpoint --message "chore(crew-interview): {task-id} complete"
457
+ ```
458
+
459
+ ---
460
+
451
461
  ## 오케스트레이터 반환 스키마
452
462
 
453
463
  **COMPLETE**:
@@ -50,7 +50,7 @@ crew-plan의 모든 에이전트 실행은 역할이나 step과 무관하게 아
50
50
 
51
51
  1. `{ role, taskId, inputs, instruction, successGate, failureHandling }` 형태의 `request-file`을 작성한다.
52
52
  2. `node "$CLAUDE_PLUGIN_ROOT/scripts/crew-agent-runner.mjs" prepare --role <role> --request-file <request-file> --json`을 실행한다.
53
- 3. `action == dispatch`이면 prepare가 반환한 command 실행하고 AgentResult를 처리한다.
53
+ 3. `action == dispatch`이면 prepare가 반환한 command `--no-checkpoint`를 추가하여 실행하고 AgentResult를 처리한다. crew-plan은 다단계 워크플로우이므로 dispatch 자동 체크포인트를 사용하지 않고 워크플로우 완료 시 한 번만 checkpoint한다.
54
54
  4. `action == agent`이면 prepare가 반환한 `subagent_type`, `model`, `prompt`로 runner 계약의 Claude 경로를 실행하고 AgentResult로 정규화한다.
55
55
 
56
56
  이 순서를 생략하고 직접 하위 에이전트를 호출하지 않는다.
@@ -363,6 +363,16 @@ Planner + PlanEvaluator 사이클은 최대 5회 (초기 1회 + retry 최대 4
363
363
 
364
364
  ---
365
365
 
366
+ ## 워크플로우 완료 시 checkpoint
367
+
368
+ 오케스트레이터가 COMPLETE 또는 ESCALATE를 반환하기 직전에, 워크플로우 중 생성된 모든 산출물(analysis.md, plan.md, review.md, contract.md, request-file 등)을 checkpoint 커밋한다.
369
+
370
+ ```
371
+ node "$CLAUDE_PLUGIN_ROOT/scripts/crew-agent-runner.mjs" checkpoint --message "chore(crew-plan): {task-id} complete"
372
+ ```
373
+
374
+ ---
375
+
366
376
  ## 오케스트레이터 반환 스키마
367
377
 
368
378
  **COMPLETE**: