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.
- package/LICENSE +21 -0
- package/dist/adapters/cli/commands/context-resolver.d.ts +29 -0
- package/dist/adapters/cli/commands/context-resolver.js +93 -0
- package/dist/adapters/cli/commands/context.d.ts +26 -0
- package/dist/adapters/cli/commands/context.js +39 -0
- package/dist/adapters/cli/commands/git-helpers.d.ts +43 -0
- package/dist/adapters/cli/commands/git-helpers.js +99 -0
- package/dist/adapters/cli/commands/init-helpers.d.ts +30 -0
- package/dist/adapters/cli/commands/init-helpers.js +112 -0
- package/dist/adapters/cli/commands/init-interactive.d.ts +25 -0
- package/dist/adapters/cli/commands/init-interactive.js +143 -0
- package/dist/adapters/cli/commands/init.d.ts +25 -0
- package/dist/adapters/cli/commands/init.js +73 -0
- package/dist/adapters/cli/commands/io-helpers.d.ts +45 -0
- package/dist/adapters/cli/commands/io-helpers.js +144 -0
- package/dist/adapters/cli/commands/list-units.d.ts +39 -0
- package/dist/adapters/cli/commands/list-units.js +92 -0
- package/dist/adapters/cli/commands/prompt-helpers.d.ts +36 -0
- package/dist/adapters/cli/commands/prompt-helpers.js +113 -0
- package/dist/adapters/cli/commands/set-unit.d.ts +44 -0
- package/dist/adapters/cli/commands/set-unit.js +90 -0
- package/dist/adapters/cli/commands/skill-install.d.ts +31 -0
- package/dist/adapters/cli/commands/skill-install.js +85 -0
- package/dist/adapters/cli/commands/state-helpers.d.ts +28 -0
- package/dist/adapters/cli/commands/state-helpers.js +55 -0
- package/dist/adapters/cli/commands/update-commit.d.ts +42 -0
- package/dist/adapters/cli/commands/update-commit.js +180 -0
- package/dist/adapters/cli/commands/validate.d.ts +40 -0
- package/dist/adapters/cli/commands/validate.js +219 -0
- package/dist/adapters/cli/formatters-list.d.ts +36 -0
- package/dist/adapters/cli/formatters-list.js +106 -0
- package/dist/adapters/cli/formatters-unit.d.ts +44 -0
- package/dist/adapters/cli/formatters-unit.js +287 -0
- package/dist/adapters/cli/formatters.d.ts +2 -0
- package/dist/adapters/cli/formatters.js +3 -0
- package/dist/adapters/cli/index.d.ts +17 -0
- package/dist/adapters/cli/index.js +60 -0
- package/dist/adapters/cli/output.d.ts +58 -0
- package/dist/adapters/cli/output.js +159 -0
- package/dist/adapters/cli/router.d.ts +99 -0
- package/dist/adapters/cli/router.js +419 -0
- package/dist/adapters/cli/scanner.d.ts +19 -0
- package/dist/adapters/cli/scanner.js +227 -0
- package/dist/adapters/pipe/stdin-reader.d.ts +23 -0
- package/dist/adapters/pipe/stdin-reader.js +56 -0
- package/dist/config/loader.d.ts +27 -0
- package/dist/config/loader.js +84 -0
- package/dist/config/resolver.d.ts +71 -0
- package/dist/config/resolver.js +124 -0
- package/dist/config/schema.d.ts +205 -0
- package/dist/config/schema.js +186 -0
- package/dist/core/parsers/backlog-parser.d.ts +25 -0
- package/dist/core/parsers/backlog-parser.js +255 -0
- package/dist/core/parsers/dep-line-parser.d.ts +36 -0
- package/dist/core/parsers/dep-line-parser.js +176 -0
- package/dist/core/parsers/dependency-extractor.d.ts +64 -0
- package/dist/core/parsers/dependency-extractor.js +193 -0
- package/dist/core/parsers/index.d.ts +20 -0
- package/dist/core/parsers/index.js +20 -0
- package/dist/core/parsers/md-utils.d.ts +81 -0
- package/dist/core/parsers/md-utils.js +144 -0
- package/dist/core/parsers/metadata-parser.d.ts +49 -0
- package/dist/core/parsers/metadata-parser.js +133 -0
- package/dist/core/parsers/pairing-question-extractor.d.ts +42 -0
- package/dist/core/parsers/pairing-question-extractor.js +146 -0
- package/dist/core/parsers/plan-parser-helpers.d.ts +61 -0
- package/dist/core/parsers/plan-parser-helpers.js +90 -0
- package/dist/core/parsers/plan-parser.d.ts +55 -0
- package/dist/core/parsers/plan-parser.js +69 -0
- package/dist/core/parsers/title-extractor.d.ts +36 -0
- package/dist/core/parsers/title-extractor.js +101 -0
- package/dist/core/renderers/index.d.ts +15 -0
- package/dist/core/renderers/index.js +18 -0
- package/dist/core/renderers/interpolate.d.ts +92 -0
- package/dist/core/renderers/interpolate.js +117 -0
- package/dist/core/renderers/marker-utils.d.ts +60 -0
- package/dist/core/renderers/marker-utils.js +85 -0
- package/dist/core/renderers/section-renderer.d.ts +31 -0
- package/dist/core/renderers/section-renderer.js +171 -0
- package/dist/core/renderers/section-updater.d.ts +72 -0
- package/dist/core/renderers/section-updater.js +175 -0
- package/dist/core/renderers/template-engine.d.ts +69 -0
- package/dist/core/renderers/template-engine.js +92 -0
- package/dist/core/renderers/updater-helpers.d.ts +45 -0
- package/dist/core/renderers/updater-helpers.js +83 -0
- package/dist/core/resolvers/commit-filter.d.ts +84 -0
- package/dist/core/resolvers/commit-filter.js +95 -0
- package/dist/core/resolvers/config-generator.d.ts +32 -0
- package/dist/core/resolvers/config-generator.js +112 -0
- package/dist/core/resolvers/config-merger.d.ts +26 -0
- package/dist/core/resolvers/config-merger.js +89 -0
- package/dist/core/resolvers/config-validator.d.ts +42 -0
- package/dist/core/resolvers/config-validator.js +61 -0
- package/dist/core/resolvers/dep-commit-resolver.d.ts +63 -0
- package/dist/core/resolvers/dep-commit-resolver.js +158 -0
- package/dist/core/resolvers/dep-doc-resolver.d.ts +70 -0
- package/dist/core/resolvers/dep-doc-resolver.js +84 -0
- package/dist/core/resolvers/index.d.ts +15 -0
- package/dist/core/resolvers/index.js +12 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +8 -0
- package/dist/types/config.d.ts +10 -0
- package/dist/types/config.js +10 -0
- package/dist/types/context.d.ts +55 -0
- package/dist/types/context.js +10 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.js +10 -0
- package/dist/types/init.d.ts +56 -0
- package/dist/types/init.js +10 -0
- package/dist/types/tool-result.d.ts +75 -0
- package/dist/types/tool-result.js +40 -0
- package/dist/types/unit.d.ts +118 -0
- package/dist/types/unit.js +10 -0
- package/package.json +71 -0
- package/skills/claude/SKILL.md +375 -0
- package/skills/common/cli-reference.md +251 -0
- 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
|
+
```
|