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,4 +1,10 @@
1
- import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
1
+ import {
2
+ copyFileSync,
3
+ existsSync,
4
+ mkdirSync,
5
+ readFileSync,
6
+ writeFileSync,
7
+ } from "node:fs";
2
8
  import { homedir } from "node:os";
3
9
  import { basename, dirname, isAbsolute, join, resolve } from "node:path";
4
10
  import { fileURLToPath } from "node:url";
@@ -43,13 +49,16 @@ function cloneDefaultRegistry() {
43
49
 
44
50
  function expandHome(filePath) {
45
51
  if (typeof filePath !== "string") return "";
46
- if (!filePath.startsWith("~/") && !filePath.startsWith("~\\")) return filePath;
52
+ if (!filePath.startsWith("~/") && !filePath.startsWith("~\\"))
53
+ return filePath;
47
54
  return join(homedir(), filePath.slice(2));
48
55
  }
49
56
 
50
57
  function resolveFilePath(filePath) {
51
58
  const expanded = expandHome(filePath);
52
- return isAbsolute(expanded) ? resolve(expanded) : resolve(process.cwd(), expanded);
59
+ return isAbsolute(expanded)
60
+ ? resolve(expanded)
61
+ : resolve(process.cwd(), expanded);
53
62
  }
54
63
 
55
64
  function normalizeForMatch(filePath) {
@@ -77,7 +86,11 @@ function ensureBackup(filePath) {
77
86
 
78
87
  function isJsonMcpConfig(filePath) {
79
88
  const name = pathBasename(filePath);
80
- return name === "settings.json" || name === "settings.local.json" || name === ".mcp.json";
89
+ return (
90
+ name === "settings.json" ||
91
+ name === "settings.local.json" ||
92
+ name === ".mcp.json"
93
+ );
81
94
  }
82
95
 
83
96
  function isCodexConfig(filePath) {
@@ -90,9 +103,9 @@ function detectClient(filePath) {
90
103
  if (normalized.endsWith("/.gemini/settings.json")) return "gemini";
91
104
  if (normalized.endsWith("/.codex/config.toml")) return "codex";
92
105
  if (
93
- normalized.endsWith("/.claude/settings.json")
94
- || normalized.endsWith("/.claude/settings.local.json")
95
- || normalized.endsWith("/.mcp.json")
106
+ normalized.endsWith("/.claude/settings.json") ||
107
+ normalized.endsWith("/.claude/settings.local.json") ||
108
+ normalized.endsWith("/.mcp.json")
96
109
  ) {
97
110
  return "claude";
98
111
  }
@@ -104,16 +117,19 @@ function detectLabel(filePath) {
104
117
  if (normalized.endsWith("/.gemini/settings.json")) return "Gemini";
105
118
  if (normalized.endsWith("/.codex/config.toml")) return "Codex";
106
119
  if (normalized.endsWith("/.claude/settings.json")) return "Claude User";
107
- if (normalized.endsWith("/.claude/settings.local.json")) return "Claude Local";
120
+ if (normalized.endsWith("/.claude/settings.local.json"))
121
+ return "Claude Local";
108
122
  if (normalized.endsWith("/.mcp.json")) return "Project MCP";
109
123
  return basename(filePath);
110
124
  }
111
125
 
112
126
  function isPrimaryConfigTarget(filePath) {
113
127
  const normalized = normalizeForMatch(filePath);
114
- return normalized.endsWith("/.gemini/settings.json")
115
- || normalized.endsWith("/.codex/config.toml")
116
- || normalized.endsWith("/.mcp.json");
128
+ return (
129
+ normalized.endsWith("/.gemini/settings.json") ||
130
+ normalized.endsWith("/.codex/config.toml") ||
131
+ normalized.endsWith("/.mcp.json")
132
+ );
117
133
  }
118
134
 
119
135
  function normalizeUrl(value) {
@@ -192,15 +208,15 @@ function removeTomlSection(raw, sectionName) {
192
208
  if (!skipping) output.push(line);
193
209
  }
194
210
 
195
- const cleaned = output.join("\n").replace(/\n{3,}$/g, "\n\n").replace(/^\n+/, "");
211
+ const cleaned = output
212
+ .join("\n")
213
+ .replace(/\n{3,}$/g, "\n\n")
214
+ .replace(/^\n+/, "");
196
215
  return cleaned.length > 0 ? cleaned.replace(/\n{3,}/g, "\n\n") : "";
197
216
  }
198
217
 
199
218
  function upsertTomlUrlServer(raw, name, url) {
200
- const section = [
201
- `[mcp_servers.${name}]`,
202
- `url = ${formatTomlString(url)}`,
203
- ];
219
+ const section = [`[mcp_servers.${name}]`, `url = ${formatTomlString(url)}`];
204
220
  const withoutExisting = removeTomlSection(raw, name).trimEnd();
205
221
  return withoutExisting.length > 0
206
222
  ? `${withoutExisting}\n\n${section.join("\n")}\n`
@@ -210,12 +226,19 @@ function upsertTomlUrlServer(raw, name, url) {
210
226
  function getHubServerEntry(registry) {
211
227
  const entries = Object.entries(registry?.servers || {});
212
228
  if (entries.length === 0) {
213
- return ["tfx-hub", { url: `${registry?.defaults?.hub_base || "http://127.0.0.1:27888"}${DEFAULT_HUB_PATH}` }];
229
+ return [
230
+ "tfx-hub",
231
+ {
232
+ url: `${registry?.defaults?.hub_base || "http://127.0.0.1:27888"}${DEFAULT_HUB_PATH}`,
233
+ },
234
+ ];
214
235
  }
215
236
 
216
- return entries.find(([name]) => name === "tfx-hub")
217
- || entries.find(([, config]) => config?.transport === "hub-url")
218
- || entries[0];
237
+ return (
238
+ entries.find(([name]) => name === "tfx-hub") ||
239
+ entries.find(([, config]) => config?.transport === "hub-url") ||
240
+ entries[0]
241
+ );
219
242
  }
220
243
 
221
244
  function _makeHubRuntimeConfig() {
@@ -224,7 +247,13 @@ function _makeHubRuntimeConfig() {
224
247
 
225
248
  function serverTargets(serverConfig) {
226
249
  if (Array.isArray(serverConfig?.targets) && serverConfig.targets.length > 0) {
227
- return [...new Set(serverConfig.targets.map((value) => String(value).trim()).filter(Boolean))];
250
+ return [
251
+ ...new Set(
252
+ serverConfig.targets
253
+ .map((value) => String(value).trim())
254
+ .filter(Boolean),
255
+ ),
256
+ ];
228
257
  }
229
258
  return ["claude", "gemini", "codex"];
230
259
  }
@@ -234,9 +263,10 @@ function serverAppliesToClient(serverConfig, client) {
234
263
  }
235
264
 
236
265
  function buildDesiredServerRecord(name, serverConfig, filePath) {
237
- const url = serverConfig?.transport === "hub-url"
238
- ? resolveHubUrl()
239
- : normalizeUrl(serverConfig?.url || "");
266
+ const url =
267
+ serverConfig?.transport === "hub-url"
268
+ ? resolveHubUrl()
269
+ : normalizeUrl(serverConfig?.url || "");
240
270
  const basenameValue = pathBasename(filePath);
241
271
 
242
272
  if (basenameValue === ".mcp.json") {
@@ -266,22 +296,30 @@ function scanJsonConfig(filePath) {
266
296
  try {
267
297
  const parsed = readJsonFile(filePath);
268
298
  const mcpServers = parsed?.mcpServers;
269
- const servers = !mcpServers || typeof mcpServers !== "object"
270
- ? []
271
- : Object.entries(mcpServers)
272
- .filter(([name, config]) => typeof name === "string" && config && typeof config === "object")
273
- .map(([name, config]) => ({
274
- name: name.trim(),
275
- url: typeof config.url === "string" ? normalizeUrl(config.url) : "",
276
- command: typeof config.command === "string" ? config.command : "",
277
- type: typeof config.type === "string" ? config.type : "",
278
- transport: typeof config.url === "string" && config.url
279
- ? "url"
280
- : typeof config.command === "string" && config.command
281
- ? "stdio"
282
- : "unknown",
283
- raw: config,
284
- }));
299
+ const servers =
300
+ !mcpServers || typeof mcpServers !== "object"
301
+ ? []
302
+ : Object.entries(mcpServers)
303
+ .filter(
304
+ ([name, config]) =>
305
+ typeof name === "string" &&
306
+ config &&
307
+ typeof config === "object",
308
+ )
309
+ .map(([name, config]) => ({
310
+ name: name.trim(),
311
+ url:
312
+ typeof config.url === "string" ? normalizeUrl(config.url) : "",
313
+ command: typeof config.command === "string" ? config.command : "",
314
+ type: typeof config.type === "string" ? config.type : "",
315
+ transport:
316
+ typeof config.url === "string" && config.url
317
+ ? "url"
318
+ : typeof config.command === "string" && config.command
319
+ ? "stdio"
320
+ : "unknown",
321
+ raw: config,
322
+ }));
285
323
 
286
324
  return {
287
325
  filePath,
@@ -325,11 +363,12 @@ function scanCodexConfig(filePath) {
325
363
  name,
326
364
  url: typeof config.url === "string" ? normalizeUrl(config.url) : "",
327
365
  command: typeof config.command === "string" ? config.command : "",
328
- transport: typeof config.url === "string" && config.url
329
- ? "url"
330
- : typeof config.command === "string" && config.command
331
- ? "stdio"
332
- : "unknown",
366
+ transport:
367
+ typeof config.url === "string" && config.url
368
+ ? "url"
369
+ : typeof config.command === "string" && config.command
370
+ ? "stdio"
371
+ : "unknown",
333
372
  raw: config,
334
373
  }));
335
374
 
@@ -368,7 +407,11 @@ function updateJsonConfig(filePath, updates = [], removals = []) {
368
407
  parsed = {};
369
408
  }
370
409
 
371
- if (!parsed.mcpServers || typeof parsed.mcpServers !== "object" || Array.isArray(parsed.mcpServers)) {
410
+ if (
411
+ !parsed.mcpServers ||
412
+ typeof parsed.mcpServers !== "object" ||
413
+ Array.isArray(parsed.mcpServers)
414
+ ) {
372
415
  parsed.mcpServers = {};
373
416
  }
374
417
 
@@ -383,8 +426,12 @@ function updateJsonConfig(filePath, updates = [], removals = []) {
383
426
 
384
427
  for (const update of updates) {
385
428
  const current = parsed.mcpServers[update.name];
386
- const nextConfig = { ...(current && typeof current === "object" ? current : {}), ...update.config };
387
- const changed = JSON.stringify(current || null) !== JSON.stringify(nextConfig);
429
+ const nextConfig = {
430
+ ...(current && typeof current === "object" ? current : {}),
431
+ ...update.config,
432
+ };
433
+ const changed =
434
+ JSON.stringify(current || null) !== JSON.stringify(nextConfig);
388
435
  if (changed) {
389
436
  parsed.mcpServers[update.name] = nextConfig;
390
437
  modified = true;
@@ -412,7 +459,9 @@ function updateCodexConfig(filePath, updates = [], removals = []) {
412
459
  }
413
460
 
414
461
  const finalRaw = raw.trim().length > 0 ? `${raw.trimEnd()}\n` : "";
415
- const previousRaw = existsSync(resolvedPath) ? readFileSync(resolvedPath, "utf8") : "";
462
+ const previousRaw = existsSync(resolvedPath)
463
+ ? readFileSync(resolvedPath, "utf8")
464
+ : "";
416
465
  if (finalRaw === previousRaw) {
417
466
  return { modified: false, filePath: resolvedPath };
418
467
  }
@@ -460,7 +509,11 @@ export function validateRegistry(registry) {
460
509
  errors.push("registry.defaults must be an object");
461
510
  }
462
511
 
463
- if (!registry.servers || typeof registry.servers !== "object" || Array.isArray(registry.servers)) {
512
+ if (
513
+ !registry.servers ||
514
+ typeof registry.servers !== "object" ||
515
+ Array.isArray(registry.servers)
516
+ ) {
464
517
  errors.push("registry.servers must be an object");
465
518
  } else {
466
519
  for (const [name, server] of Object.entries(registry.servers)) {
@@ -481,14 +534,23 @@ export function validateRegistry(registry) {
481
534
  }
482
535
  }
483
536
 
484
- if (!registry.policies || typeof registry.policies !== "object" || Array.isArray(registry.policies)) {
537
+ if (
538
+ !registry.policies ||
539
+ typeof registry.policies !== "object" ||
540
+ Array.isArray(registry.policies)
541
+ ) {
485
542
  errors.push("registry.policies must be an object");
486
543
  } else {
487
544
  if (!Array.isArray(registry.policies.watched_paths)) {
488
545
  errors.push("registry.policies.watched_paths must be an array");
489
546
  }
490
- if (registry.policies.stdio_action && !["replace-with-hub", "warn"].includes(registry.policies.stdio_action)) {
491
- errors.push("registry.policies.stdio_action must be replace-with-hub or warn");
547
+ if (
548
+ registry.policies.stdio_action &&
549
+ !["replace-with-hub", "warn"].includes(registry.policies.stdio_action)
550
+ ) {
551
+ errors.push(
552
+ "registry.policies.stdio_action must be replace-with-hub or warn",
553
+ );
492
554
  }
493
555
  }
494
556
 
@@ -578,7 +640,9 @@ export function listManagedConfigTargets(registry = loadRegistryOrDefault()) {
578
640
  }
579
641
 
580
642
  export function listPrimaryConfigTargets(registry = loadRegistryOrDefault()) {
581
- return listManagedConfigTargets(registry).filter((target) => isPrimaryConfigTarget(target.filePath));
643
+ return listManagedConfigTargets(registry).filter((target) =>
644
+ isPrimaryConfigTarget(target.filePath),
645
+ );
582
646
  }
583
647
 
584
648
  export function scanManagedConfigs(registry = loadRegistryOrDefault()) {
@@ -590,17 +654,28 @@ export function scanManagedConfigs(registry = loadRegistryOrDefault()) {
590
654
 
591
655
  export function inspectRegistryStatus(registry = loadRegistryOrDefault()) {
592
656
  const configs = scanManagedConfigs(registry);
593
- const primaryTargets = new Set(listPrimaryConfigTargets(registry).map((target) => normalizeForMatch(target.filePath)));
657
+ const primaryTargets = new Set(
658
+ listPrimaryConfigTargets(registry).map((target) =>
659
+ normalizeForMatch(target.filePath),
660
+ ),
661
+ );
594
662
  const rows = [];
595
663
 
596
664
  for (const config of configs) {
597
665
  const isPrimary = primaryTargets.has(normalizeForMatch(config.filePath));
598
- const managedServers = Object.entries(registry.servers || {})
599
- .filter(([, serverConfig]) => isPrimary && serverAppliesToClient(serverConfig, config.client));
666
+ const managedServers = Object.entries(registry.servers || {}).filter(
667
+ ([, serverConfig]) =>
668
+ isPrimary && serverAppliesToClient(serverConfig, config.client),
669
+ );
600
670
 
601
671
  for (const [name, serverConfig] of managedServers) {
602
- const expectedUrl = buildDesiredServerRecord(name, serverConfig, config.filePath).config.url;
603
- const actual = config.servers.find((server) => server.name === name) || null;
672
+ const expectedUrl = buildDesiredServerRecord(
673
+ name,
674
+ serverConfig,
675
+ config.filePath,
676
+ ).config.url;
677
+ const actual =
678
+ config.servers.find((server) => server.name === name) || null;
604
679
  let status = "missing";
605
680
 
606
681
  if (!config.exists) {
@@ -658,7 +733,9 @@ export function scanForStdioServers(filePath) {
658
733
 
659
734
  export function remediate(filePath, stdioServers, policy = {}) {
660
735
  const resolvedPath = resolveFilePath(filePath);
661
- const offenders = Array.isArray(stdioServers) ? stdioServers.filter((server) => server?.name) : [];
736
+ const offenders = Array.isArray(stdioServers)
737
+ ? stdioServers.filter((server) => server?.name)
738
+ : [];
662
739
  const action = policy?.stdio_action || "warn";
663
740
 
664
741
  if (offenders.length === 0) {
@@ -724,7 +801,11 @@ export function remediate(filePath, stdioServers, policy = {}) {
724
801
  if (action === "replace-with-hub") {
725
802
  const registry = loadRegistryOrDefault();
726
803
  const [hubServerName, hubServerConfig] = getHubServerEntry(registry);
727
- const desired = buildDesiredServerRecord(hubServerName, hubServerConfig, resolvedPath);
804
+ const desired = buildDesiredServerRecord(
805
+ hubServerName,
806
+ hubServerConfig,
807
+ resolvedPath,
808
+ );
728
809
  replacement = { name: desired.name, ...desired.config };
729
810
  updates.push(desired);
730
811
  }
@@ -742,9 +823,13 @@ export function remediate(filePath, stdioServers, policy = {}) {
742
823
 
743
824
  export function resolveHubUrl() {
744
825
  const registryState = inspectRegistry();
745
- const registry = registryState.valid ? registryState.registry : cloneDefaultRegistry();
826
+ const registry = registryState.valid
827
+ ? registryState.registry
828
+ : cloneDefaultRegistry();
746
829
  const [, hubServer] = getHubServerEntry(registry);
747
- const fallbackRaw = hubServer?.url || `${registry?.defaults?.hub_base || "http://127.0.0.1:27888"}${DEFAULT_HUB_PATH}`;
830
+ const fallbackRaw =
831
+ hubServer?.url ||
832
+ `${registry?.defaults?.hub_base || "http://127.0.0.1:27888"}${DEFAULT_HUB_PATH}`;
748
833
 
749
834
  let fallback;
750
835
  try {
@@ -754,12 +839,16 @@ export function resolveHubUrl() {
754
839
  }
755
840
 
756
841
  const envPortRaw = Number(process.env.TFX_HUB_PORT || "");
757
- const envPort = Number.isFinite(envPortRaw) && envPortRaw > 0 ? envPortRaw : null;
842
+ const envPort =
843
+ Number.isFinite(envPortRaw) && envPortRaw > 0 ? envPortRaw : null;
758
844
  const target = {
759
845
  protocol: fallback.protocol || "http:",
760
846
  host: fallback.hostname || "127.0.0.1",
761
847
  port: envPort || Number(fallback.port || 27888),
762
- pathname: fallback.pathname && fallback.pathname !== "/" ? fallback.pathname : DEFAULT_HUB_PATH,
848
+ pathname:
849
+ fallback.pathname && fallback.pathname !== "/"
850
+ ? fallback.pathname
851
+ : DEFAULT_HUB_PATH,
763
852
  };
764
853
 
765
854
  const hubPidPath = join(homedir(), ".claude", "cache", "tfx-hub", "hub.pid");
@@ -785,7 +874,9 @@ export function resolveHubUrl() {
785
874
 
786
875
  export function isWatchedPath(filePath) {
787
876
  const registryState = inspectRegistry();
788
- const registry = registryState.valid ? registryState.registry : cloneDefaultRegistry();
877
+ const registry = registryState.valid
878
+ ? registryState.registry
879
+ : cloneDefaultRegistry();
789
880
  const candidate = normalizeForMatch(filePath);
790
881
 
791
882
  return (registry?.policies?.watched_paths || []).some((watchedPath) => {
@@ -802,7 +893,10 @@ export function isWatchedPath(filePath) {
802
893
  return pathBasename(candidate) === trimmed.toLowerCase();
803
894
  }
804
895
 
805
- const suffix = trimmed.replace(/^[.][\\/]/, "").replace(/\\/g, "/").toLowerCase();
896
+ const suffix = trimmed
897
+ .replace(/^[.][\\/]/, "")
898
+ .replace(/\\/g, "/")
899
+ .toLowerCase();
806
900
  return candidate.endsWith(`/${suffix}`);
807
901
  });
808
902
  }
@@ -814,16 +908,26 @@ export function addRegistryServer(name, url, options = {}) {
814
908
  if (!normalizedUrl) throw new Error("server url is required");
815
909
 
816
910
  const registryState = inspectRegistry();
817
- const registry = registryState.valid ? loadRegistry() : cloneDefaultRegistry();
818
- const transport = options.transport || (trimmedName === "tfx-hub" ? "hub-url" : "url");
911
+ const registry = registryState.valid
912
+ ? loadRegistry()
913
+ : cloneDefaultRegistry();
914
+ const transport =
915
+ options.transport || (trimmedName === "tfx-hub" ? "hub-url" : "url");
819
916
 
820
917
  registry.servers[trimmedName] = {
821
918
  transport,
822
919
  url: normalizedUrl,
823
920
  safe: options.safe ?? true,
824
- targets: Array.isArray(options.targets) && options.targets.length > 0
825
- ? [...new Set(options.targets.map((value) => String(value).trim()).filter(Boolean))]
826
- : ["claude", "gemini", "codex"],
921
+ targets:
922
+ Array.isArray(options.targets) && options.targets.length > 0
923
+ ? [
924
+ ...new Set(
925
+ options.targets
926
+ .map((value) => String(value).trim())
927
+ .filter(Boolean),
928
+ ),
929
+ ]
930
+ : ["claude", "gemini", "codex"],
827
931
  description: options.description || `${trimmedName} MCP 서버`,
828
932
  };
829
933
 
@@ -851,10 +955,13 @@ export function removeServerFromTargets(name, options = {}) {
851
955
  const trimmedName = String(name || "").trim();
852
956
  if (!trimmedName) throw new Error("server name is required");
853
957
 
854
- const registry = options.registry || (inspectRegistry().valid ? loadRegistry() : cloneDefaultRegistry());
855
- const targetsFilter = Array.isArray(options.targets) && options.targets.length > 0
856
- ? new Set(options.targets)
857
- : null;
958
+ const registry =
959
+ options.registry ||
960
+ (inspectRegistry().valid ? loadRegistry() : cloneDefaultRegistry());
961
+ const targetsFilter =
962
+ Array.isArray(options.targets) && options.targets.length > 0
963
+ ? new Set(options.targets)
964
+ : null;
858
965
  const actions = [];
859
966
 
860
967
  for (const target of listManagedConfigTargets(registry)) {
@@ -912,7 +1019,11 @@ export function syncRegistryTargets(options = {}) {
912
1019
  }
913
1020
 
914
1021
  if (snapshot.stdioServers.length > 0) {
915
- const remediation = remediate(target.filePath, snapshot.stdioServers, registry.policies);
1022
+ const remediation = remediate(
1023
+ target.filePath,
1024
+ snapshot.stdioServers,
1025
+ registry.policies,
1026
+ );
916
1027
  actions.push({
917
1028
  type: "remediate",
918
1029
  filePath: target.filePath,
@@ -927,8 +1038,12 @@ export function syncRegistryTargets(options = {}) {
927
1038
 
928
1039
  for (const target of listPrimaryConfigTargets(registry)) {
929
1040
  const updates = Object.entries(registry.servers || {})
930
- .filter(([, serverConfig]) => serverAppliesToClient(serverConfig, target.client))
931
- .map(([name, serverConfig]) => buildDesiredServerRecord(name, serverConfig, target.filePath));
1041
+ .filter(([, serverConfig]) =>
1042
+ serverAppliesToClient(serverConfig, target.client),
1043
+ )
1044
+ .map(([name, serverConfig]) =>
1045
+ buildDesiredServerRecord(name, serverConfig, target.filePath),
1046
+ );
932
1047
 
933
1048
  if (updates.length === 0) continue;
934
1049
 
@@ -2,33 +2,41 @@
2
2
  // MCP 서버 활성화 매니페스트 — 단일 진실 소스.
3
3
  // tfx-setup 위저드가 저장하고, gateway/filter가 참조한다.
4
4
 
5
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
6
- import { join, dirname } from 'node:path';
7
- import { homedir } from 'node:os';
5
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
6
+ import { homedir } from "node:os";
7
+ import { dirname, join } from "node:path";
8
8
 
9
- export const MANIFEST_PATH = join(homedir(), '.claude', 'cache', 'mcp-enabled.json');
9
+ export const MANIFEST_PATH = join(
10
+ homedir(),
11
+ ".claude",
12
+ "cache",
13
+ "mcp-enabled.json",
14
+ );
10
15
 
11
16
  /** API 키 불필요 — 항상 활성화 */
12
- export const CORE_SERVERS = Object.freeze(['context7', 'serena']);
17
+ export const CORE_SERVERS = Object.freeze(["context7", "serena"]);
13
18
 
14
19
  /** 검색 MCP — API 키 필요 */
15
20
  export const SEARCH_SERVERS = Object.freeze([
16
- { name: 'brave-search', envVars: ['BRAVE_API_KEY'] },
17
- { name: 'exa', envVars: ['EXA_API_KEY'] },
18
- { name: 'tavily', envVars: ['TAVILY_API_KEY'] },
21
+ { name: "brave-search", envVars: ["BRAVE_API_KEY"] },
22
+ { name: "exa", envVars: ["EXA_API_KEY"] },
23
+ { name: "tavily", envVars: ["TAVILY_API_KEY"] },
19
24
  ]);
20
25
 
21
26
  /** 통합 MCP — API 키 + 추가 설정 필요 */
22
27
  export const INTEGRATION_SERVERS = Object.freeze([
23
- { name: 'jira', envVars: ['JIRA_API_TOKEN', 'JIRA_EMAIL', 'JIRA_INSTANCE_URL'] },
24
- { name: 'notion', envVars: ['NOTION_TOKEN'] },
25
- { name: 'notion-guest', envVars: ['NOTION_TOKEN'] },
28
+ {
29
+ name: "jira",
30
+ envVars: ["JIRA_API_TOKEN", "JIRA_EMAIL", "JIRA_INSTANCE_URL"],
31
+ },
32
+ { name: "notion", envVars: ["NOTION_TOKEN"] },
33
+ { name: "notion-guest", envVars: ["NOTION_TOKEN"] },
26
34
  ]);
27
35
 
28
36
  export function readManifest() {
29
37
  if (!existsSync(MANIFEST_PATH)) return null;
30
38
  try {
31
- return JSON.parse(readFileSync(MANIFEST_PATH, 'utf8'));
39
+ return JSON.parse(readFileSync(MANIFEST_PATH, "utf8"));
32
40
  } catch {
33
41
  return null;
34
42
  }
@@ -56,7 +64,9 @@ export function filterByManifest(allServers) {
56
64
  if (!manifest) return null;
57
65
  const enabled = new Set(manifest.enabled || []);
58
66
  for (const core of CORE_SERVERS) enabled.add(core);
59
- return allServers.filter((s) => enabled.has(typeof s === 'string' ? s : s.name));
67
+ return allServers.filter((s) =>
68
+ enabled.has(typeof s === "string" ? s : s.name),
69
+ );
60
70
  }
61
71
 
62
72
  /**