triflux 10.4.0 → 10.7.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 (391) hide show
  1. package/.claude-plugin/marketplace.json +34 -0
  2. package/.claude-plugin/plugin.json +22 -0
  3. package/bin/tfx-doctor-tui.mjs +1 -1
  4. package/bin/tfx-doctor.mjs +6 -1
  5. package/bin/tfx-profile.mjs +1 -1
  6. package/bin/tfx-setup-tui.mjs +1 -1
  7. package/bin/tfx-setup.mjs +6 -1
  8. package/bin/triflux.mjs +2396 -1140
  9. package/config/mcp-registry.json +29 -0
  10. package/hooks/agent-route-guard.mjs +12 -8
  11. package/hooks/cross-review-tracker.mjs +21 -8
  12. package/hooks/error-context.mjs +19 -7
  13. package/hooks/hook-adaptive-collector.mjs +18 -16
  14. package/hooks/hook-manager.mjs +93 -32
  15. package/hooks/hook-orchestrator.mjs +108 -24
  16. package/hooks/hook-registry.json +267 -256
  17. package/hooks/keyword-rules.json +6 -10
  18. package/hooks/lib/resolve-root.mjs +1 -1
  19. package/hooks/mcp-config-watcher.mjs +6 -2
  20. package/hooks/pipeline-stop.mjs +3 -6
  21. package/hooks/safety-guard.mjs +99 -28
  22. package/hooks/session-start-fast.mjs +143 -0
  23. package/hooks/subagent-verifier.mjs +5 -4
  24. package/hub/account-broker.mjs +256 -60
  25. package/hub/adaptive-diagnostic.mjs +75 -48
  26. package/hub/adaptive-inject.mjs +96 -58
  27. package/hub/adaptive-memory.mjs +156 -42
  28. package/hub/adaptive.mjs +60 -31
  29. package/hub/assign-callbacks.mjs +163 -126
  30. package/hub/bridge.mjs +0 -1
  31. package/hub/cli-adapter-base.mjs +200 -48
  32. package/hub/codex-adapter.mjs +76 -96
  33. package/hub/codex-compat.mjs +3 -3
  34. package/hub/codex-preflight.mjs +63 -37
  35. package/hub/delegator/contracts.mjs +19 -23
  36. package/hub/delegator/index.mjs +14 -14
  37. package/hub/delegator/service.mjs +88 -64
  38. package/hub/delegator/tool-definitions.mjs +35 -35
  39. package/hub/fullcycle.mjs +33 -17
  40. package/hub/gemini-adapter.mjs +69 -94
  41. package/hub/hitl.mjs +202 -143
  42. package/hub/intent.mjs +161 -38
  43. package/hub/lib/cache-guard.mjs +43 -17
  44. package/hub/lib/mcp-response-cache.mjs +66 -32
  45. package/hub/lib/memory-store.mjs +285 -111
  46. package/hub/lib/path-utils.mjs +35 -37
  47. package/hub/lib/process-utils.mjs +106 -37
  48. package/hub/lib/spawn-trace.mjs +527 -0
  49. package/hub/lib/ssh-command.mjs +34 -4
  50. package/hub/lib/ssh-retry.mjs +5 -1
  51. package/hub/lib/uuidv7.mjs +4 -3
  52. package/hub/memory-doctor.mjs +266 -106
  53. package/hub/middleware/request-logger.mjs +61 -34
  54. package/hub/paths.mjs +9 -9
  55. package/hub/pipeline/gates/confidence.mjs +34 -15
  56. package/hub/pipeline/gates/consensus.mjs +27 -15
  57. package/hub/pipeline/gates/index.mjs +7 -3
  58. package/hub/pipeline/gates/selfcheck.mjs +57 -19
  59. package/hub/pipeline/index.mjs +77 -42
  60. package/hub/pipeline/state.mjs +10 -10
  61. package/hub/pipeline/transitions.mjs +40 -23
  62. package/hub/platform.mjs +57 -48
  63. package/hub/promote-penalties.mjs +25 -7
  64. package/hub/quality/deslop.mjs +70 -49
  65. package/hub/research.mjs +32 -25
  66. package/hub/router.mjs +924 -791
  67. package/hub/routing/complexity.mjs +132 -29
  68. package/hub/routing/index.mjs +17 -12
  69. package/hub/routing/q-learning.mjs +76 -28
  70. package/hub/server.mjs +4 -4
  71. package/hub/session-fingerprint.mjs +127 -61
  72. package/hub/state.mjs +84 -43
  73. package/hub/store-adapter.mjs +59 -26
  74. package/hub/store.mjs +356 -153
  75. package/hub/team/agent-map.json +22 -7
  76. package/hub/team/ansi.mjs +186 -122
  77. package/hub/team/backend.mjs +28 -10
  78. package/hub/team/cli/commands/attach.mjs +57 -37
  79. package/hub/team/cli/commands/control.mjs +29 -8
  80. package/hub/team/cli/commands/debug.mjs +95 -74
  81. package/hub/team/cli/commands/focus.mjs +80 -53
  82. package/hub/team/cli/commands/interrupt.mjs +18 -6
  83. package/hub/team/cli/commands/kill.mjs +16 -5
  84. package/hub/team/cli/commands/list.mjs +31 -24
  85. package/hub/team/cli/commands/send.mjs +19 -6
  86. package/hub/team/cli/commands/start/index.mjs +154 -31
  87. package/hub/team/cli/commands/start/parse-args.mjs +38 -11
  88. package/hub/team/cli/commands/start/start-headless.mjs +112 -36
  89. package/hub/team/cli/commands/start/start-in-process.mjs +50 -40
  90. package/hub/team/cli/commands/start/start-mux.mjs +122 -73
  91. package/hub/team/cli/commands/start/start-wt.mjs +86 -69
  92. package/hub/team/cli/commands/status.mjs +43 -14
  93. package/hub/team/cli/commands/stop.mjs +11 -4
  94. package/hub/team/cli/commands/task.mjs +8 -3
  95. package/hub/team/cli/commands/tasks.mjs +13 -13
  96. package/hub/team/cli/index.mjs +2 -2
  97. package/hub/team/cli/manifest.mjs +38 -8
  98. package/hub/team/cli/render.mjs +52 -30
  99. package/hub/team/cli/services/attach-fallback.mjs +74 -54
  100. package/hub/team/cli/services/hub-client.mjs +42 -14
  101. package/hub/team/cli/services/member-selector.mjs +37 -30
  102. package/hub/team/cli/services/native-control.mjs +143 -116
  103. package/hub/team/cli/services/runtime-mode.mjs +2 -1
  104. package/hub/team/cli/services/state-store.mjs +25 -8
  105. package/hub/team/cli/services/task-model.mjs +40 -30
  106. package/hub/team/conductor-mesh-bridge.mjs +24 -23
  107. package/hub/team/conductor.mjs +8 -4
  108. package/hub/team/dashboard-anchor.mjs +4 -5
  109. package/hub/team/dashboard-layout.mjs +3 -1
  110. package/hub/team/dashboard-open.mjs +41 -21
  111. package/hub/team/dashboard.mjs +76 -28
  112. package/hub/team/event-log.mjs +18 -10
  113. package/hub/team/handoff.mjs +31 -15
  114. package/hub/team/headless.mjs +2 -1
  115. package/hub/team/health-probe.mjs +69 -54
  116. package/hub/team/launcher-template.mjs +16 -13
  117. package/hub/team/native-supervisor.mjs +65 -21
  118. package/hub/team/native.mjs +74 -35
  119. package/hub/team/nativeProxy.mjs +184 -113
  120. package/hub/team/notify.mjs +120 -77
  121. package/hub/team/orchestrator.mjs +166 -161
  122. package/hub/team/pane.mjs +12 -7
  123. package/hub/team/process-cleanup.mjs +25 -16
  124. package/hub/team/psmux.mjs +491 -201
  125. package/hub/team/remote-probe.mjs +68 -52
  126. package/hub/team/remote-session.mjs +117 -59
  127. package/hub/team/remote-watcher.mjs +61 -33
  128. package/hub/team/routing.mjs +51 -25
  129. package/hub/team/runtime-strategy.mjs +3 -1
  130. package/hub/team/session.mjs +675 -611
  131. package/hub/team/shared.mjs +13 -13
  132. package/hub/team/staleState.mjs +72 -30
  133. package/hub/team/swarm-locks.mjs +15 -13
  134. package/hub/team/swarm-planner.mjs +32 -21
  135. package/hub/team/swarm-reconciler.mjs +48 -23
  136. package/hub/team/tui-lite.mjs +266 -68
  137. package/hub/team/tui-remote-adapter.mjs +14 -10
  138. package/hub/team/tui-viewer.mjs +99 -43
  139. package/hub/team/tui.mjs +708 -271
  140. package/hub/team/worktree-lifecycle.mjs +152 -58
  141. package/hub/team/wt-manager.mjs +24 -14
  142. package/hub/token-mode.mjs +71 -71
  143. package/hub/tray.mjs +411 -368
  144. package/hub/workers/claude-worker.mjs +162 -118
  145. package/hub/workers/codex-mcp.mjs +558 -507
  146. package/hub/workers/delegator-mcp.mjs +507 -333
  147. package/hub/workers/factory.mjs +21 -21
  148. package/hub/workers/gemini-worker.mjs +115 -84
  149. package/hub/workers/interface.mjs +6 -1
  150. package/hub/workers/worker-utils.mjs +21 -14
  151. package/hud/colors.mjs +27 -9
  152. package/hud/constants.mjs +162 -26
  153. package/hud/context-monitor.mjs +82 -41
  154. package/hud/hud-qos-status.mjs +129 -49
  155. package/hud/mission-board.mjs +6 -3
  156. package/hud/providers/claude.mjs +226 -115
  157. package/hud/providers/codex.mjs +62 -22
  158. package/hud/providers/gemini.mjs +168 -56
  159. package/hud/renderers.mjs +384 -119
  160. package/hud/terminal.mjs +101 -31
  161. package/hud/utils.mjs +78 -38
  162. package/mesh/index.mjs +11 -5
  163. package/mesh/mesh-budget.mjs +18 -9
  164. package/mesh/mesh-heartbeat.mjs +1 -1
  165. package/mesh/mesh-queue.mjs +3 -5
  166. package/mesh/mesh-router.mjs +5 -4
  167. package/package.json +56 -21
  168. package/scripts/__tests__/gen-skill-docs.test.mjs +36 -7
  169. package/scripts/__tests__/keyword-detector.test.mjs +77 -28
  170. package/scripts/__tests__/mcp-guard-engine.test.mjs +58 -20
  171. package/scripts/__tests__/remote-spawn-transfer.test.mjs +30 -19
  172. package/scripts/__tests__/remote-spawn.test.mjs +10 -4
  173. package/scripts/__tests__/session-start-fast.test.mjs +36 -0
  174. package/scripts/__tests__/skill-template.test.mjs +98 -50
  175. package/scripts/__tests__/smoke.test.mjs +1 -1
  176. package/scripts/__tests__/spawn-trace.test.mjs +102 -0
  177. package/scripts/__tests__/tfx-doctor-diagnose.test.mjs +48 -0
  178. package/scripts/cache-doctor.mjs +11 -4
  179. package/scripts/cache-warmup.mjs +96 -37
  180. package/scripts/claudemd-sync.mjs +27 -17
  181. package/scripts/codex-gateway-preflight.mjs +52 -37
  182. package/scripts/codex-mcp-gateway-sync.mjs +59 -39
  183. package/scripts/config-audit.mjs +232 -0
  184. package/scripts/convert-to-tmpl.mjs +54 -0
  185. package/scripts/cross-review-gate.mjs +35 -12
  186. package/scripts/cross-review-tracker.mjs +21 -8
  187. package/scripts/demo.mjs +35 -17
  188. package/scripts/doctor-diagnose.mjs +284 -0
  189. package/scripts/gen-skill-docs.mjs +7 -2
  190. package/scripts/gen-skill-manifest.mjs +2 -1
  191. package/scripts/headless-guard.mjs +86 -48
  192. package/scripts/hub-ensure.mjs +139 -120
  193. package/scripts/keyword-detector.mjs +293 -272
  194. package/scripts/keyword-rules-expander.mjs +538 -521
  195. package/scripts/lib/claudemd-scanner.mjs +6 -1
  196. package/scripts/lib/context.mjs +3 -3
  197. package/scripts/lib/cross-review-utils.mjs +6 -3
  198. package/scripts/lib/env-probe.mjs +47 -28
  199. package/scripts/lib/gemini-profiles.mjs +44 -10
  200. package/scripts/lib/handoff.mjs +33 -17
  201. package/scripts/lib/hook-utils.mjs +8 -6
  202. package/scripts/lib/keyword-rules.mjs +43 -19
  203. package/scripts/lib/logger.mjs +24 -24
  204. package/scripts/lib/mcp-filter.mjs +377 -239
  205. package/scripts/lib/mcp-guard-engine.mjs +194 -79
  206. package/scripts/lib/mcp-manifest.mjs +23 -13
  207. package/scripts/lib/mcp-server-catalog.mjs +355 -118
  208. package/scripts/lib/psmux-info.mjs +11 -6
  209. package/scripts/lib/remote-spawn-transfer.mjs +44 -14
  210. package/scripts/lib/skill-template.mjs +30 -7
  211. package/scripts/mcp-check.mjs +58 -39
  212. package/scripts/mcp-gateway-config.mjs +83 -39
  213. package/scripts/mcp-gateway-ensure.mjs +43 -35
  214. package/scripts/mcp-gateway-integration-test.mjs +70 -58
  215. package/scripts/mcp-gateway-start.mjs +126 -60
  216. package/scripts/mcp-gateway-verify.mjs +24 -22
  217. package/scripts/mcp-safety-guard.mjs +44 -11
  218. package/scripts/notion-read.mjs +669 -554
  219. package/scripts/pack.mjs +94 -89
  220. package/scripts/preflight-cache.mjs +27 -10
  221. package/scripts/preinstall.mjs +42 -13
  222. package/scripts/remote-spawn.mjs +309 -94
  223. package/scripts/run.cjs +8 -5
  224. package/scripts/session-spawn-helper.mjs +130 -39
  225. package/scripts/session-stale-cleanup.mjs +123 -0
  226. package/scripts/setup.mjs +941 -492
  227. package/scripts/test-lock.mjs +20 -7
  228. package/scripts/test-tfx-route-no-claude-native.mjs +61 -57
  229. package/scripts/tfx-batch-stats.mjs +117 -96
  230. package/scripts/tfx-gate-activate.mjs +11 -4
  231. package/scripts/tfx-route-post.mjs +87 -20
  232. package/scripts/tfx-route-worker.mjs +57 -51
  233. package/scripts/tfx-route.sh +41 -124
  234. package/scripts/tmp-cleanup.mjs +21 -7
  235. package/scripts/token-snapshot.mjs +204 -85
  236. package/skills/.omc/state/idle-notif-cooldown.json +1 -1
  237. package/skills/.omc/state/last-tool-error.json +1 -1
  238. package/skills/.omc/state/subagent-tracking.json +1 -1
  239. package/skills/_templates/base.md +1 -6
  240. package/skills/merge-worktree/SKILL.md.tmpl +144 -0
  241. package/skills/shared/telemetry-segment.md +6 -0
  242. package/skills/star-prompt/SKILL.md.tmpl +222 -0
  243. package/skills/tfx-analysis/SKILL.md.tmpl +107 -0
  244. package/skills/tfx-analysis/skill.json +1 -6
  245. package/skills/tfx-auto/SKILL.md +1 -0
  246. package/skills/{tfx-workspace/skill-snapshot/tfx-auto-codex/SKILL.md → tfx-auto-codex/SKILL.md.tmpl} +33 -4
  247. package/skills/tfx-auto-codex/skill.json +1 -3
  248. package/skills/tfx-autopilot/SKILL.md.tmpl +116 -0
  249. package/skills/tfx-autopilot/skill.json +1 -5
  250. package/skills/tfx-autoresearch/SKILL.md.tmpl +136 -0
  251. package/skills/tfx-autoroute/SKILL.md.tmpl +189 -0
  252. package/skills/tfx-autoroute/skill.json +1 -7
  253. package/skills/tfx-codex/SKILL.md +1 -0
  254. package/skills/tfx-codex/skill.json +1 -3
  255. package/skills/tfx-codex-swarm/SKILL.md.tmpl +16 -0
  256. package/skills/tfx-codex-swarm/evals/evals.json +1 -1
  257. package/skills/tfx-codex-swarm/skill.json +1 -4
  258. package/skills/tfx-codex-swarm-workspace/iteration-1/benchmark.json +54 -12
  259. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/with_skill/grading.json +35 -7
  260. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/without_skill/grading.json +35 -7
  261. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/with_skill/grading.json +25 -5
  262. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/without_skill/grading.json +25 -5
  263. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/with_skill/grading.json +20 -4
  264. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/without_skill/grading.json +16 -4
  265. package/skills/tfx-consensus/SKILL.md.tmpl +146 -0
  266. package/skills/tfx-debate/SKILL.md.tmpl +192 -0
  267. package/skills/tfx-debate/skill.json +1 -7
  268. package/skills/tfx-deep-analysis/SKILL.md.tmpl +228 -0
  269. package/skills/tfx-deep-analysis/skill.json +1 -5
  270. package/skills/tfx-deep-interview/SKILL.md.tmpl +203 -0
  271. package/skills/tfx-deep-plan/SKILL.md.tmpl +282 -0
  272. package/skills/tfx-deep-qa/SKILL.md.tmpl +165 -0
  273. package/skills/tfx-deep-qa/skill.json +1 -6
  274. package/skills/tfx-deep-research/SKILL.md.tmpl +217 -0
  275. package/skills/tfx-deep-review/SKILL.md.tmpl +179 -0
  276. package/skills/tfx-doctor/SKILL.md +21 -0
  277. package/skills/tfx-doctor/SKILL.md.tmpl +172 -0
  278. package/skills/tfx-doctor/skill.json +1 -3
  279. package/skills/tfx-find/SKILL.md +1 -0
  280. package/skills/tfx-forge/SKILL.md.tmpl +187 -0
  281. package/skills/tfx-fullcycle/SKILL.md.tmpl +286 -0
  282. package/skills/tfx-fullcycle/skill.json +1 -6
  283. package/skills/{tfx-workspace/skill-snapshot/tfx-gemini/SKILL.md → tfx-gemini/SKILL.md.tmpl} +16 -7
  284. package/skills/tfx-gemini/skill.json +1 -3
  285. package/skills/tfx-hooks/SKILL.md.tmpl +216 -0
  286. package/skills/tfx-hooks/skill.json +1 -3
  287. package/skills/tfx-hub/SKILL.md.tmpl +212 -0
  288. package/skills/tfx-hub/skill.json +1 -3
  289. package/skills/tfx-index/SKILL.md +1 -0
  290. package/skills/tfx-index/skill.json +1 -6
  291. package/skills/tfx-interview/SKILL.md.tmpl +285 -0
  292. package/skills/tfx-multi/SKILL.md.tmpl +183 -0
  293. package/skills/tfx-multi/skill.json +1 -3
  294. package/skills/tfx-panel/SKILL.md.tmpl +189 -0
  295. package/skills/tfx-panel/skill.json +1 -7
  296. package/skills/tfx-persist/SKILL.md.tmpl +270 -0
  297. package/skills/tfx-persist/skill.json +1 -7
  298. package/skills/tfx-plan/SKILL.md +1 -0
  299. package/skills/tfx-plan/skill.json +1 -6
  300. package/skills/tfx-profile/SKILL.md.tmpl +239 -0
  301. package/skills/tfx-profile/skill.json +1 -3
  302. package/skills/tfx-prune/SKILL.md.tmpl +200 -0
  303. package/skills/tfx-prune/skill.json +1 -7
  304. package/skills/tfx-psmux-rules/SKILL.md.tmpl +326 -0
  305. package/skills/tfx-psmux-rules/skill.json +1 -4
  306. package/skills/tfx-qa/SKILL.md +1 -0
  307. package/skills/tfx-qa/skill.json +1 -6
  308. package/skills/tfx-ralph/SKILL.md.tmpl +28 -0
  309. package/skills/tfx-ralph/skill.json +1 -4
  310. package/skills/tfx-remote-setup/SKILL.md.tmpl +576 -0
  311. package/skills/tfx-remote-setup/skill.json +1 -3
  312. package/skills/tfx-remote-spawn/SKILL.md.tmpl +263 -0
  313. package/skills/tfx-remote-spawn/references/hosts.json +16 -16
  314. package/skills/tfx-remote-spawn/skill.json +1 -4
  315. package/skills/tfx-research/SKILL.md +1 -0
  316. package/skills/tfx-review/SKILL.md +1 -0
  317. package/skills/tfx-review/skill.json +1 -6
  318. package/skills/tfx-setup/SKILL.md.tmpl +504 -0
  319. package/skills/tfx-setup/skill.json +1 -3
  320. package/skills/tfx-swarm/SKILL.md +22 -0
  321. package/skills/tfx-swarm/SKILL.md.tmpl +218 -0
  322. package/tui/codex-profile.mjs +457 -0
  323. package/tui/core.mjs +266 -0
  324. package/tui/doctor.mjs +375 -0
  325. package/tui/gemini-profile.mjs +299 -0
  326. package/tui/monitor-data.mjs +152 -0
  327. package/tui/monitor.mjs +339 -0
  328. package/tui/setup.mjs +533 -0
  329. package/CLAUDE.md +0 -193
  330. package/references/hosts.json +0 -33
  331. package/skills/tfx-workspace/async-tests/run-tests.sh +0 -203
  332. package/skills/tfx-workspace/evals/evals.json +0 -79
  333. package/skills/tfx-workspace/iteration-1/benchmark.json +0 -162
  334. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/eval_metadata.json +0 -11
  335. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/old_skill/grading.json +0 -9
  336. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/old_skill/outputs/analysis.md +0 -154
  337. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/old_skill/timing.json +0 -5
  338. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/with_skill/grading.json +0 -9
  339. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/with_skill/outputs/analysis.md +0 -126
  340. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/with_skill/timing.json +0 -5
  341. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/eval_metadata.json +0 -11
  342. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/old_skill/grading.json +0 -9
  343. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/old_skill/outputs/analysis.md +0 -119
  344. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/old_skill/timing.json +0 -5
  345. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/with_skill/grading.json +0 -9
  346. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/with_skill/outputs/analysis.md +0 -115
  347. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/with_skill/timing.json +0 -5
  348. package/skills/tfx-workspace/iteration-1/hub-start-sequence/eval_metadata.json +0 -10
  349. package/skills/tfx-workspace/iteration-1/hub-start-sequence/old_skill/grading.json +0 -8
  350. package/skills/tfx-workspace/iteration-1/hub-start-sequence/old_skill/outputs/analysis.md +0 -86
  351. package/skills/tfx-workspace/iteration-1/hub-start-sequence/old_skill/timing.json +0 -5
  352. package/skills/tfx-workspace/iteration-1/hub-start-sequence/with_skill/grading.json +0 -8
  353. package/skills/tfx-workspace/iteration-1/hub-start-sequence/with_skill/outputs/analysis.md +0 -81
  354. package/skills/tfx-workspace/iteration-1/hub-start-sequence/with_skill/timing.json +0 -5
  355. package/skills/tfx-workspace/iteration-1/multi-team-creation/eval_metadata.json +0 -12
  356. package/skills/tfx-workspace/iteration-1/multi-team-creation/old_skill/grading.json +0 -10
  357. package/skills/tfx-workspace/iteration-1/multi-team-creation/old_skill/outputs/analysis.md +0 -316
  358. package/skills/tfx-workspace/iteration-1/multi-team-creation/old_skill/timing.json +0 -5
  359. package/skills/tfx-workspace/iteration-1/multi-team-creation/with_skill/grading.json +0 -10
  360. package/skills/tfx-workspace/iteration-1/multi-team-creation/with_skill/outputs/analysis.md +0 -352
  361. package/skills/tfx-workspace/iteration-1/multi-team-creation/with_skill/timing.json +0 -5
  362. package/skills/tfx-workspace/iteration-1/review.html +0 -1325
  363. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/eval_metadata.json +0 -12
  364. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/old_skill/grading.json +0 -10
  365. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/old_skill/outputs/analysis.md +0 -97
  366. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/old_skill/timing.json +0 -5
  367. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/with_skill/grading.json +0 -10
  368. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/with_skill/outputs/analysis.md +0 -94
  369. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/with_skill/timing.json +0 -5
  370. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/eval_metadata.json +0 -12
  371. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/old_skill/grading.json +0 -10
  372. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/old_skill/outputs/analysis.md +0 -209
  373. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/old_skill/timing.json +0 -5
  374. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/with_skill/grading.json +0 -10
  375. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/with_skill/outputs/analysis.md +0 -193
  376. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/with_skill/timing.json +0 -5
  377. package/skills/tfx-workspace/iteration-2/benchmark.json +0 -62
  378. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/eval_metadata.json +0 -13
  379. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/old_skill/grading.json +0 -11
  380. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/old_skill/outputs/analysis.md +0 -382
  381. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/old_skill/timing.json +0 -5
  382. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/with_skill/grading.json +0 -11
  383. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/with_skill/outputs/analysis.md +0 -333
  384. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/with_skill/timing.json +0 -5
  385. package/skills/tfx-workspace/iteration-2/review.html +0 -1325
  386. package/skills/tfx-workspace/skill-snapshot/tfx-auto/SKILL.md +0 -217
  387. package/skills/tfx-workspace/skill-snapshot/tfx-codex/SKILL.md +0 -65
  388. package/skills/tfx-workspace/skill-snapshot/tfx-doctor/SKILL.md +0 -94
  389. package/skills/tfx-workspace/skill-snapshot/tfx-hub/SKILL.md +0 -133
  390. package/skills/tfx-workspace/skill-snapshot/tfx-multi/SKILL.md +0 -426
  391. package/skills/tfx-workspace/skill-snapshot/tfx-setup/SKILL.md +0 -101
@@ -9,9 +9,8 @@
9
9
 
10
10
  import { execFileSync } from "node:child_process";
11
11
  import { EventEmitter } from "node:events";
12
-
12
+ import { detectHostOs, shellQuoteForHost } from "../lib/ssh-command.mjs";
13
13
  import { detectInputWait, PROBE_LEVELS } from "./health-probe.mjs";
14
- import { shellQuoteForHost, detectHostOs } from "../lib/ssh-command.mjs";
15
14
 
16
15
  export const REMOTE_WATCHER_STATES = Object.freeze({
17
16
  WATCHING: "watching",
@@ -62,7 +61,10 @@ function freezeStatus(status) {
62
61
  Object.fromEntries(
63
62
  Object.entries(status.sessions || {})
64
63
  .sort(([left], [right]) => left.localeCompare(right))
65
- .map(([sessionName, record]) => [sessionName, freezeSessionRecord(record)]),
64
+ .map(([sessionName, record]) => [
65
+ sessionName,
66
+ freezeSessionRecord(record),
67
+ ]),
66
68
  ),
67
69
  );
68
70
 
@@ -117,7 +119,9 @@ function hasMeaningfulActivity(captured) {
117
119
  }
118
120
 
119
121
  function detectCompletion(captured) {
120
- const matches = Array.from(String(captured || "").matchAll(COMPLETION_TOKEN_RE));
122
+ const matches = Array.from(
123
+ String(captured || "").matchAll(COMPLETION_TOKEN_RE),
124
+ );
121
125
  const match = matches.at(-1);
122
126
  if (!match) {
123
127
  return {
@@ -128,7 +132,8 @@ function detectCompletion(captured) {
128
132
  };
129
133
  }
130
134
 
131
- const parsedExitCode = match[2] == null ? null : Number.parseInt(match[2], 10);
135
+ const parsedExitCode =
136
+ match[2] == null ? null : Number.parseInt(match[2], 10);
132
137
  return {
133
138
  detected: true,
134
139
  exitCode: Number.isFinite(parsedExitCode) ? parsedExitCode : null,
@@ -143,7 +148,10 @@ function parseSessionNames(rawOutput, sessionPrefix) {
143
148
  .map((line) => line.trim())
144
149
  .filter(Boolean)
145
150
  .map((line) => line.split(":")[0]?.trim())
146
- .filter((sessionName) => Boolean(sessionName) && sessionName.startsWith(sessionPrefix));
151
+ .filter(
152
+ (sessionName) =>
153
+ Boolean(sessionName) && sessionName.startsWith(sessionPrefix),
154
+ );
147
155
  }
148
156
 
149
157
  function buildExecOptions(config) {
@@ -187,7 +195,9 @@ function captureSpawnSession(sessionName, config) {
187
195
  );
188
196
  return {
189
197
  paneTarget,
190
- captured: String(output || "").replace(/\r/g, "").trimEnd(),
198
+ captured: String(output || "")
199
+ .replace(/\r/g, "")
200
+ .trimEnd(),
191
201
  };
192
202
  }
193
203
 
@@ -221,7 +231,10 @@ function createSessionRecord(sessionName, config, now) {
221
231
  }
222
232
 
223
233
  function isTerminalState(state) {
224
- return state === REMOTE_WATCHER_STATES.COMPLETED || state === REMOTE_WATCHER_STATES.FAILED;
234
+ return (
235
+ state === REMOTE_WATCHER_STATES.COMPLETED ||
236
+ state === REMOTE_WATCHER_STATES.FAILED
237
+ );
225
238
  }
226
239
 
227
240
  export function createRemoteWatcher(opts = {}) {
@@ -252,26 +265,30 @@ export function createRemoteWatcher(opts = {}) {
252
265
  }
253
266
 
254
267
  function emitSessionEvent(eventName, nextRecord, now) {
255
- emitter.emit(eventName, Object.freeze({
256
- exitCode: nextRecord.exitCode,
257
- host: nextRecord.host,
258
- inputWaitPattern: nextRecord.inputWaitPattern,
259
- output: nextRecord.lastOutput,
260
- paneTarget: nextRecord.paneTarget,
261
- probeLevel: nextRecord.lastProbeLevel,
262
- promptIdlePattern: nextRecord.promptIdlePattern,
263
- reason: nextRecord.reason,
264
- sessionName: nextRecord.sessionName,
265
- state: nextRecord.state,
266
- ts: now,
267
- }));
268
+ emitter.emit(
269
+ eventName,
270
+ Object.freeze({
271
+ exitCode: nextRecord.exitCode,
272
+ host: nextRecord.host,
273
+ inputWaitPattern: nextRecord.inputWaitPattern,
274
+ output: nextRecord.lastOutput,
275
+ paneTarget: nextRecord.paneTarget,
276
+ probeLevel: nextRecord.lastProbeLevel,
277
+ promptIdlePattern: nextRecord.promptIdlePattern,
278
+ reason: nextRecord.reason,
279
+ sessionName: nextRecord.sessionName,
280
+ state: nextRecord.state,
281
+ ts: now,
282
+ }),
283
+ );
268
284
  }
269
285
 
270
286
  function classifySession(previousRecord, captured, now) {
271
287
  const completion = detectCompletion(captured);
272
288
  const inputWait = detectInputWait(captured);
273
289
  const promptIdle = detectPromptIdle(captured);
274
- const hasActivity = previousRecord.hasActivity || hasMeaningfulActivity(captured);
290
+ const hasActivity =
291
+ previousRecord.hasActivity || hasMeaningfulActivity(captured);
275
292
 
276
293
  let nextState = REMOTE_WATCHER_STATES.WATCHING;
277
294
  let reason = "watching";
@@ -292,9 +309,9 @@ export function createRemoteWatcher(opts = {}) {
292
309
  eventName = "sessionCompleted";
293
310
  }
294
311
  } else if (
295
- promptIdle.detected
296
- && hasActivity
297
- && (!inputWait.detected || inputWait.pattern === BARE_INPUT_WAIT_PATTERN)
312
+ promptIdle.detected &&
313
+ hasActivity &&
314
+ (!inputWait.detected || inputWait.pattern === BARE_INPUT_WAIT_PATTERN)
298
315
  ) {
299
316
  nextState = REMOTE_WATCHER_STATES.COMPLETED;
300
317
  reason = "prompt_idle";
@@ -325,10 +342,10 @@ export function createRemoteWatcher(opts = {}) {
325
342
  };
326
343
 
327
344
  if (
328
- eventName
329
- && previousRecord.state === nextRecord.state
330
- && previousRecord.reason === nextRecord.reason
331
- && previousRecord.exitCode === nextRecord.exitCode
345
+ eventName &&
346
+ previousRecord.state === nextRecord.state &&
347
+ previousRecord.reason === nextRecord.reason &&
348
+ previousRecord.exitCode === nextRecord.exitCode
332
349
  ) {
333
350
  return { eventName: null, nextRecord };
334
351
  }
@@ -375,7 +392,10 @@ export function createRemoteWatcher(opts = {}) {
375
392
  : createSessionRecord(sessionName, config, now);
376
393
 
377
394
  try {
378
- const { paneTarget, captured } = captureSpawnSession(sessionName, config);
395
+ const { paneTarget, captured } = captureSpawnSession(
396
+ sessionName,
397
+ config,
398
+ );
379
399
  const { eventName, nextRecord } = classifySession(
380
400
  { ...previousRecord, paneTarget },
381
401
  captured,
@@ -396,7 +416,10 @@ export function createRemoteWatcher(opts = {}) {
396
416
  state: REMOTE_WATCHER_STATES.FAILED,
397
417
  };
398
418
  nextSessions[sessionName] = failedRecord;
399
- queuedEvents.push({ eventName: "sessionFailed", record: failedRecord });
419
+ queuedEvents.push({
420
+ eventName: "sessionFailed",
421
+ record: failedRecord,
422
+ });
400
423
  setStatus({
401
424
  ...status,
402
425
  lastError: toErrorRecord(error),
@@ -407,9 +430,14 @@ export function createRemoteWatcher(opts = {}) {
407
430
  }
408
431
  }
409
432
 
410
- for (const [sessionName, previousRecord] of Object.entries(status.sessions)) {
433
+ for (const [sessionName, previousRecord] of Object.entries(
434
+ status.sessions,
435
+ )) {
411
436
  if (activeSet.has(sessionName)) continue;
412
- const { eventName, nextRecord } = markMissingSession(previousRecord, now);
437
+ const { eventName, nextRecord } = markMissingSession(
438
+ previousRecord,
439
+ now,
440
+ );
413
441
  nextSessions[sessionName] = nextRecord;
414
442
  if (eventName) {
415
443
  queuedEvents.push({ eventName, record: nextRecord });
@@ -15,31 +15,55 @@
15
15
  export function resolveRoutingStrategy({ subtasks, graph_type, thorough }) {
16
16
  const N = subtasks.length;
17
17
  if (N === 0) {
18
- const dagContext = { dag_width: 0, levels: {}, edges: [], max_complexity: 'S', taskResults: {} };
19
- return { strategy: 'quick_single', reason: 'empty_subtasks', dag_width: 0, max_complexity: 'S', dagContext };
18
+ const dagContext = {
19
+ dag_width: 0,
20
+ levels: {},
21
+ edges: [],
22
+ max_complexity: "S",
23
+ taskResults: {},
24
+ };
25
+ return {
26
+ strategy: "quick_single",
27
+ reason: "empty_subtasks",
28
+ dag_width: 0,
29
+ max_complexity: "S",
30
+ dagContext,
31
+ };
20
32
  }
21
33
 
22
- const { width: dag_width, levels, edges } = computeDagInfo(subtasks, graph_type);
34
+ const {
35
+ width: dag_width,
36
+ levels,
37
+ edges,
38
+ } = computeDagInfo(subtasks, graph_type);
23
39
  const max_complexity = getMaxComplexity(subtasks);
24
- const dagContext = { dag_width, levels, edges, max_complexity, taskResults: {} };
25
- const isHighComplexity = ['L', 'XL'].includes(max_complexity);
40
+ const dagContext = {
41
+ dag_width,
42
+ levels,
43
+ edges,
44
+ max_complexity,
45
+ taskResults: {},
46
+ };
47
+ const isHighComplexity = ["L", "XL"].includes(max_complexity);
26
48
  const allSameAgent = new Set(subtasks.map((s) => s.agent)).size === 1;
27
- const allSmall = subtasks.every((s) => normalizeComplexity(s.complexity) === 'S');
49
+ const allSmall = subtasks.every(
50
+ (s) => normalizeComplexity(s.complexity) === "S",
51
+ );
28
52
 
29
53
  // N==1: 단일 태스크
30
54
  if (N === 1) {
31
55
  if (thorough || isHighComplexity) {
32
56
  return {
33
- strategy: 'thorough_single',
34
- reason: 'single_high_complexity',
57
+ strategy: "thorough_single",
58
+ reason: "single_high_complexity",
35
59
  dag_width,
36
60
  max_complexity,
37
61
  dagContext,
38
62
  };
39
63
  }
40
64
  return {
41
- strategy: 'quick_single',
42
- reason: 'single_low_complexity',
65
+ strategy: "quick_single",
66
+ reason: "single_low_complexity",
43
67
  dag_width,
44
68
  max_complexity,
45
69
  dagContext,
@@ -50,16 +74,16 @@ export function resolveRoutingStrategy({ subtasks, graph_type, thorough }) {
50
74
  if (dag_width === 1) {
51
75
  if (thorough || isHighComplexity) {
52
76
  return {
53
- strategy: 'thorough_single',
54
- reason: 'sequential_chain',
77
+ strategy: "thorough_single",
78
+ reason: "sequential_chain",
55
79
  dag_width,
56
80
  max_complexity,
57
81
  dagContext,
58
82
  };
59
83
  }
60
84
  return {
61
- strategy: 'quick_single',
62
- reason: 'sequential_chain',
85
+ strategy: "quick_single",
86
+ reason: "sequential_chain",
63
87
  dag_width,
64
88
  max_complexity,
65
89
  dagContext,
@@ -69,8 +93,8 @@ export function resolveRoutingStrategy({ subtasks, graph_type, thorough }) {
69
93
  // 동일 에이전트 + 모두 S: 프롬프트 병합 -> batch single
70
94
  if (allSameAgent && allSmall) {
71
95
  return {
72
- strategy: 'batch_single',
73
- reason: 'same_agent_small_batch',
96
+ strategy: "batch_single",
97
+ reason: "same_agent_small_batch",
74
98
  dag_width,
75
99
  max_complexity,
76
100
  dagContext,
@@ -80,16 +104,16 @@ export function resolveRoutingStrategy({ subtasks, graph_type, thorough }) {
80
104
  // dag_width >= 2: 팀
81
105
  if (thorough || isHighComplexity) {
82
106
  return {
83
- strategy: 'thorough_team',
84
- reason: 'parallel_high_complexity',
107
+ strategy: "thorough_team",
108
+ reason: "parallel_high_complexity",
85
109
  dag_width,
86
110
  max_complexity,
87
111
  dagContext,
88
112
  };
89
113
  }
90
114
  return {
91
- strategy: 'quick_team',
92
- reason: 'parallel_low_complexity',
115
+ strategy: "quick_team",
116
+ reason: "parallel_low_complexity",
93
117
  dag_width,
94
118
  max_complexity,
95
119
  dagContext,
@@ -103,7 +127,7 @@ export function resolveRoutingStrategy({ subtasks, graph_type, thorough }) {
103
127
  * @returns {{ width: number, levels: Record<number, string[]>, edges: Array<{from:string, to:string}> }}
104
128
  */
105
129
  function computeDagInfo(subtasks, graph_type) {
106
- if (graph_type === 'SEQUENTIAL') {
130
+ if (graph_type === "SEQUENTIAL") {
107
131
  const levels = {};
108
132
  const edges = [];
109
133
  subtasks.forEach((t, i) => {
@@ -112,7 +136,7 @@ function computeDagInfo(subtasks, graph_type) {
112
136
  });
113
137
  return { width: 1, levels, edges };
114
138
  }
115
- if (graph_type === 'INDEPENDENT') {
139
+ if (graph_type === "INDEPENDENT") {
116
140
  const levels = { 0: subtasks.map((t) => t.id) };
117
141
  return { width: subtasks.length, levels, edges: [] };
118
142
  }
@@ -173,7 +197,9 @@ function computeDagInfo(subtasks, graph_type) {
173
197
  export function getUpstreamResults(taskId, pipelineState) {
174
198
  const ctx = pipelineState?.dagContext;
175
199
  if (!ctx) return {};
176
- const upstreamIds = ctx.edges.filter((e) => e.to === taskId).map((e) => e.from);
200
+ const upstreamIds = ctx.edges
201
+ .filter((e) => e.to === taskId)
202
+ .map((e) => e.from);
177
203
  const results = {};
178
204
  for (const id of upstreamIds) {
179
205
  if (id in (ctx.taskResults || {})) {
@@ -205,7 +231,7 @@ export function updateTaskResult(taskId, result, pipelineState) {
205
231
  */
206
232
  function getMaxComplexity(subtasks) {
207
233
  const order = { S: 0, M: 1, L: 2, XL: 3 };
208
- let max = 'S';
234
+ let max = "S";
209
235
  for (const s of subtasks) {
210
236
  const complexity = normalizeComplexity(s.complexity);
211
237
  if (order[complexity] > order[max]) max = complexity;
@@ -219,5 +245,5 @@ function getMaxComplexity(subtasks) {
219
245
  * @returns {"S" | "M" | "L" | "XL"}
220
246
  */
221
247
  function normalizeComplexity(complexity) {
222
- return ['S', 'M', 'L', 'XL'].includes(complexity) ? complexity : 'M';
248
+ return ["S", "M", "L", "XL"].includes(complexity) ? complexity : "M";
223
249
  }
@@ -60,7 +60,9 @@ export function createPsmuxRuntime(adapter = defaultPsmuxAdapter) {
60
60
  * @returns {TeamRuntime & { name: string }}
61
61
  */
62
62
  export function createRuntime(mode) {
63
- const normalizedMode = String(mode || "").trim().toLowerCase();
63
+ const normalizedMode = String(mode || "")
64
+ .trim()
65
+ .toLowerCase();
64
66
 
65
67
  if (normalizedMode === "psmux") {
66
68
  return createPsmuxRuntime();