triflux 10.2.1 → 10.3.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.
@@ -130,6 +130,118 @@ Bash("triflux setup")
130
130
  description: "나중에 /tfx-profile --gemini로 관리"
131
131
  ```
132
132
 
133
+ #### 단계 3.6: Codex MCP Gateway 싱글톤 전환
134
+
135
+ Codex CLI가 매 호출마다 MCP 서버를 stdio로 spawn하면 좀비 Node.js 프로세스가 생긴다.
136
+ gateway SSE 싱글톤을 사용하도록 config.toml을 전환한다.
137
+
138
+ ```bash
139
+ node scripts/codex-mcp-gateway-sync.mjs --status
140
+ ```
141
+
142
+ - 전부 `sse` → ✅ 이미 전환됨
143
+ - `stdio` 또는 `missing` 있으면 → AskUserQuestion:
144
+ ```
145
+ question: "Codex MCP 서버를 gateway 싱글톤(SSE)으로 전환하시겠습니까? 매 호출마다 MCP를 새로 spawn하는 대신, 영속 gateway 데몬을 공유합니다. (좀비 Node.js 방지)"
146
+ header: "MCP Gateway"
147
+ options:
148
+ - label: "전환 (Recommended)"
149
+ description: "stdio → SSE URL 전환. 좀비 프로세스 방지"
150
+ - label: "건너뛰기"
151
+ description: "현재 stdio 방식 유지"
152
+ ```
153
+ "전환" 선택 시:
154
+ 1. gateway 데몬이 안 떠 있으면 먼저 기동: `node scripts/mcp-gateway-start.mjs`
155
+ 2. config.toml 전환: `node scripts/codex-mcp-gateway-sync.mjs --enable`
156
+ 3. 결과 확인: `node scripts/codex-mcp-gateway-sync.mjs --status`
157
+
158
+ #### 단계 3.7: Codex config.toml 충돌 감지
159
+
160
+ `~/.codex/config.toml`을 Read 도구로 읽어 `approval_mode`와 `sandbox` 설정을 확인한다.
161
+
162
+ **충돌 감지 규칙:**
163
+ - `approval_mode = "full-auto"` 가 config.toml에 있으면 → CLI에서 `--full-auto` 플래그 중복 사용 금지
164
+ - `sandbox = "elevated"` 가 config.toml에 있으면 → CLI에서 sandbox 플래그 중복 사용 금지
165
+ - 프로파일별 설정과 기본 설정이 충돌하면 → 경고 표시
166
+
167
+ 결과 표시:
168
+ ```
169
+ ## Codex config.toml 분석
170
+
171
+ | 설정 | 값 | CLI 주의사항 |
172
+ |------|-----|-------------|
173
+ | approval_mode | full-auto | --full-auto 플래그 생략 필수 |
174
+ | sandbox | elevated | sandbox 플래그 생략 필수 |
175
+ | model | codex-mini-latest | 프로파일별 오버라이드 가능 |
176
+ ```
177
+
178
+ 충돌 발견 시 AskUserQuestion:
179
+ ```
180
+ question: "config.toml에 approval_mode=full-auto가 설정되어 있습니다. triflux의 headless 실행에서 CLI 플래그 중복을 방지하려면 이 설정을 유지하는 것이 좋습니다. 현재 설정을 유지할까요?"
181
+ header: "Codex Config"
182
+ options:
183
+ - label: "유지 (Recommended)"
184
+ description: "config.toml 기본값 사용, CLI 플래그 자동 생략"
185
+ - label: "수정"
186
+ description: "config.toml을 편집하여 직접 조정"
187
+ ```
188
+
189
+ **CLAUDE.md 주입 (필수):** 감지된 config.toml 설정을 프로젝트 CLAUDE.md의 `<codex-config>` 섹션에 반영한다.
190
+ 이렇게 해야 훅(headless-guard, safety-guard)이 명령을 차단했을 때, Claude가 차단 메시지를 읽고 "왜 차단됐는지" + "어떻게 수정해야 하는지"를 CLAUDE.md에서 찾아서 올바르게 재시도할 수 있다.
191
+
192
+ 주입 예시 (Edit 도구로 `<codex-config>` 섹션 업데이트):
193
+ ```markdown
194
+ <codex-config>
195
+ ## Codex config.toml
196
+
197
+ config.toml에 이미 설정된 값은 CLI 플래그로 중복 지정하지 않는다.
198
+
199
+ | config.toml에 있으면 | CLI에서 생략 |
200
+ |---------------------|-------------|
201
+ | `approval_mode = "full-auto"` | `--full-auto` |
202
+ | `sandbox = "elevated"` | `--full-auto` |
203
+
204
+ 안전 패턴: config.toml에 기본값을 두고, CLI에서는 `--profile` 선택만 한다.
205
+ </codex-config>
206
+ ```
207
+
208
+ 차단 → 수정 흐름:
209
+ 1. headless-guard가 `codex exec --full-auto` 차단
210
+ 2. 차단 메시지: "config.toml에 approval_mode=full-auto 있으므로 --full-auto 중복"
211
+ 3. Claude가 CLAUDE.md `<codex-config>` 읽음 → `--full-auto` 제거 후 재실행
212
+ 4. 동일 실수 반복 방지
213
+
214
+ #### 단계 3.8: 원격 기기 프로빙 (Swarm Multi-Machine)
215
+
216
+ `references/hosts.json` 또는 `~/.triflux/hosts.json` 존재 여부 확인.
217
+
218
+ - 파일 없음 → AskUserQuestion:
219
+ ```
220
+ question: "원격 기기에서 스웜을 실행할 계획이 있나요? (tfx-swarm의 다중 기기 기능)"
221
+ header: "Remote"
222
+ options:
223
+ - label: "네, 원격 설정"
224
+ description: "SSH 호스트를 감지하고 연결 테스트합니다"
225
+ - label: "나중에"
226
+ description: "로컬만 사용. 나중에 /tfx-remote-setup으로 설정"
227
+ ```
228
+ "네" 선택 시 → `/tfx-remote-setup` 스킬 호출하여 호스트 위저드 실행
229
+
230
+ - 파일 있음 → 등록된 호스트 각각에 대해 SSH 연결 + Claude 설치 프로브:
231
+ ```bash
232
+ ssh -o ConnectTimeout=5 <host> echo ok 2>/dev/null && echo "REACHABLE" || echo "UNREACHABLE"
233
+ ```
234
+ 결과 표시:
235
+ ```
236
+ ## 원격 기기 상태
237
+
238
+ | 호스트 | SSH | Claude | 스웜 사용 |
239
+ |--------|-----|--------|----------|
240
+ | ryzen5-7600 | ✅ | ✅ v1.0.30 | 가능 |
241
+ | m2 | ✅ | ⚠ 미설치 | 불가 (Claude 설치 필요) |
242
+ | ultra4 | ❌ 연결 실패 | — | 불가 |
243
+ ```
244
+
133
245
  #### 단계 4: CLI 진단
134
246
 
135
247
  `triflux doctor --json`에는 psmux 설치 여부뿐 아니라 **버전/capability preflight**도 포함된다.
@@ -354,14 +466,26 @@ options:
354
466
  | 파일 동기화 | ✅ |
355
467
  | HUD 설정 | ✅ statusLine 등록됨 |
356
468
  | Codex 프로파일 | ✅ 3개 확인 |
469
+ | Codex config.toml | ✅ approval_mode=full-auto (CLI 플래그 자동 생략) |
357
470
  | Codex CLI | ✅ |
358
471
  | Gemini CLI | ⚠ 미설치 (선택) |
472
+ | 원격 기기 | ✅ 2대 사용 가능 (ryzen5-7600, m2) / ❌ 1대 연결 실패 |
359
473
  | MCP 인벤토리 | ✅ N개 서버 |
360
474
  | 검색 MCP | ✅ Exa, Tavily / ⏭ Brave (키 없음) |
361
475
 
476
+ ### 스웜 기능 수준
477
+
478
+ | 기능 | 상태 | 필요 조건 |
479
+ |------|------|----------|
480
+ | 로컬 단일 모델 | ✅ | Codex CLI |
481
+ | 로컬 다중 모델 | ✅ | Codex CLI + Gemini CLI |
482
+ | 다중 기기 스웜 | ✅ 2대 | SSH 호스트 + Claude 설치 |
483
+ | 전체 (다중 기기 x 다중 모델) | ✅ | 위 전부 |
484
+
362
485
  ### 다음 단계
363
486
  - Codex 미설치 시: `npm install -g @openai/codex`
364
487
  - Gemini 미설치 시: `npm install -g @google/gemini-cli`
488
+ - 원격 호스트 추가: `/tfx-remote-setup`
365
489
  - 검색 MCP 추가/변경: `/tfx-setup` → 단계별 선택 → 검색 MCP
366
490
  - 세션 재시작하면 HUD + 검색 MCP가 활성화됩니다
367
491
  ```
@@ -1,18 +1,31 @@
1
- # tfx-swarm — 통합 스웜 오케스트레이션
1
+ # tfx-swarm — 다중 기기 x 다중 모델 스웜 오케스트레이션
2
2
 
3
- > **Canonical swarm entrypoint.** tfx-codex-swarm + tfx-remote-spawn을 일반화 통합.
4
- > PRD swarm-planner swarm-hypervisor 파이프라인을 단일 스킬 호출�� 실행한다.
3
+ > **Multi-Machine x Multi-Model Swarm.** PRD 하나로 로컬과 원격 머신에서
4
+ > Claude + Codex + Gemini를 병렬 실행하고, file-lease로 충돌을 방지하며,
5
+ > 결과를 자동 통합한다. triflux의 킬러 스킬.
5
6
 
6
7
  ## 트리거
7
8
 
8
9
  - `swarm`, `스웜`, `병렬 실행`, `다중 워커`, `PRD 실행`, `swarm launch`
9
- - `codex-swarm` (backward compat 이 스킬로 라우팅)
10
+ - `codex-swarm` (backward compat -> 이 스킬로 라우팅)
11
+
12
+ ## 핵심 기능
13
+
14
+ | 기능 | 설명 |
15
+ |------|------|
16
+ | **다중 모델** | shard별 `agent: codex\|gemini\|claude` 지정. 작업 특성에 맞는 모델 배치 |
17
+ | **다중 기기** | shard별 `host: <ssh-host>` 지정. 로컬/원격 혼합 실행 |
18
+ | **File Lease** | shard별 파일 소유권. 동일 파일 동시 수정 방지 |
19
+ | **Redundant Execution** | critical shard는 다른 모델로 이중 실행 후 reconcile |
20
+ | **자동 통합** | 의존 순서대로 merge. 원격 shard는 SSH 경유 fetch |
21
+ | **장애 폴백** | rate limit -> 다른 모델로 자동 전환 (codex<->gemini<->claude) |
10
22
 
11
23
  ## 전제조건
12
24
 
13
- - psmux 3.3.0
25
+ - psmux >= 3.3.0
14
26
  - Hub 실행 중 (`curl -sf http://127.0.0.1:27888/status`)
15
- - Codex CLI (`codex --version`)
27
+ - Codex CLI 또는 Gemini CLI (사용할 agent에 따라)
28
+ - 원격 shard 사용 시: SSH 키 인증 + 원격 머신에 Claude Code 설치
16
29
  - 프로젝트에 `docs/prd/` 디렉토리 존재
17
30
 
18
31
  ## 실행 흐름
@@ -25,72 +38,133 @@ find docs/prd -name '*.md' -not -name '_template.md' -not -path '*/archived/*' |
25
38
 
26
39
  AskUserQuestion으로 실행할 PRD 선택. 복수 선택 시 각각 독립 shard.
27
40
 
28
- ### Step 2: 계획 생성
41
+ ### Step 2: 원격/모델 구성 확인
42
+
43
+ PRD 파싱 후, shard에 `host:` 필드가 있으면 AskUserQuestion으로 원격 실행 여부를 확인한다.
44
+
45
+ AskUserQuestion:
46
+
47
+ > PRD에 원격 호스트가 지정된 shard가 있습니다:
48
+ > - `{shard_name}` -> `{host}` ({agent})
49
+ >
50
+ > 원격 실행을 어떻게 할까요?
51
+
52
+ Options:
53
+ - A) 원격 포함 실행 (PRD 그대로) — 로컬+원격 혼합
54
+ - B) 전부 로컬에서 실행 — host 필드 무시
55
+ - C) 원격만 실행 — 로컬 shard 건너뛰기
56
+
57
+ PRD에 다중 agent가 지정된 경우에도 AskUserQuestion:
58
+
59
+ > PRD에 여러 모델이 지정되어 있습니다:
60
+ > - codex: {N}개 shard
61
+ > - gemini: {N}개 shard
62
+ > - claude: {N}개 shard
63
+ >
64
+ > 모델 배치를 어떻게 할까요?
65
+
66
+ Options:
67
+ - A) PRD 그대로 — shard별 지정 모델 사용 (권장)
68
+ - B) 전부 Codex로 — 단일 모델
69
+ - C) 전부 Gemini로 — 단일 모델
70
+
71
+ ### Step 3: 계획 생성
29
72
 
30
73
  ```javascript
31
- import { plan } from '../../hub/team/swarm-planner.mjs';
74
+ import { planSwarm } from '../../hub/team/swarm-planner.mjs';
32
75
 
33
- const swarmPlan = plan({
34
- prdText: selectedPrdContent,
35
- baseBranch: 'main',
36
- provider: 'codex', // 기본값, AskUserQuestion으로 변경 가능
37
- });
76
+ const swarmPlan = planSwarm(selectedPrdPath);
38
77
  ```
39
78
 
40
79
  계획을 사용자에게 보여주고 승인 요청:
41
80
  - shard 수, 파일 배분, lease 맵, merge 순서
81
+ - 원격 shard 표시 (host 정보)
82
+ - 모델 배분 표시 (agent 정보)
42
83
  - critical shard 표시 (redundant execution 대상)
43
84
 
44
- ### Step 3: Hypervisor 실행
85
+ ### Step 4: Hypervisor 실행
45
86
 
46
87
  ```javascript
47
88
  import { createSwarmHypervisor } from '../../hub/team/swarm-hypervisor.mjs';
48
89
 
49
90
  const hyper = createSwarmHypervisor({
50
- rootDir: process.cwd(),
51
- maxConcurrency: 4,
91
+ workdir: process.cwd(),
92
+ logsDir: join(process.cwd(), '.triflux', 'swarm-logs'),
93
+ maxRestarts: 2,
52
94
  });
53
95
 
54
- const run = await hyper.launch(swarmPlan);
96
+ const run = hyper.launch(swarmPlan);
55
97
  ```
56
98
 
57
99
  실행 중 상태 모니터링:
58
- - `hyper.on('shardLaunched', ...)` 진행 표시
59
- - `hyper.on('shardDone', ...)` 완료/실패 표시
60
- - `hyper.on('zombieDetected', ...)` 경고
100
+ - `hyper.on('shardLaunched', ...)` -> 진행 표시
101
+ - `hyper.on('shardCompleted', ...)` -> 완료/실패 표시
102
+ - `hyper.on('warning', ...)` -> 경고 (파일 충돌 등)
61
103
 
62
- ### Step 4: 결과 검증 + 통합
104
+ 원격 shard 실행 시:
105
+ 1. `probeRemoteEnv(host)` -> 원격 환경 감지 (OS, shell, Claude 경로)
106
+ 2. conductor가 `remote: true` 설정으로 SSH 경유 세션 실행
107
+ 3. 완료 후 `fetchRemoteShard()`로 원격 브랜치를 로컬로 fetch
63
108
 
64
- ```javascript
65
- // 각 shard 결과 검증
66
- for (const shard of swarmPlan.shards) {
67
- const v = hyper.validateResult(run.runId, shard.id);
68
- if (!v.accepted) console.log(`${shard.id}: ${v.reason}`);
69
- }
109
+ ### Step 5: 결과 검증 + 통합
70
110
 
71
- // merge order에 따라 integration branch로 통합
72
- const integration = await hyper.integrateResults(run.runId);
111
+ ```javascript
112
+ const status = hyper.getStatus();
113
+ // status.completedShards, status.failedShards, status.workers
73
114
  ```
74
115
 
75
116
  통합 결과를 사용자에게 보고:
76
- - 성공: merged shard 목록
117
+ - 성공: merged shard 목록 (로컬/원격 구분 표시)
77
118
  - 실패: 충돌/실패 shard 목록 + 수동 해결 안내
78
119
 
79
- ### Step 5: 정리
120
+ ### Step 6: 정리
80
121
 
81
122
  ```javascript
82
- await hyper.cleanup(run.runId, { keepFailedWorktrees: true });
123
+ await hyper.shutdown('completed');
83
124
  ```
84
125
 
85
- ### Step 6: pack.mjs 동기화
86
-
87
- 새 모듈이 hub/team/에 추가되었으므로:
126
+ ## PRD 예제: 다중 기기 x 다중 모델
88
127
 
89
- ```bash
90
- npm run pack
128
+ ```markdown
129
+ ## Shard: auth-refactor
130
+ - agent: codex
131
+ - files: src/auth.mjs, src/middleware/jwt.mjs
132
+ - prompt: JWT 인증 미들웨어 리팩터링
133
+
134
+ ## Shard: ui-dashboard
135
+ - agent: gemini
136
+ - files: src/ui/dashboard.mjs, src/ui/charts.mjs
137
+ - prompt: 대시보드 UI 개선
138
+
139
+ ## Shard: security-audit
140
+ - agent: claude
141
+ - host: ryzen5-7600
142
+ - files: src/security.mjs
143
+ - critical: true
144
+ - prompt: 보안 취약점 감사
145
+
146
+ ## Shard: perf-optimization
147
+ - agent: codex
148
+ - host: m2
149
+ - files: src/engine/optimizer.mjs
150
+ - depends: auth-refactor
151
+ - prompt: 성능 최적화 (auth 리팩터 완료 후)
91
152
  ```
92
153
 
93
- REMOTE_INDEX에 export가 필요하면 scripts/pack.mjs 수정 재실행.
154
+ PRD 하나로: Codex(로컬) + Gemini(로컬) + Claude(ryzen5-7600) + Codex(m2) 4개 워커가 병렬 실행된다.
155
+ security-audit는 `critical: true`이므로 다른 모델로 이중 실행 후 reconcile.
156
+
157
+ ## PRD Shard 필드 레퍼런스
158
+
159
+ | 필드 | 필수 | 기본값 | 설명 |
160
+ |------|------|--------|------|
161
+ | `agent` | - | `codex` | 실행 모델: `codex`, `gemini`, `claude` |
162
+ | `host` | - | (로컬) | SSH 호스트. 미지정 시 로컬 실행 |
163
+ | `files` | O | - | shard가 수정할 파일 목록 (file-lease 대상) |
164
+ | `depends` | - | - | 의존하는 shard 이름. 해당 shard 완료 후 실행 |
165
+ | `critical` | - | `false` | `true`면 다른 모델로 이중 실행 + reconcile |
166
+ | `mcp` | - | - | 필요한 MCP 서버 목록 |
167
+ | `prompt` | O | - | shard 실행 프롬프트. `\|`로 멀티라인 |
94
168
 
95
169
  ## 제약
96
170
 
@@ -115,40 +189,18 @@ if (shouldRunRedundant(shard)) {
115
189
 
116
190
  HITL fallback 시 AskUserQuestion으로 사용자에게 선택 요청.
117
191
 
118
- ## Remote Shard 지원 (Lake 3)
119
-
120
- PRD에 `- host: <ssh-host>` 필드를 추가하면 해당 shard가 원격 머신에서 실행된다.
121
-
122
- ```markdown
123
- ## Shard: heavy-analysis
124
- - agent: codex
125
- - host: ultra4
126
- - files: src/analysis/engine.mjs
127
- - prompt: 대규모 분석 엔진 구��
128
- ```
129
-
130
- 동작 원리:
131
- 1. swarm-planner가 `host` 필드를 파싱하여 shard에 포함
132
- 2. swarm-hypervisor의 `launchShard()`가 `probeRemoteEnv(host)`로 원격 환경 감지
133
- 3. conductor의 `spawnSession({ remote: true, host, ... })`로 원격 세션 실행
134
- 4. worktree-lifecycle이 `remoteGit()`으로 SSH 경유 worktree 생성
135
-
136
- 전제조건:
137
- - SSH 키 인증 설정 완료 (`ssh ultra4` 패스워드 없이 접속 가능)
138
- - 원격 머신에 Claude Code 설치됨 (`probeRemoteEnv`가 자동 확인)
139
- - hosts.json 등록 권장 (`/tfx-remote-setup`으로 설정)
140
-
141
- host 미지정 shard는 기존대로 로컬 실행. 로컬/원격 혼합 가능.
142
-
143
- ## 기존 tfx-codex-swarm과의 관계
192
+ ## 장애 처리
144
193
 
145
- - tfx-codex-swarm은 스킬의 **backward compat alias**
146
- - 기존 워크플로우(PRD 스캔 → worktree 생성 → Codex 실행)는 동일
147
- - 차이: 프로그래밍 API 기반, file lease, redundant exec, 자동 merge
194
+ | 장애 | 분류 | 대응 |
195
+ |------|------|------|
196
+ | 워커 크래시 | F1 | conductor auto-restart (최대 2회) |
197
+ | Rate limit | F2 | 다른 모델로 자동 전환 (codex->gemini->claude) |
198
+ | Stall | F3 | health probe 감지 -> kill -> restart |
199
+ | File lease 위반 | F4 | 워커 변경 revert, shard 실패 처리 |
200
+ | Merge 충돌 | F5 | 충돌 해결 재시도 |
148
201
 
149
- ## tfx-remote-spawn과의 관계
202
+ ## 기존 스킬과의 관계
150
203
 
151
- - tfx-remote-spawn의 핵심 함수가 `hub/team/remote-session.mjs`로 모듈화됨
152
- - swarm-hypervisor가 모듈을 사용하여 원격 세션을 관리
153
- - tfx-remote-spawn 스킬은 **단독 원격 세션 관리**용으로 유지 (list, attach, send)
154
- - swarm은 **다중 shard 병렬 관리** (로컬+원격 혼합)
204
+ - **tfx-codex-swarm**: deprecated. 스킬로 통합됨 (backward compat alias)
205
+ - **tfx-remote-spawn**: 단독 원격 세션 관리(list, attach, send)용으로 유지. swarm은 다중 shard 병렬 관리
206
+ - **tfx-multi**: Claude Native Teams 기반 로컬 오케스트레이션. swarm은 PRD 기반 worktree 분할