triflux 10.3.3 → 10.4.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.
Files changed (130) hide show
  1. package/CLAUDE.md +193 -0
  2. package/LICENSE +21 -21
  3. package/hooks/hook-registry.json +256 -256
  4. package/hub/adaptive-inject.mjs +1 -1
  5. package/hub/assign-callbacks.mjs +120 -120
  6. package/hub/delegator/index.mjs +14 -14
  7. package/hub/delegator/tool-definitions.mjs +35 -35
  8. package/hub/hitl.mjs +143 -143
  9. package/hub/lib/path-utils.mjs +167 -0
  10. package/hub/router.mjs +791 -791
  11. package/hub/session-fingerprint.mjs +1 -1
  12. package/hub/team/cli/commands/attach.mjs +37 -37
  13. package/hub/team/cli/commands/debug.mjs +74 -74
  14. package/hub/team/cli/commands/focus.mjs +53 -53
  15. package/hub/team/cli/commands/list.mjs +24 -24
  16. package/hub/team/cli/commands/start/start-in-process.mjs +40 -40
  17. package/hub/team/cli/commands/start/start-mux.mjs +73 -73
  18. package/hub/team/cli/commands/start/start-wt.mjs +69 -69
  19. package/hub/team/cli/commands/tasks.mjs +13 -13
  20. package/hub/team/cli/render.mjs +30 -30
  21. package/hub/team/cli/services/attach-fallback.mjs +54 -54
  22. package/hub/team/cli/services/member-selector.mjs +30 -30
  23. package/hub/team/cli/services/native-control.mjs +116 -116
  24. package/hub/team/cli/services/task-model.mjs +30 -30
  25. package/hub/team/notify.mjs +1 -1
  26. package/hub/team/orchestrator.mjs +161 -161
  27. package/hub/team/runtime-strategy.mjs +74 -0
  28. package/hub/team/session.mjs +611 -611
  29. package/hub/team/shared.mjs +13 -13
  30. package/hub/team/worktree-lifecycle.mjs +61 -2
  31. package/hub/tray.mjs +368 -368
  32. package/hub/workers/codex-mcp.mjs +507 -507
  33. package/hub/workers/factory.mjs +21 -21
  34. package/hud/hud-qos-status.mjs +17 -3
  35. package/hud/mission-board.mjs +53 -0
  36. package/hud/providers/claude.mjs +95 -22
  37. package/hud/renderers.mjs +39 -5
  38. package/package.json +21 -55
  39. package/references/hosts.json +33 -0
  40. package/scripts/completions/tfx.bash +47 -47
  41. package/scripts/completions/tfx.fish +44 -44
  42. package/scripts/completions/tfx.zsh +83 -83
  43. package/scripts/demo.mjs +169 -0
  44. package/scripts/headless-guard.mjs +16 -4
  45. package/scripts/hub-ensure.mjs +120 -120
  46. package/scripts/keyword-detector.mjs +272 -272
  47. package/scripts/keyword-rules-expander.mjs +521 -521
  48. package/scripts/lib/mcp-server-catalog.mjs +118 -118
  49. package/scripts/lib/skill-state.mjs +220 -0
  50. package/scripts/notion-read.mjs +553 -553
  51. package/scripts/test-tfx-route-no-claude-native.mjs +57 -57
  52. package/scripts/tfx-batch-stats.mjs +96 -96
  53. package/skills/.omc/state/agent-replay-8f0e10a9-9693-4410-96f5-a6b07e8ed995.jsonl +1 -0
  54. package/skills/.omc/state/idle-notif-cooldown.json +3 -0
  55. package/skills/.omc/state/last-tool-error.json +7 -0
  56. package/skills/.omc/state/subagent-tracking.json +7 -0
  57. package/skills/tfx-remote-spawn/references/hosts.json +16 -0
  58. package/skills/tfx-workspace/async-tests/run-tests.sh +203 -0
  59. package/skills/tfx-workspace/evals/evals.json +79 -0
  60. package/skills/tfx-workspace/iteration-1/benchmark.json +162 -0
  61. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/eval_metadata.json +11 -0
  62. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/old_skill/grading.json +9 -0
  63. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/old_skill/outputs/analysis.md +154 -0
  64. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/old_skill/timing.json +5 -0
  65. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/with_skill/grading.json +9 -0
  66. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/with_skill/outputs/analysis.md +126 -0
  67. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/with_skill/timing.json +5 -0
  68. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/eval_metadata.json +11 -0
  69. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/old_skill/grading.json +9 -0
  70. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/old_skill/outputs/analysis.md +119 -0
  71. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/old_skill/timing.json +5 -0
  72. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/with_skill/grading.json +9 -0
  73. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/with_skill/outputs/analysis.md +115 -0
  74. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/with_skill/timing.json +5 -0
  75. package/skills/tfx-workspace/iteration-1/hub-start-sequence/eval_metadata.json +10 -0
  76. package/skills/tfx-workspace/iteration-1/hub-start-sequence/old_skill/grading.json +8 -0
  77. package/skills/tfx-workspace/iteration-1/hub-start-sequence/old_skill/outputs/analysis.md +86 -0
  78. package/skills/tfx-workspace/iteration-1/hub-start-sequence/old_skill/timing.json +5 -0
  79. package/skills/tfx-workspace/iteration-1/hub-start-sequence/with_skill/grading.json +8 -0
  80. package/skills/tfx-workspace/iteration-1/hub-start-sequence/with_skill/outputs/analysis.md +81 -0
  81. package/skills/tfx-workspace/iteration-1/hub-start-sequence/with_skill/timing.json +5 -0
  82. package/skills/tfx-workspace/iteration-1/multi-team-creation/eval_metadata.json +12 -0
  83. package/skills/tfx-workspace/iteration-1/multi-team-creation/old_skill/grading.json +10 -0
  84. package/skills/tfx-workspace/iteration-1/multi-team-creation/old_skill/outputs/analysis.md +316 -0
  85. package/skills/tfx-workspace/iteration-1/multi-team-creation/old_skill/timing.json +5 -0
  86. package/skills/tfx-workspace/iteration-1/multi-team-creation/with_skill/grading.json +10 -0
  87. package/skills/tfx-workspace/iteration-1/multi-team-creation/with_skill/outputs/analysis.md +352 -0
  88. package/skills/tfx-workspace/iteration-1/multi-team-creation/with_skill/timing.json +5 -0
  89. package/skills/tfx-workspace/iteration-1/review.html +1325 -0
  90. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/eval_metadata.json +12 -0
  91. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/old_skill/grading.json +10 -0
  92. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/old_skill/outputs/analysis.md +97 -0
  93. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/old_skill/timing.json +5 -0
  94. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/with_skill/grading.json +10 -0
  95. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/with_skill/outputs/analysis.md +94 -0
  96. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/with_skill/timing.json +5 -0
  97. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/eval_metadata.json +12 -0
  98. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/old_skill/grading.json +10 -0
  99. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/old_skill/outputs/analysis.md +209 -0
  100. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/old_skill/timing.json +5 -0
  101. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/with_skill/grading.json +10 -0
  102. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/with_skill/outputs/analysis.md +193 -0
  103. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/with_skill/timing.json +5 -0
  104. package/skills/tfx-workspace/iteration-2/benchmark.json +62 -0
  105. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/eval_metadata.json +13 -0
  106. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/old_skill/grading.json +11 -0
  107. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/old_skill/outputs/analysis.md +382 -0
  108. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/old_skill/timing.json +5 -0
  109. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/with_skill/grading.json +11 -0
  110. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/with_skill/outputs/analysis.md +333 -0
  111. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/with_skill/timing.json +5 -0
  112. package/skills/tfx-workspace/iteration-2/review.html +1325 -0
  113. package/skills/tfx-workspace/skill-snapshot/tfx-auto/SKILL.md +217 -0
  114. package/skills/tfx-workspace/skill-snapshot/tfx-auto-codex/SKILL.md +77 -0
  115. package/skills/tfx-workspace/skill-snapshot/tfx-codex/SKILL.md +65 -0
  116. package/skills/tfx-workspace/skill-snapshot/tfx-doctor/SKILL.md +94 -0
  117. package/skills/tfx-workspace/skill-snapshot/tfx-gemini/SKILL.md +82 -0
  118. package/skills/tfx-workspace/skill-snapshot/tfx-hub/SKILL.md +133 -0
  119. package/skills/tfx-workspace/skill-snapshot/tfx-multi/SKILL.md +426 -0
  120. package/skills/tfx-workspace/skill-snapshot/tfx-setup/SKILL.md +101 -0
  121. package/.claude-plugin/marketplace.json +0 -34
  122. package/.claude-plugin/plugin.json +0 -22
  123. package/config/mcp-registry.json +0 -29
  124. package/tui/codex-profile.mjs +0 -402
  125. package/tui/core.mjs +0 -236
  126. package/tui/doctor.mjs +0 -328
  127. package/tui/gemini-profile.mjs +0 -254
  128. package/tui/monitor-data.mjs +0 -148
  129. package/tui/monitor.mjs +0 -295
  130. package/tui/setup.mjs +0 -442
@@ -0,0 +1,115 @@
1
+ # tfx-doctor Routing Analysis
2
+
3
+ ## User Request
4
+
5
+ > "HUD가 안 보이고 codex도 안 되는데 어떻게 해?"
6
+
7
+ ---
8
+
9
+ ## Skill Matched
10
+
11
+ **tfx-doctor** (`skills/tfx-doctor/SKILL.md`)
12
+
13
+ The request directly matches two of the documented auto-suggestion triggers:
14
+ - "HUD가 안 보여" → maps to "HUD가 안 보이고"
15
+ - "codex/gemini가 안 돼" → maps to "codex도 안 되는데"
16
+
17
+ ---
18
+
19
+ ## Mode Selected
20
+
21
+ **Default mode** (`/tfx-doctor` — 진단만, 읽기 전용)
22
+
23
+ Rationale: The user is reporting symptoms ("안 보이고", "안 되는데") but has not asked for an automatic fix, a reset, or a cache wipe. The skill definition states that the default mode is read-only diagnosis only. `--fix` would be *suggested* after the diagnosis if issues are found, but it would not be applied automatically without user consent. `--reset` is not appropriate here because the user has not said "캐시 초기화", "리셋", or "reset".
24
+
25
+ ---
26
+
27
+ ## Exact Bash Command That Would Be Run
28
+
29
+ ```bash
30
+ Bash("triflux doctor")
31
+ ```
32
+
33
+ No flags. This is the single command executed in default mode.
34
+
35
+ ---
36
+
37
+ ## Diagnostics Checked
38
+
39
+ The skill definition lists the following items that `triflux doctor` inspects:
40
+
41
+ | # | Diagnostic Item | Relevance to this Request |
42
+ |---|-----------------|--------------------------|
43
+ | 1 | tfx-route.sh 설치 상태 | Baseline routing check |
44
+ | 2 | HUD 설치 및 설정 상태 | Directly relevant — HUD가 안 보임 |
45
+ | 3 | Codex/Gemini/Claude CLI 경로 (크로스 셸) | Directly relevant — codex 안 됨 |
46
+ | 4 | 스킬 설치 상태 | General health |
47
+ | 5 | 플러그인 등록 상태 | General health |
48
+ | 6 | MCP 인벤토리 캐시 | Could affect HUD/Codex behaviour |
49
+ | 7 | CLI 이슈 트래커 | May surface logged errors |
50
+ | 8 | 잔존 팀(orphan teams) 감지 (`~/.claude/teams/`) | General health |
51
+
52
+ Both primary symptoms (HUD invisible, Codex not working) are covered by items 2 and 3.
53
+
54
+ ---
55
+
56
+ ## --fix Suggestion
57
+
58
+ **Yes — `--fix` would be suggested** after the diagnosis report is returned to the user.
59
+
60
+ The skill's error-handling table states: "if issues remain after `--fix`, manual installation of Codex/Gemini is guided." This implies the flow is:
61
+
62
+ 1. Run default diagnosis → report findings.
63
+ 2. If issues are found, offer the user the option to re-run with `--fix`.
64
+ 3. User decides; skill does not auto-escalate.
65
+
66
+ ---
67
+
68
+ ## --reset Decision
69
+
70
+ **`--reset` would NOT be used.**
71
+
72
+ Reasons:
73
+ - The user did not request a cache wipe, full reset, or use the words "리셋", "초기화", or "reset".
74
+ - `--reset` is a destructive, irreversible operation (deletes all cache files listed in the skill) and must only be triggered by explicit user intent.
75
+ - The reported symptoms (HUD invisible, Codex not working) are diagnostic problems, not confirmed cache-corruption problems. A reset would be premature without diagnosis confirming a cache issue.
76
+
77
+ ---
78
+
79
+ ## Expected Report Format
80
+
81
+ After `triflux doctor` completes, the output is relayed to the user verbatim (per the skill: "결과를 사용자에게 보고합니다"). Based on the diagnostic items, the expected report structure is:
82
+
83
+ ```
84
+ [triflux doctor] 진단 결과
85
+ ─────────────────────────────────
86
+ ✓ / ✗ tfx-route.sh 설치 상태
87
+ ✓ / ✗ HUD 설치 및 설정 상태
88
+ ✓ / ✗ Codex CLI 경로
89
+ ✓ / ✗ Gemini CLI 경로
90
+ ✓ / ✗ Claude CLI 경로
91
+ ✓ / ✗ 스킬 설치 상태
92
+ ✓ / ✗ 플러그인 등록 상태
93
+ ✓ / ✗ MCP 인벤토리 캐시
94
+ ✓ / ✗ CLI 이슈 트래커
95
+ ✓ / ✗ 잔존 팀(orphan teams)
96
+ ─────────────────────────────────
97
+ N개 이슈 발견. --fix로 자동 수정하려면: /tfx-doctor --fix
98
+ ```
99
+
100
+ If `--fix` is subsequently accepted by the user, the report repeats after remediation, showing whether items moved from ✗ to ✓. Any items that `--fix` cannot resolve (e.g., Codex not installed) are surfaced with a manual-installation note.
101
+
102
+ ---
103
+
104
+ ## Summary
105
+
106
+ | Decision Point | Answer |
107
+ |----------------|--------|
108
+ | Skill triggered | tfx-doctor |
109
+ | Mode | default (진단만) |
110
+ | Command run | `triflux doctor` |
111
+ | HUD checked | Yes |
112
+ | CLI paths checked | Yes (Codex, Gemini, Claude) |
113
+ | --fix suggested | Yes, after diagnosis |
114
+ | --fix auto-applied | No |
115
+ | --reset used | No |
@@ -0,0 +1,5 @@
1
+ {
2
+ "total_tokens": 14499,
3
+ "duration_ms": 53804,
4
+ "total_duration_seconds": 53.8
5
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "eval_id": 5,
3
+ "eval_name": "hub-start-sequence",
4
+ "prompt": "/tfx-hub start",
5
+ "assertions": [
6
+ "Runs 'node hub/server.mjs' with run_in_background=true",
7
+ "Mentions port 27888 and /mcp endpoint",
8
+ "Does NOT try to run any triage or routing"
9
+ ]
10
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "expectations": [
3
+ {"text": "Runs 'node hub/server.mjs' with run_in_background=true", "passed": true, "evidence": "Agent output: 'Bash(\"node hub/server.mjs\", run_in_background=true)'"},
4
+ {"text": "Mentions port 27888 and /mcp endpoint", "passed": true, "evidence": "Agent output: 'Port: 27888, MCP endpoint: http://127.0.0.1:27888/mcp'"},
5
+ {"text": "Does NOT try to run any triage or routing", "passed": true, "evidence": "Agent correctly identified as command match, not fallthrough"}
6
+ ],
7
+ "summary": {"passed": 3, "failed": 0, "total": 3, "pass_rate": 1.0}
8
+ }
@@ -0,0 +1,86 @@
1
+ # Routing Analysis: `/tfx-hub start`
2
+
3
+ **Skill source:** `skills/tfx-workspace/skill-snapshot/tfx-hub/SKILL.md`
4
+ **Input:** `/tfx-hub start`
5
+ **Run mode:** DRY RUN — no commands executed
6
+
7
+ ---
8
+
9
+ ## 1. Command Match vs. Fallthrough
10
+
11
+ This input **matches a command** — specifically the `start` command.
12
+
13
+ The skill's input interpretation table explicitly lists:
14
+
15
+ ```
16
+ /tfx-hub start → 커맨드 매칭 → 허브 시작
17
+ ```
18
+
19
+ The argument `start` is a recognized command keyword (alongside `stop`, `status`, `--port`). Therefore, the fallthrough path is NOT taken.
20
+
21
+ ---
22
+
23
+ ## 2. Exact Bash Command That Would Be Run
24
+
25
+ ```bash
26
+ Bash("node hub/server.mjs", run_in_background=true)
27
+ ```
28
+
29
+ This is quoted verbatim from the `### start — 허브 시작` section of the skill definition.
30
+
31
+ ---
32
+
33
+ ## 3. run_in_background Setting
34
+
35
+ `run_in_background` would be set to **`true`**.
36
+
37
+ The skill definition explicitly passes `run_in_background=true` as a parameter to the `Bash` call for the `start` command. The hub process is a long-running server and must not block the agent thread.
38
+
39
+ ---
40
+
41
+ ## 4. Port and Endpoint
42
+
43
+ - **Port:** `27888`
44
+ - **MCP endpoint:** `http://127.0.0.1:27888/mcp`
45
+ - **Status endpoint:** `http://127.0.0.1:27888/status`
46
+
47
+ The skill states: "Streamable HTTP MCP 서버를 `http://127.0.0.1:27888/mcp` 에서 시작"
48
+
49
+ Supporting runtime details:
50
+ - SQLite WAL DB: `~/.claude/cache/tfx-hub/state.db`
51
+ - PID file: `~/.claude/cache/tfx-hub/hub.pid`
52
+ - Port can be overridden via env var `TFX_HUB_PORT`; DB path via `TFX_HUB_DB`
53
+
54
+ ---
55
+
56
+ ## 5. Post-Start Registration Steps
57
+
58
+ The skill documents a section titled **"각 CLI 등록 방법"** (How to register with each CLI) describing steps to run after the hub starts. These are not executed automatically by the `start` command — they are listed as manual follow-up actions:
59
+
60
+ ```bash
61
+ # Codex
62
+ codex mcp add tfx-hub --url http://127.0.0.1:27888/mcp
63
+
64
+ # Gemini (settings.json)
65
+ # mcpServers.tfx-hub.url = "http://127.0.0.1:27888/mcp"
66
+
67
+ # Claude
68
+ claude mcp add --transport http tfx-hub http://127.0.0.1:27888/mcp
69
+ ```
70
+
71
+ The `start` command itself only launches `node hub/server.mjs` in the background. Registration with individual CLI agents is a separate, post-start step described in the skill but not triggered automatically. The skill does not indicate these registration calls are part of the `start` flow — they are presented as supplementary instructions under their own heading.
72
+
73
+ ---
74
+
75
+ ## Summary Table
76
+
77
+ | Field | Value |
78
+ |-------------------------|--------------------------------------------|
79
+ | Routing outcome | Command match (`start`) |
80
+ | Fallthrough triggered | No |
81
+ | Exact command | `Bash("node hub/server.mjs", run_in_background=true)` |
82
+ | run_in_background | `true` |
83
+ | Hub port | `27888` |
84
+ | MCP endpoint | `http://127.0.0.1:27888/mcp` |
85
+ | Status endpoint | `http://127.0.0.1:27888/status` |
86
+ | Post-start registration | Manual — not auto-executed by start command |
@@ -0,0 +1,5 @@
1
+ {
2
+ "total_tokens": 14904,
3
+ "duration_ms": 51754,
4
+ "total_duration_seconds": 51.8
5
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "expectations": [
3
+ {"text": "Runs 'node hub/server.mjs' with run_in_background=true", "passed": true, "evidence": "Agent output: 'Bash(\"node hub/server.mjs\", run_in_background=true)'"},
4
+ {"text": "Mentions port 27888 and /mcp endpoint", "passed": true, "evidence": "Agent output: 'Port 27888, MCP endpoint at http://127.0.0.1:27888/mcp'"},
5
+ {"text": "Does NOT try to run any triage or routing", "passed": true, "evidence": "Agent correctly identified this as a command match (start), not fallthrough to triage"}
6
+ ],
7
+ "summary": {"passed": 3, "failed": 0, "total": 3, "pass_rate": 1.0}
8
+ }
@@ -0,0 +1,81 @@
1
+ # Routing Analysis: `/tfx-hub start`
2
+
3
+ ## Source
4
+ Skill definition: `skills/tfx-hub/SKILL.md`
5
+
6
+ ---
7
+
8
+ ## 1. Command Match vs. Fallthrough
9
+
10
+ **Result: Command match — `start`**
11
+
12
+ The skill defines an explicit routing table under "입력 해석 규칙":
13
+
14
+ ```
15
+ /tfx-hub start → 커맨드 매칭 → 허브 시작
16
+ ```
17
+
18
+ The argument `start` is listed as a command keyword. The fallthrough rule only applies when the argument does NOT match `start`, `stop`, `status`, or `--port`. Therefore `/tfx-hub start` is handled by the `start` command branch, not the free-form fallthrough.
19
+
20
+ ---
21
+
22
+ ## 2. Exact Bash Command
23
+
24
+ ```bash
25
+ Bash("node hub/server.mjs", run_in_background=true)
26
+ ```
27
+
28
+ Quoted verbatim from the skill's `### start — 허브 시작` section.
29
+
30
+ ---
31
+
32
+ ## 3. `run_in_background`
33
+
34
+ **Set to `true`.**
35
+
36
+ The skill explicitly passes `run_in_background=true` in the `start` command call. This is the only command in the skill that uses background execution.
37
+
38
+ ---
39
+
40
+ ## 4. Port and Endpoint
41
+
42
+ - **Port:** `27888` (default; overridable via environment variable `TFX_HUB_PORT`)
43
+ - **MCP endpoint:** `http://127.0.0.1:27888/mcp`
44
+ - **Status endpoint:** `http://127.0.0.1:27888/status`
45
+
46
+ Additional runtime artefacts written on start:
47
+ - SQLite WAL DB: `~/.claude/cache/tfx-hub/state.db`
48
+ - PID file: `~/.claude/cache/tfx-hub/hub.pid`
49
+
50
+ ---
51
+
52
+ ## 5. Post-Start Registration Steps
53
+
54
+ The skill describes registering the running hub with each CLI agent under "각 CLI 등록 방법":
55
+
56
+ ```bash
57
+ # Codex
58
+ codex mcp add tfx-hub --url http://127.0.0.1:27888/mcp
59
+
60
+ # Gemini (settings.json)
61
+ # mcpServers.tfx-hub.url = "http://127.0.0.1:27888/mcp"
62
+
63
+ # Claude
64
+ claude mcp add --transport http tfx-hub http://127.0.0.1:27888/mcp
65
+ ```
66
+
67
+ These steps are documented but are listed as per-CLI manual registration steps — the skill does not show them being executed automatically as part of the `start` command block itself. The `start` block contains only the single `Bash("node hub/server.mjs", run_in_background=true)` call.
68
+
69
+ ---
70
+
71
+ ## Summary Table
72
+
73
+ | Attribute | Value |
74
+ |-----------|-------|
75
+ | Routing outcome | Command match (`start`) |
76
+ | Fallthrough triggered | No |
77
+ | Bash command | `Bash("node hub/server.mjs", run_in_background=true)` |
78
+ | `run_in_background` | `true` |
79
+ | Port | `27888` |
80
+ | MCP endpoint | `http://127.0.0.1:27888/mcp` |
81
+ | Post-start registration | Documented (manual, per-CLI); not auto-executed by `start` |
@@ -0,0 +1,5 @@
1
+ {
2
+ "total_tokens": 14821,
3
+ "duration_ms": 47208,
4
+ "total_duration_seconds": 47.2
5
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "eval_id": 3,
3
+ "eval_name": "multi-team-creation",
4
+ "prompt": "/tfx-multi 인증 리팩터링 + UI 개선 + 보안 리뷰",
5
+ "assertions": [
6
+ "Creates exactly one TeamCreate with tfx- prefix naming",
7
+ "Creates 3 TaskCreate calls (one per subtask)",
8
+ "Spawns 3 Agent wrappers with mode: bypassPermissions",
9
+ "Uses tfx-route.sh inside Agent wrapper (not direct codex/gemini)",
10
+ "Includes Phase 5 cleanup (TeamDelete)"
11
+ ]
12
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "expectations": [
3
+ {"text": "Creates exactly one TeamCreate with tfx- prefix naming", "passed": true, "evidence": "Agent output: TeamCreate({ team_name: 'tfx-<id>' })"},
4
+ {"text": "Creates 3 TaskCreate calls (one per subtask)", "passed": true, "evidence": "Agent output: 'Three TaskCreate calls (one per subtask), preserving taskIds'"},
5
+ {"text": "Spawns 3 Agent wrappers with mode: bypassPermissions", "passed": true, "evidence": "Agent output: 'mode: bypassPermissions — included in all 3 Agent calls. Mandatory.'"},
6
+ {"text": "Uses tfx-route.sh inside Agent wrapper (not direct codex/gemini)", "passed": true, "evidence": "Agent output: 'all wrappers internally call bash ~/.claude/scripts/tfx-route.sh — never direct codex exec or gemini -y -p'"},
7
+ {"text": "Includes Phase 5 cleanup (TeamDelete)", "passed": true, "evidence": "Agent output: 'TeamDelete is called unconditionally (success or failure), with 30-second wait'"}
8
+ ],
9
+ "summary": {"passed": 5, "failed": 0, "total": 5, "pass_rate": 1.0}
10
+ }
@@ -0,0 +1,316 @@
1
+ # tfx-multi Routing Analysis
2
+
3
+ ## Input
4
+ ```
5
+ /tfx-multi 인증 리팩터링 + UI 개선 + 보안 리뷰
6
+ ```
7
+
8
+ ---
9
+
10
+ ## Phase 0: Preflight Checks
11
+
12
+ **Mode determination:** The input has no `--tmux`, `--psmux`, `--agents`, or `N:agent` prefix, and is not a control command (`status`/`stop`/etc.), so this is **auto mode**.
13
+
14
+ **Execution order (auto mode):** Phase 0 (preflight) and Phase 2 (triage) run **simultaneously in parallel** (NOT sequentially). Phase 3 starts only after both complete.
15
+
16
+ **Single combined Bash check:**
17
+ ```bash
18
+ Bash({
19
+ command: "curl -sf http://127.0.0.1:27888/status >/dev/null && test -f ~/.claude/scripts/tfx-route.sh && echo \"preflight: ok\" || echo \"preflight: FAIL\""
20
+ })
21
+ ```
22
+
23
+ **What is verified:**
24
+ - Hub is running and healthy at `http://127.0.0.1:27888/status` (`/status` endpoint — `/health` alone is forbidden)
25
+ - `~/.claude/scripts/tfx-route.sh` exists on disk
26
+
27
+ **Output policy:** Only a single summary line is shown to the user (e.g., `preflight: ok (route/hub)`). No individual Bash logs are surfaced unless preflight fails.
28
+
29
+ **Failure actions (only if preflight fails):**
30
+ - `tfx-route.sh` missing → advise user to run `tfx setup`
31
+ - Hub not running/unhealthy → surface Hub error detail
32
+ - Required CLI not installed → surface missing CLI detail
33
+
34
+ ---
35
+
36
+ ## Phase 1: Input Parsing
37
+
38
+ **Raw input:** `"인증 리팩터링 + UI 개선 + 보안 리뷰"`
39
+
40
+ **Parse results:**
41
+ - No `--tmux` / `--psmux` flag → NOT routed to Phase 3-mux
42
+ - No `--agents` flag
43
+ - No `N:agent_type` prefix (e.g., `3:codex`)
44
+ - Not a control command (`status`, `stop`, `kill`, `attach`, `list`, `send`)
45
+ - Input string is non-empty → no prompt to user required
46
+ - No `--thorough` flag → **`--quick` mode (default)**; Phase 2.5, 2.6, 3.5, 3.6, 3.7 are all SKIPPED
47
+
48
+ **Determined mode:** Auto mode, `--quick`
49
+
50
+ ---
51
+
52
+ ## Phase 2: Triage — Decomposition
53
+
54
+ ### Step 2a: Codex Classification
55
+
56
+ ```bash
57
+ Bash({
58
+ command: "codex exec --full-auto --skip-git-repo-check '다음 작업을 분석하고 각 부분에 적합한 agent를 분류하라.\n\n agent 선택:\n - codex: 코드 구현/수정/분석/리뷰/디버깅/설계 (기본값)\n - gemini: 문서/UI/디자인/멀티모달\n - claude: 코드베이스 탐색/테스트 실행/검증 (최후 수단)\n\n 모든 역할은 Codex/Gemini 우선 배정:\n - explore, verifier, test-engineer, qa-tester 포함 전 역할이 Codex/Gemini로 라우팅\n - Codex/Gemini 미설치 시에만 claude-native(sonnet/haiku) fallback\n - claude 타입은 최후 수단으로만 사용\n\n 작업: 인증 리팩터링 + UI 개선 + 보안 리뷰\n\n JSON만 출력:\n { \"parts\": [{ \"description\": \"...\", \"agent\": \"codex|gemini|claude\" }] }\n'"
59
+ })
60
+ ```
61
+
62
+ **Expected Codex classification output (JSON):**
63
+ ```json
64
+ {
65
+ "parts": [
66
+ { "description": "인증 리팩터링", "agent": "codex" },
67
+ { "description": "UI 개선", "agent": "gemini" },
68
+ { "description": "보안 리뷰", "agent": "codex" }
69
+ ]
70
+ }
71
+ ```
72
+
73
+ Rationale per the skill's agent selection rules:
74
+ - "인증 리팩터링" → code refactoring → `codex` (executor)
75
+ - "UI 개선" → UI/design → `gemini` (designer)
76
+ - "보안 리뷰" → code review/analysis → `codex` (reviewer)
77
+
78
+ If Codex classification fails, the Lead (Opus) directly classifies and decomposes inline with the same result.
79
+
80
+ ### Step 2b: Inline Decomposition
81
+
82
+ ```javascript
83
+ assignments = [
84
+ { cli: "codex", subtask: "인증 리팩터링", role: "executor" },
85
+ { cli: "gemini", subtask: "UI 개선", role: "designer" },
86
+ { cli: "codex", subtask: "보안 리뷰", role: "reviewer" }
87
+ ]
88
+ ```
89
+
90
+ **Note:** Phase 2.5 (Plan) and Phase 2.6 (PRD) are SKIPPED because `--thorough` was NOT specified.
91
+
92
+ ---
93
+
94
+ ## Phase 3: Native Teams Execution
95
+
96
+ ### Step 3a: TeamCreate
97
+
98
+ ```
99
+ teamName = "tfx-" + Date.now().toString(36).slice(-6)
100
+ // Example: "tfx-m3x9pq"
101
+ ```
102
+
103
+ ```javascript
104
+ TeamCreate({
105
+ team_name: "tfx-m3x9pq",
106
+ description: "tfx-multi: 인증 리팩터링 + UI 개선 + 보안 리뷰"
107
+ })
108
+ ```
109
+
110
+ ### Step 3b: TaskCreate (3 tasks, one per subtask)
111
+
112
+ **Task 1:**
113
+ ```javascript
114
+ TaskCreate({
115
+ subject: "인증 리팩터링",
116
+ description: "CLI: codex, 역할: executor\n\n인증 관련 코드를 리팩터링한다.",
117
+ metadata: { cli: "codex", role: "executor" }
118
+ })
119
+ // → taskId: <task-id-1>
120
+ // → agentName: "codex-worker-1"
121
+ ```
122
+
123
+ **Task 2:**
124
+ ```javascript
125
+ TaskCreate({
126
+ subject: "UI 개선",
127
+ description: "CLI: gemini, 역할: designer\n\nUI를 개선한다.",
128
+ metadata: { cli: "gemini", role: "designer" }
129
+ })
130
+ // → taskId: <task-id-2>
131
+ // → agentName: "gemini-worker-1"
132
+ ```
133
+
134
+ **Task 3:**
135
+ ```javascript
136
+ TaskCreate({
137
+ subject: "보안 리뷰",
138
+ description: "CLI: codex, 역할: reviewer\n\n보안 관련 코드 리뷰를 수행한다.",
139
+ metadata: { cli: "codex", role: "reviewer" }
140
+ })
141
+ // → taskId: <task-id-3>
142
+ // → agentName: "codex-worker-2"
143
+ ```
144
+
145
+ **runQueue after 3b:**
146
+ ```javascript
147
+ runQueue = [
148
+ { taskId: "<task-id-1>", agentName: "codex-worker-1", cli: "codex", subtask: "인증 리팩터링", role: "executor" },
149
+ { taskId: "<task-id-2>", agentName: "gemini-worker-1", cli: "gemini", subtask: "UI 개선", role: "designer" },
150
+ { taskId: "<task-id-3>", agentName: "codex-worker-2", cli: "codex", subtask: "보안 리뷰", role: "reviewer" }
151
+ ]
152
+ ```
153
+
154
+ ### Step 3c: Agent Slim-Wrapper Spawn (codex and gemini items)
155
+
156
+ All three items use `cli: "codex"` or `cli: "gemini"`, so ALL THREE get slim-wrapper Agents (none are `cli: "claude"`).
157
+
158
+ The prompt for each is generated by `buildSlimWrapperPrompt()` in `hub/team/native.mjs`. The wrapper's core behavior:
159
+ 1. `TaskUpdate(taskId, status: in_progress)` — claim
160
+ 2. `SendMessage(to: "team-lead", "작업 시작: {agentName}")` — start report (creates turn boundary)
161
+ 3. `Bash(command: "bash ~/.claude/scripts/tfx-route.sh {role} '{subtask}' {mcp_profile}", timeout: {bashTimeoutMs})` — delegate to tfx-route.sh
162
+ 4. `SendMessage(to: "team-lead", "결과: {요약}")` — result report (creates turn boundary)
163
+ 5. Await lead feedback; loop back to step 3 if further instructions received
164
+ 6. Final: `TaskUpdate(status: completed, metadata: {result: "success"|"failed"})` + `SendMessage` → exit
165
+
166
+ **Bash timeout calculation (from `getRouteTimeout`):**
167
+ - `executor` role → default 1080 seconds + 60 buffer = **1140 seconds = 1,140,000 ms**
168
+ - `designer` role → default 1080 seconds + 60 buffer = **1140 seconds = 1,140,000 ms**
169
+ - `reviewer` role → maps to `review` profile → **3600 seconds + 60 buffer = 3,660,000 ms**
170
+
171
+ **Agent call 1 — codex-worker-1:**
172
+ ```javascript
173
+ Agent({
174
+ name: "codex-worker-1",
175
+ team_name: "tfx-m3x9pq",
176
+ mode: "bypassPermissions",
177
+ run_in_background: true,
178
+ prompt: buildSlimWrapperPrompt("codex", {
179
+ subtask: "인증 리팩터링",
180
+ role: "executor",
181
+ teamName: "tfx-m3x9pq",
182
+ taskId: "<task-id-1>",
183
+ agentName: "codex-worker-1",
184
+ leadName: "team-lead",
185
+ mcp_profile: <resolved_mcp_profile>
186
+ })
187
+ // Internal Bash: "bash ~/.claude/scripts/tfx-route.sh executor '인증 리팩터링' <mcp_profile>"
188
+ // Bash timeout: 1,140,000 ms
189
+ })
190
+ ```
191
+
192
+ **Agent call 2 — gemini-worker-1:**
193
+ ```javascript
194
+ Agent({
195
+ name: "gemini-worker-1",
196
+ team_name: "tfx-m3x9pq",
197
+ mode: "bypassPermissions",
198
+ run_in_background: true,
199
+ prompt: buildSlimWrapperPrompt("gemini", {
200
+ subtask: "UI 개선",
201
+ role: "designer",
202
+ teamName: "tfx-m3x9pq",
203
+ taskId: "<task-id-2>",
204
+ agentName: "gemini-worker-1",
205
+ leadName: "team-lead",
206
+ mcp_profile: <resolved_mcp_profile>
207
+ })
208
+ // Internal Bash: "bash ~/.claude/scripts/tfx-route.sh designer 'UI 개선' <mcp_profile>"
209
+ // Bash timeout: 1,140,000 ms
210
+ })
211
+ ```
212
+
213
+ **Agent call 3 — codex-worker-2:**
214
+ ```javascript
215
+ Agent({
216
+ name: "codex-worker-2",
217
+ team_name: "tfx-m3x9pq",
218
+ mode: "bypassPermissions",
219
+ run_in_background: true,
220
+ prompt: buildSlimWrapperPrompt("codex", {
221
+ subtask: "보안 리뷰",
222
+ role: "reviewer",
223
+ teamName: "tfx-m3x9pq",
224
+ taskId: "<task-id-3>",
225
+ agentName: "codex-worker-2",
226
+ leadName: "team-lead",
227
+ mcp_profile: <resolved_mcp_profile>
228
+ })
229
+ // Internal Bash: "bash ~/.claude/scripts/tfx-route.sh reviewer '보안 리뷰' <mcp_profile>"
230
+ // Bash timeout: 3,660,000 ms
231
+ })
232
+ ```
233
+
234
+ **`mode: "bypassPermissions"` — YES, included in all three Agent calls.** This is mandatory per the skill definition; without it workers would pause awaiting user approval on every Bash call.
235
+
236
+ **`tfx-route.sh` usage — YES.** Workers call `bash ~/.claude/scripts/tfx-route.sh`, never `codex exec ...` or `gemini -y -p ...` directly. Direct calls are explicitly forbidden by the skill.
237
+
238
+ ### Step 3d: claude-type Agent — NOT APPLICABLE
239
+
240
+ None of the three subtasks were classified as `cli: "claude"`, so Step 3d is skipped entirely.
241
+
242
+ ### Step 3e: User Notification
243
+
244
+ ```
245
+ 팀 'tfx-m3x9pq' 생성 완료.
246
+ Codex/Gemini 워커가 슬림 래퍼 Agent로 네비게이션에 등록되었습니다.
247
+ Shift+Down으로 다음 워커로 전환 (마지막→리드 wrap). Shift+Tab으로 이전 워커 전환.
248
+ ```
249
+
250
+ ---
251
+
252
+ ## Phase 4: Result Collection
253
+
254
+ 1. Lead waits for all three background Agent processes to complete.
255
+ 2. Query `team_task_list` as the **single truth source**:
256
+
257
+ ```bash
258
+ Bash({
259
+ command: "node hub/bridge.mjs team-task-list --team tfx-m3x9pq"
260
+ })
261
+ ```
262
+
263
+ 3. For any task where status is `completed` but `metadata.result == "failed"`: trigger Claude fallback retry.
264
+ 4. After fallback, re-query `team_task_list` to confirm final state.
265
+ 5. `send-message` and `result(task.result)` events are observation channels only; final verdict is always from `team_task_list`.
266
+
267
+ **Summary report (example):**
268
+ ```markdown
269
+ ## tfx-multi 실행 결과
270
+
271
+ | # | Worker | CLI | 작업 | 상태 |
272
+ |---|----------------|--------|---------------|-----------|
273
+ | 1 | codex-worker-1 | codex | 인증 리팩터링 | completed |
274
+ | 2 | gemini-worker-1| gemini | UI 개선 | completed |
275
+ | 3 | codex-worker-2 | codex | 보안 리뷰 | completed |
276
+ ```
277
+
278
+ ---
279
+
280
+ ## Phase 5: Cleanup (always runs — success or failure)
281
+
282
+ 1. Wait up to **30 seconds** for all background Agents to finish.
283
+ 2. If any Agent is still running after 30 seconds, proceed with cleanup anyway.
284
+ 3. Call `TeamDelete`:
285
+
286
+ ```javascript
287
+ TeamDelete({
288
+ team_name: "tfx-m3x9pq"
289
+ })
290
+ ```
291
+
292
+ 4. If `TeamDelete` fails (active members still present), call `forceCleanupTeam("tfx-m3x9pq")`.
293
+ If that also fails, output manual cleanup instructions:
294
+ ```
295
+ rm -rf ~/.claude/teams/tfx-m3x9pq/ ~/.claude/tasks/tfx-m3x9pq/
296
+ ```
297
+ 5. Output the final summary report.
298
+
299
+ **Reason TeamDelete is mandatory:** Leaving `~/.claude/teams/{teamName}/` on disk causes the OMC hook to repeatedly detect "team executing", creating an infinite loop.
300
+
301
+ ---
302
+
303
+ ## Key Routing Decisions Summary
304
+
305
+ | Question | Answer |
306
+ |----------|--------|
307
+ | `mode: "bypassPermissions"` in Agent calls? | YES — all three Agent calls include it |
308
+ | `tfx-route.sh` used inside Agent wrappers? | YES — `bash ~/.claude/scripts/tfx-route.sh {role} '{subtask}' {mcp_profile}` |
309
+ | Direct `codex exec` or `gemini -y -p` calls? | NO — explicitly forbidden |
310
+ | Workers use Read/Edit/Write/Grep/Glob tools? | NO — forbidden; all file operations delegated via tfx-route.sh |
311
+ | `--thorough` pipeline stages (Phase 2.5, 2.6, 3.5–3.7)? | SKIPPED — `--quick` (default) mode |
312
+ | `--tmux`/`--psmux` mode? | NO — not in input |
313
+ | Step 3d (claude-type Agent)? | SKIPPED — no subtask has `cli: "claude"` |
314
+ | TeamDelete on failure? | YES — Phase 5 is unconditional |
315
+ | Preflight and triage run in parallel? | YES — auto mode runs Phase 0 + Phase 2 in parallel |
316
+ | Lead directly calling Codex/Gemini Bash? | NO — Lead spawns Agent wrappers; wrappers call tfx-route.sh |