uctm 1.5.3 → 1.5.4
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/.claude-plugin/plugin.json +1 -1
- package/agents/builder.md +90 -84
- package/agents/committer.md +98 -91
- package/agents/planner.md +68 -111
- package/agents/scheduler.md +85 -104
- package/agents/specifier.md +295 -116
- package/agents/verifier.md +71 -62
- package/package.json +1 -1
- package/references/agent-flow.md +107 -128
- package/references/callback-protocol.md +40 -0
- package/references/context-policy.md +37 -37
- package/references/file-content-schema.md +136 -67
- package/references/ref-cache-protocol.md +31 -31
- package/references/shared-prompt-sections.md +95 -201
- package/references/work-activity-log.md +26 -26
- package/references/xml-schema.md +52 -52
- package/skills/init/SKILL.md +26 -26
- package/skills/uctm-init/SKILL.md +95 -0
- package/skills/work-pipeline/SKILL.md +30 -39
- package/skills/work-status/SKILL.md +17 -17
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 공유 프롬프트 섹션
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
각 에이전트가 `cache_control` 마커를 통해 참조하는 공통 재사용 섹션.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
## § 1.
|
|
7
|
+
## § 1. 출력 언어 규칙
|
|
8
8
|
|
|
9
9
|
```
|
|
10
|
-
|
|
10
|
+
우선순위: PLAN.md > Language: → CLAUDE.md ## Language → en (기본값)
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
디스패치 시: <context><language> 필드에 결정된 언어 코드 전달
|
|
13
|
+
섹션 헤더(##)도 결정된 언어로 작성 (언어 매핑 표 참조)
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
---
|
|
17
17
|
|
|
18
|
-
## § 2.
|
|
18
|
+
## § 2. 빌드 및 린트 명령
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
|
-
#
|
|
21
|
+
# 빌드 자동 감지 (스크립트가 있을 때만 실행)
|
|
22
22
|
if [ -f "package.json" ]; then
|
|
23
23
|
if node -e "const p=JSON.parse(require('fs').readFileSync('package.json','utf8')); process.exit(p.scripts&&p.scripts.build?0:1)" 2>/dev/null; then
|
|
24
24
|
npm run build 2>&1 || bun run build 2>&1 || yarn build 2>&1
|
|
@@ -33,7 +33,7 @@ elif [ -f "Makefile" ]; then
|
|
|
33
33
|
make build 2>&1 || make 2>&1
|
|
34
34
|
fi
|
|
35
35
|
|
|
36
|
-
#
|
|
36
|
+
# 린트 자동 감지 (스크립트가 있을 때만 실행)
|
|
37
37
|
if [ -f "package.json" ]; then
|
|
38
38
|
if node -e "const p=JSON.parse(require('fs').readFileSync('package.json','utf8')); process.exit(p.scripts&&p.scripts.lint?0:1)" 2>/dev/null; then
|
|
39
39
|
npm run lint 2>&1 || bun run lint 2>&1 || true
|
|
@@ -43,99 +43,99 @@ elif [ -f "pyproject.toml" ]; then
|
|
|
43
43
|
fi
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
-
-
|
|
47
|
-
-
|
|
46
|
+
- 빌드/린트 스크립트가 없으면 → **생략 (N/A로 처리)**.
|
|
47
|
+
- 빌드/린트 실패 시 보고 전에 항상 수정.
|
|
48
48
|
|
|
49
49
|
---
|
|
50
50
|
|
|
51
|
-
## § 3. WORK
|
|
51
|
+
## § 3. WORK 및 TASK 파일 경로 패턴
|
|
52
52
|
|
|
53
53
|
```
|
|
54
54
|
works/{WORK_ID}/
|
|
55
|
-
├─ Requirement.md #
|
|
55
|
+
├─ Requirement.md # Specifier가 생성 (필수)
|
|
56
56
|
├─ PLAN.md
|
|
57
|
-
├─ TASK-00.md #
|
|
58
|
-
├─ TASK-00_result.md #
|
|
57
|
+
├─ TASK-00.md # WORK 접두사 없음
|
|
58
|
+
├─ TASK-00_result.md # 구분자: 언더스코어
|
|
59
59
|
└─ TASK-01.md ...
|
|
60
60
|
```
|
|
61
61
|
|
|
62
|
-
- WORK ID: `WORK-NN` (
|
|
63
|
-
- TASK ID: `TASK-NN` (
|
|
62
|
+
- WORK ID: `WORK-NN` (예: `WORK-03`)
|
|
63
|
+
- TASK ID: `TASK-NN` (예: `TASK-00`) — WORK 접두사 포함 금지
|
|
64
64
|
|
|
65
65
|
---
|
|
66
66
|
|
|
67
|
-
## § 4.
|
|
67
|
+
## § 4. 파일 시스템 Discovery 스크립트
|
|
68
68
|
|
|
69
69
|
```
|
|
70
|
-
#
|
|
71
|
-
#
|
|
72
|
-
#
|
|
73
|
-
# -
|
|
74
|
-
# -
|
|
75
|
-
#
|
|
76
|
-
|
|
77
|
-
#
|
|
78
|
-
#
|
|
79
|
-
|
|
80
|
-
#
|
|
81
|
-
#
|
|
82
|
-
#
|
|
70
|
+
# 미완료 TASK가 있는 최신 WORK 찾기
|
|
71
|
+
# Glob 도구 사용: pattern "works/WORK-*/" → 모든 WORK 디렉토리 목록 (정렬)
|
|
72
|
+
# 각 WORK (내림차순)에 대해 works/WORK-NN/work_WORK-NN.log 마지막 줄 읽기
|
|
73
|
+
# - 로그 파일 없음 → 시작 안 됨
|
|
74
|
+
# - 마지막 줄에 마지막 TASK 번호의 "COMMITTER_DONE" 포함 → 남은 TASK 확인
|
|
75
|
+
# 완전히 완료되지 않은 첫 번째 WORK가 활성 WORK
|
|
76
|
+
|
|
77
|
+
# 모든 WORK 목록
|
|
78
|
+
# Glob 도구 사용: pattern "works/WORK-*/"
|
|
79
|
+
|
|
80
|
+
# 활동 로그의 마지막 줄로 WORK/TASK 상태 파악
|
|
81
|
+
# works/${WORK_ID}/work_${WORK_ID}.log 마지막 줄 읽기
|
|
82
|
+
# 형식: [timestamp] EVENT — description
|
|
83
83
|
#
|
|
84
|
-
#
|
|
84
|
+
# 핵심 규칙: *_START에 대응하는 *_DONE이 없으면 = 중단됨, 해당 단계 재수행 필요
|
|
85
85
|
#
|
|
86
|
-
# COMMITTER_DONE — TASK-NN → TASK-NN
|
|
87
|
-
# COMMITTER_START — TASK-NN → committer
|
|
88
|
-
# VERIFIER_DONE — TASK-NN → TASK-NN
|
|
89
|
-
# VERIFIER_START — TASK-NN → verifier
|
|
90
|
-
# BUILDER_DONE — TASK-NN → TASK-NN builder
|
|
91
|
-
# BUILDER_START — TASK-NN → builder
|
|
92
|
-
# PLANNER_DONE →
|
|
93
|
-
# PLANNER_START → planner
|
|
94
|
-
# SPECIFIER_DONE → specifier
|
|
95
|
-
# SPECIFIER_START → specifier
|
|
96
|
-
#
|
|
86
|
+
# COMMITTER_DONE — TASK-NN → TASK-NN 완료, 다음은 TASK-(NN+1)
|
|
87
|
+
# COMMITTER_START — TASK-NN → committer 중단됨, TASK-NN committer 재수행
|
|
88
|
+
# VERIFIER_DONE — TASK-NN → TASK-NN 검증됨, committer 필요
|
|
89
|
+
# VERIFIER_START — TASK-NN → verifier 중단됨, TASK-NN verifier 재수행
|
|
90
|
+
# BUILDER_DONE — TASK-NN → TASK-NN builder 완료, verifier 필요
|
|
91
|
+
# BUILDER_START — TASK-NN → builder 중단됨, TASK-NN builder 재수행
|
|
92
|
+
# PLANNER_DONE → 계획 완료, 첫 TASK 시작
|
|
93
|
+
# PLANNER_START → planner 중단됨, planner 재수행
|
|
94
|
+
# SPECIFIER_DONE → specifier 완료, planner 필요
|
|
95
|
+
# SPECIFIER_START → specifier 중단됨, specifier 재수행
|
|
96
|
+
# 로그 파일 없음 → 처음부터 시작
|
|
97
97
|
```
|
|
98
98
|
|
|
99
99
|
---
|
|
100
100
|
|
|
101
|
-
## § 5. Task Result XML
|
|
101
|
+
## § 5. Task Result XML 형식
|
|
102
102
|
|
|
103
103
|
```xml
|
|
104
104
|
<task-result work="{WORK_ID}" task="{TASK_ID}" agent="{agent}" status="{PASS|FAIL}">
|
|
105
|
-
<summary>{1-2
|
|
105
|
+
<summary>{1-2줄 요약}</summary>
|
|
106
106
|
<files-changed>
|
|
107
|
-
<file action="{created|modified|deleted}" path="{path}">{
|
|
107
|
+
<file action="{created|modified|deleted}" path="{path}">{설명}</file>
|
|
108
108
|
</files-changed>
|
|
109
109
|
<verification>
|
|
110
|
-
<check name="{type}" status="{PASS|FAIL|N/A}">{
|
|
110
|
+
<check name="{type}" status="{PASS|FAIL|N/A}">{상세}</check>
|
|
111
111
|
</verification>
|
|
112
|
-
<notes>{
|
|
112
|
+
<notes>{다음 단계를 위한 메모}</notes>
|
|
113
113
|
</task-result>
|
|
114
114
|
```
|
|
115
115
|
|
|
116
116
|
---
|
|
117
117
|
|
|
118
|
-
## § 7. PLAN.md
|
|
118
|
+
## § 7. PLAN.md 필수 메타 정보 — 7개 필드
|
|
119
119
|
|
|
120
|
-
→ `{REFERENCES_DIR}/file-content-schema.md` § 1
|
|
120
|
+
→ `{REFERENCES_DIR}/file-content-schema.md` § 1 참조
|
|
121
121
|
|
|
122
|
-
|
|
|
123
|
-
|
|
122
|
+
| 필드 | 필수 | 설명 |
|
|
123
|
+
|------|------|------|
|
|
124
124
|
| `> Created:` | ✅ | YYYY-MM-DD |
|
|
125
|
-
| `> Requirement:` | ✅ | `REQ-XXX`
|
|
125
|
+
| `> Requirement:` | ✅ | `REQ-XXX` 또는 사용자 요청 텍스트 |
|
|
126
126
|
| `> Execution-Mode:` | ✅ | `direct` / `pipeline` / `full` |
|
|
127
|
-
| `> Project:` | ✅ |
|
|
128
|
-
| `> Tech Stack:` | ✅ |
|
|
129
|
-
| `> Language:` | ✅ |
|
|
130
|
-
| `> Status:` | ✅ |
|
|
127
|
+
| `> Project:` | ✅ | 프로젝트 이름 |
|
|
128
|
+
| `> Tech Stack:` | ✅ | 감지된 기술 스택 |
|
|
129
|
+
| `> Language:` | ✅ | 언어 코드 (`ko`, `en` 등) |
|
|
130
|
+
| `> Status:` | ✅ | 항상 `PLANNED`로 시작 |
|
|
131
131
|
|
|
132
132
|
---
|
|
133
133
|
|
|
134
|
-
## § 8. WORK-LIST.md
|
|
134
|
+
## § 8. WORK-LIST.md 업데이트 규칙
|
|
135
135
|
|
|
136
|
-
|
|
136
|
+
파일: `works/WORK-LIST.md`
|
|
137
137
|
|
|
138
|
-
|
|
138
|
+
**형식:**
|
|
139
139
|
```
|
|
140
140
|
LAST_WORK_ID: WORK-XX
|
|
141
141
|
|
|
@@ -145,163 +145,57 @@ LAST_WORK_ID: WORK-XX
|
|
|
145
145
|
| WORK-MM | ... | DONE | YYYY-MM-DD | YYYY-MM-DD |
|
|
146
146
|
```
|
|
147
147
|
|
|
148
|
-
|
|
|
149
|
-
|
|
150
|
-
| `IN_PROGRESS` | WORK
|
|
151
|
-
| `DONE` |
|
|
152
|
-
| `COMPLETED` |
|
|
148
|
+
| 상태 | 의미 | 트리거 |
|
|
149
|
+
|------|------|--------|
|
|
150
|
+
| `IN_PROGRESS` | WORK 실행 중 | specifier가 WORK 생성 |
|
|
151
|
+
| `DONE` | 모든 TASK 완료, 리뷰/push 대기 | committer가 마지막 TASK 완료 |
|
|
152
|
+
| `COMPLETED` | _COMPLETED/로 아카이빙됨 | push 머지 (Main Claude가 모든 DONE 일괄 처리) |
|
|
153
153
|
|
|
154
|
-
|
|
155
|
-
- `LAST_WORK_ID`
|
|
156
|
-
- **specifier**:
|
|
157
|
-
- **committer**:
|
|
158
|
-
- **Main Claude** (push
|
|
154
|
+
규칙:
|
|
155
|
+
- `LAST_WORK_ID` 헤더는 지금까지 생성된 가장 높은 WORK ID를 추적
|
|
156
|
+
- **specifier**: WORK 생성 시 IN_PROGRESS 행 추가 + `LAST_WORK_ID` 업데이트
|
|
157
|
+
- **committer**: 마지막 TASK 완료 시 `IN_PROGRESS` → `DONE`으로 변경하고 완료일 기입 (폴더 이동이나 행 제거 금지)
|
|
158
|
+
- **Main Claude** (push 절차): 모든 DONE WORK를 `works/_COMPLETED/`로 이동, WORK-LIST.md에서 해당 행 제거
|
|
159
159
|
|
|
160
160
|
---
|
|
161
161
|
|
|
162
|
-
## § 9.
|
|
162
|
+
## § 9. 로케일 감지
|
|
163
163
|
|
|
164
164
|
```
|
|
165
|
-
1.
|
|
166
|
-
2.
|
|
167
|
-
3.
|
|
165
|
+
1. Grep 도구 사용: pattern "Language:\s*[a-z]{2}" path="CLAUDE.md" → 언어 코드 추출
|
|
166
|
+
2. 없으면 사용자에게 언어 확인
|
|
167
|
+
3. 없으면 Bash로 시스템 로케일 자동 감지:
|
|
168
168
|
- Windows: powershell -c "[CultureInfo]::CurrentCulture.TwoLetterISOLanguageName"
|
|
169
169
|
- Linux/Mac: locale | grep LANG
|
|
170
|
-
-
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
---
|
|
174
|
-
|
|
175
|
-
## § 10. Callback & Activity Log
|
|
176
|
-
|
|
177
|
-
### 10-1. Callback (CE7)
|
|
178
|
-
|
|
179
|
-
Each agent sends START/DONE/FAILED events to the server via CE7 API.
|
|
180
|
-
|
|
181
|
-
**Activation condition:** Only when `CALLBACK_URL` is available. Check in order:
|
|
182
|
-
1. Dispatch XML `<callback-url>` element (passed from Main Claude)
|
|
183
|
-
2. Prompt text containing `CALLBACK_URL=...` line
|
|
184
|
-
3. If neither found → **skip all callbacks**
|
|
185
|
-
|
|
186
|
-
**How to resolve CALLBACK_URL and CALLBACK_TOKEN:**
|
|
187
|
-
|
|
188
|
-
The runner injects callback info directly into the prompt:
|
|
189
|
-
```
|
|
190
|
-
POST {CALLBACK_URL}
|
|
191
|
-
Authorization: Bearer {CALLBACK_TOKEN}
|
|
192
|
-
```
|
|
193
|
-
The first agent (specifier) extracts these and passes them via dispatch XML to subsequent agents.
|
|
194
|
-
|
|
195
|
-
**When to send:**
|
|
196
|
-
- **START**: At the very beginning of agent execution (after STARTUP)
|
|
197
|
-
- **DONE**: At the very end, before returning task-result XML
|
|
198
|
-
- **FAILED**: On unrecoverable failure, before returning FAIL task-result
|
|
199
|
-
|
|
200
|
-
**How to send** (single curl command):
|
|
201
|
-
```bash
|
|
202
|
-
curl -s --connect-timeout 3 --max-time 5 -X POST "$CALLBACK_URL" \
|
|
203
|
-
-H "Authorization: Bearer $CALLBACK_TOKEN" \
|
|
204
|
-
-H "Content-Type: application/json" \
|
|
205
|
-
-d '{"stage":"BUILDER","event":"START","workId":"WORK-09","taskId":"TASK-01"}' \
|
|
206
|
-
2>/dev/null || true
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
- `--connect-timeout 3`: 연결 대기 최대 3초
|
|
210
|
-
- `--max-time 5`: 전체 요청 최대 5초
|
|
211
|
-
- `|| true`: 실패해도 agent 실행 계속
|
|
212
|
-
|
|
213
|
-
**Include docs (actual file content, not references):**
|
|
214
|
-
- specifier DONE: `"docs": {"requirementContent": "<Requirement.md content>"}`
|
|
215
|
-
- planner DONE: `"docs": {"planContent": "<PLAN.md content>"}`
|
|
216
|
-
- builder START: `"docs": {"taskContent": "<TASK-NN.md content>"}`
|
|
217
|
-
- committer DONE: `"docs": {"resultContent": "<TASK-NN_result.md content>"}`
|
|
218
|
-
|
|
219
|
-
**Token usage** (DONE event only, optional):
|
|
220
|
-
```json
|
|
221
|
-
{"inputTokens": 1234, "outputTokens": 567, "cacheCreationTokens": 890, "cacheReadTokens": 456}
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
Callback failure must NOT block agent execution. Always continue.
|
|
225
|
-
|
|
226
|
-
### 10-2. Activity Log
|
|
227
|
-
|
|
228
|
-
Each agent records start/end to `works/{WORK_ID}/work_{WORK_ID}.log`.
|
|
229
|
-
|
|
230
|
-
**All WORKs** — no CALLBACK_URL condition.
|
|
231
|
-
|
|
232
|
-
**Timestamp:** Run `date -u +"%Y-%m-%dT%H:%M:%SZ"` via Bash tool to get the real UTC time. Do NOT use dummy/placeholder timestamps.
|
|
233
|
-
|
|
234
|
-
**Format:**
|
|
235
|
-
```
|
|
236
|
-
[2026-03-30T14:30:00Z] AGENT_EVENT — description
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
**How to write:** Use Bash `echo "[timestamp] EVENT — description" >> works/{WORK_ID}/work_{WORK_ID}.log`
|
|
240
|
-
|
|
241
|
-
**Required entries per agent (START and DONE only):**
|
|
242
|
-
```
|
|
243
|
-
[{timestamp}] SPECIFIER_START — WORK-NN specifier started
|
|
244
|
-
[{timestamp}] SPECIFIER_DONE — WORK-NN specifier completed
|
|
245
|
-
[{timestamp}] BUILDER_START — TASK-NN implement
|
|
246
|
-
[{timestamp}] BUILDER_DONE — TASK-NN complete
|
|
247
|
-
[{timestamp}] VERIFIER_START — TASK-NN verification
|
|
248
|
-
[{timestamp}] VERIFIER_DONE — TASK-NN verified
|
|
249
|
-
[{timestamp}] COMMITTER_START — TASK-NN commit
|
|
250
|
-
[{timestamp}] COMMITTER_DONE — TASK-NN committed
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
Do NOT write INIT, REF, PLAN, DISPATCH or other intermediate entries. Only START and DONE per agent role.
|
|
254
|
-
|
|
255
|
-
---
|
|
256
|
-
|
|
257
|
-
## § 11. Project Discovery
|
|
258
|
-
|
|
259
|
-
```
|
|
260
|
-
# 1. Check CLAUDE.md language setting
|
|
261
|
-
Use Grep tool: pattern "Language:\s*[a-z]{2}" path="CLAUDE.md"
|
|
262
|
-
|
|
263
|
-
# 2. Tech stack (read first 50/30/20/10 lines if file exists)
|
|
264
|
-
Use Read tool: "package.json" (limit=50)
|
|
265
|
-
Use Read tool: "pyproject.toml" (limit=30)
|
|
266
|
-
Use Read tool: "Cargo.toml" (limit=20)
|
|
267
|
-
Use Read tool: "go.mod" (limit=10)
|
|
268
|
-
|
|
269
|
-
# 3. Structure (when needed)
|
|
270
|
-
Use Glob tool: pattern "**/*.{md,json,toml}" (exclude node_modules)
|
|
170
|
+
- 폴백: "en"
|
|
271
171
|
```
|
|
272
172
|
|
|
273
173
|
---
|
|
274
174
|
|
|
275
|
-
## § 12. Bash
|
|
276
|
-
|
|
277
|
-
Bash commands MUST follow these rules for permission compatibility.
|
|
175
|
+
## § 12. Bash 명령 규칙
|
|
278
176
|
|
|
279
|
-
|
|
280
|
-
- One simple command per Bash call — NO compound commands (`&&`, `||`, `;`, `|`)
|
|
281
|
-
- NO `cd` — Bash tool cwd is always the project root. Never use `cd dir &&`, `cd dir ;`, or `cd dir` in any form. Use relative paths from project root
|
|
282
|
-
- NO multi-line scripts — split into separate Bash calls
|
|
283
|
-
- NO sub-shell expansions in arguments — e.g., `$(date ...)` inside `printf`
|
|
284
|
-
- Use relative paths from project root (e.g., `works/WORK-01/`) — NO absolute paths
|
|
285
|
-
- Use `git add file`, `git commit -m "msg"` — NO `git -C path` flag
|
|
177
|
+
Bash 명령은 권한 호환성을 위해 다음 규칙을 반드시 따라야 합니다.
|
|
286
178
|
|
|
287
|
-
|
|
288
|
-
-
|
|
289
|
-
-
|
|
290
|
-
-
|
|
291
|
-
-
|
|
292
|
-
-
|
|
179
|
+
**필수:**
|
|
180
|
+
- Bash 호출당 단순 명령 하나 — 복합 명령 금지 (`&&`, `||`, `;`, `|`)
|
|
181
|
+
- `cd` 금지 — Bash 도구의 cwd는 항상 프로젝트 루트. `cd dir &&`, `cd dir ;`, `cd dir` 어떤 형태든 사용 금지. 프로젝트 루트 기준 상대 경로 사용
|
|
182
|
+
- 멀티라인 스크립트 금지 — 별도 Bash 호출로 분할
|
|
183
|
+
- 인수 내 서브셸 확장 금지 — 예: `printf` 안의 `$(date ...)`
|
|
184
|
+
- 프로젝트 루트 기준 상대 경로 사용 (예: `works/WORK-01/`) — 절대 경로 금지
|
|
185
|
+
- `git add file`, `git commit -m "msg"` 사용 — `git -C path` 플래그 금지
|
|
293
186
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
187
|
+
**파일 작업에는 Bash 대신 전용 도구를 우선 사용:**
|
|
188
|
+
- 파일 읽기 → `Read` 도구 (`cat` 아님)
|
|
189
|
+
- 파일 쓰기/추가 → `Write` 도구 (`echo >>` 또는 `printf >>` 아님)
|
|
190
|
+
- 파일 편집 → `Edit` 도구 (`sed -i` 아님)
|
|
191
|
+
- 파일 검색 → `Grep` 도구 (`grep` 아님)
|
|
192
|
+
- 파일 찾기 → `Glob` 도구 (`find` 아님)
|
|
299
193
|
|
|
300
|
-
**Git
|
|
194
|
+
**Git 예시:**
|
|
301
195
|
```
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
git commit -m "msg" (
|
|
196
|
+
잘못됨: cd /path/to/project && git add file && git commit -m "msg"
|
|
197
|
+
올바름: git add file (한 번의 호출)
|
|
198
|
+
git commit -m "msg" (다음 호출)
|
|
305
199
|
```
|
|
306
200
|
|
|
307
201
|
---
|
|
@@ -309,4 +203,4 @@ RIGHT: git add file (one call)
|
|
|
309
203
|
## Version
|
|
310
204
|
|
|
311
205
|
- Created: 2026-03-10
|
|
312
|
-
- Updated: 2026-03-
|
|
206
|
+
- Updated: 2026-03-31
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
1.
|
|
8
|
-
2.
|
|
9
|
-
3.
|
|
10
|
-
|
|
11
|
-
##
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
[YYYY-MM-DDTHH:MM:SSZ] AGENT_EVENT — description
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
##
|
|
18
|
-
|
|
19
|
-
|
|
|
20
|
-
|
|
21
|
-
| specifier | `SPECIFIER_START — WORK-NN specifier started` | `SPECIFIER_DONE — WORK-NN specifier completed` |
|
|
22
|
-
| planner | `PLANNER_START — WORK-NN planner started` | `PLANNER_DONE — WORK-NN planner completed` |
|
|
23
|
-
| scheduler | `SCHEDULER_START — WORK-NN scheduler started` | `SCHEDULER_DONE — WORK-NN scheduler completed` |
|
|
24
|
-
| builder | `BUILDER_START — TASK-NN implement` | `BUILDER_DONE — TASK-NN complete` |
|
|
25
|
-
| verifier | `VERIFIER_START — TASK-NN verification` | `VERIFIER_DONE — TASK-NN verified` |
|
|
26
|
-
| committer | `COMMITTER_START — TASK-NN commit` | `COMMITTER_DONE — TASK-NN committed` |
|
|
1
|
+
# 작업 활동 로그
|
|
2
|
+
|
|
3
|
+
`works/{WORK_ID}/work_{WORK_ID}.log`에 에이전트 시작/종료 이벤트를 기록.
|
|
4
|
+
|
|
5
|
+
## 규칙
|
|
6
|
+
|
|
7
|
+
1. **타임스탬프**: Bash로 `date -u +"%Y-%m-%dT%H:%M:%SZ"` 실행하여 실제 UTC 시간 획득. 더미 값 사용 금지.
|
|
8
|
+
2. **기록 방법**: Bash `echo` 로 추가.
|
|
9
|
+
3. **항목**: 에이전트 역할별 START와 DONE만. 중간 단계 없음.
|
|
10
|
+
|
|
11
|
+
## 형식
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
[YYYY-MM-DDTHH:MM:SSZ] AGENT_EVENT — description
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 필수 항목
|
|
18
|
+
|
|
19
|
+
| 에이전트 | START | DONE |
|
|
20
|
+
|----------|-------|------|
|
|
21
|
+
| specifier | `SPECIFIER_START — WORK-NN specifier started` | `SPECIFIER_DONE — WORK-NN specifier completed` |
|
|
22
|
+
| planner | `PLANNER_START — WORK-NN planner started` | `PLANNER_DONE — WORK-NN planner completed` |
|
|
23
|
+
| scheduler | `SCHEDULER_START — WORK-NN scheduler started` | `SCHEDULER_DONE — WORK-NN scheduler completed` |
|
|
24
|
+
| builder | `BUILDER_START — TASK-NN implement` | `BUILDER_DONE — TASK-NN complete` |
|
|
25
|
+
| verifier | `VERIFIER_START — TASK-NN verification` | `VERIFIER_DONE — TASK-NN verified` |
|
|
26
|
+
| committer | `COMMITTER_START — TASK-NN commit` | `COMMITTER_DONE — TASK-NN committed` |
|
package/references/xml-schema.md
CHANGED
|
@@ -1,120 +1,120 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 에이전트 통신 XML 스키마
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
uc-taskmanager 에이전트용 XML 통신 형식 정의.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
## 1. Dispatch
|
|
7
|
+
## 1. Dispatch 형식 (디스패처 → 수신자)
|
|
8
8
|
|
|
9
9
|
```xml
|
|
10
10
|
<dispatch to="{receiver}" work="{WORK_ID}" task="{TASK_ID}" execution-mode="{direct|pipeline|full}">
|
|
11
|
-
<ref-cache> <!--
|
|
12
|
-
<ref key="shared-prompt-sections">{
|
|
13
|
-
<ref key="file-content-schema">{
|
|
14
|
-
<ref key="xml-schema">{
|
|
15
|
-
<ref key="context-policy">{
|
|
16
|
-
<ref key="work-activity-log">{
|
|
11
|
+
<ref-cache> <!-- 선택사항 -->
|
|
12
|
+
<ref key="shared-prompt-sections">{파일 내용}</ref>
|
|
13
|
+
<ref key="file-content-schema">{파일 내용}</ref>
|
|
14
|
+
<ref key="xml-schema">{파일 내용}</ref>
|
|
15
|
+
<ref key="context-policy">{파일 내용}</ref>
|
|
16
|
+
<ref key="work-activity-log">{파일 내용}</ref>
|
|
17
17
|
</ref-cache>
|
|
18
|
-
<references-dir>{
|
|
18
|
+
<references-dir>{references 디렉토리 절대 경로}</references-dir>
|
|
19
19
|
<context>
|
|
20
|
-
<project>{
|
|
20
|
+
<project>{프로젝트 이름}</project>
|
|
21
21
|
<language>{lang_code}</language>
|
|
22
22
|
<plan-file>works/{WORK_ID}/PLAN.md</plan-file>
|
|
23
23
|
</context>
|
|
24
24
|
<task-spec>
|
|
25
25
|
<file>works/{WORK_ID}/TASK-XX.md</file>
|
|
26
|
-
<title>{
|
|
26
|
+
<title>{제목}</title>
|
|
27
27
|
<action>{implement|verify|commit|plan|route}</action>
|
|
28
|
-
<description>{
|
|
28
|
+
<description>{선택사항}</description>
|
|
29
29
|
</task-spec>
|
|
30
30
|
<previous-results>
|
|
31
|
-
<result task="{TASK_ID}" status="{PASS|FAIL|SKIP}">{
|
|
31
|
+
<result task="{TASK_ID}" status="{PASS|FAIL|SKIP}">{요약}</result>
|
|
32
32
|
</previous-results>
|
|
33
33
|
<cache-hint sections="{section1},{section2}"/>
|
|
34
34
|
</dispatch>
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
|
|
|
38
|
-
|
|
37
|
+
| 속성 | 값 |
|
|
38
|
+
|------|-----|
|
|
39
39
|
| `to` | builder, verifier, committer, planner, scheduler, specifier |
|
|
40
|
-
| `task` | `TASK-NN` — WORK
|
|
41
|
-
| `execution-mode` | direct / pipeline / full (
|
|
40
|
+
| `task` | `TASK-NN` — WORK 접두사 포함 금지 |
|
|
41
|
+
| `execution-mode` | direct / pipeline / full (생략 시 full 기본값) |
|
|
42
42
|
|
|
43
43
|
---
|
|
44
44
|
|
|
45
|
-
## 2. Task Result
|
|
45
|
+
## 2. Task Result 형식 (수신자 → 디스패처)
|
|
46
46
|
|
|
47
47
|
```xml
|
|
48
48
|
<task-result work="{WORK_ID}" task="{TASK_ID}" agent="{agent}" status="{PASS|FAIL}">
|
|
49
|
-
<summary>{1-2
|
|
49
|
+
<summary>{1-2줄 요약}</summary>
|
|
50
50
|
<files-changed>
|
|
51
|
-
<file action="{created|modified|deleted}" path="{path}">{
|
|
51
|
+
<file action="{created|modified|deleted}" path="{path}">{설명}</file>
|
|
52
52
|
</files-changed>
|
|
53
53
|
<verification>
|
|
54
|
-
<check name="{type}" status="{PASS|FAIL|N/A}">{
|
|
54
|
+
<check name="{type}" status="{PASS|FAIL|N/A}">{출력}</check>
|
|
55
55
|
</verification>
|
|
56
|
-
<notes>{
|
|
57
|
-
<ref-cache> <!--
|
|
58
|
-
<ref key="shared-prompt-sections">{
|
|
59
|
-
<ref key="file-content-schema">{
|
|
60
|
-
<ref key="xml-schema">{
|
|
61
|
-
<ref key="context-policy">{
|
|
62
|
-
<ref key="work-activity-log">{
|
|
56
|
+
<notes>{메모}</notes>
|
|
57
|
+
<ref-cache> <!-- 선택사항 -->
|
|
58
|
+
<ref key="shared-prompt-sections">{파일 내용}</ref>
|
|
59
|
+
<ref key="file-content-schema">{파일 내용}</ref>
|
|
60
|
+
<ref key="xml-schema">{파일 내용}</ref>
|
|
61
|
+
<ref key="context-policy">{파일 내용}</ref>
|
|
62
|
+
<ref key="work-activity-log">{파일 내용}</ref>
|
|
63
63
|
</ref-cache>
|
|
64
64
|
</task-result>
|
|
65
65
|
```
|
|
66
66
|
|
|
67
67
|
---
|
|
68
68
|
|
|
69
|
-
## 3. Context-Handoff
|
|
69
|
+
## 3. Context-Handoff 요소
|
|
70
70
|
|
|
71
71
|
```xml
|
|
72
72
|
<context-handoff from="{agent}" detail-level="{FULL|SUMMARY|DROP}">
|
|
73
|
-
<what>{
|
|
74
|
-
<why>{
|
|
75
|
-
<caution>{
|
|
76
|
-
<incomplete>{
|
|
73
|
+
<what>{변경/검증 상세}</what>
|
|
74
|
+
<why>{결정 근거}</why> <!-- FULL만 -->
|
|
75
|
+
<caution>{주의사항}</caution> <!-- FULL만 -->
|
|
76
|
+
<incomplete>{미완료 항목}</incomplete> <!-- FULL만 -->
|
|
77
77
|
</context-handoff>
|
|
78
78
|
```
|
|
79
79
|
|
|
80
|
-
| detail-level |
|
|
80
|
+
| detail-level | 포함 필드 |
|
|
81
81
|
|:---:|---|
|
|
82
82
|
| `FULL` | what, why, caution, incomplete |
|
|
83
|
-
| `SUMMARY` | what
|
|
84
|
-
| `DROP` |
|
|
83
|
+
| `SUMMARY` | what만 (1-3줄) |
|
|
84
|
+
| `DROP` | 요소 생략 |
|
|
85
85
|
|
|
86
86
|
---
|
|
87
87
|
|
|
88
|
-
## 4. ref-cache
|
|
88
|
+
## 4. ref-cache 요소 정의
|
|
89
89
|
|
|
90
|
-
`<ref-cache
|
|
90
|
+
`<ref-cache>`는 dispatch 및 task-result XML 내에서 미리 로딩된 레퍼런스 파일 내용을 전달하는 선택적 컨테이너 요소입니다. 존재할 경우, 수신 에이전트는 디스크에서 파일을 읽는 대신 반드시 이 내용을 사용해야 합니다.
|
|
91
91
|
|
|
92
|
-
###
|
|
92
|
+
### 구조
|
|
93
93
|
|
|
94
94
|
```xml
|
|
95
95
|
<ref-cache>
|
|
96
|
-
<ref key="{
|
|
96
|
+
<ref key="{확장자 없는 파일명}">{전체 파일 내용}</ref>
|
|
97
97
|
...
|
|
98
98
|
</ref-cache>
|
|
99
99
|
```
|
|
100
100
|
|
|
101
|
-
|
|
|
102
|
-
|
|
103
|
-
| `<ref-cache>` |
|
|
104
|
-
| `<ref key="...">` | — |
|
|
101
|
+
| 요소 | 필수 | 설명 |
|
|
102
|
+
|------|------|------|
|
|
103
|
+
| `<ref-cache>` | 선택 | 캐시된 레퍼런스 파일 컨테이너. 캐시가 없으면 전체 생략. |
|
|
104
|
+
| `<ref key="...">` | — | 개별 레퍼런스 파일. `key`는 확장자 없는 파일명 (예: `shared-prompt-sections`). |
|
|
105
105
|
|
|
106
|
-
###
|
|
106
|
+
### 인식되는 키
|
|
107
107
|
|
|
108
|
-
|
|
|
109
|
-
|
|
108
|
+
| 키 | 대응 파일 |
|
|
109
|
+
|-----|-----------|
|
|
110
110
|
| `shared-prompt-sections` | `{REFERENCES_DIR}/shared-prompt-sections.md` |
|
|
111
111
|
| `file-content-schema` | `{REFERENCES_DIR}/file-content-schema.md` |
|
|
112
112
|
| `xml-schema` | `{REFERENCES_DIR}/xml-schema.md` |
|
|
113
113
|
| `context-policy` | `{REFERENCES_DIR}/context-policy.md` |
|
|
114
114
|
| `work-activity-log` | `{REFERENCES_DIR}/work-activity-log.md` |
|
|
115
115
|
|
|
116
|
-
###
|
|
116
|
+
### 하위 호환성
|
|
117
117
|
|
|
118
|
-
-
|
|
119
|
-
-
|
|
120
|
-
-
|
|
118
|
+
- `<ref-cache>` 없는 dispatch 또는 task-result XML은 완전히 유효 — 에이전트는 `REFERENCES_DIR`에서 파일을 읽는 것으로 폴백.
|
|
119
|
+
- ref-cache를 아직 지원하지 않는 에이전트는 해당 요소를 무시하고 정상적으로 파일을 읽음.
|
|
120
|
+
- 부분적 ref-cache (일부 키만 존재)도 허용 — 없는 키는 디스크에서 읽음.
|