vibe-commander 0.1.0

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.
Files changed (117) hide show
  1. package/LICENSE +21 -0
  2. package/dist/adapters/cli/commands/context-resolver.d.ts +29 -0
  3. package/dist/adapters/cli/commands/context-resolver.js +93 -0
  4. package/dist/adapters/cli/commands/context.d.ts +26 -0
  5. package/dist/adapters/cli/commands/context.js +39 -0
  6. package/dist/adapters/cli/commands/git-helpers.d.ts +43 -0
  7. package/dist/adapters/cli/commands/git-helpers.js +99 -0
  8. package/dist/adapters/cli/commands/init-helpers.d.ts +30 -0
  9. package/dist/adapters/cli/commands/init-helpers.js +112 -0
  10. package/dist/adapters/cli/commands/init-interactive.d.ts +25 -0
  11. package/dist/adapters/cli/commands/init-interactive.js +143 -0
  12. package/dist/adapters/cli/commands/init.d.ts +25 -0
  13. package/dist/adapters/cli/commands/init.js +73 -0
  14. package/dist/adapters/cli/commands/io-helpers.d.ts +45 -0
  15. package/dist/adapters/cli/commands/io-helpers.js +144 -0
  16. package/dist/adapters/cli/commands/list-units.d.ts +39 -0
  17. package/dist/adapters/cli/commands/list-units.js +92 -0
  18. package/dist/adapters/cli/commands/prompt-helpers.d.ts +36 -0
  19. package/dist/adapters/cli/commands/prompt-helpers.js +113 -0
  20. package/dist/adapters/cli/commands/set-unit.d.ts +44 -0
  21. package/dist/adapters/cli/commands/set-unit.js +90 -0
  22. package/dist/adapters/cli/commands/skill-install.d.ts +31 -0
  23. package/dist/adapters/cli/commands/skill-install.js +85 -0
  24. package/dist/adapters/cli/commands/state-helpers.d.ts +28 -0
  25. package/dist/adapters/cli/commands/state-helpers.js +55 -0
  26. package/dist/adapters/cli/commands/update-commit.d.ts +42 -0
  27. package/dist/adapters/cli/commands/update-commit.js +180 -0
  28. package/dist/adapters/cli/commands/validate.d.ts +40 -0
  29. package/dist/adapters/cli/commands/validate.js +219 -0
  30. package/dist/adapters/cli/formatters-list.d.ts +36 -0
  31. package/dist/adapters/cli/formatters-list.js +106 -0
  32. package/dist/adapters/cli/formatters-unit.d.ts +44 -0
  33. package/dist/adapters/cli/formatters-unit.js +287 -0
  34. package/dist/adapters/cli/formatters.d.ts +2 -0
  35. package/dist/adapters/cli/formatters.js +3 -0
  36. package/dist/adapters/cli/index.d.ts +17 -0
  37. package/dist/adapters/cli/index.js +60 -0
  38. package/dist/adapters/cli/output.d.ts +58 -0
  39. package/dist/adapters/cli/output.js +159 -0
  40. package/dist/adapters/cli/router.d.ts +99 -0
  41. package/dist/adapters/cli/router.js +419 -0
  42. package/dist/adapters/cli/scanner.d.ts +19 -0
  43. package/dist/adapters/cli/scanner.js +227 -0
  44. package/dist/adapters/pipe/stdin-reader.d.ts +23 -0
  45. package/dist/adapters/pipe/stdin-reader.js +56 -0
  46. package/dist/config/loader.d.ts +27 -0
  47. package/dist/config/loader.js +84 -0
  48. package/dist/config/resolver.d.ts +71 -0
  49. package/dist/config/resolver.js +124 -0
  50. package/dist/config/schema.d.ts +205 -0
  51. package/dist/config/schema.js +186 -0
  52. package/dist/core/parsers/backlog-parser.d.ts +25 -0
  53. package/dist/core/parsers/backlog-parser.js +255 -0
  54. package/dist/core/parsers/dep-line-parser.d.ts +36 -0
  55. package/dist/core/parsers/dep-line-parser.js +176 -0
  56. package/dist/core/parsers/dependency-extractor.d.ts +64 -0
  57. package/dist/core/parsers/dependency-extractor.js +193 -0
  58. package/dist/core/parsers/index.d.ts +20 -0
  59. package/dist/core/parsers/index.js +20 -0
  60. package/dist/core/parsers/md-utils.d.ts +81 -0
  61. package/dist/core/parsers/md-utils.js +144 -0
  62. package/dist/core/parsers/metadata-parser.d.ts +49 -0
  63. package/dist/core/parsers/metadata-parser.js +133 -0
  64. package/dist/core/parsers/pairing-question-extractor.d.ts +42 -0
  65. package/dist/core/parsers/pairing-question-extractor.js +146 -0
  66. package/dist/core/parsers/plan-parser-helpers.d.ts +61 -0
  67. package/dist/core/parsers/plan-parser-helpers.js +90 -0
  68. package/dist/core/parsers/plan-parser.d.ts +55 -0
  69. package/dist/core/parsers/plan-parser.js +69 -0
  70. package/dist/core/parsers/title-extractor.d.ts +36 -0
  71. package/dist/core/parsers/title-extractor.js +101 -0
  72. package/dist/core/renderers/index.d.ts +15 -0
  73. package/dist/core/renderers/index.js +18 -0
  74. package/dist/core/renderers/interpolate.d.ts +92 -0
  75. package/dist/core/renderers/interpolate.js +117 -0
  76. package/dist/core/renderers/marker-utils.d.ts +60 -0
  77. package/dist/core/renderers/marker-utils.js +85 -0
  78. package/dist/core/renderers/section-renderer.d.ts +31 -0
  79. package/dist/core/renderers/section-renderer.js +171 -0
  80. package/dist/core/renderers/section-updater.d.ts +72 -0
  81. package/dist/core/renderers/section-updater.js +175 -0
  82. package/dist/core/renderers/template-engine.d.ts +69 -0
  83. package/dist/core/renderers/template-engine.js +92 -0
  84. package/dist/core/renderers/updater-helpers.d.ts +45 -0
  85. package/dist/core/renderers/updater-helpers.js +83 -0
  86. package/dist/core/resolvers/commit-filter.d.ts +84 -0
  87. package/dist/core/resolvers/commit-filter.js +95 -0
  88. package/dist/core/resolvers/config-generator.d.ts +32 -0
  89. package/dist/core/resolvers/config-generator.js +112 -0
  90. package/dist/core/resolvers/config-merger.d.ts +26 -0
  91. package/dist/core/resolvers/config-merger.js +89 -0
  92. package/dist/core/resolvers/config-validator.d.ts +42 -0
  93. package/dist/core/resolvers/config-validator.js +61 -0
  94. package/dist/core/resolvers/dep-commit-resolver.d.ts +63 -0
  95. package/dist/core/resolvers/dep-commit-resolver.js +158 -0
  96. package/dist/core/resolvers/dep-doc-resolver.d.ts +70 -0
  97. package/dist/core/resolvers/dep-doc-resolver.js +84 -0
  98. package/dist/core/resolvers/index.d.ts +15 -0
  99. package/dist/core/resolvers/index.js +12 -0
  100. package/dist/index.d.ts +8 -0
  101. package/dist/index.js +8 -0
  102. package/dist/types/config.d.ts +10 -0
  103. package/dist/types/config.js +10 -0
  104. package/dist/types/context.d.ts +55 -0
  105. package/dist/types/context.js +10 -0
  106. package/dist/types/index.d.ts +15 -0
  107. package/dist/types/index.js +10 -0
  108. package/dist/types/init.d.ts +56 -0
  109. package/dist/types/init.js +10 -0
  110. package/dist/types/tool-result.d.ts +75 -0
  111. package/dist/types/tool-result.js +40 -0
  112. package/dist/types/unit.d.ts +118 -0
  113. package/dist/types/unit.js +10 -0
  114. package/package.json +71 -0
  115. package/skills/claude/SKILL.md +375 -0
  116. package/skills/common/cli-reference.md +251 -0
  117. package/skills/cursor/SKILL.md +353 -0
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "vibe-commander",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Unit-based vibe coding workflow automation CLI — automate context collection from unit ID to command file in 10 seconds",
6
+ "license": "MIT",
7
+ "author": "viilab",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/viilab/vibe-commander.git"
11
+ },
12
+ "homepage": "https://github.com/viilab/vibe-commander#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/viilab/vibe-commander/issues"
15
+ },
16
+ "keywords": [
17
+ "vibe-coding",
18
+ "cli",
19
+ "agent",
20
+ "workflow",
21
+ "automation",
22
+ "ai-coding",
23
+ "unit-based",
24
+ "context-collection",
25
+ "cursor",
26
+ "claude"
27
+ ],
28
+ "bin": {
29
+ "vc": "./dist/adapters/cli/index.js",
30
+ "vibe-commander": "./dist/adapters/cli/index.js"
31
+ },
32
+ "files": [
33
+ "dist/**/*.js",
34
+ "dist/**/*.d.ts",
35
+ "!dist/**/*.d.ts.map",
36
+ "skills/",
37
+ "LICENSE",
38
+ "README.md"
39
+ ],
40
+ "scripts": {
41
+ "dev": "tsx src/adapters/cli/index.ts",
42
+ "build": "tsc -p tsconfig.build.json",
43
+ "test": "vitest run",
44
+ "test:watch": "vitest",
45
+ "test:coverage": "vitest run --coverage",
46
+ "lint": "eslint src/",
47
+ "lint:fix": "eslint src/ --fix",
48
+ "format": "prettier --write \"src/**/*.ts\"",
49
+ "format:check": "prettier --check \"src/**/*.ts\"",
50
+ "typecheck": "tsc --noEmit",
51
+ "check": "npm run typecheck && npm run lint && npm run format:check && npm run test"
52
+ },
53
+ "dependencies": {
54
+ "zod": "^4.3.6"
55
+ },
56
+ "devDependencies": {
57
+ "@eslint/js": "^9.39.2",
58
+ "@types/node": "^25.2.1",
59
+ "@vitest/coverage-v8": "^4.0.18",
60
+ "eslint": "^9.39.2",
61
+ "jiti": "^2.6.1",
62
+ "prettier": "^3.8.1",
63
+ "tsx": "^4.19.4",
64
+ "typescript": "^5.9.3",
65
+ "typescript-eslint": "^8.54.0",
66
+ "vitest": "^4.0.18"
67
+ },
68
+ "engines": {
69
+ "node": ">=24.0.0"
70
+ }
71
+ }
@@ -0,0 +1,375 @@
1
+ ---
2
+ name: vibe-commander
3
+ description: vibe-commander CLI(vc)를 활용하여 유닛 기반 워크플로우를 자동화합니다. 유닛 전환, 커밋 추적, 컨텍스트 수집, 설정 검증 요청 시 사용합니다.
4
+ metadata:
5
+ version: 1.0.0
6
+ category: workflow-automation
7
+ tags: [vc, vibe-commander, unit, set-unit, update-commit, list-units, context, validate, init, workflow, 유닛, 커맨드]
8
+ ---
9
+
10
+ # vibe-commander CLI 사용 가이드
11
+
12
+ vibe-commander(`vc`)는 유닛 기반 바이브 코딩 워크플로우를 자동화하는 CLI 도구입니다.
13
+ 유닛 ID 하나로 커맨드 파일 섹션을 자동 생성하여, 에이전트의 컨텍스트 준비 시간을 단축합니다.
14
+
15
+ ## Instructions (Synced from skills/common/cli-reference.md)
16
+
17
+ ### Step 1: 프로젝트 설정 확인
18
+
19
+ 작업 시작 전, 프로젝트 루트에 `vibe-commander.config.json`이 있는지 확인합니다.
20
+
21
+ ```bash
22
+ vc validate
23
+ ```
24
+
25
+ 설정이 없으면 초기화합니다:
26
+
27
+ ```bash
28
+ vc init --from-existing # 기존 파일 스캔으로 자동 감지
29
+ vc init # 대화형으로 직접 입력
30
+ ```
31
+
32
+ ### Step 2: 유닛 전환 워크플로우
33
+
34
+ 에이전트가 유닛 작업을 수행할 때의 표준 흐름:
35
+
36
+ ```
37
+ 1. vc list-units → 착수 가능 유닛 확인
38
+ 2. vc set-unit <unitId> → 커맨드 파일 자동 구성
39
+ 3. (에이전트가 코드 작업 수행)
40
+ 4. vc update-commit → HEAD 커밋 SHA 자동 추적
41
+ 5. vc set-unit <nextUnitId> → 다음 유닛 전환
42
+ ```
43
+
44
+ ### Step 3: 컨텍스트 조회 (읽기 전용)
45
+
46
+ 커맨드 파일을 수정하지 않고 유닛 정보만 확인할 때:
47
+
48
+ ```bash
49
+ vc context <unitId> --json
50
+ ```
51
+
52
+ ## CLI 레퍼런스
53
+
54
+ ### `vc set-unit <unitId>` — 현재 작업 유닛 설정
55
+
56
+ 커맨드 파일의 해당 섹션을 자동으로 구성합니다.
57
+
58
+ ```bash
59
+ vc set-unit "U-013[Mvp]"
60
+ vc set-unit "U-013[Mvp]" --request mcp-nanobanana,doc-update
61
+ vc set-unit "U-013[Mvp]" --no-prompt # 페어링 질문 프롬프트 비활성화
62
+ vc set-unit "U-013[Mvp]" --json # JSON ToolResult 출력
63
+ ```
64
+
65
+ **동작**: 유닛 ID → 유형 자동 매칭 → 계획서 파싱 → 의존성 문서/커밋 수집 → 커맨드 파일 섹션 교체
66
+
67
+ **옵션**:
68
+ | 옵션 | 설명 |
69
+ |------|------|
70
+ | `--request <key1,key2>` | `customRequests`에서 키로 특별 요청사항 선택 |
71
+ | `--no-prompt` | 페어링 질문 인터랙티브 프롬프트 비활성화 |
72
+ | `--json` | JSON ToolResult 구조로 출력 |
73
+ | `--stdin` | stdin에서 JSON 입력 (`{"unitId":"..."}`) |
74
+
75
+ ### `vc update-commit [sha|N]` — 커밋 SHA 업데이트
76
+
77
+ ```bash
78
+ vc update-commit # HEAD SHA 자동 감지
79
+ vc update-commit 3 # 최근 3개 커밋 SHA
80
+ vc update-commit abc1234 # 특정 SHA 지정
81
+ vc update-commit abc1234 --mode append # 기존 값에 추가
82
+ ```
83
+
84
+ **옵션**:
85
+ | 옵션 | 설명 |
86
+ |------|------|
87
+ | `--mode replace\|append` | 값 교체(기본) 또는 기존 값에 추가 |
88
+ | `--section <name>` | 대상 섹션 지정 (미지정 시 자동 감지) |
89
+
90
+ ### `vc list-units` — 미완료 유닛 목록
91
+
92
+ ```bash
93
+ vc list-units # 전체 미완료 유닛
94
+ vc list-units --phase Mvp # 특정 phase 필터
95
+ vc list-units --json # JSON 출력
96
+ ```
97
+
98
+ **출력 분류**: `ready`(착수 가능), `inProgress`(진행중), `blocked`(의존성 미충족)
99
+
100
+ ### `vc context <unitId>` — 유닛 컨텍스트 조회
101
+
102
+ `set-unit`과 동일한 파싱을 수행하되, 커맨드 파일을 수정하지 않습니다.
103
+
104
+ ```bash
105
+ vc context "U-013[Mvp]" --json
106
+ ```
107
+
108
+ ### `vc validate` — 설정 검증
109
+
110
+ 설정 파일의 스키마, 경로 존재, 정규식 유효성, 패턴 충돌을 4단계로 검증합니다.
111
+
112
+ ```bash
113
+ vc validate # 사람용 포맷 리포트
114
+ vc validate --json # JSON ToolResult
115
+ ```
116
+
117
+ ### `vc init` — 프로젝트 초기화
118
+
119
+ ```bash
120
+ vc init # 대화형 설정 생성
121
+ vc init --from-existing # 기존 .md 파일 스캔 → 패턴 자동 감지 → 설정 생성
122
+ ```
123
+
124
+ `--from-existing`은 기존 설정이 있으면 커스텀 필드를 보존하며 병합합니다.
125
+
126
+ ### 파이프 모드 (에이전트/오케스트레이터 연동)
127
+
128
+ 모든 명령어에 `--json`과 `--stdin`을 조합하여 프로그래밍 방식으로 사용할 수 있습니다.
129
+
130
+ ```bash
131
+ echo '{"unitId":"U-013[Mvp]"}' | vc set-unit --stdin --json
132
+ echo '{"count":3}' | vc update-commit --stdin --json
133
+ echo '{}' | vc list-units --stdin --json
134
+ echo '{"unitId":"U-013[Mvp]"}' | vc context --stdin --json
135
+ ```
136
+
137
+ **출력 규약**:
138
+ - `stdout`: JSON ToolResult만 출력 (파이프라인 호환)
139
+ - `stderr`: 로그, 경고, 에러 메시지
140
+
141
+ ## Rules
142
+
143
+ ### 에이전트 워크플로우에서의 사용 패턴
144
+
145
+ **Do ✅ — 유닛 시작 시**:
146
+
147
+ 1. `vc set-unit <unitId> --json --no-prompt`으로 커맨드 파일 구성
148
+ 2. 반환된 JSON에서 `pairingQuestions` 확인 → 미결정 항목이 있으면 사용자에게 전달
149
+ 3. `docsFound`의 의존성 문서를 컨텍스트에 포함
150
+
151
+ **Do ✅ — 커밋 후**:
152
+
153
+ 1. `vc update-commit`으로 HEAD SHA 자동 업데이트
154
+ 2. 여러 커밋이 누적되었으면 `vc update-commit N`으로 최근 N개 수집
155
+
156
+ **Do ✅ — 다음 유닛 확인 시**:
157
+
158
+ 1. `vc list-units --json`으로 착수 가능 유닛 목록 확인
159
+ 2. `ready` 목록에서 사용자가 선택한 유닛으로 `vc set-unit` 실행
160
+
161
+ **Don't ❌**:
162
+
163
+ - 커맨드 파일을 직접 편집하여 유닛 정보 삽입 (반드시 `vc set-unit` 사용)
164
+ - `--json` 없이 파이프라인에서 사용 (stdout에 사람용 포맷 출력됨)
165
+ - 유효하지 않은 유닛 ID로 `set-unit` 호출 (설정의 `idPattern`에 매칭되어야 함)
166
+
167
+ ### ToolResult 응답 처리
168
+
169
+ 모든 `--json` 출력은 아래 구조를 따릅니다:
170
+
171
+ ```json
172
+ {
173
+ "success": true,
174
+ "data": { /* 명령어별 결과 데이터 */ }
175
+ }
176
+ ```
177
+
178
+ 실패 시:
179
+
180
+ ```json
181
+ {
182
+ "success": false,
183
+ "error": {
184
+ "code": "PLAN_NOT_FOUND",
185
+ "message": "계획서를 찾을 수 없음: vibe/unit-plans/U-999.md"
186
+ }
187
+ }
188
+ ```
189
+
190
+ 주요 에러 코드:
191
+ | 코드 | 의미 |
192
+ |------|------|
193
+ | `CONFIG_NOT_FOUND` | 설정 파일 없음 → `vc init` 실행 |
194
+ | `CONFIG_INVALID` | 설정 파일 스키마 오류 → `vc validate`로 확인 |
195
+ | `PLAN_NOT_FOUND` | 계획서 파일 없음 → 경로 확인 |
196
+ | `UNIT_TYPE_NOT_FOUND` | ID가 어떤 unitType에도 매칭 안 됨 → 설정의 idPattern 확인 |
197
+ | `COMMANDS_FILE_NOT_FOUND` | 커맨드 파일 없음 → `paths.commands` 경로 확인 |
198
+ | `ROADMAP_NOT_CONFIGURED` | 로드맵 미설정 → `paths.roadmap` 설정 필요 |
199
+
200
+ ## 설정 파일 가이드
201
+
202
+ ### 최소 필수 구조
203
+
204
+ ```jsonc
205
+ {
206
+ "version": 1,
207
+ "paths": {
208
+ "commands": "vibe/commands.md", // 커맨드 파일 경로 (필수)
209
+ "roadmap": "vibe/roadmap.md", // null이면 list-units 비활성화
210
+ "docRoots": {
211
+ "plan": "vibe/unit-plans", // 계획서 디렉토리
212
+ "result": "vibe/unit-results" // 결과 보고서 디렉토리
213
+ }
214
+ },
215
+ "unitTypes": [
216
+ {
217
+ "key": "implement",
218
+ "idPattern": "^(U-\\d+|CP-).*", // 정규식으로 유닛 ID 매칭
219
+ "planDir": "plan", // docRoots 키 참조
220
+ "commandSection": "# 유닛 구현", // 커맨드 파일 섹션 헤더
221
+ "collectDeps": true, // 의존성 수집 여부
222
+ "headerTemplate": "### 현재 구현 유닛: {{title}}\n- 계획서: @{{planPath}}"
223
+ }
224
+ ],
225
+ "docDiscovery": {
226
+ "plan": { "pattern": "{{unitId}}.md" },
227
+ "result": { "pattern": "{{unitId}}.md" }
228
+ },
229
+ "planParsing": {
230
+ "titleSource": "h1",
231
+ "dependsSource": "section",
232
+ "dependsSectionName": "이전 작업에서 가져올 것",
233
+ "pairingQuestionSection": "페어링 질문"
234
+ }
235
+ }
236
+ ```
237
+
238
+ ### 템플릿 변수
239
+
240
+ `headerTemplate`에서 사용 가능한 변수:
241
+
242
+ | 변수 | 설명 | 예시 |
243
+ |------|------|------|
244
+ | `{{unitId}}` | 원본 유닛 ID | `U-118[Mmp]` |
245
+ | `{{shortId}}` | phase 제거 | `U-118` |
246
+ | `{{title}}` | 전체 제목 (ID 포함) | `U-118[Mmp]: 마크다운 이미지 링크 삽입` |
247
+ | `{{titleOnly}}` | 제목만 (ID 제외) | `마크다운 이미지 링크 삽입` |
248
+ | `{{planPath}}` | 계획서 상대 경로 | `vibe/unit-plans/U-118[Mmp].md` |
249
+ | `{{phase}}` | phase 문자열 | `Mmp` |
250
+
251
+ ### 유닛 유형 우선순위
252
+
253
+ `unitTypes` 배열 순서가 매칭 우선순위입니다. 더 구체적인 패턴을 앞에 배치하세요.
254
+
255
+ ```jsonc
256
+ "unitTypes": [
257
+ { "key": "refactor-sub", "idPattern": "^RU-\\d+-[A-Z]\\d+$" }, // 구체적 → 먼저
258
+ { "key": "implement", "idPattern": "^(U-\\d+|CP-).*" }, // 일반적 → 나중
259
+ { "key": "refactor", "idPattern": "^RU-\\d+\\[.*\\]$" }
260
+ ]
261
+ ```
262
+
263
+ ## Claude Code 통합
264
+
265
+ ### SKILL 설치 위치
266
+
267
+ 이 SKILL 파일은 `vc skill install --claude` 실행 시 아래 경로에 자동 설치됩니다:
268
+
269
+ ```
270
+ .claude/skills/vibe-commander/SKILL.md
271
+ ```
272
+
273
+ ### CLAUDE.md 동적 로딩 연동
274
+
275
+ 프로젝트의 `CLAUDE.md`에 vibe-commander SKILL을 등록하여 자동 로딩할 수 있습니다.
276
+
277
+ ```markdown
278
+ ## 등록된 SKILL 목록
279
+
280
+ | SKILL | 경로 | 트리거 키워드 |
281
+ |-------|------|--------------|
282
+ | vibe-commander | `.claude/skills/vibe-commander/SKILL.md` | [vc, vibe-commander, unit, set-unit, update-commit, 유닛, 워크플로우] |
283
+ ```
284
+
285
+ 동적 로딩 규칙 예시:
286
+
287
+ ```markdown
288
+ - **[트리거: "vc", "유닛 전환", "set-unit", "커맨드 파일"]**:
289
+ - SKILL: `.claude/skills/vibe-commander/SKILL.md` 읽기
290
+ - CLI 명령어로 워크플로우 자동화
291
+ ```
292
+
293
+ ### 슬래시 커맨드와 연동
294
+
295
+ Claude Code의 커스텀 슬래시 커맨드(`.claude/commands/`)에서 `vc` CLI를 호출하여
296
+ 유닛 구현 워크플로우를 자동화할 수 있습니다:
297
+
298
+ ```markdown
299
+ # .claude/commands/unit-start.md
300
+ ## 유닛 시작 자동화
301
+
302
+ 1. `vc set-unit $ARGUMENTS --json --no-prompt` 실행
303
+ 2. 반환된 컨텍스트로 작업 시작
304
+ 3. 커밋 후 `vc update-commit` 실행
305
+ ```
306
+
307
+ ### Bash 도구 활용 패턴
308
+
309
+ Claude Code에서는 Bash 도구로 `vc` CLI를 직접 실행합니다:
310
+
311
+ ```bash
312
+ # 유닛 설정 (JSON 모드)
313
+ vc set-unit "U-013[Mvp]" --json --no-prompt
314
+
315
+ # 결과를 파싱하여 의존성 문서 확인
316
+ vc context "U-013[Mvp]" --json | jq '.data.docsFound'
317
+ ```
318
+
319
+ ## Examples
320
+
321
+ ### Example 1: 새 유닛 작업 시작
322
+
323
+ 사용자가 "U-112[Mmp] 유닛 구현해줘"라고 요청한 경우:
324
+
325
+ 1. `vc set-unit "U-112[Mmp]" --json --no-prompt` 실행
326
+ 2. 커맨드 파일이 자동 구성됨 — 계획서, 의존성 문서, 커밋 SHA 포함
327
+ 3. 반환된 JSON의 `planPath`에서 계획서를 읽어 작업 시작
328
+ 4. 작업 중 커밋 발생 시 `vc update-commit` 실행
329
+
330
+ ### Example 2: 다음 착수 가능 유닛 확인
331
+
332
+ 사용자가 "다음에 뭐 하면 돼?"라고 질문한 경우:
333
+
334
+ 1. `vc list-units --json` 실행
335
+ 2. `ready` 목록에서 착수 가능 유닛 제시
336
+ 3. 사용자가 선택하면 `vc set-unit` 실행
337
+
338
+ ### Example 3: 파이프라인 연동
339
+
340
+ 오케스트레이터가 JSON 파이프로 유닛을 설정하는 경우:
341
+
342
+ ```bash
343
+ echo '{"unitId":"U-013[Mvp]"}' | vc set-unit --stdin --json
344
+ ```
345
+
346
+ 결과를 파싱하여 에이전트에 컨텍스트를 주입합니다.
347
+
348
+ ## Troubleshooting
349
+
350
+ ### Error: CONFIG_NOT_FOUND
351
+ **원인**: 프로젝트 루트에 `vibe-commander.config.json`이 없음
352
+ **해결**: `vc init` 또는 `vc init --from-existing` 실행
353
+
354
+ ### Error: UNIT_TYPE_NOT_FOUND
355
+ **원인**: 입력한 유닛 ID가 설정의 어떤 `idPattern`에도 매칭되지 않음
356
+ **해결**: `vibe-commander.config.json`의 `unitTypes[].idPattern` 정규식 확인. `vc validate`로 패턴 충돌 여부 점검
357
+
358
+ ### Error: PLAN_NOT_FOUND
359
+ **원인**: 해당 유닛의 계획서 파일이 `docRoots.plan` 디렉토리에 없음
360
+ **해결**: 계획서 파일명이 `docDiscovery.plan.pattern`과 일치하는지 확인 (기본: `{{unitId}}.md`)
361
+
362
+ ### Error: COMMANDS_FILE_NOT_FOUND
363
+ **원인**: `paths.commands`에 지정된 커맨드 파일이 없음
364
+ **해결**: 파일을 생성하거나 `paths.commands` 경로 수정
365
+
366
+ ### Error: set-unit 후 섹션이 갱신되지 않음
367
+ **원인**: 커맨드 파일에 HTML 주석 마커(`<!-- vc:begin:key -->`)가 없거나 섹션 헤더 불일치
368
+ **해결**: `commandSections.useMarkers: true`이면 마커 존재 확인. 마커가 없으면 `commandSection` 헤더 텍스트가 정확한지 확인
369
+
370
+ ## References
371
+
372
+ - CLI 도움말: `vc --help`
373
+ - 설정 파일 예시: 프로젝트 루트의 `vibe-commander.config.json`
374
+ - PRD: `vibe/prd.md` §6 기능 명세, §7.2 SKILL 파일 인터페이스
375
+ - 아키텍처: `vibe/architecture.md`
@@ -0,0 +1,251 @@
1
+ # vibe-commander CLI 사용 가이드 (Common)
2
+
3
+ vibe-commander(`vc`)는 유닛 기반 바이브 코딩 워크플로우를 자동화하는 CLI 도구입니다.
4
+ 유닛 ID 하나로 커맨드 파일 섹션을 자동 생성하여, 에이전트의 컨텍스트 준비 시간을 단축합니다.
5
+
6
+ ## Instructions
7
+
8
+ ### Step 1: 프로젝트 설정 확인
9
+
10
+ 작업 시작 전, 프로젝트 루트에 `vibe-commander.config.json`이 있는지 확인합니다.
11
+
12
+ ```bash
13
+ vc validate
14
+ ```
15
+
16
+ 설정이 없으면 초기화합니다:
17
+
18
+ ```bash
19
+ vc init --from-existing # 기존 파일 스캔으로 자동 감지
20
+ vc init # 대화형으로 직접 입력
21
+ ```
22
+
23
+ ### Step 2: 유닛 전환 워크플로우
24
+
25
+ 에이전트가 유닛 작업을 수행할 때의 표준 흐름:
26
+
27
+ ```
28
+ 1. vc list-units → 착수 가능 유닛 확인
29
+ 2. vc set-unit <unitId> → 커맨드 파일 자동 구성
30
+ 3. (에이전트가 코드 작업 수행)
31
+ 4. vc update-commit → HEAD 커밋 SHA 자동 추적
32
+ 5. vc set-unit <nextUnitId> → 다음 유닛 전환
33
+ ```
34
+
35
+ ### Step 3: 컨텍스트 조회 (읽기 전용)
36
+
37
+ 커맨드 파일을 수정하지 않고 유닛 정보만 확인할 때:
38
+
39
+ ```bash
40
+ vc context <unitId> --json
41
+ ```
42
+
43
+ ## CLI 레퍼런스
44
+
45
+ ### `vc set-unit <unitId>` — 현재 작업 유닛 설정
46
+
47
+ 커맨드 파일의 해당 섹션을 자동으로 구성합니다.
48
+
49
+ ```bash
50
+ vc set-unit "U-013[Mvp]"
51
+ vc set-unit "U-013[Mvp]" --request mcp-nanobanana,doc-update
52
+ vc set-unit "U-013[Mvp]" --no-prompt # 페어링 질문 프롬프트 비활성화
53
+ vc set-unit "U-013[Mvp]" --json # JSON ToolResult 출력
54
+ ```
55
+
56
+ **동작**: 유닛 ID → 유형 자동 매칭 → 계획서 파싱 → 의존성 문서/커밋 수집 → 커맨드 파일 섹션 교체
57
+
58
+ **옵션**:
59
+ | 옵션 | 설명 |
60
+ |------|------|
61
+ | `--request <key1,key2>` | `customRequests`에서 키로 특별 요청사항 선택 |
62
+ | `--no-prompt` | 페어링 질문 인터랙티브 프롬프트 비활성화 |
63
+ | `--json` | JSON ToolResult 구조로 출력 |
64
+ | `--stdin` | stdin에서 JSON 입력 (`{"unitId":"..."}`) |
65
+
66
+ ### `vc update-commit [sha|N]` — 커밋 SHA 업데이트
67
+
68
+ ```bash
69
+ vc update-commit # HEAD SHA 자동 감지
70
+ vc update-commit 3 # 최근 3개 커밋 SHA
71
+ vc update-commit abc1234 # 특정 SHA 지정
72
+ vc update-commit abc1234 --mode append # 기존 값에 추가
73
+ ```
74
+
75
+ **옵션**:
76
+ | 옵션 | 설명 |
77
+ |------|------|
78
+ | `--mode replace|append` | 값 교체(기본) 또는 기존 값에 추가 |
79
+ | `--section <name>` | 대상 섹션 지정 (미지정 시 자동 감지) |
80
+
81
+ ### `vc list-units` — 미완료 유닛 목록
82
+
83
+ ```bash
84
+ vc list-units # 전체 미완료 유닛
85
+ vc list-units --phase Mvp # 특정 phase 필터
86
+ vc list-units --json # JSON 출력
87
+ ```
88
+
89
+ **출력 분류**: `ready`(착수 가능), `inProgress`(진행중), `blocked`(의존성 미충족)
90
+
91
+ ### `vc context <unitId>` — 유닛 컨텍스트 조회
92
+
93
+ `set-unit`과 동일한 파싱을 수행하되, 커맨드 파일을 수정하지 않습니다.
94
+
95
+ ```bash
96
+ vc context "U-013[Mvp]" --json
97
+ ```
98
+
99
+ ### `vc validate` — 설정 검증
100
+
101
+ 설정 파일의 스키마, 경로 존재, 정규식 유효성, 패턴 충돌을 4단계로 검증합니다.
102
+
103
+ ```bash
104
+ vc validate # 사람용 포맷 리포트
105
+ vc validate --json # JSON ToolResult
106
+ ```
107
+
108
+ ### `vc init` — 프로젝트 초기화
109
+
110
+ ```bash
111
+ vc init # 대화형 설정 생성
112
+ vc init --from-existing # 기존 .md 파일 스캔 → 패턴 자동 감지 → 설정 생성
113
+ ```
114
+
115
+ `--from-existing`은 기존 설정이 있으면 커스텀 필드를 보존하며 병합합니다.
116
+
117
+ ### 파이프 모드 (에이전트/오케스트레이터 연동)
118
+
119
+ 모든 명령어에 `--json`과 `--stdin`을 조합하여 프로그래밍 방식으로 사용할 수 있습니다.
120
+
121
+ ```bash
122
+ echo '{"unitId":"U-013[Mvp]"}' | vc set-unit --stdin --json
123
+ echo '{"count":3}' | vc update-commit --stdin --json
124
+ echo '{}' | vc list-units --stdin --json
125
+ echo '{"unitId":"U-013[Mvp]"}' | vc context --stdin --json
126
+ ```
127
+
128
+ **출력 규약**:
129
+ - `stdout`: JSON ToolResult만 출력 (파이프라인 호환)
130
+ - `stderr`: 로그, 경고, 에러 메시지
131
+
132
+ ## Rules
133
+
134
+ ### 에이전트 워크플로우에서의 사용 패턴
135
+
136
+ **Do ✅ — 유닛 시작 시**:
137
+
138
+ 1. `vc set-unit <unitId> --json --no-prompt`으로 커맨드 파일 구성
139
+ 2. 반환된 JSON에서 `pairingQuestions` 확인 → 미결정 항목이 있으면 사용자에게 전달
140
+ 3. `docsFound`의 의존성 문서를 컨텍스트에 포함
141
+
142
+ **Do ✅ — 커밋 후**:
143
+
144
+ 1. `vc update-commit`으로 HEAD SHA 자동 업데이트
145
+ 2. 여러 커밋이 누적되었으면 `vc update-commit N`으로 최근 N개 수집
146
+
147
+ **Do ✅ — 다음 유닛 확인 시**:
148
+
149
+ 1. `vc list-units --json`으로 착수 가능 유닛 목록 확인
150
+ 2. `ready` 목록에서 사용자가 선택한 유닛으로 `vc set-unit` 실행
151
+
152
+ **Don't ❌**:
153
+
154
+ - 커맨드 파일을 직접 편집하여 유닛 정보 삽입 (반드시 `vc set-unit` 사용)
155
+ - `--json` 없이 파이프라인에서 사용 (stdout에 사람용 포맷 출력됨)
156
+ - 유효하지 않은 유닛 ID로 `set-unit` 호출 (설정의 `idPattern`에 매칭되어야 함)
157
+
158
+ ### ToolResult 응답 처리
159
+
160
+ 모든 `--json` 출력은 아래 구조를 따릅니다:
161
+
162
+ ```json
163
+ {
164
+ "success": true,
165
+ "data": { /* 명령어별 결과 데이터 */ }
166
+ }
167
+ ```
168
+
169
+ 실패 시:
170
+
171
+ ```json
172
+ {
173
+ "success": false,
174
+ "error": {
175
+ "code": "PLAN_NOT_FOUND",
176
+ "message": "계획서를 찾을 수 없음: vibe/unit-plans/U-999.md"
177
+ }
178
+ }
179
+ ```
180
+
181
+ 주요 에러 코드:
182
+ | 코드 | 의미 |
183
+ |------|------|
184
+ | `CONFIG_NOT_FOUND` | 설정 파일 없음 → `vc init` 실행 |
185
+ | `CONFIG_INVALID` | 설정 파일 스키마 오류 → `vc validate`로 확인 |
186
+ | `PLAN_NOT_FOUND` | 계획서 파일 없음 → 경로 확인 |
187
+ | `UNIT_TYPE_NOT_FOUND` | ID가 어떤 unitType에도 매칭 안 됨 → 설정의 idPattern 확인 |
188
+ | `COMMANDS_FILE_NOT_FOUND` | 커맨드 파일 없음 → `paths.commands` 경로 확인 |
189
+ | `ROADMAP_NOT_CONFIGURED` | 로드맵 미설정 → `paths.roadmap` 설정 필요 |
190
+
191
+ ## 설정 파일 가이드
192
+
193
+ ### 최소 필수 구조
194
+
195
+ ```jsonc
196
+ {
197
+ "version": 1,
198
+ "paths": {
199
+ "commands": "vibe/commands.md", // 커맨드 파일 경로 (필수)
200
+ "roadmap": "vibe/roadmap.md", // null이면 list-units 비활성화
201
+ "docRoots": {
202
+ "plan": "vibe/unit-plans", // 계획서 디렉토리
203
+ "result": "vibe/unit-results" // 결과 보고서 디렉토리
204
+ }
205
+ },
206
+ "unitTypes": [
207
+ {
208
+ "key": "implement",
209
+ "idPattern": "^(U-\d+|CP-).*", // 정규식으로 유닛 ID 매칭
210
+ "planDir": "plan", // docRoots 키 참조
211
+ "commandSection": "# 유닛 구현", // 커맨드 파일 섹션 헤더
212
+ "collectDeps": true, // 의존성 수집 여부
213
+ "headerTemplate": "### 현재 구현 유닛: {{title}}\n- 계획서: @{{planPath}}"
214
+ }
215
+ ],
216
+ "docDiscovery": {
217
+ "plan": { "pattern": "{{unitId}}.md" },
218
+ "result": { "pattern": "{{unitId}}.md" }
219
+ },
220
+ "planParsing": {
221
+ "titleSource": "h1",
222
+ "dependsSource": "section",
223
+ "dependsSectionName": "이전 작업에서 가져올 것",
224
+ "pairingQuestionSection": "페어링 질문"
225
+ }
226
+ }
227
+ ```
228
+
229
+ ### Troubleshooting
230
+
231
+ ### Error: CONFIG_NOT_FOUND
232
+ **원인**: 프로젝트 루트에 `vibe-commander.config.json`이 없음
233
+ **해결**: `vc init` 또는 `vc init --from-existing` 실행
234
+
235
+ ### Error: UNIT_TYPE_NOT_FOUND
236
+ **원인**: 입력한 유닛 ID가 설정의 어떤 `idPattern`에도 매칭되지 않음
237
+ **해결**: `vibe-commander.config.json`의 `unitTypes[].idPattern` 정규식 확인. `vc validate`로 패턴 충돌 여부 점검
238
+
239
+ ### Error: PLAN_NOT_FOUND
240
+ **원인**: 해당 유닛의 계획서 파일이 `docRoots.plan` 디렉토리에 없음
241
+ **해결**: 계획서 파일명이 `docDiscovery.plan.pattern`과 일치하는지 확인 (기본: `{{unitId}}.md`)
242
+
243
+ ### Error: COMMANDS_FILE_NOT_FOUND
244
+ **원인**: `paths.commands`에 지정된 커맨드 파일이 없음
245
+ **해결**: 파일을 생성하거나 `paths.commands` 경로 수정
246
+
247
+ ### Error: set-unit 후 섹션이 갱신되지 않음
248
+ **원인**: 커맨드 파일에 HTML 주석 마커(`<!-- vc:begin:key -->`)가 없거나 섹션 헤더 불일치
249
+ **해결**: `commandSections.useMarkers: true`이면 마커 존재 확인. 마커가 없으면 `commandSection` 헤더 텍스트가 정확한지 확인
250
+
251
+ ```