triflux 3.2.0-dev.1 → 3.2.0-dev.2
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/triflux.mjs +185 -43
- package/hooks/hooks.json +12 -0
- package/hub/bridge.mjs +137 -51
- package/hub/server.mjs +100 -29
- package/hub/team/cli.mjs +1080 -113
- package/hub/team/native-supervisor.mjs +300 -0
- package/hub/team/native.mjs +92 -0
- package/hub/team/nativeProxy.mjs +455 -0
- package/hub/team/orchestrator.mjs +99 -35
- package/hub/team/pane.mjs +18 -9
- package/hub/team/session.mjs +359 -16
- package/hub/tools.mjs +113 -15
- package/package.json +1 -1
- package/scripts/setup.mjs +95 -0
- package/scripts/team-keyword.mjs +35 -0
- package/scripts/tfx-route.sh +13 -73
- package/skills/tfx-team/SKILL.md +204 -86
package/skills/tfx-team/SKILL.md
CHANGED
|
@@ -1,28 +1,32 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tfx-team
|
|
3
|
-
description: 멀티-CLI 팀 모드.
|
|
3
|
+
description: 멀티-CLI 팀 모드. Claude Native Agent Teams + Codex/Gemini 멀티모델 오케스트레이션.
|
|
4
4
|
triggers:
|
|
5
5
|
- tfx-team
|
|
6
|
-
argument-hint: '"작업 설명" | --agents codex,gemini "작업" | status | stop'
|
|
6
|
+
argument-hint: '"작업 설명" | --agents codex,gemini "작업" | --tmux "작업" | status | stop'
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# tfx-team —
|
|
9
|
+
# tfx-team v2 — Claude Native Teams 기반 멀티-CLI 팀 오케스트레이터
|
|
10
10
|
|
|
11
|
-
>
|
|
12
|
-
>
|
|
13
|
-
>
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
> Claude Code의 네이티브 Agent Teams (in-process 모드)를 활용하여
|
|
12
|
+
> tmux 없이 현재 터미널에서 Codex/Gemini/Claude 멀티모델 팀을 구성한다.
|
|
13
|
+
> 각 teammate는 Claude Code 인스턴스이지만 Codex/Gemini CLI **래퍼**로 동작하여 토큰을 최소화한다.
|
|
14
|
+
|
|
15
|
+
| | tfx-auto | tfx-team v1 (tmux) | **tfx-team v2 (native)** |
|
|
16
|
+
|--|----------|--------------------|-----------------------------|
|
|
17
|
+
| 트리아지 | Codex 분류 → Opus 분해 | 동일 | **동일** |
|
|
18
|
+
| 실행 | tfx-route.sh one-shot | tmux pane interactive | **Native Teams in-process** |
|
|
19
|
+
| 관찰 | stdout 반환 | Ctrl+B 방향키 | **Shift+Down teammate 전환** |
|
|
20
|
+
| 통신 | 없음 | Hub MCP 버스 | **내장 Mailbox + Task List** |
|
|
21
|
+
| 개입 | 불가 | tfx team send | **SendMessage** |
|
|
22
|
+
| tmux 필요 | ✗ | ✓ | **✗** |
|
|
20
23
|
|
|
21
24
|
## 사용법
|
|
22
25
|
|
|
23
26
|
```
|
|
24
27
|
/tfx-team "인증 리팩터링 + UI 개선 + 보안 리뷰"
|
|
25
28
|
/tfx-team --agents codex,gemini "프론트+백엔드"
|
|
29
|
+
/tfx-team --tmux "작업" # 레거시 tmux 모드
|
|
26
30
|
/tfx-team status
|
|
27
31
|
/tfx-team stop
|
|
28
32
|
```
|
|
@@ -34,14 +38,18 @@ argument-hint: '"작업 설명" | --agents codex,gemini "작업" | status | stop
|
|
|
34
38
|
```
|
|
35
39
|
입력: "3:codex 리뷰" → 수동 모드: N=3, agent=codex
|
|
36
40
|
입력: "인증 + UI + 테스트" → 자동 모드: Codex 분류 → Opus 분해
|
|
37
|
-
입력: "
|
|
38
|
-
입력: "
|
|
41
|
+
입력: "--tmux 인증 + UI" → tmux 레거시 모드 → Phase 3-tmux로 분기
|
|
42
|
+
입력: "status" → 제어 커맨드
|
|
43
|
+
입력: "stop" → 제어 커맨드
|
|
39
44
|
```
|
|
40
45
|
|
|
41
46
|
**제어 커맨드 감지:**
|
|
42
47
|
- `status`, `stop`, `kill`, `attach`, `list`, `send` → `Bash("node bin/triflux.mjs team {cmd}")` 직행
|
|
48
|
+
(`bin/triflux.mjs` 절대경로는 triflux 패키지 루트 기준)
|
|
43
49
|
- 그 외 → Phase 2 트리아지
|
|
44
50
|
|
|
51
|
+
**--tmux 감지:** 입력에 `--tmux`가 포함되면 Phase 3-tmux로 분기.
|
|
52
|
+
|
|
45
53
|
### Phase 2: 트리아지 (tfx-auto와 동일)
|
|
46
54
|
|
|
47
55
|
#### 자동 모드 — Codex 분류 → Opus 분해
|
|
@@ -57,7 +65,7 @@ Bash("codex exec --full-auto --skip-git-repo-check '다음 작업을 분석하
|
|
|
57
65
|
|
|
58
66
|
작업: {task}
|
|
59
67
|
|
|
60
|
-
JSON
|
|
68
|
+
JSON만 출력:
|
|
61
69
|
{ \"parts\": [{ \"description\": \"...\", \"agent\": \"codex|gemini|claude\" }] }
|
|
62
70
|
'")
|
|
63
71
|
```
|
|
@@ -65,108 +73,218 @@ Bash("codex exec --full-auto --skip-git-repo-check '다음 작업을 분석하
|
|
|
65
73
|
> Codex 분류 실패 시 → Opus(오케스트레이터)가 직접 분류+분해
|
|
66
74
|
|
|
67
75
|
```
|
|
68
|
-
# Step 2b:
|
|
69
|
-
분류 결과 →
|
|
70
|
-
codex
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
결과: agents 배열 + subtasks 배열
|
|
76
|
+
# Step 2b: 인라인 분해
|
|
77
|
+
분류 결과 → 서브태스크 배열 구성:
|
|
78
|
+
[{ cli: "codex", subtask: "인증 리팩터링", role: "executor" },
|
|
79
|
+
{ cli: "gemini", subtask: "UI 개선", role: "designer" },
|
|
80
|
+
{ cli: "codex", subtask: "보안 리뷰", role: "reviewer" }]
|
|
75
81
|
```
|
|
76
82
|
|
|
77
|
-
#### 수동 모드 (`N:agent_type`)
|
|
83
|
+
#### 수동 모드 (`N:agent_type` 또는 `--agents`)
|
|
78
84
|
|
|
79
85
|
Codex 분류 건너뜀 → Opus가 직접 N개 서브태스크 분해.
|
|
80
86
|
|
|
81
|
-
### Phase 3:
|
|
87
|
+
### Phase 3: Native Teams 실행
|
|
82
88
|
|
|
83
|
-
트리아지 결과를
|
|
89
|
+
트리아지 결과를 Claude Code 네이티브 Agent Teams로 실행한다.
|
|
90
|
+
|
|
91
|
+
#### Step 3a: 팀 생성
|
|
84
92
|
|
|
85
|
-
```bash
|
|
86
|
-
# agents 배열과 작업을 tfx team에 전달
|
|
87
|
-
Bash("node {PKG_ROOT}/bin/triflux.mjs team --agents {agents.join(',')} \"{task}\"")
|
|
88
93
|
```
|
|
94
|
+
teamName = "tfx-" + Date.now().toString(36).slice(-6)
|
|
89
95
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
5. 3초 대기 (CLI 초기화)
|
|
96
|
-
6. 각 pane에 서브태스크 프롬프트 주입 (load-buffer + paste-buffer)
|
|
97
|
-
7. tmux attach → 사용자에게 제어권
|
|
96
|
+
TeamCreate({
|
|
97
|
+
team_name: teamName,
|
|
98
|
+
description: "tfx-team: {원본 작업 요약}"
|
|
99
|
+
})
|
|
100
|
+
```
|
|
98
101
|
|
|
99
|
-
|
|
102
|
+
#### Step 3b: 공유 작업 등록
|
|
100
103
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
104
|
+
각 서브태스크에 대해 TaskCreate를 호출한다:
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
for each assignment in assignments:
|
|
108
|
+
TaskCreate({
|
|
109
|
+
subject: assignment.subtask,
|
|
110
|
+
description: "CLI: {assignment.cli}, 역할: {assignment.role}\n\n{상세 작업 내용}",
|
|
111
|
+
metadata: { cli: assignment.cli, role: assignment.role }
|
|
112
|
+
})
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
#### Step 3c: Teammate 스폰
|
|
116
|
+
|
|
117
|
+
**Agent 도구**에 `team_name`과 `name` 파라미터를 전달하여 teammate를 생성한다.
|
|
118
|
+
**모든 teammate를 `run_in_background: true`로 병렬 스폰한다.**
|
|
119
|
+
|
|
120
|
+
각 CLI 타입별 teammate 프롬프트:
|
|
121
|
+
|
|
122
|
+
**codex-worker (Codex CLI 래퍼):**
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
Agent({
|
|
126
|
+
name: "codex-worker-{n}",
|
|
127
|
+
team_name: teamName,
|
|
128
|
+
description: "codex-worker-{n}",
|
|
129
|
+
run_in_background: true,
|
|
130
|
+
prompt: "너는 {teamName}의 Codex 워커이다.
|
|
131
|
+
|
|
132
|
+
[실행 규칙]
|
|
133
|
+
1. TaskList를 호출하여 너에게 배정된 pending 작업을 확인하라
|
|
134
|
+
2. TaskGet으로 작업 상세를 읽고, TaskUpdate(status: in_progress, owner: 너의 이름)로 claim
|
|
135
|
+
3. Bash(\"bash ~/.claude/scripts/tfx-route.sh {role} '{subtask}' auto\")로 실행
|
|
136
|
+
4. 결과를 확인하고:
|
|
137
|
+
- 성공: TaskUpdate(status: completed) + SendMessage(type: message, recipient: team-lead, summary: '작업 완료')
|
|
138
|
+
- 실패: TaskUpdate에 에러 기록 + SendMessage로 리드에게 보고
|
|
139
|
+
5. TaskList를 다시 확인하고 추가 pending 작업이 있으면 반복
|
|
140
|
+
|
|
141
|
+
[규칙]
|
|
142
|
+
- 실제 구현은 Codex CLI가 수행 — 너는 실행+보고 역할만
|
|
143
|
+
- tfx-route.sh 결과를 그대로 보고하라 (요약하지 말 것)"
|
|
144
|
+
})
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**gemini-worker (Gemini CLI 래퍼):**
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
Agent({
|
|
151
|
+
name: "gemini-worker-{n}",
|
|
152
|
+
team_name: teamName,
|
|
153
|
+
description: "gemini-worker-{n}",
|
|
154
|
+
run_in_background: true,
|
|
155
|
+
prompt: "너는 {teamName}의 Gemini 워커이다.
|
|
156
|
+
|
|
157
|
+
[실행 규칙]
|
|
158
|
+
1. TaskList를 호출하여 너에게 배정된 pending 작업을 확인하라
|
|
159
|
+
2. TaskGet으로 작업 상세를 읽고, TaskUpdate(status: in_progress, owner: 너의 이름)로 claim
|
|
160
|
+
3. Bash(\"bash ~/.claude/scripts/tfx-route.sh {role} '{subtask}' auto\")로 실행
|
|
161
|
+
4. 결과를 확인하고:
|
|
162
|
+
- 성공: TaskUpdate(status: completed) + SendMessage(type: message, recipient: team-lead, summary: '작업 완료')
|
|
163
|
+
- 실패: TaskUpdate에 에러 기록 + SendMessage로 리드에게 보고
|
|
164
|
+
5. TaskList를 다시 확인하고 추가 pending 작업이 있으면 반복
|
|
165
|
+
|
|
166
|
+
[규칙]
|
|
167
|
+
- 실제 구현은 Gemini CLI가 수행 — 너는 실행+보고 역할만
|
|
168
|
+
- tfx-route.sh 결과를 그대로 보고하라 (요약하지 말 것)"
|
|
169
|
+
})
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**claude-worker (직접 실행):**
|
|
105
173
|
|
|
106
|
-
세션 분리 후 제어:
|
|
107
|
-
```bash
|
|
108
|
-
/tfx-team status # 팀 상태 확인
|
|
109
|
-
/tfx-team send 1 "추가 지시" # Pane 1에 입력
|
|
110
|
-
/tfx-team attach # 세션 재연결
|
|
111
|
-
/tfx-team stop # graceful 종료
|
|
112
174
|
```
|
|
175
|
+
Agent({
|
|
176
|
+
name: "claude-worker-{n}",
|
|
177
|
+
team_name: teamName,
|
|
178
|
+
description: "claude-worker-{n}",
|
|
179
|
+
run_in_background: true,
|
|
180
|
+
prompt: "너는 {teamName}의 Claude 워커이다.
|
|
181
|
+
|
|
182
|
+
[실행 규칙]
|
|
183
|
+
1. TaskList를 호출하여 너에게 배정된 pending 작업을 확인하라
|
|
184
|
+
2. TaskGet으로 작업 상세를 읽고, TaskUpdate(status: in_progress, owner: 너의 이름)로 claim
|
|
185
|
+
3. Glob, Grep, Read, Bash 등 도구를 직접 사용하여 작업 수행
|
|
186
|
+
4. 완료 시 TaskUpdate(status: completed) + SendMessage(type: message, recipient: team-lead, summary: '작업 완료')
|
|
187
|
+
5. TaskList를 다시 확인하고 추가 pending 작업이 있으면 반복
|
|
188
|
+
|
|
189
|
+
에러 시 TaskUpdate + SendMessage로 리드에게 보고."
|
|
190
|
+
})
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
#### Step 3d: 사용자 안내
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
"팀 '{teamName}' 생성 완료 ({N}명의 teammate).
|
|
197
|
+
Shift+Down으로 각 teammate의 진행 상황을 확인할 수 있습니다."
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Phase 4: 결과 수집
|
|
201
|
+
|
|
202
|
+
리드(이 오케스트레이터)가:
|
|
203
|
+
1. teammate들의 SendMessage를 자동 수신 (폴링 불필요 — 자동 배달됨)
|
|
204
|
+
2. 모든 teammate가 결과를 보고하면 TaskList로 전체 상태 확인
|
|
205
|
+
3. 모든 작업이 completed이면 종합 보고서 출력:
|
|
206
|
+
|
|
207
|
+
```markdown
|
|
208
|
+
## tfx-team 실행 결과
|
|
209
|
+
|
|
210
|
+
| # | Teammate | CLI | 작업 | 상태 |
|
|
211
|
+
|---|----------|-----|------|------|
|
|
212
|
+
| 1 | codex-worker-1 | codex | 인증 리팩터링 | ✓ completed |
|
|
213
|
+
| 2 | gemini-worker-1 | gemini | UI 개선 | ✓ completed |
|
|
214
|
+
| 3 | codex-worker-2 | codex | 보안 리뷰 | ✓ completed |
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Phase 5: 정리
|
|
113
218
|
|
|
114
|
-
|
|
219
|
+
```
|
|
220
|
+
# 각 teammate에 shutdown 요청
|
|
221
|
+
for each teammate in teammates:
|
|
222
|
+
SendMessage({
|
|
223
|
+
type: "shutdown_request",
|
|
224
|
+
recipient: teammate.name,
|
|
225
|
+
content: "모든 작업 완료. 종료합니다."
|
|
226
|
+
})
|
|
227
|
+
|
|
228
|
+
# 모든 teammate 종료 후 팀 삭제
|
|
229
|
+
TeamDelete()
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
> **중요:** TeamDelete는 활성 멤버가 있으면 실패한다. 반드시 모든 teammate에 shutdown_request를 보내고 종료를 확인한 후 호출.
|
|
115
233
|
|
|
116
|
-
|
|
117
|
-
- `register`: 에이전트 등록
|
|
118
|
-
- `publish`: 결과 발행 (topic: task.result)
|
|
119
|
-
- `poll_messages`: 다른 에이전트 메시지 수신
|
|
120
|
-
- `ask`: 다른 에이전트에게 질문
|
|
234
|
+
### Phase 3-tmux: 레거시 tmux 모드
|
|
121
235
|
|
|
122
|
-
|
|
236
|
+
`--tmux` 플래그가 있으면 기존 v1 방식으로 실행:
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
# PKG_ROOT: triflux 패키지 루트 (Bash로 확인)
|
|
240
|
+
Bash("node {PKG_ROOT}/bin/triflux.mjs team --no-attach --agents {agents.join(',')} \"{task}\"")
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
이후 Phase 4-5 대신 사용자에게 tmux 세션 안내:
|
|
244
|
+
|
|
245
|
+
```
|
|
246
|
+
"tmux 세션이 생성되었습니다.
|
|
247
|
+
tmux attach -t {sessionId} 세션 연결
|
|
248
|
+
Ctrl+B → 방향키 pane 전환
|
|
249
|
+
Ctrl+B → D 세션 분리
|
|
250
|
+
Ctrl+B → Z pane 전체화면"
|
|
251
|
+
```
|
|
123
252
|
|
|
124
253
|
## 에이전트 매핑
|
|
125
254
|
|
|
126
|
-
| 분류 결과 | CLI |
|
|
127
|
-
|
|
128
|
-
| codex |
|
|
129
|
-
| gemini |
|
|
130
|
-
| claude |
|
|
131
|
-
|
|
132
|
-
>
|
|
133
|
-
>
|
|
134
|
-
>
|
|
135
|
-
|
|
136
|
-
## tfx-auto와의 차이 요약
|
|
137
|
-
|
|
138
|
-
| 항목 | tfx-auto | tfx-team |
|
|
139
|
-
|------|----------|----------|
|
|
140
|
-
| 트리아지 | Codex 분류 → Opus 분해 | **동일** |
|
|
141
|
-
| 실행 단위 | 에이전트(executor, reviewer 등) | CLI(codex, gemini, claude) |
|
|
142
|
-
| 실행 방식 | `tfx-route.sh` (one-shot, 블랙박스) | tmux pane (interactive, 관찰 가능) |
|
|
143
|
-
| 결과 수집 | stdout 파싱 | Hub publish/poll |
|
|
144
|
-
| 개입 | 불가 | `tfx team send` |
|
|
145
|
-
| 통신 | 없음 | Hub MCP 메시지 버스 |
|
|
146
|
-
| Dashboard | 없음 | Pane 0 실시간 상태 |
|
|
147
|
-
| tmux 필요 | 아니오 | **예** |
|
|
148
|
-
| 종료 | 자동 (실행 완료) | 수동 (`tfx team stop`) |
|
|
255
|
+
| 분류 결과 | CLI | teammate 역할 | 실행 방법 |
|
|
256
|
+
|----------|-----|--------------|----------|
|
|
257
|
+
| codex | codex | Codex CLI 래퍼 | `tfx-route.sh {role} '{task}' auto` via Bash |
|
|
258
|
+
| gemini | gemini | Gemini CLI 래퍼 | `tfx-route.sh {role} '{task}' auto` via Bash |
|
|
259
|
+
| claude | claude | 직접 실행 | Glob/Grep/Read/Bash 직접 사용 |
|
|
260
|
+
|
|
261
|
+
> **핵심 아이디어:** Claude teammate = Codex/Gemini 실행 래퍼
|
|
262
|
+
> - Native Teams 인프라 (in-process, Task List, Mailbox) 활용
|
|
263
|
+
> - 실제 작업은 Codex/Gemini가 수행 (비용 최소화)
|
|
264
|
+
> - teammate의 Claude 토큰은 "실행+보고" 래퍼 역할에만 소비
|
|
149
265
|
|
|
150
266
|
## 전제 조건
|
|
151
267
|
|
|
152
|
-
- **
|
|
268
|
+
- **CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1** — settings.json env에 설정 (`tfx setup`이 자동 설정)
|
|
153
269
|
- **codex/gemini CLI** — 해당 에이전트 사용 시
|
|
154
|
-
- **tfx setup** —
|
|
270
|
+
- **tfx setup** — tfx-route.sh 동기화 + AGENT_TEAMS 자동 설정 (사전 실행 권장)
|
|
155
271
|
|
|
156
272
|
## 에러 처리
|
|
157
273
|
|
|
158
274
|
| 에러 | 처리 |
|
|
159
275
|
|------|------|
|
|
160
|
-
|
|
|
161
|
-
|
|
|
162
|
-
| CLI 미설치 | 해당
|
|
163
|
-
| MCP 미등록 | REST 폴백 (curl) |
|
|
276
|
+
| TeamCreate 실패 / Agent Teams 비활성 | `--tmux` 폴백 (Phase 3-tmux로 전환) |
|
|
277
|
+
| tfx-route.sh 없음 | `tfx setup` 실행 안내 |
|
|
278
|
+
| CLI 미설치 (codex/gemini) | 해당 서브태스크를 claude 워커로 대체 |
|
|
164
279
|
| Codex 분류 실패 | Opus 직접 분류+분해 |
|
|
280
|
+
| teammate 실행 에러 | TaskUpdate(status: failed) + SendMessage로 리드에게 보고 |
|
|
281
|
+
| teammate shutdown 거부 | 재시도 1회, 이후 사용자에게 보고 |
|
|
165
282
|
|
|
166
283
|
## 관련
|
|
167
284
|
|
|
168
285
|
| 항목 | 설명 |
|
|
169
286
|
|------|------|
|
|
170
|
-
| `hub/team
|
|
171
|
-
| `
|
|
172
|
-
| `tfx-
|
|
287
|
+
| `hub/team/native.mjs` | Native Teams 래퍼 (프롬프트 템플릿, 팀 설정 빌더) |
|
|
288
|
+
| `hub/team/cli.mjs` | tmux 팀 CLI (`--tmux` 레거시 모드) |
|
|
289
|
+
| `tfx-auto` | one-shot 실행 오케스트레이터 (병행 유지) |
|
|
290
|
+
| `tfx-hub` | MCP 메시지 버스 관리 (tmux 모드용) |
|