triflux 4.2.5 → 4.2.7
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/bin/tfx-doctor.mjs +1 -1
- package/bin/tfx-setup.mjs +1 -1
- package/bin/triflux.mjs +1 -1
- package/package.json +2 -1
- package/scripts/setup.mjs +21 -16
- package/skills/tfx-auto/SKILL.md +1 -1
- package/skills/tfx-codex/SKILL.md +1 -1
- package/skills/tfx-gemini/SKILL.md +1 -1
- package/skills/tfx-hub/SKILL.md +4 -1
- package/skills/tfx-multi/SKILL.md +177 -409
- package/skills/tfx-multi/references/agent-wrapper-rules.md +81 -0
- package/skills/tfx-multi/references/thorough-pipeline.md +66 -0
package/bin/tfx-doctor.mjs
CHANGED
package/bin/tfx-setup.mjs
CHANGED
package/bin/triflux.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
1
|
+
#!/usr/bin/env node
|
|
2
2
|
// triflux CLI — setup, doctor, version
|
|
3
3
|
import { copyFileSync, existsSync, readFileSync, writeFileSync, mkdirSync, chmodSync, readdirSync, unlinkSync, rmSync, statSync, openSync, closeSync } from "fs";
|
|
4
4
|
import { join, dirname } from "path";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "triflux",
|
|
3
|
-
"version": "4.2.
|
|
3
|
+
"version": "4.2.7",
|
|
4
4
|
"description": "CLI-first multi-model orchestrator for Claude Code — route tasks to Codex, Gemini, and Claude",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"bin",
|
|
15
15
|
"hub",
|
|
16
16
|
"skills",
|
|
17
|
+
"!skills/tfx-workspace",
|
|
17
18
|
"!**/failure-reports",
|
|
18
19
|
"scripts",
|
|
19
20
|
"hooks",
|
package/scripts/setup.mjs
CHANGED
|
@@ -293,34 +293,39 @@ if (existsSync(agentsSrc)) {
|
|
|
293
293
|
}
|
|
294
294
|
|
|
295
295
|
// ── 스킬 동기화 ──
|
|
296
|
+
// SKILL.md + 하위 디렉토리(references/ 등)를 재귀적으로 동기화
|
|
296
297
|
|
|
297
298
|
const skillsSrc = join(PLUGIN_ROOT, "skills");
|
|
298
299
|
const skillsDst = join(CLAUDE_DIR, "skills");
|
|
299
300
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
const src = join(skillsSrc, name, "SKILL.md");
|
|
303
|
-
if (!existsSync(src)) continue;
|
|
304
|
-
|
|
305
|
-
const dstDir = join(skillsDst, name);
|
|
306
|
-
const dst = join(dstDir, "SKILL.md");
|
|
301
|
+
function syncSkillDir(srcDir, dstDir) {
|
|
302
|
+
if (!existsSync(dstDir)) mkdirSync(dstDir, { recursive: true });
|
|
307
303
|
|
|
308
|
-
|
|
304
|
+
for (const entry of readdirSync(srcDir, { withFileTypes: true })) {
|
|
305
|
+
const srcPath = join(srcDir, entry.name);
|
|
306
|
+
const dstPath = join(dstDir, entry.name);
|
|
309
307
|
|
|
310
|
-
if (
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
const dstContent = readFileSync(dst, "utf8");
|
|
316
|
-
if (srcContent !== dstContent) {
|
|
317
|
-
copyFileSync(src, dst);
|
|
308
|
+
if (entry.isDirectory()) {
|
|
309
|
+
syncSkillDir(srcPath, dstPath);
|
|
310
|
+
} else if (entry.name.endsWith(".md")) {
|
|
311
|
+
if (shouldSyncTextFile(srcPath, dstPath)) {
|
|
312
|
+
copyFileSync(srcPath, dstPath);
|
|
318
313
|
synced++;
|
|
319
314
|
}
|
|
320
315
|
}
|
|
321
316
|
}
|
|
322
317
|
}
|
|
323
318
|
|
|
319
|
+
if (existsSync(skillsSrc)) {
|
|
320
|
+
for (const name of readdirSync(skillsSrc)) {
|
|
321
|
+
const skillDir = join(skillsSrc, name);
|
|
322
|
+
const skillMd = join(skillDir, "SKILL.md");
|
|
323
|
+
if (!existsSync(skillMd)) continue;
|
|
324
|
+
|
|
325
|
+
syncSkillDir(skillDir, join(skillsDst, name));
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
324
329
|
// ── settings.json statusLine 자동 설정 ──
|
|
325
330
|
|
|
326
331
|
const settingsPath = join(CLAUDE_DIR, "settings.json");
|
package/skills/tfx-auto/SKILL.md
CHANGED
|
@@ -214,4 +214,4 @@ OUTPUT 추출: `echo "$result" | sed -n '/^=== OUTPUT ===/,/^=== /{/^=== OUTPUT
|
|
|
214
214
|
|
|
215
215
|
## 상세 레퍼런스
|
|
216
216
|
|
|
217
|
-
DAG 알고리즘, 컨텍스트 머지 규칙, 토큰 스냅샷, 보고서
|
|
217
|
+
DAG 알고리즘, 컨텍스트 머지 규칙, 토큰 스냅샷, 보고서 상세는 `scripts/tfx-route.sh` 내부 주석 및 `hub/` 모듈 참조.
|
package/skills/tfx-hub/SKILL.md
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tfx-hub
|
|
3
|
-
description:
|
|
3
|
+
description: >
|
|
4
|
+
tfx-hub MCP 메시지 버스 관리. CLI 에이전트 간 실시간 통신 허브를 시작/중지/상태확인하고,
|
|
5
|
+
hub 도메인의 자유형 작업도 처리합니다.
|
|
6
|
+
Use when: hub, 허브, 메시지 버스, message bus, 브릿지, bridge, MCP 서버 관리, 에이전트 통신
|
|
4
7
|
triggers:
|
|
5
8
|
- tfx-hub
|
|
6
9
|
argument-hint: "<start|stop|status|자유형 작업 설명>"
|
|
@@ -1,409 +1,177 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: tfx-multi
|
|
3
|
-
description: 멀티-CLI 팀 모드. Claude Native Agent Teams + Codex/Gemini 멀티모델 오케스트레이션.
|
|
4
|
-
triggers:
|
|
5
|
-
- tfx-multi
|
|
6
|
-
argument-hint: '"작업 설명" | --agents codex,gemini "작업" | --tmux "작업" | status | stop'
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# tfx-multi v3 — 파이프라인 기반 멀티-CLI 팀 오케스트레이터
|
|
10
|
-
|
|
11
|
-
> Claude Code Native Teams의 Shift+Down 네비게이션을 복원한다.
|
|
12
|
-
> Codex/Gemini 워커마다 최소 프롬프트(~100 토큰)의 슬림 Agent 래퍼를 spawn하여 네비게이션에 등록하고,
|
|
13
|
-
> 실제 작업은 `tfx-route.sh`가 수행한다. task 상태는 `team_task_list`를 truth source로 검증한다.
|
|
14
|
-
> v3 — `--quick`(
|
|
15
|
-
|
|
16
|
-
> **
|
|
17
|
-
> Lead(Claude Opus)는 brave-search, exa, tavily
|
|
18
|
-
>
|
|
19
|
-
>
|
|
20
|
-
|
|
21
|
-
## 사용법
|
|
22
|
-
|
|
23
|
-
```
|
|
24
|
-
/tfx-multi "인증 리팩터링 + UI 개선 + 보안 리뷰" # --quick (기본)
|
|
25
|
-
/tfx-multi --thorough "인증 리팩터링 + UI 개선 + 보안 리뷰" # 전체 파이프라인
|
|
26
|
-
/tfx-multi --agents codex,gemini "프론트+백엔드"
|
|
27
|
-
/tfx-multi --tmux "작업" # 레거시 tmux 모드
|
|
28
|
-
/tfx-multi status
|
|
29
|
-
/tfx-multi stop
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## 실행 워크플로우
|
|
33
|
-
|
|
34
|
-
### Phase 0: 사전 점검
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
>
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
### Phase
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
})
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
Codex/Gemini 서브태스크마다 최소 프롬프트의 Agent를 spawn하여 네비게이션에 등록한다.
|
|
180
|
-
Agent 내부에서 `Bash(tfx-route.sh)`를 N회 실행할 수 있다. 리드 피드백을 받아 재실행하는 구조이다.
|
|
181
|
-
|
|
182
|
-
```
|
|
183
|
-
for each item in runQueue where item.cli in ["codex", "gemini"]:
|
|
184
|
-
Agent({
|
|
185
|
-
name: item.agentName,
|
|
186
|
-
team_name: teamName,
|
|
187
|
-
mode: "bypassPermissions",
|
|
188
|
-
run_in_background: true,
|
|
189
|
-
prompt: buildSlimWrapperPrompt(item.cli, {
|
|
190
|
-
subtask: item.subtask,
|
|
191
|
-
role: item.role,
|
|
192
|
-
teamName: teamName,
|
|
193
|
-
taskId: item.taskId,
|
|
194
|
-
agentName: item.agentName,
|
|
195
|
-
leadName: "team-lead",
|
|
196
|
-
mcp_profile: mcp_profile
|
|
197
|
-
})
|
|
198
|
-
})
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
슬림 래퍼 프롬프트는 `hub/team/native.mjs`의 `buildSlimWrapperPrompt()`가 **단일 truth source**.
|
|
202
|
-
핵심 동작: Bash(tfx-route.sh) 실행 → SendMessage(결과 보고) → 리드 피드백 대기 → 필요 시 재실행(N회).
|
|
203
|
-
최종 완료 시 TaskUpdate(completed) + SendMessage → 종료.
|
|
204
|
-
status는 "completed"만 사용. 실패 여부는 `metadata.result`로 구분.
|
|
205
|
-
|
|
206
|
-
> **[핵심] 슬림 래퍼는 1회성이 아니다 — 리드↔워커 피드백 루프가 설계 의도이다.**
|
|
207
|
-
> 워커가 tfx-route.sh 실행 후 결과를 SendMessage로 보고하면 턴 경계가 생긴다.
|
|
208
|
-
> 리드는 이 턴 경계에서 방향 수정/추가 지시를 보낼 수 있고,
|
|
209
|
-
> 워커는 피드백을 반영하여 tfx-route.sh를 재실행한다.
|
|
210
|
-
> 래퍼 존재 이유: (1) Shift+Down 네비게이션 등록 (2) 리드↔워커 피드백 루프 (3) 실패 시 재실행
|
|
211
|
-
|
|
212
|
-
> **[필수] `mode: "bypassPermissions"` — 모든 Agent spawn에 반드시 포함한다.**
|
|
213
|
-
> 이 설정이 없으면 워커가 Bash 실행 시 사용자 승인을 요청하여 자동 실행이 중단된다.
|
|
214
|
-
> Codex/Gemini 래퍼, Claude 워커 모두 동일하게 적용한다.
|
|
215
|
-
|
|
216
|
-
> **[금지] Lead 또는 Agent 래퍼가 `gemini -y -p "..."` 또는 `codex exec "..."`를 직접 호출하면 안 된다.**
|
|
217
|
-
> 직접 호출하면 tfx-route.sh의 모델 지정(`-m gemini-3.1-pro-preview`), MCP 필터, 팀 bridge 연동,
|
|
218
|
-
> Windows 호환 경로, 타임아웃, 후처리(토큰 추적/이슈 로깅)가 모두 누락된다.
|
|
219
|
-
> 반드시 `bash ~/.claude/scripts/tfx-route.sh {role} '{subtask}' {mcp_profile}`을 통해 실행해야 한다.
|
|
220
|
-
|
|
221
|
-
> **[금지] 슬림 래퍼 워커가 코드를 직접 읽거나 수정하면 안 된다.**
|
|
222
|
-
> codex-worker는 반드시 tfx-route.sh를 통해 Codex에 위임하고, gemini-worker도 마찬가지다.
|
|
223
|
-
> 워커가 Read, Edit, Write, Grep, Glob 등 도구를 직접 사용하는 것은 위임 구조 위반이다.
|
|
224
|
-
> 이는 tfx-route.sh의 MCP 필터, 모델 지정, bridge 연동, 토큰 추적을 모두 우회하는 것이므로
|
|
225
|
-
> 어떤 경우에도 허용하지 않는다. 워커가 이 규칙을 위반하면 작업 실패로 간주한다.
|
|
226
|
-
|
|
227
|
-
**Bash timeout 동적 상속:** Bash timeout은 tfx-route.sh의 role/profile별 timeout + 60초 여유를 ms로 변환하여 동적 상속한다. `getRouteTimeout(role, mcpProfile)` 기준: analyze/review 프로필 또는 architect/analyst 역할은 3600초, 그 외 기본 1080초(18분).
|
|
228
|
-
|
|
229
|
-
**핵심 차이 vs v2:** 프롬프트 ~100 토큰 (v2의 ~500), task claim/complete/report는 tfx-route.sh가 Named Pipe(우선)/HTTP(fallback) 경유로 수행. 래퍼가 N회 실행을 지원하므로 리드가 결과를 보고 방향을 수정할 수 있다.
|
|
230
|
-
|
|
231
|
-
#### 인터럽트 프로토콜
|
|
232
|
-
|
|
233
|
-
워커가 Bash 실행 전에 SendMessage로 시작을 보고하면 턴 경계가 생겨 리드가 방향 전환 메시지를 보낼 수 있다.
|
|
234
|
-
|
|
235
|
-
```
|
|
236
|
-
1. TaskUpdate(taskId, status: in_progress) — task claim
|
|
237
|
-
2. SendMessage(to: team-lead, "작업 시작: {agentName}") — 시작 보고 (턴 경계 생성)
|
|
238
|
-
3. Bash(command: tfx-route.sh ..., timeout: {bashTimeoutMs}) — 실행
|
|
239
|
-
4. SendMessage(to: team-lead, "결과: {요약}") — 결과 보고 (턴 경계 생성)
|
|
240
|
-
5. 리드 피드백 대기 — 피드백 수신 시 Step 3으로 돌아가 재실행
|
|
241
|
-
6. 최종 완료 시 TaskUpdate(status: completed, metadata: {result}) + SendMessage → 종료
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
리드는 워커의 Step 2, Step 4 시점에 턴 경계를 인식하고, 방향 전환/추가 지시/재실행 요청을 보낼 수 있다.
|
|
245
|
-
|
|
246
|
-
`tfx-route.sh` 팀 통합 동작(이미 구현됨, `TFX_TEAM_*` 기반):
|
|
247
|
-
- `TFX_TEAM_NAME`: 팀 식별자
|
|
248
|
-
- `TFX_TEAM_TASK_ID`: 작업 식별자
|
|
249
|
-
- `TFX_TEAM_AGENT_NAME`: 워커 표기 이름
|
|
250
|
-
- `TFX_TEAM_LEAD_NAME`: 리드 수신자 이름 (기본 `team-lead`)
|
|
251
|
-
|
|
252
|
-
Hub 통신 (Named Pipe 우선, HTTP fallback):
|
|
253
|
-
- `bridge.mjs`가 Named Pipe(`\\.\pipe\triflux-{pid}`) 우선 연결, 실패 시 HTTP `/bridge/*` fallback
|
|
254
|
-
- 실행 시작: `node hub/bridge.mjs team-task-update --team {name} --task-id {id} --claim --status in_progress`
|
|
255
|
-
- 실행 종료: `node hub/bridge.mjs team-task-update --team {name} --task-id {id} --status completed|failed`
|
|
256
|
-
- 리드 보고: `node hub/bridge.mjs team-send-message --team {name} --from {agent} --to team-lead --text "..."`
|
|
257
|
-
- 결과 발행: `node hub/bridge.mjs result --agent {id} --topic task.result --file {output}`
|
|
258
|
-
|
|
259
|
-
#### Step 3d: claude 타입만 Agent 직접 실행
|
|
260
|
-
|
|
261
|
-
`cli == claude`인 서브태스크에만 `Agent(subagent_type)`를 사용한다.
|
|
262
|
-
|
|
263
|
-
```
|
|
264
|
-
Agent({
|
|
265
|
-
name: "claude-worker-{n}",
|
|
266
|
-
team_name: teamName,
|
|
267
|
-
description: "claude-worker-{n}",
|
|
268
|
-
mode: "bypassPermissions",
|
|
269
|
-
run_in_background: true,
|
|
270
|
-
subagent_type: "{role}",
|
|
271
|
-
prompt: "너는 {teamName}의 Claude 워커이다.
|
|
272
|
-
|
|
273
|
-
1. TaskGet 후 TaskUpdate(status: in_progress, owner: 너의 이름)로 claim
|
|
274
|
-
2. 도구를 직접 사용해 작업 수행
|
|
275
|
-
3. 성공 시 TaskUpdate(status: completed, metadata: {result: 'success'}) + SendMessage(to: team-lead)
|
|
276
|
-
4. 실패 시 TaskUpdate(status: completed, metadata: {result: 'failed', error: '에러 요약'}) + SendMessage(to: team-lead)
|
|
277
|
-
|
|
278
|
-
중요: status는 'completed'만 사용. 'failed'는 API 미지원. 실패 여부는 metadata.result로 구분.
|
|
279
|
-
어떤 경우에도 TaskUpdate + SendMessage 후 반드시 종료하라."
|
|
280
|
-
})
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
#### Step 3e: 사용자 안내
|
|
284
|
-
|
|
285
|
-
```
|
|
286
|
-
"팀 '{teamName}' 생성 완료.
|
|
287
|
-
Codex/Gemini 워커가 슬림 래퍼 Agent로 네비게이션에 등록되었습니다.
|
|
288
|
-
Shift+Down으로 다음 워커로 전환 (마지막→리드 wrap). Shift+Tab으로 이전 워커 전환."
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
### Phase 3.5–3.7: Verify/Fix Loop (`--thorough` 전용)
|
|
292
|
-
|
|
293
|
-
> `--quick`(기본) 모드에서는 이 단계를 건너뛰고 Phase 4로 직행한다.
|
|
294
|
-
> `--thorough` 모드에서만 실행된다.
|
|
295
|
-
|
|
296
|
-
```
|
|
297
|
-
Phase 3.5: Verify (Codex review)
|
|
298
|
-
1. pipeline advance: exec → verify
|
|
299
|
-
2. Codex verifier로 결과 검증:
|
|
300
|
-
bash ~/.claude/scripts/tfx-route.sh verifier "결과 검증: ${task}" review
|
|
301
|
-
— verifier는 Codex --profile thorough review로 실행됨
|
|
302
|
-
3. 검증 결과를 파이프라인 artifact에 저장:
|
|
303
|
-
pipeline.setArtifact('verify_report', verifyOutputPath)
|
|
304
|
-
4. 통과 → pipeline advance: verify → complete → Phase 5 (cleanup)
|
|
305
|
-
5. 실패 → Phase 3.6
|
|
306
|
-
|
|
307
|
-
Phase 3.6: Fix (Codex executor, max 3회)
|
|
308
|
-
1. pipeline advance: verify → fix
|
|
309
|
-
— fix_attempt 자동 증가, fix_max(3) 초과 시 전이 거부
|
|
310
|
-
2. fix_attempt > fix_max → Phase 3.7 (ralph loop) 또는 failed 보고 → Phase 5
|
|
311
|
-
3. Codex executor로 실패 항목 수정:
|
|
312
|
-
bash ~/.claude/scripts/tfx-route.sh executor "실패 항목 수정: ${failedItems}" implement
|
|
313
|
-
4. pipeline advance: fix → exec (재실행)
|
|
314
|
-
5. → Phase 3 (exec) → Phase 3.5 (verify) 재실행
|
|
315
|
-
|
|
316
|
-
Phase 3.7: Ralph Loop (fix 3회 초과 시)
|
|
317
|
-
1. ralph_iteration 증가 (pipeline.restart())
|
|
318
|
-
2. ralph_iteration > ralph_max(10) → 최종 failed → Phase 5
|
|
319
|
-
3. fix_attempt 리셋, 전체 파이프라인 재시작 (Phase 2.5 plan부터)
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
### Phase 4: 결과 수집 (truth source = team_task_list)
|
|
323
|
-
|
|
324
|
-
1. 리드가 Step 3c에서 실행한 모든 백그라운드 Bash 프로세스 완료를 대기한다.
|
|
325
|
-
2. `team_task_list`를 최종 truth source로 조회한다.
|
|
326
|
-
|
|
327
|
-
```bash
|
|
328
|
-
Bash("node hub/bridge.mjs team-task-list --team ${teamName}")
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
3. `completed` 상태이지만 `metadata.result == "failed"`인 task가 있으면 Claude fallback으로 재시도한다.
|
|
332
|
-
4. 재시도 후 다시 `team_task_list`를 조회해 최종 상태를 확정한다.
|
|
333
|
-
5. `send-message`와 `result(task.result)` 이벤트는 진행 관찰 채널로 사용하고, 최종 판정은 반드시 `team_task_list` 기준으로 한다.
|
|
334
|
-
6. Hub `task-update`에서는 `status: "failed"`를 그대로 사용한다 (Hub API는 자체 상태 관리). Claude Code `TaskUpdate`만 `"completed"` + `metadata.result`로 구분한다.
|
|
335
|
-
|
|
336
|
-
종합 보고서 예시:
|
|
337
|
-
```markdown
|
|
338
|
-
## tfx-multi 실행 결과
|
|
339
|
-
|
|
340
|
-
| # | Worker | CLI | 작업 | 상태 |
|
|
341
|
-
|---|--------|-----|------|------|
|
|
342
|
-
| 1 | codex-worker-1 | codex | 인증 리팩터링 | completed |
|
|
343
|
-
| 2 | gemini-worker-1 | gemini | UI 개선 | completed |
|
|
344
|
-
| 3 | claude-worker-1 | claude | 실패 fallback 재시도 | completed |
|
|
345
|
-
```
|
|
346
|
-
|
|
347
|
-
### Phase 5: 정리 (반드시 실행)
|
|
348
|
-
|
|
349
|
-
> **[필수] Phase 5는 성공/실패에 관계없이 반드시 실행해야 한다.**
|
|
350
|
-
> 워커 실패, Bash 에러, fallback 실패 등 어떤 상황에서도 TeamDelete를 건너뛰면 안 된다.
|
|
351
|
-
> TeamDelete를 하지 않으면 `~/.claude/teams/{teamName}/`이 잔존하여 OMC hook이 "team executing"을
|
|
352
|
-
> 반복 감지하는 무한 루프에 빠진다.
|
|
353
|
-
|
|
354
|
-
정리 순서:
|
|
355
|
-
1. 모든 백그라운드 Agent 완료를 **최대 30초** 대기한다.
|
|
356
|
-
2. 30초 후에도 미완료 Agent가 있으면 대기를 중단하고 정리를 진행한다.
|
|
357
|
-
3. `TeamDelete()`를 호출한다.
|
|
358
|
-
4. TeamDelete가 실패하면 (활성 멤버 잔존) `forceCleanupTeam(teamName)`으로 강제 정리한다.
|
|
359
|
-
이것도 실패하면 수동 정리를 안내한다:
|
|
360
|
-
```
|
|
361
|
-
rm -rf ~/.claude/teams/{teamName}/ ~/.claude/tasks/{teamName}/
|
|
362
|
-
```
|
|
363
|
-
5. 종합 보고서를 출력한다.
|
|
364
|
-
|
|
365
|
-
### Phase 3-mux: 레거시 psmux/tmux 모드
|
|
366
|
-
`--tmux` 또는 `--psmux` 플래그 시 pane 기반 실행. `detectMultiplexer()`가 psmux → tmux → wsl-tmux → git-bash-tmux 순으로 자동 감지.
|
|
367
|
-
Windows에서는 **psmux가 1순위** (ADR-001).
|
|
368
|
-
|
|
369
|
-
Bash("node {PKG_ROOT}/bin/triflux.mjs multi --no-attach --agents {agents} \\\"{task}\\\"")
|
|
370
|
-
이후 사용자에게 세션 연결 안내.
|
|
371
|
-
|
|
372
|
-
## 에이전트 매핑
|
|
373
|
-
> 에이전트 매핑: codex/gemini → tfx-route.sh, claude → Agent(subagent_type) 직접 실행. 상세는 Phase 3c/3d 참조.
|
|
374
|
-
|
|
375
|
-
## 전제 조건
|
|
376
|
-
|
|
377
|
-
- **CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1** — settings.json env에 설정 (`tfx setup`이 자동 설정)
|
|
378
|
-
- **codex/gemini CLI** — 해당 에이전트 사용 시
|
|
379
|
-
- **tfx setup** — tfx-route.sh 동기화 + AGENT_TEAMS 자동 설정 (사전 실행 권장)
|
|
380
|
-
- **Hub 활성 상태** — Named Pipe(`\\.\pipe\triflux-{pid}`) 우선, HTTP `127.0.0.1:27888` fallback. `bridge.mjs`가 자동 선택. Hub 미실행 시 nativeProxy fallback.
|
|
381
|
-
- **멀티플렉서** — psmux(Windows 1순위) / tmux / wsl-tmux / git-bash-tmux 자동 감지 (`--tmux`/`--psmux` 모드)
|
|
382
|
-
- **출력 정책** — preflight는 비동기/요약 출력이 기본이며, 실패 시에만 상세 출력
|
|
383
|
-
|
|
384
|
-
## 에러 처리
|
|
385
|
-
|
|
386
|
-
| 에러 | 처리 |
|
|
387
|
-
|------|------|
|
|
388
|
-
| TeamCreate 실패 / Agent Teams 비활성 | `--psmux/--tmux` 폴백 (Phase 3-mux로 전환) |
|
|
389
|
-
| tfx-route.sh 없음 | `tfx setup` 실행 안내 |
|
|
390
|
-
| CLI 미설치 (codex/gemini) | 해당 서브태스크를 claude 워커로 대체 |
|
|
391
|
-
| Codex 분류 실패 | Opus 직접 분류+분해 |
|
|
392
|
-
| Bash 실행 실패 (Lead) | task를 `completed` + `metadata.result: "failed"`로 마킹 후 Claude fallback 재시도 |
|
|
393
|
-
| `team_task_list` 조회 실패 | Named Pipe/stdout로 임시 관찰 후 Hub 복구 뒤 상태 재검증 |
|
|
394
|
-
| claude fallback 실패 | 실패 task 목록/원인 요약 후 사용자 승인 대기 |
|
|
395
|
-
|
|
396
|
-
> **[중요] TaskUpdate 상태값 제약:** Claude Code API는 `pending`, `in_progress`, `completed`, `deleted`만 지원한다.
|
|
397
|
-
> `failed` 상태는 존재하지 않으므로 절대 사용하지 마라. 실패는 `status: "completed"` + `metadata: {result: "failed"}`로 표현한다.
|
|
398
|
-
> Hub API(`bridge.mjs team-task-update`)는 자체 상태 관리이므로 `"failed"` 사용 가능.
|
|
399
|
-
|
|
400
|
-
## 관련
|
|
401
|
-
|
|
402
|
-
| 항목 | 설명 |
|
|
403
|
-
|------|------|
|
|
404
|
-
| `scripts/tfx-route.sh` | 팀 통합 라우터 (`TFX_TEAM_*`, task claim/complete, send-message, Named Pipe/HTTP bridge) |
|
|
405
|
-
| `hub/team/native.mjs` | Native Teams 래퍼 (프롬프트 템플릿, 팀 설정 빌더) |
|
|
406
|
-
| `hub/team/cli/index.mjs` | tmux 팀 CLI 라우터 (`hub/team/cli/` 서브커맨드 구조) |
|
|
407
|
-
| `hub/pipeline/` | 파이프라인 상태 기계 (transitions, state, index) — `--thorough` 모드 |
|
|
408
|
-
| `tfx-auto` | one-shot 실행 오케스트레이터 (병행 유지) |
|
|
409
|
-
| `tfx-hub` | MCP 메시지 버스 관리 (tmux 모드용) |
|
|
1
|
+
---
|
|
2
|
+
name: tfx-multi
|
|
3
|
+
description: 멀티-CLI 팀 모드. Claude Native Agent Teams + Codex/Gemini 멀티모델 오케스트레이션.
|
|
4
|
+
triggers:
|
|
5
|
+
- tfx-multi
|
|
6
|
+
argument-hint: '"작업 설명" | --agents codex,gemini "작업" | --tmux "작업" | status | stop'
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# tfx-multi v3 — 파이프라인 기반 멀티-CLI 팀 오케스트레이터
|
|
10
|
+
|
|
11
|
+
> Claude Code Native Teams의 Shift+Down 네비게이션을 복원한다.
|
|
12
|
+
> Codex/Gemini 워커마다 최소 프롬프트(~100 토큰)의 슬림 Agent 래퍼를 spawn하여 네비게이션에 등록하고,
|
|
13
|
+
> 실제 작업은 `tfx-route.sh`가 수행한다. task 상태는 `team_task_list`를 truth source로 검증한다.
|
|
14
|
+
> v3 — `--quick`(기본) + `--thorough`(전체 파이프라인: plan→prd→exec→verify→fix loop).
|
|
15
|
+
|
|
16
|
+
> **Lead 고토큰 MCP 직접 사용 금지**
|
|
17
|
+
> Lead(Claude Opus)는 웹 서치(brave-search, exa, tavily), 외부 서비스(Notion, Jira/Confluence, Calendar, Gmail),
|
|
18
|
+
> 대량 조회를 직접 호출하지 않는다. Codex `scientist`/`document-specialist` 워커에 위임하면 Claude 토큰을 절약할 수 있다.
|
|
19
|
+
> 단건 조회(이슈 1개 확인 등)는 Lead 직접 허용하되, 3회 이상 반복 호출 시 위임 전환.
|
|
20
|
+
|
|
21
|
+
## 사용법
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
/tfx-multi "인증 리팩터링 + UI 개선 + 보안 리뷰" # --quick (기본)
|
|
25
|
+
/tfx-multi --thorough "인증 리팩터링 + UI 개선 + 보안 리뷰" # 전체 파이프라인
|
|
26
|
+
/tfx-multi --agents codex,gemini "프론트+백엔드"
|
|
27
|
+
/tfx-multi --tmux "작업" # 레거시 tmux 모드
|
|
28
|
+
/tfx-multi status
|
|
29
|
+
/tfx-multi stop
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 실행 워크플로우
|
|
33
|
+
|
|
34
|
+
### Phase 0: 사전 점검 (출력 최소화 + 즉시 spawn)
|
|
35
|
+
|
|
36
|
+
preflight와 Agent 생성을 병렬로 실행하여 사용자 체감 지연을 최소화한다.
|
|
37
|
+
|
|
38
|
+
- **수동 모드:** Phase 1 파싱 → Phase 3a~3c(TeamCreate + Agent spawn) + Phase 0(preflight) **동시 병렬**
|
|
39
|
+
- **자동 모드:** Phase 0(preflight) + Phase 2(triage) **동시 병렬** → Phase 3
|
|
40
|
+
- 리드에는 요약 한 줄만 노출. 예: `preflight: ok (route/hub)`
|
|
41
|
+
- 권장 체크: `curl -sf http://127.0.0.1:27888/status >/dev/null && test -f ~/.claude/scripts/tfx-route.sh && echo "preflight: ok" || echo "preflight: FAIL"`
|
|
42
|
+
- 실패 시에만 상세 노출 (tfx-route.sh 없음, Hub 비정상, CLI 미설치)
|
|
43
|
+
|
|
44
|
+
### Phase 1: 입력 파싱
|
|
45
|
+
|
|
46
|
+
인자 없이 호출되면 "어떤 작업을 실행할까요?" 등으로 입력 요청. TeamCreate/Agent spawn을 시작하지 않는다.
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
""(빈 문자열) → 사용자에게 작업 입력 요청
|
|
50
|
+
"3:codex 리뷰" → 수동 모드: N=3, agent=codex
|
|
51
|
+
"인증 + UI + 테스트" → 자동 모드: Codex 분류 → Opus 분해
|
|
52
|
+
"--tmux 인증 + UI" → Phase 3-mux 분기
|
|
53
|
+
"status" / "stop" → Bash("node bin/triflux.mjs multi {cmd}") 직행
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Phase 2: 트리아지 (tfx-auto와 동일)
|
|
57
|
+
|
|
58
|
+
**자동 모드:**
|
|
59
|
+
1. Codex `--full-auto --skip-git-repo-check` 분류 → JSON `{parts: [{description, agent}]}`
|
|
60
|
+
2. Opus 인라인 분해 → 서브태스크 배열 `[{cli, subtask, role}]`
|
|
61
|
+
3. Codex 분류 실패 시 → Opus가 직접 분류+분해
|
|
62
|
+
|
|
63
|
+
**수동 모드:** Codex 분류 건너뜀 → Opus가 직접 N개 서브태스크 분해.
|
|
64
|
+
|
|
65
|
+
### Phase 2.5–2.6 + 3.5–3.7: `--thorough` 파이프라인
|
|
66
|
+
|
|
67
|
+
> `--quick`(기본)에서는 건너뛴다. `--thorough` 모드에서만 실행.
|
|
68
|
+
> 상세는 → [`references/thorough-pipeline.md`](references/thorough-pipeline.md) 참조.
|
|
69
|
+
|
|
70
|
+
### Phase 3: Native Teams 실행
|
|
71
|
+
|
|
72
|
+
#### Step 3a: 팀 생성
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
teamName = "tfx-" + Date.now().toString(36).slice(-6)
|
|
76
|
+
TeamCreate({ team_name: teamName, description: "tfx-multi: {원본 작업 요약}" })
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
#### Step 3b: 공유 작업 등록
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
for each assignment (index i):
|
|
83
|
+
TaskCreate({ subject: assignment.subtask, metadata: { cli, role } })
|
|
84
|
+
agentName = "{cli}-worker-{i+1}"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
#### Step 3c: 슬림 래퍼 Agent 실행
|
|
88
|
+
|
|
89
|
+
Codex/Gemini 서브태스크마다 슬림 래퍼 Agent를 spawn하여 Shift+Down 네비게이션에 등록한다.
|
|
90
|
+
래퍼 내부에서 `tfx-route.sh`로 CLI를 실행하고, 리드 피드백을 받아 재실행하는 구조이다.
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
for each item where item.cli in ["codex", "gemini"]:
|
|
94
|
+
Agent({
|
|
95
|
+
name: item.agentName,
|
|
96
|
+
team_name: teamName,
|
|
97
|
+
mode: "bypassPermissions",
|
|
98
|
+
run_in_background: true,
|
|
99
|
+
prompt: buildSlimWrapperPrompt(item.cli, { subtask, role, teamName, taskId, agentName, leadName: "team-lead", mcp_profile })
|
|
100
|
+
})
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
슬림 래퍼 프롬프트의 단일 truth source: `hub/team/native.mjs`의 `buildSlimWrapperPrompt()`.
|
|
104
|
+
핵심 동작: Bash(tfx-route.sh) → SendMessage(보고) → 피드백 대기 → 재실행(N회) → TaskUpdate(completed) → 종료.
|
|
105
|
+
|
|
106
|
+
**핵심 규칙 요약:**
|
|
107
|
+
- Agent 래퍼 생략 금지 — 단일 워커도 반드시 Agent로 spawn (네비게이션 등록)
|
|
108
|
+
- `mode: "bypassPermissions"` 필수 — 모든 Agent에 포함
|
|
109
|
+
- `tfx-route.sh` 경유 필수 — 직접 `codex exec`/`gemini -y -p` 호출 금지
|
|
110
|
+
- 코드 직접 조작 금지 — 워커가 Read/Edit/Write 등 도구 직접 사용 금지
|
|
111
|
+
|
|
112
|
+
> 래퍼 규칙의 상세 이유와 인터럽트 프로토콜 → [`references/agent-wrapper-rules.md`](references/agent-wrapper-rules.md) 참조.
|
|
113
|
+
|
|
114
|
+
#### Step 3d: claude 타입만 Agent 직접 실행
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
Agent({
|
|
118
|
+
name: "claude-worker-{n}", team_name: teamName, mode: "bypassPermissions",
|
|
119
|
+
run_in_background: true, subagent_type: "{role}",
|
|
120
|
+
prompt: "TaskGet → TaskUpdate(in_progress) → 작업 수행 → TaskUpdate(completed, metadata: {result}) + SendMessage(to: team-lead)"
|
|
121
|
+
})
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
status는 "completed"만 사용. 실패 여부는 `metadata.result`로 구분.
|
|
125
|
+
|
|
126
|
+
#### Step 3e: 사용자 안내
|
|
127
|
+
|
|
128
|
+
"팀 생성 완료. Shift+Down으로 워커 전환, Shift+Tab으로 이전 워커."
|
|
129
|
+
|
|
130
|
+
### Phase 4: 결과 수집
|
|
131
|
+
|
|
132
|
+
`team_task_list`가 최종 truth source: `Bash("node hub/bridge.mjs team-task-list --team ${teamName}")`
|
|
133
|
+
- `metadata.result == "failed"` → Claude fallback 재시도
|
|
134
|
+
- Hub `task-update`에서는 `"failed"` 사용 가능. Claude Code `TaskUpdate`만 `"completed"` + `metadata.result`로 구분.
|
|
135
|
+
|
|
136
|
+
### Phase 5: 정리 (반드시 실행)
|
|
137
|
+
|
|
138
|
+
성공/실패에 관계없이 반드시 실행. TeamDelete를 건너뛰면 `~/.claude/teams/{teamName}/`이 잔존하여 무한 루프 발생.
|
|
139
|
+
|
|
140
|
+
1. 백그라운드 Agent 완료를 **최대 30초** 대기
|
|
141
|
+
2. `TeamDelete()` 호출
|
|
142
|
+
3. 실패 시 `forceCleanupTeam(teamName)` → 그래도 실패 시 `rm -rf ~/.claude/teams/{teamName}/` 안내
|
|
143
|
+
4. 종합 보고서 출력
|
|
144
|
+
|
|
145
|
+
### Phase 3-mux: 레거시 psmux/tmux 모드
|
|
146
|
+
|
|
147
|
+
`--tmux`/`--psmux` 시 pane 기반 실행. psmux가 Windows 1순위.
|
|
148
|
+
`Bash("node {PKG_ROOT}/bin/triflux.mjs multi --no-attach --agents {agents} \\\"{task}\\\"")`
|
|
149
|
+
|
|
150
|
+
## 전제 조건
|
|
151
|
+
|
|
152
|
+
- **CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1** — `tfx setup`이 자동 설정
|
|
153
|
+
- **codex/gemini CLI** — 해당 에이전트 사용 시
|
|
154
|
+
- **Hub 활성 상태** — Named Pipe 우선, HTTP `127.0.0.1:27888` fallback. Hub 미실행 시 nativeProxy fallback.
|
|
155
|
+
|
|
156
|
+
## 에러 처리
|
|
157
|
+
|
|
158
|
+
| 에러 | 처리 |
|
|
159
|
+
|------|------|
|
|
160
|
+
| TeamCreate 실패 / Agent Teams 비활성 | `--psmux/--tmux` 폴백 |
|
|
161
|
+
| tfx-route.sh 없음 | `tfx setup` 실행 안내 |
|
|
162
|
+
| CLI 미설치 (codex/gemini) | claude 워커로 대체 |
|
|
163
|
+
| Codex 분류 실패 | Opus 직접 분류+분해 |
|
|
164
|
+
| Bash 실행 실패 | `completed` + `metadata.result: "failed"` 마킹 후 Claude fallback |
|
|
165
|
+
| claude fallback 실패 | 실패 목록/원인 요약 후 사용자 승인 대기 |
|
|
166
|
+
|
|
167
|
+
> TaskUpdate 상태값: `pending`, `in_progress`, `completed`, `deleted`만 지원. `failed` 사용 금지.
|
|
168
|
+
|
|
169
|
+
## 관련
|
|
170
|
+
|
|
171
|
+
| 항목 | 설명 |
|
|
172
|
+
|------|------|
|
|
173
|
+
| `scripts/tfx-route.sh` | 팀 통합 라우터 |
|
|
174
|
+
| `hub/team/native.mjs` | Native Teams 래퍼 (프롬프트 템플릿) |
|
|
175
|
+
| `hub/pipeline/` | 파이프라인 상태 기계 (`--thorough` 모드) |
|
|
176
|
+
| `tfx-auto` | one-shot 실행 오케스트레이터 |
|
|
177
|
+
| `tfx-hub` | MCP 메시지 버스 관리 |
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Agent 래퍼 상세 규칙
|
|
2
|
+
|
|
3
|
+
## 슬림 래퍼의 존재 이유
|
|
4
|
+
|
|
5
|
+
Native Teams의 teammate는 Claude 모델만 가능하다.
|
|
6
|
+
Codex/Gemini는 teammate로 직접 등록할 수 없으므로, Claude slim wrapper를 spawn하고
|
|
7
|
+
래퍼 내부에서 `tfx-route.sh`로 Codex/Gemini CLI를 실행하는 구조이다.
|
|
8
|
+
|
|
9
|
+
래퍼가 존재하는 이유:
|
|
10
|
+
1. **Shift+Down 네비게이션 등록** — 래퍼 없이 Lead가 직접 Bash를 실행하면 네비게이션에 등록되지 않음
|
|
11
|
+
2. **리드↔워커 피드백 루프** — 워커가 결과를 보고하면 턴 경계가 생겨 리드가 방향을 수정할 수 있음
|
|
12
|
+
3. **실패 시 재실행** — N회 실행을 지원
|
|
13
|
+
|
|
14
|
+
## 필수 규칙
|
|
15
|
+
|
|
16
|
+
### 1. Agent 래퍼 생략 금지
|
|
17
|
+
|
|
18
|
+
Codex/Gemini 서브태스크는 워커 수에 관계없이 반드시 Agent 래퍼를 spawn해야 한다.
|
|
19
|
+
단일 워커(1:gemini 등)여도 Lead가 직접 Bash를 실행하면 안 된다.
|
|
20
|
+
Lead가 "효율적"이라고 판단해서 Agent를 건너뛰는 것은 금지한다.
|
|
21
|
+
|
|
22
|
+
### 2. mode: bypassPermissions 필수
|
|
23
|
+
|
|
24
|
+
모든 Agent spawn에 반드시 `mode: "bypassPermissions"`를 포함한다.
|
|
25
|
+
이 설정이 없으면 워커가 Bash 실행 시 사용자 승인을 요청하여 자동 실행이 중단된다.
|
|
26
|
+
|
|
27
|
+
### 3. tfx-route.sh 경유 필수
|
|
28
|
+
|
|
29
|
+
Lead 또는 Agent 래퍼가 `gemini -y -p "..."` 또는 `codex exec "..."`를 직접 호출하면 안 된다.
|
|
30
|
+
직접 호출하면 다음이 누락된다:
|
|
31
|
+
- tfx-route.sh의 모델 지정(`-m gemini-3.1-pro-preview`)
|
|
32
|
+
- MCP 필터
|
|
33
|
+
- 팀 bridge 연동
|
|
34
|
+
- Windows 호환 경로
|
|
35
|
+
- 타임아웃
|
|
36
|
+
- 후처리(토큰 추적/이슈 로깅)
|
|
37
|
+
|
|
38
|
+
반드시 `bash ~/.claude/scripts/tfx-route.sh {role} '{subtask}' {mcp_profile}`을 통해 실행해야 한다.
|
|
39
|
+
|
|
40
|
+
### 4. 코드 직접 조작 금지
|
|
41
|
+
|
|
42
|
+
슬림 래퍼 워커가 코드를 직접 읽거나 수정하면 안 된다.
|
|
43
|
+
codex-worker는 반드시 tfx-route.sh를 통해 Codex에 위임하고, gemini-worker도 마찬가지다.
|
|
44
|
+
워커가 Read, Edit, Write, Grep, Glob 등 도구를 직접 사용하는 것은 위임 구조 위반이다.
|
|
45
|
+
|
|
46
|
+
## 인터럽트 프로토콜
|
|
47
|
+
|
|
48
|
+
워커가 Bash 실행 전에 SendMessage로 시작을 보고하면 턴 경계가 생겨 리드가 방향 전환 메시지를 보낼 수 있다.
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
1. TaskUpdate(taskId, status: in_progress) — task claim
|
|
52
|
+
2. SendMessage(to: team-lead, "작업 시작: {agentName}") — 시작 보고 (턴 경계 생성)
|
|
53
|
+
3. Bash(command: tfx-route.sh ..., timeout: {bashTimeoutMs}) — 실행
|
|
54
|
+
4. SendMessage(to: team-lead, "결과: {요약}") — 결과 보고 (턴 경계 생성)
|
|
55
|
+
5. 리드 피드백 대기 — 피드백 수신 시 Step 3으로 돌아가 재실행
|
|
56
|
+
6. 최종 완료 시 TaskUpdate(status: completed, metadata: {result}) + SendMessage → 종료
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
리드는 워커의 Step 2, Step 4 시점에 턴 경계를 인식하고, 방향 전환/추가 지시/재실행 요청을 보낼 수 있다.
|
|
60
|
+
|
|
61
|
+
## Bash timeout 동적 상속
|
|
62
|
+
|
|
63
|
+
Bash timeout은 tfx-route.sh의 role/profile별 timeout + 60초 여유를 ms로 변환하여 동적 상속한다.
|
|
64
|
+
`getRouteTimeout(role, mcpProfile)` 기준:
|
|
65
|
+
- analyze/review 프로필 또는 architect/analyst 역할: 3600초
|
|
66
|
+
- 그 외 기본: 1080초(18분)
|
|
67
|
+
|
|
68
|
+
## tfx-route.sh 팀 통합 동작
|
|
69
|
+
|
|
70
|
+
`TFX_TEAM_*` 환경변수 기반 (이미 구현됨):
|
|
71
|
+
- `TFX_TEAM_NAME`: 팀 식별자
|
|
72
|
+
- `TFX_TEAM_TASK_ID`: 작업 식별자
|
|
73
|
+
- `TFX_TEAM_AGENT_NAME`: 워커 표기 이름
|
|
74
|
+
- `TFX_TEAM_LEAD_NAME`: 리드 수신자 이름 (기본 `team-lead`)
|
|
75
|
+
|
|
76
|
+
Hub 통신 (Named Pipe 우선, HTTP fallback):
|
|
77
|
+
- `bridge.mjs`가 Named Pipe(`\\.\pipe\triflux-{pid}`) 우선 연결, 실패 시 HTTP `/bridge/*` fallback
|
|
78
|
+
- 실행 시작: `node hub/bridge.mjs team-task-update --team {name} --task-id {id} --claim --status in_progress`
|
|
79
|
+
- 실행 종료: `node hub/bridge.mjs team-task-update --team {name} --task-id {id} --status completed|failed`
|
|
80
|
+
- 리드 보고: `node hub/bridge.mjs team-send-message --team {name} --from {agent} --to team-lead --text "..."`
|
|
81
|
+
- 결과 발행: `node hub/bridge.mjs result --agent {id} --topic task.result --file {output}`
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# --thorough 파이프라인 상세
|
|
2
|
+
|
|
3
|
+
> `--quick`(기본) 모드에서는 이 파일의 내용이 적용되지 않는다.
|
|
4
|
+
> `--thorough` 모드에서만 Phase 2.5-2.6과 Phase 3.5-3.7이 실행된다.
|
|
5
|
+
|
|
6
|
+
## Phase 2.5: Plan (Codex architect)
|
|
7
|
+
|
|
8
|
+
1. Hub pipeline 초기화:
|
|
9
|
+
```bash
|
|
10
|
+
Bash("node hub/bridge.mjs pipeline-advance --team ${teamName} --status plan")
|
|
11
|
+
```
|
|
12
|
+
— 또는 createPipeline(db, teamName) 직접 호출
|
|
13
|
+
2. Codex architect로 작업 분석 + 접근법 설계:
|
|
14
|
+
```bash
|
|
15
|
+
bash ~/.claude/scripts/tfx-route.sh architect "${task}" analyze
|
|
16
|
+
```
|
|
17
|
+
3. 결과를 파이프라인 artifact에 저장:
|
|
18
|
+
```
|
|
19
|
+
pipeline.setArtifact('plan_path', planOutputPath)
|
|
20
|
+
```
|
|
21
|
+
4. pipeline advance: plan → prd
|
|
22
|
+
|
|
23
|
+
## Phase 2.6: PRD (Codex analyst)
|
|
24
|
+
|
|
25
|
+
1. Codex analyst로 수용 기준 확정:
|
|
26
|
+
```bash
|
|
27
|
+
bash ~/.claude/scripts/tfx-route.sh analyst "${task}" analyze
|
|
28
|
+
```
|
|
29
|
+
2. 결과를 파이프라인 artifact에 저장:
|
|
30
|
+
```
|
|
31
|
+
pipeline.setArtifact('prd_path', prdOutputPath)
|
|
32
|
+
```
|
|
33
|
+
3. pipeline advance: prd → exec
|
|
34
|
+
|
|
35
|
+
## Phase 3.5: Verify (Codex review)
|
|
36
|
+
|
|
37
|
+
1. pipeline advance: exec → verify
|
|
38
|
+
2. Codex verifier로 결과 검증:
|
|
39
|
+
```bash
|
|
40
|
+
bash ~/.claude/scripts/tfx-route.sh verifier "결과 검증: ${task}" review
|
|
41
|
+
```
|
|
42
|
+
— verifier는 Codex --profile thorough review로 실행됨
|
|
43
|
+
3. 검증 결과를 파이프라인 artifact에 저장:
|
|
44
|
+
```
|
|
45
|
+
pipeline.setArtifact('verify_report', verifyOutputPath)
|
|
46
|
+
```
|
|
47
|
+
4. 통과 → pipeline advance: verify → complete → Phase 5 (cleanup)
|
|
48
|
+
5. 실패 → Phase 3.6
|
|
49
|
+
|
|
50
|
+
## Phase 3.6: Fix (Codex executor, max 3회)
|
|
51
|
+
|
|
52
|
+
1. pipeline advance: verify → fix
|
|
53
|
+
— fix_attempt 자동 증가, fix_max(3) 초과 시 전이 거부
|
|
54
|
+
2. fix_attempt > fix_max → Phase 3.7 (ralph loop) 또는 failed 보고 → Phase 5
|
|
55
|
+
3. Codex executor로 실패 항목 수정:
|
|
56
|
+
```bash
|
|
57
|
+
bash ~/.claude/scripts/tfx-route.sh executor "실패 항목 수정: ${failedItems}" implement
|
|
58
|
+
```
|
|
59
|
+
4. pipeline advance: fix → exec (재실행)
|
|
60
|
+
5. → Phase 3 (exec) → Phase 3.5 (verify) 재실행
|
|
61
|
+
|
|
62
|
+
## Phase 3.7: Ralph Loop (fix 3회 초과 시)
|
|
63
|
+
|
|
64
|
+
1. ralph_iteration 증가 (pipeline.restart())
|
|
65
|
+
2. ralph_iteration > ralph_max(10) → 최종 failed → Phase 5
|
|
66
|
+
3. fix_attempt 리셋, 전체 파이프라인 재시작 (Phase 2.5 plan부터)
|