triflux 10.0.0 → 10.0.1

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 (426) hide show
  1. package/CLAUDE.md +171 -0
  2. package/README.md +32 -15
  3. package/bin/triflux.mjs +62 -5
  4. package/hooks/agent-route-guard.mjs +109 -0
  5. package/hooks/cross-review-tracker.mjs +122 -0
  6. package/hooks/error-context.mjs +148 -0
  7. package/hooks/hook-adaptive-collector.mjs +86 -0
  8. package/hooks/hook-manager.mjs +365 -0
  9. package/hooks/hook-orchestrator.mjs +312 -0
  10. package/hooks/hook-registry.json +246 -0
  11. package/hooks/hooks.json +89 -0
  12. package/hooks/keyword-rules.json +574 -0
  13. package/hooks/lib/resolve-root.mjs +59 -0
  14. package/hooks/mcp-config-watcher.mjs +80 -0
  15. package/hooks/pipeline-stop.mjs +76 -0
  16. package/hooks/safety-guard.mjs +169 -0
  17. package/hooks/subagent-verifier.mjs +80 -0
  18. package/hub/account-broker.mjs +251 -0
  19. package/hub/adaptive-diagnostic.mjs +323 -0
  20. package/hub/adaptive-inject.mjs +186 -0
  21. package/hub/adaptive-memory.mjs +163 -0
  22. package/hub/adaptive.mjs +143 -0
  23. package/hub/assign-callbacks.mjs +133 -0
  24. package/hub/bridge.mjs +799 -0
  25. package/hub/cli-adapter-base.mjs +280 -0
  26. package/hub/codex-adapter.mjs +199 -0
  27. package/hub/codex-compat.mjs +11 -0
  28. package/hub/codex-preflight.mjs +166 -0
  29. package/hub/delegator/contracts.mjs +37 -0
  30. package/hub/delegator/index.mjs +14 -0
  31. package/hub/delegator/schema/delegator-tools.schema.json +250 -0
  32. package/hub/delegator/service.mjs +307 -0
  33. package/hub/delegator/tool-definitions.mjs +35 -0
  34. package/hub/fullcycle.mjs +96 -0
  35. package/hub/gemini-adapter.mjs +180 -0
  36. package/hub/hitl.mjs +143 -0
  37. package/hub/intent.mjs +193 -0
  38. package/hub/lib/cache-guard.mjs +114 -0
  39. package/hub/lib/known-errors.json +72 -0
  40. package/hub/lib/memory-store.mjs +748 -0
  41. package/hub/lib/process-utils.mjs +361 -0
  42. package/hub/lib/ssh-command.mjs +211 -0
  43. package/hub/lib/ssh-retry.mjs +59 -0
  44. package/hub/lib/uuidv7.mjs +44 -0
  45. package/hub/memory-doctor.mjs +480 -0
  46. package/hub/middleware/request-logger.mjs +161 -0
  47. package/hub/paths.mjs +30 -0
  48. package/hub/pipe.mjs +664 -0
  49. package/hub/pipeline/gates/confidence.mjs +56 -0
  50. package/hub/pipeline/gates/consensus.mjs +94 -0
  51. package/hub/pipeline/gates/index.mjs +5 -0
  52. package/hub/pipeline/gates/selfcheck.mjs +82 -0
  53. package/hub/pipeline/index.mjs +318 -0
  54. package/hub/pipeline/state.mjs +191 -0
  55. package/hub/pipeline/transitions.mjs +124 -0
  56. package/hub/platform.mjs +225 -0
  57. package/hub/public/dashboard.html +355 -0
  58. package/hub/public/tray-icon.ico +0 -0
  59. package/hub/public/tray-icon.png +0 -0
  60. package/hub/quality/deslop.mjs +253 -0
  61. package/hub/reflexion.mjs +372 -0
  62. package/hub/research.mjs +146 -0
  63. package/hub/router.mjs +791 -0
  64. package/hub/routing/complexity.mjs +166 -0
  65. package/hub/routing/index.mjs +117 -0
  66. package/hub/routing/q-learning.mjs +336 -0
  67. package/hub/schema.sql +148 -0
  68. package/hub/server.mjs +1264 -0
  69. package/hub/session-fingerprint.mjs +352 -0
  70. package/hub/state.mjs +258 -0
  71. package/hub/store-adapter.mjs +118 -0
  72. package/hub/store.mjs +857 -0
  73. package/hub/team/agent-map.json +11 -0
  74. package/hub/team/ansi.mjs +379 -0
  75. package/hub/team/backend.mjs +90 -0
  76. package/hub/team/cli/commands/attach.mjs +37 -0
  77. package/hub/team/cli/commands/control.mjs +43 -0
  78. package/hub/team/cli/commands/debug.mjs +74 -0
  79. package/hub/team/cli/commands/focus.mjs +53 -0
  80. package/hub/team/cli/commands/interrupt.mjs +36 -0
  81. package/hub/team/cli/commands/kill.mjs +37 -0
  82. package/hub/team/cli/commands/list.mjs +24 -0
  83. package/hub/team/cli/commands/send.mjs +37 -0
  84. package/hub/team/cli/commands/start/index.mjs +106 -0
  85. package/hub/team/cli/commands/start/parse-args.mjs +130 -0
  86. package/hub/team/cli/commands/start/start-headless.mjs +109 -0
  87. package/hub/team/cli/commands/start/start-in-process.mjs +40 -0
  88. package/hub/team/cli/commands/start/start-mux.mjs +73 -0
  89. package/hub/team/cli/commands/start/start-wt.mjs +69 -0
  90. package/hub/team/cli/commands/status.mjs +87 -0
  91. package/hub/team/cli/commands/stop.mjs +31 -0
  92. package/hub/team/cli/commands/task.mjs +30 -0
  93. package/hub/team/cli/commands/tasks.mjs +13 -0
  94. package/hub/team/cli/help.mjs +42 -0
  95. package/hub/team/cli/index.mjs +41 -0
  96. package/hub/team/cli/manifest.mjs +29 -0
  97. package/hub/team/cli/render.mjs +30 -0
  98. package/hub/team/cli/services/attach-fallback.mjs +54 -0
  99. package/hub/team/cli/services/hub-client.mjs +227 -0
  100. package/hub/team/cli/services/member-selector.mjs +30 -0
  101. package/hub/team/cli/services/native-control.mjs +117 -0
  102. package/hub/team/cli/services/runtime-mode.mjs +62 -0
  103. package/hub/team/cli/services/state-store.mjs +48 -0
  104. package/hub/team/cli/services/task-model.mjs +30 -0
  105. package/hub/team/conductor-mesh-bridge.mjs +121 -0
  106. package/hub/team/conductor.mjs +671 -0
  107. package/hub/team/dashboard-anchor.mjs +14 -0
  108. package/hub/team/dashboard-layout.mjs +33 -0
  109. package/hub/team/dashboard-open.mjs +153 -0
  110. package/hub/team/dashboard.mjs +274 -0
  111. package/hub/team/event-log.mjs +76 -0
  112. package/hub/team/handoff.mjs +303 -0
  113. package/hub/team/headless.mjs +1156 -0
  114. package/hub/team/health-probe.mjs +272 -0
  115. package/hub/team/launcher-template.mjs +95 -0
  116. package/hub/team/lead-control.mjs +104 -0
  117. package/hub/team/native-supervisor.mjs +392 -0
  118. package/hub/team/native.mjs +649 -0
  119. package/hub/team/nativeProxy.mjs +688 -0
  120. package/hub/team/notify.mjs +293 -0
  121. package/hub/team/orchestrator.mjs +161 -0
  122. package/hub/team/pane.mjs +153 -0
  123. package/hub/team/process-cleanup.mjs +342 -0
  124. package/hub/team/psmux.mjs +1354 -0
  125. package/hub/team/remote-probe.mjs +276 -0
  126. package/hub/team/remote-session.mjs +299 -0
  127. package/hub/team/remote-watcher.mjs +478 -0
  128. package/hub/team/routing.mjs +223 -0
  129. package/hub/team/session-sync.mjs +169 -0
  130. package/hub/team/session.mjs +611 -0
  131. package/hub/team/shared.mjs +13 -0
  132. package/hub/team/staleState.mjs +361 -0
  133. package/hub/team/swarm-hypervisor.mjs +589 -0
  134. package/hub/team/swarm-locks.mjs +204 -0
  135. package/hub/team/swarm-planner.mjs +260 -0
  136. package/hub/team/swarm-reconciler.mjs +137 -0
  137. package/hub/team/tui-lite.mjs +380 -0
  138. package/hub/team/tui-remote-adapter.mjs +393 -0
  139. package/hub/team/tui-viewer.mjs +463 -0
  140. package/hub/team/tui.mjs +1449 -0
  141. package/hub/team/worktree-lifecycle.mjs +193 -0
  142. package/hub/team/wt-manager.mjs +407 -0
  143. package/hub/team/wt-templates.json +43 -0
  144. package/hub/team-bridge.mjs +27 -0
  145. package/hub/token-mode.mjs +224 -0
  146. package/hub/tools.mjs +636 -0
  147. package/hub/tray.mjs +376 -0
  148. package/hub/workers/claude-worker.mjs +475 -0
  149. package/hub/workers/codex-mcp.mjs +507 -0
  150. package/hub/workers/delegator-mcp.mjs +1076 -0
  151. package/hub/workers/factory.mjs +21 -0
  152. package/hub/workers/gemini-worker.mjs +374 -0
  153. package/hub/workers/interface.mjs +52 -0
  154. package/hub/workers/worker-utils.mjs +104 -0
  155. package/hud/colors.mjs +88 -0
  156. package/hud/constants.mjs +88 -0
  157. package/hud/context-monitor.mjs +403 -0
  158. package/hud/hud-qos-status.mjs +210 -0
  159. package/hud/providers/claude.mjs +314 -0
  160. package/hud/providers/codex.mjs +151 -0
  161. package/hud/providers/gemini.mjs +320 -0
  162. package/hud/renderers.mjs +442 -0
  163. package/hud/terminal.mjs +140 -0
  164. package/hud/utils.mjs +313 -0
  165. package/mesh/index.mjs +63 -0
  166. package/mesh/mesh-budget.mjs +128 -0
  167. package/mesh/mesh-heartbeat.mjs +100 -0
  168. package/mesh/mesh-protocol.mjs +96 -0
  169. package/mesh/mesh-queue.mjs +165 -0
  170. package/mesh/mesh-registry.mjs +78 -0
  171. package/mesh/mesh-router.mjs +76 -0
  172. package/package.json +8 -1
  173. package/references/hosts.json +33 -0
  174. package/scripts/__tests__/gen-skill-docs.test.mjs +87 -0
  175. package/scripts/__tests__/keyword-detector.test.mjs +234 -0
  176. package/scripts/__tests__/mcp-guard-engine.test.mjs +118 -0
  177. package/scripts/__tests__/remote-spawn-transfer.test.mjs +117 -0
  178. package/scripts/__tests__/remote-spawn.test.mjs +92 -0
  179. package/scripts/__tests__/skill-template.test.mjs +193 -0
  180. package/scripts/__tests__/smoke.test.mjs +34 -0
  181. package/scripts/cache-buildup.mjs +30 -0
  182. package/scripts/cache-doctor.mjs +149 -0
  183. package/scripts/cache-warmup.mjs +557 -0
  184. package/scripts/claudemd-sync.mjs +148 -0
  185. package/scripts/cli-route.sh +3 -0
  186. package/scripts/completions/tfx.bash +47 -0
  187. package/scripts/completions/tfx.fish +44 -0
  188. package/scripts/completions/tfx.zsh +83 -0
  189. package/scripts/cross-review-gate.mjs +126 -0
  190. package/scripts/cross-review-tracker.mjs +238 -0
  191. package/scripts/gen-skill-docs.mjs +111 -0
  192. package/scripts/headless-guard-fast.sh +21 -0
  193. package/scripts/headless-guard.mjs +360 -0
  194. package/scripts/hub-ensure.mjs +120 -0
  195. package/scripts/keyword-detector.mjs +272 -0
  196. package/scripts/keyword-rules-expander.mjs +521 -0
  197. package/scripts/lib/claudemd-scanner.mjs +218 -0
  198. package/scripts/lib/context.mjs +67 -0
  199. package/scripts/lib/cross-review-utils.mjs +51 -0
  200. package/scripts/lib/env-probe.mjs +241 -0
  201. package/scripts/lib/gemini-profiles.mjs +85 -0
  202. package/scripts/lib/handoff.mjs +171 -0
  203. package/scripts/lib/hook-utils.mjs +14 -0
  204. package/scripts/lib/keyword-rules.mjs +166 -0
  205. package/scripts/lib/logger.mjs +105 -0
  206. package/scripts/lib/mcp-filter.mjs +739 -0
  207. package/scripts/lib/mcp-guard-engine.mjs +954 -0
  208. package/scripts/lib/mcp-manifest.mjs +79 -0
  209. package/scripts/lib/mcp-server-catalog.mjs +118 -0
  210. package/scripts/lib/psmux-info.mjs +119 -0
  211. package/scripts/lib/remote-spawn-transfer.mjs +196 -0
  212. package/scripts/lib/skill-template.mjs +326 -0
  213. package/scripts/mcp-check.mjs +237 -0
  214. package/scripts/mcp-cleanup.ps1 +17 -0
  215. package/scripts/mcp-gateway-config.mjs +207 -0
  216. package/scripts/mcp-gateway-ensure.mjs +85 -0
  217. package/scripts/mcp-gateway-integration-test.mjs +228 -0
  218. package/scripts/mcp-gateway-start.mjs +226 -0
  219. package/scripts/mcp-gateway-start.ps1 +141 -0
  220. package/scripts/mcp-gateway-verify.mjs +77 -0
  221. package/scripts/mcp-safety-guard.mjs +44 -0
  222. package/scripts/notion-read.mjs +556 -0
  223. package/scripts/pack.mjs +295 -0
  224. package/scripts/preflight-cache.mjs +69 -0
  225. package/scripts/preinstall.mjs +96 -0
  226. package/scripts/remote-spawn.mjs +1376 -0
  227. package/scripts/run.cjs +79 -0
  228. package/scripts/session-spawn-helper.mjs +185 -0
  229. package/scripts/setup.mjs +1176 -0
  230. package/scripts/test-lock.mjs +71 -0
  231. package/scripts/test-tfx-route-no-claude-native.mjs +57 -0
  232. package/scripts/tfx-batch-stats.mjs +96 -0
  233. package/scripts/tfx-gate-activate.mjs +89 -0
  234. package/scripts/tfx-route-post.mjs +505 -0
  235. package/scripts/tfx-route-worker.mjs +223 -0
  236. package/scripts/tfx-route.sh +2014 -0
  237. package/scripts/tmp-cleanup.mjs +103 -0
  238. package/scripts/token-snapshot.mjs +575 -0
  239. package/skills/tfx-auto/SKILL.md.tmpl +2 -3
  240. package/skills/tfx-autoresearch/SKILL.md +6 -5
  241. package/skills/tfx-codex/SKILL.md.tmpl +2 -3
  242. package/skills/tfx-codex-swarm-workspace/iteration-1/benchmark.json +33 -0
  243. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/eval_metadata.json +42 -0
  244. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/with_skill/grading.json +11 -0
  245. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/with_skill/outputs/analysis.md +87 -0
  246. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/with_skill/outputs/classification.md +35 -0
  247. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/with_skill/outputs/commands.sh +275 -0
  248. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/with_skill/outputs/routing.md +56 -0
  249. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/with_skill/timing.json +5 -0
  250. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/without_skill/grading.json +11 -0
  251. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/without_skill/outputs/analysis.md +92 -0
  252. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/without_skill/outputs/classification.md +71 -0
  253. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/without_skill/outputs/commands.sh +264 -0
  254. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/without_skill/outputs/routing.md +113 -0
  255. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/without_skill/timing.json +5 -0
  256. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/eval_metadata.json +32 -0
  257. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/with_skill/grading.json +9 -0
  258. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/with_skill/outputs/analysis.md +96 -0
  259. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/with_skill/outputs/classification.md +38 -0
  260. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/with_skill/outputs/commands.sh +151 -0
  261. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/with_skill/outputs/routing.md +51 -0
  262. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/with_skill/timing.json +5 -0
  263. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/without_skill/grading.json +9 -0
  264. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/without_skill/outputs/analysis.md +127 -0
  265. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/without_skill/outputs/classification.md +57 -0
  266. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/without_skill/outputs/commands.sh +129 -0
  267. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/without_skill/outputs/routing.md +84 -0
  268. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/without_skill/timing.json +5 -0
  269. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/eval_metadata.json +27 -0
  270. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/with_skill/grading.json +8 -0
  271. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/with_skill/outputs/analysis.md +98 -0
  272. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/with_skill/outputs/classification.md +65 -0
  273. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/with_skill/outputs/commands.sh +123 -0
  274. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/with_skill/outputs/routing.md +66 -0
  275. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/with_skill/timing.json +5 -0
  276. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/without_skill/grading.json +8 -0
  277. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/without_skill/outputs/analysis.md +88 -0
  278. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/without_skill/outputs/classification.md +40 -0
  279. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/without_skill/outputs/commands.sh +130 -0
  280. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/without_skill/outputs/routing.md +61 -0
  281. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/without_skill/timing.json +5 -0
  282. package/skills/tfx-deep-interview/SKILL.md +1 -2
  283. package/skills/tfx-plan/SKILL.md.tmpl +2 -3
  284. package/skills/tfx-psmux-rules/SKILL.md +11 -2
  285. package/skills/tfx-qa/SKILL.md.tmpl +2 -3
  286. package/skills/tfx-remote-spawn/SKILL.md +8 -11
  287. package/skills/tfx-research/SKILL.md.tmpl +2 -3
  288. package/skills/tfx-review/SKILL.md.tmpl +2 -3
  289. package/skills/tfx-workspace/async-tests/run-tests.sh +203 -0
  290. package/skills/tfx-workspace/evals/evals.json +79 -0
  291. package/skills/tfx-workspace/iteration-1/benchmark.json +162 -0
  292. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/eval_metadata.json +11 -0
  293. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/old_skill/grading.json +9 -0
  294. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/old_skill/outputs/analysis.md +154 -0
  295. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/old_skill/timing.json +5 -0
  296. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/with_skill/grading.json +9 -0
  297. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/with_skill/outputs/analysis.md +126 -0
  298. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/with_skill/timing.json +5 -0
  299. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/eval_metadata.json +11 -0
  300. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/old_skill/grading.json +9 -0
  301. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/old_skill/outputs/analysis.md +119 -0
  302. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/old_skill/timing.json +5 -0
  303. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/with_skill/grading.json +9 -0
  304. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/with_skill/outputs/analysis.md +115 -0
  305. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/with_skill/timing.json +5 -0
  306. package/skills/tfx-workspace/iteration-1/hub-start-sequence/eval_metadata.json +10 -0
  307. package/skills/tfx-workspace/iteration-1/hub-start-sequence/old_skill/grading.json +8 -0
  308. package/skills/tfx-workspace/iteration-1/hub-start-sequence/old_skill/outputs/analysis.md +86 -0
  309. package/skills/tfx-workspace/iteration-1/hub-start-sequence/old_skill/timing.json +5 -0
  310. package/skills/tfx-workspace/iteration-1/hub-start-sequence/with_skill/grading.json +8 -0
  311. package/skills/tfx-workspace/iteration-1/hub-start-sequence/with_skill/outputs/analysis.md +81 -0
  312. package/skills/tfx-workspace/iteration-1/hub-start-sequence/with_skill/timing.json +5 -0
  313. package/skills/tfx-workspace/iteration-1/multi-team-creation/eval_metadata.json +12 -0
  314. package/skills/tfx-workspace/iteration-1/multi-team-creation/old_skill/grading.json +10 -0
  315. package/skills/tfx-workspace/iteration-1/multi-team-creation/old_skill/outputs/analysis.md +316 -0
  316. package/skills/tfx-workspace/iteration-1/multi-team-creation/old_skill/timing.json +5 -0
  317. package/skills/tfx-workspace/iteration-1/multi-team-creation/with_skill/grading.json +10 -0
  318. package/skills/tfx-workspace/iteration-1/multi-team-creation/with_skill/outputs/analysis.md +352 -0
  319. package/skills/tfx-workspace/iteration-1/multi-team-creation/with_skill/timing.json +5 -0
  320. package/skills/tfx-workspace/iteration-1/review.html +1325 -0
  321. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/eval_metadata.json +12 -0
  322. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/old_skill/grading.json +10 -0
  323. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/old_skill/outputs/analysis.md +97 -0
  324. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/old_skill/timing.json +5 -0
  325. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/with_skill/grading.json +10 -0
  326. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/with_skill/outputs/analysis.md +94 -0
  327. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/with_skill/timing.json +5 -0
  328. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/eval_metadata.json +12 -0
  329. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/old_skill/grading.json +10 -0
  330. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/old_skill/outputs/analysis.md +209 -0
  331. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/old_skill/timing.json +5 -0
  332. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/with_skill/grading.json +10 -0
  333. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/with_skill/outputs/analysis.md +193 -0
  334. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/with_skill/timing.json +5 -0
  335. package/skills/tfx-workspace/iteration-2/benchmark.json +62 -0
  336. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/eval_metadata.json +13 -0
  337. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/old_skill/grading.json +11 -0
  338. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/old_skill/outputs/analysis.md +382 -0
  339. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/old_skill/timing.json +5 -0
  340. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/with_skill/grading.json +11 -0
  341. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/with_skill/outputs/analysis.md +333 -0
  342. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/with_skill/timing.json +5 -0
  343. package/skills/tfx-workspace/iteration-2/review.html +1325 -0
  344. package/skills/tfx-workspace/skill-snapshot/tfx-auto/SKILL.md +217 -0
  345. package/skills/{tfx-auto-codex/SKILL.md.tmpl → tfx-workspace/skill-snapshot/tfx-auto-codex/SKILL.md} +3 -31
  346. package/skills/tfx-workspace/skill-snapshot/tfx-codex/SKILL.md +65 -0
  347. package/skills/tfx-workspace/skill-snapshot/tfx-doctor/SKILL.md +94 -0
  348. package/skills/{tfx-gemini/SKILL.md.tmpl → tfx-workspace/skill-snapshot/tfx-gemini/SKILL.md} +6 -14
  349. package/skills/tfx-workspace/skill-snapshot/tfx-hub/SKILL.md +133 -0
  350. package/skills/tfx-workspace/skill-snapshot/tfx-multi/SKILL.md +426 -0
  351. package/skills/tfx-workspace/skill-snapshot/tfx-setup/SKILL.md +101 -0
  352. package/skills/merge-worktree/SKILL.md.tmpl +0 -144
  353. package/skills/shared/arguments-processing.md +0 -2
  354. package/skills/shared/mandatory-rules.md +0 -6
  355. package/skills/shared/telemetry-segment.md +0 -6
  356. package/skills/star-prompt/SKILL.md.tmpl +0 -122
  357. package/skills/tfx-analysis/SKILL.md.tmpl +0 -106
  358. package/skills/tfx-analysis/skill.json +0 -11
  359. package/skills/tfx-auto/skill.json +0 -26
  360. package/skills/tfx-auto-codex/skill.json +0 -8
  361. package/skills/tfx-autopilot/SKILL.md.tmpl +0 -115
  362. package/skills/tfx-autopilot/skill.json +0 -10
  363. package/skills/tfx-autoresearch/SKILL.md.tmpl +0 -135
  364. package/skills/tfx-autoresearch/skill.json +0 -14
  365. package/skills/tfx-autoroute/SKILL.md.tmpl +0 -188
  366. package/skills/tfx-autoroute/skill.json +0 -12
  367. package/skills/tfx-codex/skill.json +0 -8
  368. package/skills/tfx-codex-swarm/SKILL.md.tmpl +0 -16
  369. package/skills/tfx-codex-swarm/skill.json +0 -5
  370. package/skills/tfx-consensus/SKILL.md.tmpl +0 -145
  371. package/skills/tfx-consensus/skill.json +0 -8
  372. package/skills/tfx-debate/SKILL.md.tmpl +0 -191
  373. package/skills/tfx-debate/skill.json +0 -12
  374. package/skills/tfx-deep-analysis/SKILL.md.tmpl +0 -227
  375. package/skills/tfx-deep-analysis/skill.json +0 -10
  376. package/skills/tfx-deep-interview/SKILL.md.tmpl +0 -203
  377. package/skills/tfx-deep-interview/skill.json +0 -12
  378. package/skills/tfx-deep-plan/SKILL.md.tmpl +0 -281
  379. package/skills/tfx-deep-plan/skill.json +0 -13
  380. package/skills/tfx-deep-qa/SKILL.md.tmpl +0 -164
  381. package/skills/tfx-deep-qa/skill.json +0 -11
  382. package/skills/tfx-deep-research/SKILL.md.tmpl +0 -216
  383. package/skills/tfx-deep-research/skill.json +0 -14
  384. package/skills/tfx-deep-review/SKILL.md.tmpl +0 -178
  385. package/skills/tfx-deep-review/skill.json +0 -12
  386. package/skills/tfx-doctor/SKILL.md.tmpl +0 -172
  387. package/skills/tfx-doctor/skill.json +0 -8
  388. package/skills/tfx-find/skill.json +0 -12
  389. package/skills/tfx-forge/SKILL.md.tmpl +0 -187
  390. package/skills/tfx-forge/skill.json +0 -12
  391. package/skills/tfx-fullcycle/SKILL.md.tmpl +0 -285
  392. package/skills/tfx-fullcycle/skill.json +0 -11
  393. package/skills/tfx-gemini/skill.json +0 -8
  394. package/skills/tfx-hooks/SKILL.md.tmpl +0 -216
  395. package/skills/tfx-hooks/skill.json +0 -8
  396. package/skills/tfx-hub/SKILL.md.tmpl +0 -212
  397. package/skills/tfx-hub/skill.json +0 -8
  398. package/skills/tfx-index/skill.json +0 -11
  399. package/skills/tfx-interview/SKILL.md.tmpl +0 -284
  400. package/skills/tfx-interview/skill.json +0 -12
  401. package/skills/tfx-multi/SKILL.md.tmpl +0 -183
  402. package/skills/tfx-multi/skill.json +0 -8
  403. package/skills/tfx-panel/SKILL.md.tmpl +0 -188
  404. package/skills/tfx-panel/skill.json +0 -12
  405. package/skills/tfx-persist/SKILL.md.tmpl +0 -269
  406. package/skills/tfx-persist/skill.json +0 -12
  407. package/skills/tfx-plan/skill.json +0 -11
  408. package/skills/tfx-profile/SKILL.md.tmpl +0 -239
  409. package/skills/tfx-profile/skill.json +0 -8
  410. package/skills/tfx-prune/SKILL.md.tmpl +0 -199
  411. package/skills/tfx-prune/skill.json +0 -12
  412. package/skills/tfx-psmux-rules/SKILL.md.tmpl +0 -317
  413. package/skills/tfx-psmux-rules/skill.json +0 -8
  414. package/skills/tfx-qa/skill.json +0 -11
  415. package/skills/tfx-ralph/SKILL.md.tmpl +0 -27
  416. package/skills/tfx-ralph/skill.json +0 -8
  417. package/skills/tfx-remote-setup/SKILL.md.tmpl +0 -576
  418. package/skills/tfx-remote-setup/skill.json +0 -8
  419. package/skills/tfx-remote-spawn/SKILL.md.tmpl +0 -263
  420. package/skills/tfx-remote-spawn/skill.json +0 -9
  421. package/skills/tfx-research/skill.json +0 -13
  422. package/skills/tfx-review/skill.json +0 -11
  423. package/skills/tfx-setup/SKILL.md.tmpl +0 -380
  424. package/skills/tfx-setup/skill.json +0 -8
  425. package/skills/tfx-swarm/SKILL.md.tmpl +0 -154
  426. package/skills/tfx-swarm/skill.json +0 -5
package/CLAUDE.md ADDED
@@ -0,0 +1,171 @@
1
+ # triflux — Claude Code 운영 가이드
2
+
3
+ <core-systems>
4
+ ## 핵심 스킬 시스템 (항상 인지)
5
+
6
+ 이 프로젝트는 3개의 스킬 시스템을 동시에 사용한다. 어떤 작업이든 해당 시스템의 스킬이 있는지 먼저 확인한다.
7
+
8
+ | 시스템 | 접두사 | 용도 | 스킬 수 |
9
+ |--------|--------|------|---------|
10
+ | **triflux** | `/tfx-*` | CLI 라우팅, 멀티모델 오케스트레이션, 스웜, 원격 실행 | ~40개 |
11
+ | **gstack** | `/` (접두사 없음) | QA, ship, investigate, design, review, checkpoint | ~35개 |
12
+ | **omc** | `/oh-my-claudecode:*` | autopilot, ralph, team, ultrawork, ccg | ~25개 |
13
+
14
+ 스킬을 모르면 자연어 라우팅(아래)으로 자동 매핑된다.
15
+ 세션 종료 전 메모리 파일이 3개+ 변경됐으면 `/memory-hygiene` 제안을 검토한다.
16
+ </core-systems>
17
+
18
+ <routing>
19
+ ## 자연어 → 스킬 라우팅
20
+
21
+ 사용자가 스킬명을 모르더라도 자연어로 요청하면 아래 규칙에 따라 적절한 스킬을 호출한다.
22
+
23
+ ### 행동 유형 → 스킬 매핑
24
+
25
+ | 의도 | 자연어 신호 | 스킬 |
26
+ |------|-----------|------|
27
+ | 구현/수정 | 만들어, 고쳐, 구현해, 짜줘, 수정해, 바꿔 | tfx-auto |
28
+ | 리뷰 | 봐줘, 리뷰해, 검토해, 괜찮아? | tfx-review |
29
+ | 분석 | 분석해, 어떻게 돌아가?, 구조가 뭐야 | tfx-analysis |
30
+ | 계획 | 계획, 어떻게 하지, 설계해 | tfx-plan |
31
+ | 검색 | 찾아, 어디있어, 파일 찾아 | tfx-find |
32
+ | 리서치 (빠른) | 검색해줘, 찾아봐, 공식문서, 이거 뭐야 | tfx-research |
33
+ | 리서치 (자율) | 자율 리서치, 검색하고 정리해, research and plan | tfx-autoresearch |
34
+ | 테스트 | 테스트, 검증, 돌려봐, QA | tfx-qa |
35
+ | 정리 | 정리해, 슬롭 제거, 클린업 | tfx-prune |
36
+ | 토론 | 뭐가 나을까, 비교해, A vs B | tfx-debate |
37
+
38
+ ### 깊이 수정자
39
+
40
+ | 수정자 | 신호 | 효과 |
41
+ |--------|------|------|
42
+ | 기본 | (없음), 빠르게, 간단히 | Light 스킬 |
43
+ | 깊이 | 제대로, 꼼꼼히, 철저히 | Deep 스킬 (tfx-deep-*). 예외: tfx-deep-interview는 Gemini 단독 |
44
+ | 합의 | 3자, 교차, 다각도 | consensus 프로토콜 |
45
+ | 반복 | 끝까지, 멈추지마, ralph | persist 모드 |
46
+ | 자율 | 알아서, 자동으로, autopilot | autopilot 모드 |
47
+
48
+ ### CLI 라우팅
49
+
50
+ headless-guard가 `codex exec` / `gemini -y -p` 직접 호출을 차단한다. tfx 스킬 경유 필수.
51
+
52
+ **Layer 1 — Light** (tfx-route.sh → 단일 CLI)
53
+
54
+ | 스킬 | CLI | 용도 |
55
+ |------|-----|------|
56
+ | tfx-auto | 자동 | 통합 진입점 |
57
+ | tfx-codex | Codex | Codex 전용 |
58
+ | tfx-gemini | Gemini | Gemini 전용 |
59
+ | tfx-autopilot | Codex→검증 | 단일 파일, 5분 이내 |
60
+ | tfx-autoroute | 자동 승격 | 실패→더 강한 모델 |
61
+
62
+ **Layer 2 — Deep** (headless 3-CLI 합의)
63
+
64
+ tfx-deep-review, tfx-deep-qa, tfx-deep-plan, tfx-deep-research, tfx-consensus, tfx-debate, tfx-panel, tfx-fullcycle, tfx-persist
65
+
66
+ **Layer 3 — Remote/병렬**
67
+
68
+ | 스킬 | 용도 |
69
+ |------|------|
70
+ | tfx-multi | 2+개 태스크 headless 병렬 |
71
+ | tfx-codex-swarm | PRD별 worktree + Codex 다중 (로컬 전용) |
72
+ | tfx-remote-spawn | Claude Code 원격 세션 (SSH, setup 필수) |
73
+
74
+ **Claude 네이티브** (CLI 불필요): tfx-find, tfx-forge, tfx-prune, tfx-index, tfx-setup, tfx-doctor, tfx-hooks, tfx-hub
75
+
76
+ 자원 우선순위: remote-spawn > codex-swarm > multi > Light > 로컬 단독
77
+
78
+ ### 충돌 해소
79
+
80
+ - ralph = persist alias
81
+ - "auto" 단독 → tfx-auto. "알아서 해" → tfx-autopilot
82
+ - "코드에서 찾아" → tfx-find. "알아봐" → tfx-research
83
+ - 복합 의도: "구현하고 리뷰까지" → tfx-auto → cross-review hook
84
+ </routing>
85
+
86
+ <session-context>
87
+ ## 맥락 이탈 판단
88
+
89
+ 현재 세션 맥락과 무관한 요청이 감지되면 psmux 격리를 제안한다.
90
+
91
+ | 확신도 | 신호 | 행동 |
92
+ |--------|------|------|
93
+ | 확실 | "새 탭", "별도로", "새 세션" | 바로 psmux spawn |
94
+ | 높음 | 다른 프로젝트/스택 언급 | 분리 제안 |
95
+ | 중간 | 작업 유형 전환 | 분리 제안 + 현재 세션 옵션 |
96
+ | 낮음 | 현재 작업 연장 | 세션 유지 |
97
+ </session-context>
98
+
99
+ <psmux-wt>
100
+ ## psmux/WT 규칙
101
+
102
+ psmux 세션·WT 패인을 생성/조작/정리할 때 `tfx-psmux-rules` 스킬을 참조한다.
103
+ WT 프리징 방지: exit → sleep 2 → kill 순서. 바로 kill하지 않는다.
104
+
105
+ ### wt.exe → wt-manager 경유
106
+
107
+ safety-guard가 `wt.exe`, `wt new-tab`, `wt split-pane`, `Start-Process wt`를 차단한다.
108
+ `hub/team/wt-manager.mjs`의 API를 사용한다.
109
+
110
+ | 용도 | API |
111
+ |------|-----|
112
+ | 새 탭 | `createTab({ title, command, profile, cwd })` |
113
+ | 패인 분할 | `splitPane({ direction: 'H'\|'V', title, command })` |
114
+ | 다중 배치 | `applySplitLayout([{ title, command, direction }])` |
115
+ | 탭 정리 | `closeTab(title)` / `closeStale({ olderThanMs, titlePattern })` |
116
+
117
+ 차단과 대안은 항상 쌍으로 존재해야 한다. 차단만 추가하고 대안을 안 만들면 데드락.
118
+
119
+ ### psmux에서 Codex 실행
120
+
121
+ | 방식 | 동작 | 이유 |
122
+ |------|------|------|
123
+ | `codex` (interactive) | 불가 | psmux에서 TTY를 못 잡음 |
124
+ | `codex < prompt.md` | 불가 | "stdin is not a terminal" |
125
+ | `codex exec "$(cat prompt.md)" -s danger-full-access --dangerously-bypass-approvals-and-sandbox` | 사용 | 유일한 안전 경로 |
126
+
127
+ `codex exec`는 config.toml `approval_mode`를 무시하므로 `--dangerously-bypass-approvals-and-sandbox` 필수.
128
+ `-s` 유효값: read-only, workspace-write, danger-full-access.
129
+ </psmux-wt>
130
+
131
+ <codex-config>
132
+ ## Codex config.toml
133
+
134
+ config.toml에 이미 설정된 값은 CLI 플래그로 중복 지정하지 않는다.
135
+
136
+ | config.toml에 있으면 | CLI에서 생략 |
137
+ |---------------------|-------------|
138
+ | `sandbox = "elevated"` | `--full-auto` |
139
+ | `approval_mode = "full-auto"` | `--full-auto` |
140
+
141
+ 안전 패턴: config.toml에 기본값을 두고, CLI에서는 `--profile` 선택만 한다.
142
+ </codex-config>
143
+
144
+ <remote>
145
+ ## 원격 실행
146
+
147
+ ### 스킬 구분
148
+
149
+ | 스킬 | 대상 | 방식 |
150
+ |------|------|------|
151
+ | tfx-codex-swarm | 로컬 전용 | 로컬 worktree + psmux |
152
+ | tfx-remote-spawn | Claude Code 원격 | SSH → Claude Code 세션 → 내부 tfx 라우팅 |
153
+
154
+ codex를 SSH 너머로 직접 실행하지 않는다. config.toml 충돌 + TTY 문제.
155
+ 원격에서 codex가 필요하면: remote-spawn → Claude Code → Claude가 내부에서 codex 호출.
156
+
157
+ ### SSH 패턴
158
+
159
+ - 인라인 쿼팅 대신 scp + `pwsh -File` 패턴 사용
160
+ - SSH 전송 중 `$var` 전개 주의, PowerShell 변수는 인라인 불가
161
+ - `~` → `$HOME` 변환 필수, 원격 기본 셸 = PowerShell
162
+ </remote>
163
+
164
+ <cross-review>
165
+ ## 교차 검증
166
+
167
+ - Claude 작성 코드 → Codex 리뷰
168
+ - Codex 작성 코드 → Claude 리뷰
169
+ - 동일 모델 self-approve 하지 않는다
170
+ - git commit 전 미검증 파일 감지 시 nudge
171
+ </cross-review>
package/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  <p align="center">
12
12
  <strong>Tri-CLI Orchestration with Consensus Intelligence</strong><br>
13
- <em>Claude + Codex + Gemini — natural language routing, cross-model review, 38 skills with Deep/Light variants.</em>
13
+ <em>Claude + Codex + Gemini — natural language routing, cross-model review, 42 skills with Deep/Light variants.</em>
14
14
  </p>
15
15
 
16
16
  <p align="center">
@@ -75,12 +75,24 @@ tfx setup
75
75
 
76
76
  # Remote — spawn Claude sessions on other machines
77
77
  /tfx-remote-setup # interactive host wizard (Tailscale + SSH)
78
- /tfx-remote-spawn "run security review on ultra4" # spawn on remote host
78
+ /tfx-remote-spawn "run security review on my-server" # spawn on remote host
79
79
  ```
80
80
 
81
81
  ---
82
82
 
83
- ## What's New in v9
83
+ ## What's New in v10
84
+
85
+ **triflux v10** completes the **4-Lake Roadmap** — a systematic hardening of every layer from CLI stability to remote multi-agent orchestration.
86
+
87
+ ### v10 Highlights
88
+
89
+ - **Lake 1: CLI Stability** — Retry, stall detection, version cache. Zero silent failures
90
+ - **Lake 2: Plugin Isolation** — cli-adapter-base, team-bridge, pack.mjs sync
91
+ - **Lake 3: Remote Infrastructure** — SSH keepalive/retry, hosts.json capability routing, remote handoff, MCP singleton daemon
92
+ - **Lake 4: Token Optimization** — Skill template engine, shared segments, manifest separation. 62% prompt token reduction
93
+ - **Lake 5: Agent Mesh** — Message routing, per-agent queues, heartbeat monitoring, Conductor integration
94
+
95
+ ### v9 (carried forward)
84
96
 
85
97
  **triflux v9** introduces **Harness-Native Intelligence** — speak naturally, and triflux routes to the right skill automatically. Cross-model review ensures no model approves its own work.
86
98
 
@@ -141,7 +153,7 @@ Phase 3: Resolution (if consensus < 70%)
141
153
  |-------|------|-------------|--------|
142
154
  | `tfx-research` | Light | Quick web search via Exa/Brave/Tavily auto-selection | ~5K |
143
155
  | `tfx-deep-research` | Deep | Multi-source parallel search with 3-CLI cross-validation | ~50K |
144
- | `tfx-codebase-search` | Light | Fast codebase exploration via Haiku agent | ~3K |
156
+ | `tfx-find` | Light | Fast codebase search — files, symbols, patterns via Haiku | ~3K |
145
157
  | `tfx-autoresearch` | Light | Autonomous web research to structured report | ~15K |
146
158
 
147
159
  ### Analysis
@@ -155,9 +167,9 @@ Phase 3: Resolution (if consensus < 70%)
155
167
 
156
168
  | Skill | Type | Description | Tokens |
157
169
  |-------|------|-------------|--------|
158
- | `tfx-autopilot` | Light | Simple autonomous task execution | ~10K |
159
- | `tfx-deep-autopilot` | Deep | Full 5-phase pipeline: Expand → Plan → Execute → QA → Validate | ~80K |
160
- | `tfx-auto` | — | Unified CLI orchestrator with command shortcuts | varies |
170
+ | `tfx-autopilot` | Light | Simple autonomous task execution (single file, <5min) | ~10K |
171
+ | `tfx-fullcycle` | Deep | Full pipeline: Design → Plan → Execute → QA → Verify | ~80K |
172
+ | `tfx-auto` | — | Unified CLI orchestrator with command shortcuts + auto-triage | varies |
161
173
 
162
174
  ### QA & Verification
163
175
 
@@ -191,8 +203,9 @@ Phase 3: Resolution (if consensus < 70%)
191
203
 
192
204
  | Skill | Type | Description | Tokens |
193
205
  |-------|------|-------------|--------|
194
- | `tfx-persist` | Deep | 3-party verified persistence loop until done (`/tfx-ralph` compat alias) | varies |
195
- | `tfx-sisyphus` | Light | Auto-routing execution with model escalation | varies |
206
+ | `tfx-persist` | Deep | 3-party verified persistence loop until done | varies |
207
+ | `tfx-ralph` | | Alias for `tfx-persist` | varies |
208
+ | `tfx-autoroute` | Light | Auto-routing with model escalation on failure | varies |
196
209
 
197
210
  ### Meta & Utility
198
211
 
@@ -201,7 +214,8 @@ Phase 3: Resolution (if consensus < 70%)
201
214
  | `tfx-index` | Light | 94% token reduction via project indexing (58K→3K) | ~2K |
202
215
  | `tfx-forge` | Light | Create new skills interactively | ~10K |
203
216
  | `tfx-interview` | Light | Socratic requirements exploration | ~15K |
204
- | `tfx-deslop` | Deep | AI slop removal with 3-party consensus | ~10K |
217
+ | `tfx-deep-interview` | Deep | Socratic deep interview with ambiguity gating | ~25K |
218
+ | `tfx-prune` | Light | AI slop removal — dead code, over-abstraction cleanup | ~10K |
205
219
 
206
220
  ### Infrastructure
207
221
 
@@ -210,13 +224,16 @@ Phase 3: Resolution (if consensus < 70%)
210
224
  | `tfx-consensus` | Core consensus engine (internal, used by all Deep skills) |
211
225
  | `tfx-hub` | MCP message bus management |
212
226
  | `tfx-multi` | Multi-CLI team orchestration |
227
+ | `tfx-codex-swarm` | Parallel Codex sessions via worktree + psmux |
228
+ | `tfx-swarm` | Unified swarm orchestration |
213
229
  | `tfx-setup` | Initial setup wizard |
214
230
  | `tfx-doctor` | Diagnostics and auto-repair |
215
- | `tfx-profile` | Codex CLI profile management |
231
+ | `tfx-hooks` | Claude Code hook priority manager |
232
+ | `tfx-profile` | Codex/Gemini CLI profile management |
216
233
  | `tfx-codex` | Codex-only orchestrator |
217
234
  | `tfx-gemini` | Gemini-only orchestrator |
218
235
  | `tfx-auto-codex` | Codex-lead orchestrator |
219
- | `tfx-remote-spawn` | Remote session management via psmux |
236
+ | `tfx-remote-spawn` | Remote session management via psmux + SSH |
220
237
  | `tfx-remote-setup` | Remote host setup wizard (Tailscale + SSH) |
221
238
 
222
239
  ---
@@ -326,9 +343,9 @@ tfx setup
326
343
 
327
344
  ## Research Foundation
328
345
 
329
- The v8 skill suite was designed after comprehensive reverse-engineering of 37 cloned repositories across the Claude Code ecosystem:
346
+ The v8 skill suite was inspired by patterns and ideas from across the Claude Code ecosystem:
330
347
 
331
- | Project | Stars | Key Insight Adopted |
348
+ | Project | Stars | Inspiration |
332
349
  |---------|-------|-------------------|
333
350
  | everything-claude-code | 114K | Instinct-based learning patterns |
334
351
  | Superpowers | 93K | TDD enforcement, composable skills |
@@ -363,7 +380,7 @@ The v8 skill suite was designed after comprehensive reverse-engineering of 37 cl
363
380
 
364
381
  ## QoS Dashboard
365
382
 
366
- Monitor orchestration health at `http://localhost:27888/dashboard`.
383
+ Monitor orchestration health via the built-in QoS Dashboard (run `tfx doctor` for URL).
367
384
 
368
385
  - **AIMD Batch Sizing** — Auto-scales parallel tasks based on success rates
369
386
  - **Token Savings** — Real-time tracking of Claude tokens saved
package/bin/triflux.mjs CHANGED
@@ -284,6 +284,16 @@ function handleFatalError(error, { json = false } = {}) {
284
284
  process.exit(exitCode);
285
285
  }
286
286
 
287
+ function renderErrorMessage(message, fallback = "unknown error") {
288
+ if (typeof message === "string") {
289
+ const normalized = message.trim().toLowerCase();
290
+ if (normalized.length > 0 && normalized !== "undefined" && normalized !== "null") {
291
+ return message.trim();
292
+ }
293
+ }
294
+ return fallback;
295
+ }
296
+
287
297
  function which(cmd) {
288
298
  try {
289
299
  const result = process.platform === "win32"
@@ -706,11 +716,45 @@ function previewMcpRegistrationActions(mcpUrl) {
706
716
  return actions;
707
717
  }
708
718
 
719
+ function previewClaudeRoutingAction() {
720
+ const globalClaudePath = join(CLAUDE_DIR, "CLAUDE.md");
721
+ const projectClaudePath = join(PKG_ROOT, "CLAUDE.md");
722
+ const projectContent = existsSync(projectClaudePath)
723
+ ? readFileSync(projectClaudePath, "utf8")
724
+ : "";
725
+ const projectSection = extractMarkdownSection(projectContent, TFX_SECTION_HEADING);
726
+
727
+ if (!projectSection) {
728
+ return {
729
+ type: "claude-guidance",
730
+ path: globalClaudePath,
731
+ source: projectClaudePath,
732
+ change: "skip",
733
+ reason: "project-section-missing",
734
+ };
735
+ }
736
+
737
+ const globalContent = existsSync(globalClaudePath)
738
+ ? readFileSync(globalClaudePath, "utf8")
739
+ : "";
740
+ const preview = ensureTfxSection(globalContent, { scope: "global", projectSection });
741
+
742
+ return {
743
+ type: "claude-guidance",
744
+ path: globalClaudePath,
745
+ source: projectClaudePath,
746
+ change: preview.changed ? (existsSync(globalClaudePath) ? "update" : "create") : "noop",
747
+ heading: TFX_SECTION_HEADING,
748
+ summary: TFX_GLOBAL_SUMMARY_SECTION,
749
+ };
750
+ }
751
+
709
752
  function buildSetupDryRunPlan() {
710
753
  const actions = [
711
754
  ...SYNC_MAP.map(({ src, dst, label }) => describeSyncAction(src, dst, label)),
712
755
  ...listSkillSyncActions(),
713
756
  ];
757
+ actions.push(previewClaudeRoutingAction());
714
758
  const codexProfiles = previewCodexProfiles();
715
759
  actions.push({
716
760
  type: "codex-profiles",
@@ -742,6 +786,12 @@ function cmdSetup(options = {}) {
742
786
  for (const target of SYNC_MAP) {
743
787
  syncFile(target.src, target.dst, target.label);
744
788
  }
789
+ {
790
+ const claudeGuide = ensureGlobalClaudeRoutingSection();
791
+ if (!claudeGuide.ok) warn(`CLAUDE.md 라우팅 섹션 확인 실패: ${claudeGuide.reason}`);
792
+ else if (claudeGuide.changed) ok("CLAUDE.md: 전역 triflux 라우팅 요약 갱신");
793
+ else ok("CLAUDE.md: 전역 triflux 라우팅 요약 유지");
794
+ }
745
795
 
746
796
  // 스킬 동기화 (~/.claude/skills/{name}/SKILL.md)
747
797
  const skillsSrc = join(PKG_ROOT, "skills");
@@ -838,8 +888,9 @@ function cmdSetup(options = {}) {
838
888
 
839
889
  const codexProfileResult = ensureCodexProfiles();
840
890
  if (!codexProfileResult.ok) {
841
- warn(`Codex profiles 설정 실패: ${codexProfileResult.message}`);
842
- summary.push({ item: "Codex profiles", status: "⚠️", detail: codexProfileResult.message });
891
+ const reason = renderErrorMessage(codexProfileResult.message);
892
+ warn(`Codex profiles 설정 실패: ${reason}`);
893
+ summary.push({ item: "Codex profiles", status: "⚠️", detail: reason });
843
894
  } else if (codexProfileResult.changed > 0) {
844
895
  ok(`Codex profiles: ${codexProfileResult.changed}개 반영됨 (~/.codex/config.toml)`);
845
896
  summary.push({ item: "Codex profiles", status: "✅", detail: `${codexProfileResult.changed}개 반영됨` });
@@ -851,8 +902,9 @@ function cmdSetup(options = {}) {
851
902
  // Gemini 프로필
852
903
  const geminiResult = ensureGeminiProfiles();
853
904
  if (!geminiResult.ok) {
854
- warn(`Gemini profiles 설정 실패: ${geminiResult.message}`);
855
- summary.push({ item: "Gemini profiles", status: "⚠️", detail: geminiResult.message });
905
+ const reason = renderErrorMessage(geminiResult.message);
906
+ warn(`Gemini profiles 설정 실패: ${reason}`);
907
+ summary.push({ item: "Gemini profiles", status: "⚠️", detail: reason });
856
908
  } else if (geminiResult.created) {
857
909
  ok(`Gemini profiles: ${geminiResult.count}개 생성됨 (~/.gemini/triflux-profiles.json)`);
858
910
  summary.push({ item: "Gemini profiles", status: "✅", detail: `${geminiResult.count}개 생성됨` });
@@ -1320,6 +1372,11 @@ async function cmdDoctor(options = {}) {
1320
1372
  for (const target of SYNC_MAP) {
1321
1373
  syncFile(target.src, target.dst, target.label);
1322
1374
  }
1375
+ {
1376
+ const claudeGuide = ensureGlobalClaudeRoutingSection();
1377
+ if (!claudeGuide.ok) warn(`CLAUDE.md 라우팅 섹션 확인 실패: ${claudeGuide.reason}`);
1378
+ else if (claudeGuide.changed) ok("CLAUDE.md: 전역 triflux 라우팅 요약 갱신");
1379
+ }
1323
1380
  // 스킬 동기화
1324
1381
  const fSkillsSrc = join(PKG_ROOT, "skills");
1325
1382
  const fSkillsDst = join(CLAUDE_DIR, "skills");
@@ -1340,7 +1397,7 @@ async function cmdDoctor(options = {}) {
1340
1397
  }
1341
1398
  const profileFix = ensureCodexProfiles();
1342
1399
  if (!profileFix.ok) {
1343
- warn(`Codex Profiles 자동 복구 실패: ${profileFix.message}`);
1400
+ warn(`Codex Profiles 자동 복구 실패: ${renderErrorMessage(profileFix.message)}`);
1344
1401
  } else if (profileFix.changed > 0) {
1345
1402
  ok(`Codex Profiles: ${profileFix.changed}개 반영됨`);
1346
1403
  } else {
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env node
2
+ // hooks/agent-route-guard.mjs — PreToolUse:Agent 훅
3
+ // 서브에이전트 스폰 시 triflux 컨텍스트를 구조화 JSON으로 주입한다.
4
+ // - subagent_type별 최적 라우팅 가이드
5
+ // - tfx-multi 활성 상태 시 headless dispatch 강제
6
+ // - 프로젝트 컨텍스트 자동 첨부
7
+
8
+ import { readFileSync, existsSync } from "node:fs";
9
+ import { join } from "node:path";
10
+ import { tmpdir } from "node:os";
11
+
12
+ const TFX_MULTI_STATE = join(tmpdir(), "tfx-multi-state.json");
13
+ const EXPIRE_MS = 30 * 60 * 1000; // 30분
14
+
15
+ // 서브에이전트 타입별 라우팅 힌트
16
+ const AGENT_HINTS = {
17
+ "general-purpose": "범용 에이전트. tfx 스킬이 활성이면 스킬 MD의 라우팅을 우선한다.",
18
+ Explore: "탐색 전용. 파일 수정 불가. Glob/Grep/Read만 사용.",
19
+ Plan: "설계 전용. 파일 수정 불가. 구현 계획 반환.",
20
+ "oh-my-claudecode:executor": "OMC executor. triflux 프로젝트에서는 tfx-auto 라우팅을 우선.",
21
+ "oh-my-claudecode:code-reviewer": "OMC 리뷰어. 교차 리뷰 시 CLAUDE.md 교차 검증 규칙 준수.",
22
+ "oh-my-claudecode:architect": "OMC 아키텍트. READ-ONLY.",
23
+ "oh-my-claudecode:debugger": "OMC 디버거. 근본 원인 분석 집중.",
24
+ "oh-my-claudecode:test-engineer": "OMC 테스트. npm test 실행 후 결과 반환.",
25
+ };
26
+
27
+ function readStdin() {
28
+ try {
29
+ return readFileSync(0, "utf8");
30
+ } catch {
31
+ return "";
32
+ }
33
+ }
34
+
35
+ function getTfxMultiState() {
36
+ if (!existsSync(TFX_MULTI_STATE)) return null;
37
+ try {
38
+ const state = JSON.parse(readFileSync(TFX_MULTI_STATE, "utf8"));
39
+ if (Date.now() - state.activatedAt > EXPIRE_MS) return null;
40
+ return state.active ? state : null;
41
+ } catch {
42
+ return null;
43
+ }
44
+ }
45
+
46
+ function buildContext(agentType, prompt) {
47
+ const parts = [];
48
+
49
+ // 1. tfx-multi 활성 상태 확인
50
+ const multiState = getTfxMultiState();
51
+ if (multiState) {
52
+ parts.push(
53
+ "[tfx-multi ACTIVE] headless dispatch 모드. " +
54
+ "CLI 작업은 Bash(tfx-route.sh)를 통해 실행하세요."
55
+ );
56
+ }
57
+
58
+ // 2. 에이전트 타입별 힌트
59
+ const hint = AGENT_HINTS[agentType];
60
+ if (hint) {
61
+ parts.push(`[Agent:${agentType}] ${hint}`);
62
+ }
63
+
64
+ // 3. 프로젝트 컨텍스트
65
+ parts.push(
66
+ "triflux 프로젝트: subagent_type 미지정 시 'general-purpose' 기본. " +
67
+ "tfx-* 스킬 활성 시 스킬 MD 라우팅 우선."
68
+ );
69
+
70
+ return parts.join("\n");
71
+ }
72
+
73
+ function main() {
74
+ const raw = readStdin();
75
+ if (!raw.trim()) process.exit(0);
76
+
77
+ let input;
78
+ try {
79
+ input = JSON.parse(raw);
80
+ } catch {
81
+ process.exit(0);
82
+ }
83
+
84
+ if (input.tool_name !== "Agent") process.exit(0);
85
+
86
+ const toolInput = input.tool_input || {};
87
+ const agentType = toolInput.subagent_type || toolInput.agent || "general-purpose";
88
+ const prompt = toolInput.prompt || "";
89
+
90
+ const context = buildContext(agentType, prompt);
91
+
92
+ // 구조화된 hookSpecificOutput 반환
93
+ const output = {
94
+ hookSpecificOutput: {
95
+ hookEventName: "PreToolUse",
96
+ permissionDecision: "allow",
97
+ additionalContext: context,
98
+ },
99
+ };
100
+
101
+ process.stdout.write(JSON.stringify(output));
102
+ }
103
+
104
+ try {
105
+ main();
106
+ } catch {
107
+ // 훅 실패 시 블로킹하지 않음
108
+ process.exit(0);
109
+ }
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env node
2
+ // hooks/cross-review-tracker.mjs — PostToolUse:Edit|Write 훅
3
+ //
4
+ // 파일 수정을 추적하여 교차 리뷰 미검증 파일을 감지한다.
5
+ // CLAUDE.md 규칙: "Claude 작성 코드 → Codex 리뷰, Codex 작성 → Claude 리뷰"
6
+ //
7
+ // 동작:
8
+ // 1. Edit/Write 성공 시 수정된 파일 경로를 상태 파일에 누적
9
+ // 2. 일정 수(REVIEW_THRESHOLD) 이상 미검증 파일이 쌓이면 nudge 메시지 주입
10
+ // 3. git commit 전 미검증 파일 경고
11
+
12
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
13
+ import { join, relative } from "node:path";
14
+ import { tmpdir } from "node:os";
15
+
16
+ const STATE_DIR = join(tmpdir(), "tfx-cross-review");
17
+ const STATE_FILE = join(STATE_DIR, "pending-review.json");
18
+ const REVIEW_THRESHOLD = 5; // 이 수 이상 미검증 파일 → nudge
19
+ const EXPIRE_MS = 60 * 60 * 1000; // 1시간 후 자동 만료
20
+
21
+ // 코드 파일만 추적 (설정/문서/빌드 산출물 제외)
22
+ const CODE_EXTENSIONS = new Set([
23
+ ".js", ".mjs", ".cjs", ".ts", ".tsx", ".jsx",
24
+ ".py", ".rs", ".go", ".java", ".c", ".cpp", ".h",
25
+ ".vue", ".svelte", ".sh", ".bash", ".ps1",
26
+ ]);
27
+
28
+ function isCodeFile(filePath) {
29
+ if (!filePath) return false;
30
+ const ext = filePath.slice(filePath.lastIndexOf(".")).toLowerCase();
31
+ return CODE_EXTENSIONS.has(ext);
32
+ }
33
+
34
+ function loadState() {
35
+ if (!existsSync(STATE_FILE)) {
36
+ return { files: {}, startedAt: Date.now() };
37
+ }
38
+ try {
39
+ const state = JSON.parse(readFileSync(STATE_FILE, "utf8"));
40
+ // 만료 체크
41
+ if (Date.now() - state.startedAt > EXPIRE_MS) {
42
+ return { files: {}, startedAt: Date.now() };
43
+ }
44
+ return state;
45
+ } catch {
46
+ return { files: {}, startedAt: Date.now() };
47
+ }
48
+ }
49
+
50
+ function saveState(state) {
51
+ mkdirSync(STATE_DIR, { recursive: true });
52
+ writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));
53
+ }
54
+
55
+ function readStdin() {
56
+ try {
57
+ return readFileSync(0, "utf8");
58
+ } catch {
59
+ return "";
60
+ }
61
+ }
62
+
63
+ function main() {
64
+ const raw = readStdin();
65
+ if (!raw.trim()) process.exit(0);
66
+
67
+ let input;
68
+ try {
69
+ input = JSON.parse(raw);
70
+ } catch {
71
+ process.exit(0);
72
+ }
73
+
74
+ const toolName = input.tool_name || "";
75
+ if (toolName !== "Edit" && toolName !== "Write") process.exit(0);
76
+
77
+ const toolInput = input.tool_input || {};
78
+ const filePath = toolInput.file_path || "";
79
+
80
+ if (!filePath || !isCodeFile(filePath)) process.exit(0);
81
+
82
+ // 프로젝트 루트 기준 상대 경로
83
+ const cwd = input.cwd || process.cwd();
84
+ const relPath = relative(cwd, filePath) || filePath;
85
+
86
+ // 상태 갱신: 파일 추가
87
+ const state = loadState();
88
+ state.files[relPath] = {
89
+ tool: toolName,
90
+ modifiedAt: Date.now(),
91
+ reviewed: false,
92
+ };
93
+ saveState(state);
94
+
95
+ // 미검증 파일 수 체크
96
+ const unreviewed = Object.entries(state.files).filter(
97
+ ([, v]) => !v.reviewed
98
+ );
99
+ const count = unreviewed.length;
100
+
101
+ if (count >= REVIEW_THRESHOLD) {
102
+ // nudge 메시지 주입
103
+ const fileList = unreviewed
104
+ .slice(0, 8)
105
+ .map(([f]) => ` - ${f}`)
106
+ .join("\n");
107
+
108
+ const output = {
109
+ systemMessage:
110
+ `[교차 리뷰 nudge] 미검증 코드 파일 ${count}개:\n${fileList}\n` +
111
+ (count > 8 ? ` ... 외 ${count - 8}개\n` : "") +
112
+ `커밋 전 교차 리뷰를 권장합니다. (Claude→Codex 또는 Codex→Claude)`,
113
+ };
114
+ process.stdout.write(JSON.stringify(output));
115
+ }
116
+ }
117
+
118
+ try {
119
+ main();
120
+ } catch {
121
+ process.exit(0);
122
+ }