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
@@ -1,52 +1,59 @@
1
1
  // hub/team/notify.mjs — team notifier (bell / Windows toast / webhook)
2
2
 
3
- import { execFile } from 'node:child_process';
4
- import os from 'node:os';
3
+ import { execFile } from "node:child_process";
4
+ import os from "node:os";
5
5
 
6
- export const NOTIFY_EVENT_TYPES = Object.freeze(['completed', 'failed', 'inputWait']);
7
- export const NOTIFY_CHANNELS = Object.freeze(['bell', 'toast', 'webhook']);
6
+ export const NOTIFY_EVENT_TYPES = Object.freeze([
7
+ "completed",
8
+ "failed",
9
+ "inputWait",
10
+ ]);
11
+ export const NOTIFY_CHANNELS = Object.freeze(["bell", "toast", "webhook"]);
8
12
 
9
13
  function freezeRecord(record) {
10
14
  return Object.freeze({ ...record });
11
15
  }
12
16
 
13
17
  function escapePowerShellSingleQuoted(value) {
14
- return String(value ?? '').replaceAll("'", "''");
18
+ return String(value ?? "").replaceAll("'", "''");
15
19
  }
16
20
 
17
21
  function normalizeTimestamp(value) {
18
22
  if (value instanceof Date) return value.toISOString();
19
- if (value == null || value === '') return new Date().toISOString();
23
+ if (value == null || value === "") return new Date().toISOString();
20
24
  return String(value);
21
25
  }
22
26
 
23
27
  function normalizeEvent(event, defaults = {}) {
24
- if (!event || typeof event !== 'object') {
25
- throw new TypeError('notify(event) requires an event object');
28
+ if (!event || typeof event !== "object") {
29
+ throw new TypeError("notify(event) requires an event object");
26
30
  }
27
31
 
28
- const type = String(event.type || '').trim();
32
+ const type = String(event.type || "").trim();
29
33
  if (!NOTIFY_EVENT_TYPES.includes(type)) {
30
- throw new TypeError(`Unsupported notify event type: ${type || '<empty>'}`);
34
+ throw new TypeError(`Unsupported notify event type: ${type || "<empty>"}`);
31
35
  }
32
36
 
33
37
  return freezeRecord({
34
38
  type,
35
- sessionId: event.sessionId == null ? '' : String(event.sessionId),
36
- host: event.host == null || event.host === '' ? String(defaults.host || os.hostname()) : String(event.host),
37
- summary: event.summary == null ? '' : String(event.summary),
39
+ sessionId: event.sessionId == null ? "" : String(event.sessionId),
40
+ host:
41
+ event.host == null || event.host === ""
42
+ ? String(defaults.host || os.hostname())
43
+ : String(event.host),
44
+ summary: event.summary == null ? "" : String(event.summary),
38
45
  timestamp: normalizeTimestamp(event.timestamp),
39
46
  });
40
47
  }
41
48
 
42
49
  function defaultChannelConfig(name, env) {
43
50
  switch (name) {
44
- case 'bell':
51
+ case "bell":
45
52
  return { enabled: true };
46
- case 'toast':
53
+ case "toast":
47
54
  return { enabled: true };
48
- case 'webhook': {
49
- const url = String(env?.TRIFLUX_NOTIFY_WEBHOOK || '');
55
+ case "webhook": {
56
+ const url = String(env?.TRIFLUX_NOTIFY_WEBHOOK || "");
50
57
  return { enabled: Boolean(url), url };
51
58
  }
52
59
  default:
@@ -56,33 +63,40 @@ function defaultChannelConfig(name, env) {
56
63
 
57
64
  function normalizeChannelConfig(name, value, env) {
58
65
  const base = defaultChannelConfig(name, env);
59
- const patch = typeof value === 'boolean'
60
- ? { enabled: value }
61
- : (value && typeof value === 'object' ? value : {});
66
+ const patch =
67
+ typeof value === "boolean"
68
+ ? { enabled: value }
69
+ : value && typeof value === "object"
70
+ ? value
71
+ : {};
62
72
 
63
73
  const next = {
64
74
  ...base,
65
75
  ...patch,
66
76
  };
67
77
 
68
- if ('enabled' in next) {
78
+ if ("enabled" in next) {
69
79
  next.enabled = Boolean(next.enabled);
70
80
  }
71
81
 
72
- if (name === 'webhook') {
73
- next.url = String(next.url || env?.TRIFLUX_NOTIFY_WEBHOOK || '');
82
+ if (name === "webhook") {
83
+ next.url = String(next.url || env?.TRIFLUX_NOTIFY_WEBHOOK || "");
74
84
  }
75
85
 
76
- if (name === 'toast') {
86
+ if (name === "toast") {
77
87
  if (next.command != null) next.command = String(next.command);
78
- if (next.timeoutMs != null) next.timeoutMs = Math.max(1, Number.parseInt(String(next.timeoutMs), 10) || 5000);
88
+ if (next.timeoutMs != null)
89
+ next.timeoutMs = Math.max(
90
+ 1,
91
+ Number.parseInt(String(next.timeoutMs), 10) || 5000,
92
+ );
79
93
  }
80
94
 
81
95
  return freezeRecord(next);
82
96
  }
83
97
 
84
98
  function normalizeChannels(channels, env) {
85
- const source = channels && typeof channels === 'object' ? channels : {};
99
+ const source = channels && typeof channels === "object" ? channels : {};
86
100
  const normalized = {};
87
101
  for (const name of NOTIFY_CHANNELS) {
88
102
  normalized[name] = normalizeChannelConfig(name, source[name], env);
@@ -97,20 +111,27 @@ function updateChannelConfig(channels, channel, config, env) {
97
111
 
98
112
  return Object.freeze({
99
113
  ...channels,
100
- [channel]: normalizeChannelConfig(channel, { ...channels[channel], ...(typeof config === 'boolean' ? { enabled: config } : (config || {})) }, env),
114
+ [channel]: normalizeChannelConfig(
115
+ channel,
116
+ {
117
+ ...channels[channel],
118
+ ...(typeof config === "boolean" ? { enabled: config } : config || {}),
119
+ },
120
+ env,
121
+ ),
101
122
  });
102
123
  }
103
124
 
104
125
  function formatEventTitle(event) {
105
126
  switch (event.type) {
106
- case 'completed':
107
- return 'Triflux completed';
108
- case 'failed':
109
- return 'Triflux failed';
110
- case 'inputWait':
111
- return 'Triflux waiting for input';
127
+ case "completed":
128
+ return "Triflux completed";
129
+ case "failed":
130
+ return "Triflux failed";
131
+ case "inputWait":
132
+ return "Triflux waiting for input";
112
133
  default:
113
- return 'Triflux notification';
134
+ return "Triflux notification";
114
135
  }
115
136
  }
116
137
 
@@ -118,12 +139,15 @@ function formatEventBody(event) {
118
139
  const parts = [];
119
140
  if (event.summary) parts.push(event.summary);
120
141
 
121
- const meta = [event.sessionId ? `session ${event.sessionId}` : '', event.host ? `host ${event.host}` : '']
142
+ const meta = [
143
+ event.sessionId ? `session ${event.sessionId}` : "",
144
+ event.host ? `host ${event.host}` : "",
145
+ ]
122
146
  .filter(Boolean)
123
- .join(' · ');
147
+ .join(" · ");
124
148
  if (meta) parts.push(meta);
125
149
 
126
- return parts.join('\n') || event.timestamp;
150
+ return parts.join("\n") || event.timestamp;
127
151
  }
128
152
 
129
153
  function createResult(channel, status, extra = {}) {
@@ -145,17 +169,18 @@ function execFileAsync(command, args, options, execFileFn) {
145
169
  }
146
170
 
147
171
  async function sendBell(config, deps) {
148
- if (!config.enabled) return createResult('bell', 'skipped', { reason: 'disabled' });
172
+ if (!config.enabled)
173
+ return createResult("bell", "skipped", { reason: "disabled" });
149
174
  const stream = deps.stdout;
150
- if (!stream || typeof stream.write !== 'function') {
151
- return createResult('bell', 'skipped', { reason: 'stdout-unavailable' });
175
+ if (!stream || typeof stream.write !== "function") {
176
+ return createResult("bell", "skipped", { reason: "stdout-unavailable" });
152
177
  }
153
178
 
154
179
  try {
155
- stream.write('\u0007');
156
- return createResult('bell', 'sent');
180
+ stream.write("\u0007");
181
+ return createResult("bell", "sent");
157
182
  } catch (error) {
158
- return createResult('bell', 'failed', { error: error.message });
183
+ return createResult("bell", "failed", { error: error.message });
159
184
  }
160
185
  }
161
186
 
@@ -167,32 +192,34 @@ function buildToastScript(title, body) {
167
192
  `$Title = '${safeTitle}'`,
168
193
  `$Body = '${safeBody}'`,
169
194
  "if (Get-Command New-BurntToastNotification -ErrorAction SilentlyContinue) {",
170
- ' New-BurntToastNotification -Text @($Title, $Body) | Out-Null',
171
- ' return',
172
- '}',
173
- '[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null',
174
- '[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] > $null',
175
- '$escapedTitle = [System.Security.SecurityElement]::Escape($Title)',
176
- '$escapedBody = [System.Security.SecurityElement]::Escape($Body)',
177
- '$xml = New-Object Windows.Data.Xml.Dom.XmlDocument',
178
- '$xml.LoadXml("<toast><visual><binding template=\'ToastGeneric\'><text>$escapedTitle</text><text>$escapedBody</text></binding></visual></toast>")',
179
- '$toast = [Windows.UI.Notifications.ToastNotification]::new($xml)',
195
+ " New-BurntToastNotification -Text @($Title, $Body) | Out-Null",
196
+ " return",
197
+ "}",
198
+ "[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] > $null",
199
+ "[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] > $null",
200
+ "$escapedTitle = [System.Security.SecurityElement]::Escape($Title)",
201
+ "$escapedBody = [System.Security.SecurityElement]::Escape($Body)",
202
+ "$xml = New-Object Windows.Data.Xml.Dom.XmlDocument",
203
+ "$xml.LoadXml(\"<toast><visual><binding template='ToastGeneric'><text>$escapedTitle</text><text>$escapedBody</text></binding></visual></toast>\")",
204
+ "$toast = [Windows.UI.Notifications.ToastNotification]::new($xml)",
180
205
  "[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('Triflux').Show($toast)",
181
- ].join('; ');
206
+ ].join("; ");
182
207
  }
183
208
 
184
209
  async function sendToast(event, config, deps) {
185
- if (!config.enabled) return createResult('toast', 'skipped', { reason: 'disabled' });
186
- if ((deps.platform || process.platform) !== 'win32') {
187
- return createResult('toast', 'skipped', { reason: 'unsupported-platform' });
210
+ if (!config.enabled)
211
+ return createResult("toast", "skipped", { reason: "disabled" });
212
+ if ((deps.platform || process.platform) !== "win32") {
213
+ return createResult("toast", "skipped", { reason: "unsupported-platform" });
188
214
  }
189
215
 
190
216
  const execFileFn = deps.execFile || execFile;
191
217
  const candidates = config.command
192
218
  ? [config.command]
193
- : Array.isArray(deps.powerShellCandidates) && deps.powerShellCandidates.length > 0
219
+ : Array.isArray(deps.powerShellCandidates) &&
220
+ deps.powerShellCandidates.length > 0
194
221
  ? deps.powerShellCandidates
195
- : ['pwsh', 'powershell.exe'];
222
+ : ["pwsh", "powershell.exe"];
196
223
 
197
224
  const title = formatEventTitle(event);
198
225
  const body = formatEventBody(event);
@@ -201,40 +228,51 @@ async function sendToast(event, config, deps) {
201
228
 
202
229
  for (const command of candidates) {
203
230
  try {
204
- await execFileAsync(command, ['-NoLogo', '-NoProfile', '-Command', script], {
205
- windowsHide: true,
206
- timeout: config.timeoutMs || 5000,
207
- }, execFileFn);
208
- return createResult('toast', 'sent', { command });
231
+ await execFileAsync(
232
+ command,
233
+ ["-NoLogo", "-NoProfile", "-Command", script],
234
+ {
235
+ windowsHide: true,
236
+ timeout: config.timeoutMs || 5000,
237
+ },
238
+ execFileFn,
239
+ );
240
+ return createResult("toast", "sent", { command });
209
241
  } catch (error) {
210
242
  failures.push(`${command}: ${error.message}`);
211
243
  }
212
244
  }
213
245
 
214
- return createResult('toast', 'failed', { error: failures.join(' | ') || 'toast-send-failed' });
246
+ return createResult("toast", "failed", {
247
+ error: failures.join(" | ") || "toast-send-failed",
248
+ });
215
249
  }
216
250
 
217
251
  async function sendWebhook(event, config, deps) {
218
- if (!config.enabled) return createResult('webhook', 'skipped', { reason: 'disabled' });
219
- if (!config.url) return createResult('webhook', 'skipped', { reason: 'missing-url' });
220
- if (typeof deps.fetch !== 'function') {
221
- return createResult('webhook', 'failed', { error: 'fetch-unavailable' });
252
+ if (!config.enabled)
253
+ return createResult("webhook", "skipped", { reason: "disabled" });
254
+ if (!config.url)
255
+ return createResult("webhook", "skipped", { reason: "missing-url" });
256
+ if (typeof deps.fetch !== "function") {
257
+ return createResult("webhook", "failed", { error: "fetch-unavailable" });
222
258
  }
223
259
 
224
260
  try {
225
261
  const response = await deps.fetch(config.url, {
226
- method: 'POST',
227
- headers: { 'content-type': 'application/json' },
262
+ method: "POST",
263
+ headers: { "content-type": "application/json" },
228
264
  body: JSON.stringify(event),
229
265
  });
230
266
 
231
267
  if (!response?.ok) {
232
- return createResult('webhook', 'failed', { error: `HTTP ${response?.status ?? 'unknown'}` });
268
+ return createResult("webhook", "failed", {
269
+ error: `HTTP ${response?.status ?? "unknown"}`,
270
+ });
233
271
  }
234
272
 
235
- return createResult('webhook', 'sent', { statusCode: response.status });
273
+ return createResult("webhook", "sent", { statusCode: response.status });
236
274
  } catch (error) {
237
- return createResult('webhook', 'failed', { error: error.message });
275
+ return createResult("webhook", "failed", { error: error.message });
238
276
  }
239
277
  }
240
278
 
@@ -254,7 +292,10 @@ function createNotifierInstance(channels, deps) {
254
292
  }
255
293
 
256
294
  function setChannel(channel, config) {
257
- return createNotifierInstance(updateChannelConfig(channels, channel, config, deps.env), deps);
295
+ return createNotifierInstance(
296
+ updateChannelConfig(channels, channel, config, deps.env),
297
+ deps,
298
+ );
258
299
  }
259
300
 
260
301
  return Object.freeze({ notify, setChannel });
@@ -286,8 +327,10 @@ export function createNotifier(opts = {}) {
286
327
  fetch: opts.deps?.fetch || globalThis.fetch?.bind(globalThis),
287
328
  platform: opts.platform || process.platform,
288
329
  hostname: opts.hostname || os.hostname(),
289
- powerShellCandidates: Object.freeze(opts.deps?.powerShellCandidates || ['pwsh', 'powershell.exe']),
330
+ powerShellCandidates: Object.freeze(
331
+ opts.deps?.powerShellCandidates || ["pwsh", "powershell.exe"],
332
+ ),
290
333
  });
291
334
 
292
335
  return createNotifierInstance(normalizeChannels(opts.channels, env), deps);
293
- }
336
+ }