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
package/scripts/pack.mjs CHANGED
@@ -4,9 +4,17 @@
4
4
  //
5
5
  // Usage: node scripts/pack.mjs [core|remote|triflux|all]
6
6
 
7
- import { cpSync, existsSync, mkdirSync, rmSync, readFileSync, writeFileSync, readdirSync } from 'node:fs';
8
- import { join, dirname, relative, normalize } from 'node:path';
9
- import { fileURLToPath } from 'node:url';
7
+ import {
8
+ cpSync,
9
+ existsSync,
10
+ mkdirSync,
11
+ readdirSync,
12
+ readFileSync,
13
+ rmSync,
14
+ writeFileSync,
15
+ } from "node:fs";
16
+ import { dirname, join, normalize, relative } from "node:path";
17
+ import { fileURLToPath } from "node:url";
10
18
 
11
19
  const ROOT = dirname(dirname(fileURLToPath(import.meta.url)));
12
20
 
@@ -14,76 +22,67 @@ const ROOT = dirname(dirname(fileURLToPath(import.meta.url)));
14
22
 
15
23
  const CORE_FILES = [
16
24
  // hub root — core modules
17
- 'hub/cli-adapter-base.mjs',
18
- 'hub/codex-adapter.mjs',
19
- 'hub/codex-compat.mjs',
20
- 'hub/codex-preflight.mjs',
21
- 'hub/gemini-adapter.mjs',
22
- 'hub/team-bridge.mjs',
23
- 'hub/paths.mjs',
24
- 'hub/platform.mjs',
25
- 'hub/state.mjs',
26
- 'hub/intent.mjs',
27
- 'hub/token-mode.mjs',
28
- 'hub/router.mjs',
29
- 'hub/hitl.mjs',
30
- 'hub/assign-callbacks.mjs',
31
- 'hub/fullcycle.mjs',
32
- 'hub/bridge.mjs',
33
- 'hub/reflexion.mjs',
34
- 'hub/research.mjs',
35
- 'hub/session-fingerprint.mjs',
25
+ "hub/cli-adapter-base.mjs",
26
+ "hub/codex-adapter.mjs",
27
+ "hub/codex-compat.mjs",
28
+ "hub/codex-preflight.mjs",
29
+ "hub/gemini-adapter.mjs",
30
+ "hub/team-bridge.mjs",
31
+ "hub/paths.mjs",
32
+ "hub/platform.mjs",
33
+ "hub/state.mjs",
34
+ "hub/intent.mjs",
35
+ "hub/token-mode.mjs",
36
+ "hub/router.mjs",
37
+ "hub/hitl.mjs",
38
+ "hub/assign-callbacks.mjs",
39
+ "hub/fullcycle.mjs",
40
+ "hub/bridge.mjs",
41
+ "hub/reflexion.mjs",
42
+ "hub/research.mjs",
43
+ "hub/session-fingerprint.mjs",
36
44
  // Neural Memory (Lake 2 Phase 1)
37
- 'hub/adaptive.mjs',
38
- 'hub/adaptive-diagnostic.mjs',
39
- 'hub/adaptive-inject.mjs',
40
- 'hub/adaptive-memory.mjs',
41
- 'hub/memory-doctor.mjs',
42
- 'hub/account-broker.mjs',
45
+ "hub/adaptive.mjs",
46
+ "hub/adaptive-diagnostic.mjs",
47
+ "hub/adaptive-inject.mjs",
48
+ "hub/adaptive-memory.mjs",
49
+ "hub/memory-doctor.mjs",
50
+ "hub/account-broker.mjs",
43
51
  ];
44
52
 
45
53
  const CORE_DIRS = [
46
- 'hub/pipeline',
47
- 'hub/routing',
48
- 'hub/quality',
49
- 'hub/delegator',
50
- 'hub/lib',
51
- 'hub/middleware',
52
- 'hub/workers/worker-utils.mjs', // shared utility
54
+ "hub/pipeline",
55
+ "hub/routing",
56
+ "hub/quality",
57
+ "hub/delegator",
58
+ "hub/lib",
59
+ "hub/middleware",
60
+ "hub/workers/worker-utils.mjs", // shared utility
53
61
  ];
54
62
 
55
63
  const REMOTE_FILES = [
56
- 'hub/server.mjs',
57
- 'hub/store.mjs',
58
- 'hub/store-adapter.mjs',
59
- 'hub/pipe.mjs',
60
- 'hub/tools.mjs',
61
- 'hub/tray.mjs',
64
+ "hub/server.mjs",
65
+ "hub/store.mjs",
66
+ "hub/store-adapter.mjs",
67
+ "hub/pipe.mjs",
68
+ "hub/tools.mjs",
69
+ "hub/tray.mjs",
62
70
  ];
63
71
 
64
- const REMOTE_DIRS = [
65
- 'hub/team',
66
- 'hub/workers',
67
- 'hub/public',
68
- ];
72
+ const REMOTE_DIRS = ["hub/team", "hub/workers", "hub/public"];
69
73
 
70
74
  const TRIFLUX_DIRS = [
71
- 'bin',
72
- 'skills',
73
- 'hooks',
74
- 'hud',
75
- 'scripts',
76
- 'hub',
77
- 'mesh',
78
- 'references',
75
+ "bin",
76
+ "skills",
77
+ "hooks",
78
+ "hud",
79
+ "scripts",
80
+ "hub",
81
+ "mesh",
82
+ "references",
79
83
  ];
80
84
 
81
- const TRIFLUX_FILES = [
82
- 'README.md',
83
- 'README.ko.md',
84
- 'LICENSE',
85
- 'CLAUDE.md',
86
- ];
85
+ const TRIFLUX_FILES = ["README.md", "README.ko.md", "LICENSE", "CLAUDE.md"];
87
86
 
88
87
  // ── 복사 유틸 ───────────────────────────────────────────────────
89
88
 
@@ -100,14 +99,15 @@ function copyItem(src, dest) {
100
99
  }
101
100
 
102
101
  function cleanDist(pkgDir) {
103
- const dirs = ['hub', 'bin', 'skills', 'scripts', 'hooks', 'hud'];
102
+ const dirs = ["hub", "bin", "skills", "scripts", "hooks", "hud"];
104
103
  for (const d of dirs) {
105
104
  const target = join(pkgDir, d);
106
105
  if (existsSync(target)) rmSync(target, { recursive: true, force: true });
107
106
  }
108
- for (const f of ['README.md', 'README.ko.md', 'LICENSE']) {
107
+ for (const f of ["README.md", "README.ko.md", "LICENSE"]) {
109
108
  const target = join(pkgDir, f);
110
- if (existsSync(target) && target !== join(ROOT, f)) rmSync(target, { force: true });
109
+ if (existsSync(target) && target !== join(ROOT, f))
110
+ rmSync(target, { force: true });
111
111
  }
112
112
  }
113
113
 
@@ -119,7 +119,7 @@ function walkMjs(dir) {
119
119
  for (const entry of readdirSync(dir, { withFileTypes: true })) {
120
120
  const full = join(dir, entry.name);
121
121
  if (entry.isDirectory()) files.push(...walkMjs(full));
122
- else if (entry.name.endsWith('.mjs')) files.push(full);
122
+ else if (entry.name.endsWith(".mjs")) files.push(full);
123
123
  }
124
124
  return files;
125
125
  }
@@ -142,7 +142,7 @@ function rewriteRemoteImports(remotePkgDir, corePkgDir) {
142
142
  let totalRewrites = 0;
143
143
 
144
144
  for (const filePath of walkMjs(remotePkgDir)) {
145
- let content = readFileSync(filePath, 'utf8');
145
+ let content = readFileSync(filePath, "utf8");
146
146
  let changed = false;
147
147
 
148
148
  content = content.replace(
@@ -152,7 +152,10 @@ function rewriteRemoteImports(remotePkgDir, corePkgDir) {
152
152
  // import 대상이 remote 패키지 내에 있으면 그대로 유지
153
153
  if (existsSync(resolved)) return match;
154
154
  // core 패키지에 동일 상대경로로 존재하는지 확인
155
- const relToRemote = relative(remotePkgDir, resolved).replace(/\\/g, '/');
155
+ const relToRemote = relative(remotePkgDir, resolved).replace(
156
+ /\\/g,
157
+ "/",
158
+ );
156
159
  const coreEquiv = normalize(join(corePkgDir, relToRemote));
157
160
  if (coreFiles.has(coreEquiv)) {
158
161
  changed = true;
@@ -160,7 +163,7 @@ function rewriteRemoteImports(remotePkgDir, corePkgDir) {
160
163
  return `${pre}@triflux/core/${relToRemote}${post}`;
161
164
  }
162
165
  return match;
163
- }
166
+ },
164
167
  );
165
168
 
166
169
  if (changed) writeFileSync(filePath, content);
@@ -231,65 +234,67 @@ export { ensureWorktree, prepareIntegrationBranch, rebaseShardOntoIntegration, p
231
234
  `;
232
235
 
233
236
  function writeIndex(dest, content) {
234
- const indexPath = join(dest, 'hub', 'index.mjs');
237
+ const indexPath = join(dest, "hub", "index.mjs");
235
238
  writeFileSync(indexPath, content);
236
- console.log(' WRITE hub/index.mjs');
239
+ console.log(" WRITE hub/index.mjs");
237
240
  }
238
241
 
239
242
  // ── Pack 함수 ───────────────────────────────────────────────────
240
243
 
241
244
  function packCore() {
242
- const dest = join(ROOT, 'packages', 'core');
243
- console.log('\n@triflux/core');
245
+ const dest = join(ROOT, "packages", "core");
246
+ console.log("\n@triflux/core");
244
247
  cleanDist(dest);
245
248
  for (const f of CORE_FILES) copyItem(f, dest);
246
249
  for (const d of CORE_DIRS) copyItem(d, dest);
247
250
  // shared scripts/lib for logger, context
248
- copyItem('scripts/lib', dest);
249
- copyItem('hooks', dest);
250
- copyItem('hud', dest);
251
+ copyItem("scripts/lib", dest);
252
+ copyItem("hooks", dest);
253
+ copyItem("hud", dest);
251
254
  writeIndex(dest, CORE_INDEX);
252
- console.log(' DONE');
255
+ console.log(" DONE");
253
256
  }
254
257
 
255
258
  function packRemote() {
256
- const dest = join(ROOT, 'packages', 'remote');
257
- const coreDest = join(ROOT, 'packages', 'core');
258
- console.log('\n@triflux/remote');
259
+ const dest = join(ROOT, "packages", "remote");
260
+ const coreDest = join(ROOT, "packages", "core");
261
+ console.log("\n@triflux/remote");
259
262
  cleanDist(dest);
260
263
  for (const f of REMOTE_FILES) copyItem(f, dest);
261
264
  for (const d of REMOTE_DIRS) copyItem(d, dest);
262
265
  // shared scripts/lib needed by delegator-mcp.mjs (dynamic resolve)
263
- copyItem('scripts/lib', dest);
266
+ copyItem("scripts/lib", dest);
264
267
  writeIndex(dest, REMOTE_INDEX);
265
268
  const rewrites = rewriteRemoteImports(dest, coreDest);
266
269
  console.log(` REWROTE ${rewrites} cross-package imports → @triflux/core`);
267
- console.log(' DONE');
270
+ console.log(" DONE");
268
271
  }
269
272
 
270
273
  function packTriflux() {
271
- const dest = join(ROOT, 'packages', 'triflux');
272
- console.log('\ntriflux (meta)');
274
+ const dest = join(ROOT, "packages", "triflux");
275
+ console.log("\ntriflux (meta)");
273
276
  cleanDist(dest);
274
277
  // clean extra dirs that triflux now includes
275
- for (const d of ['hooks', 'hud', 'scripts', 'hub', 'mesh', 'references']) {
278
+ for (const d of ["hooks", "hud", "scripts", "hub", "mesh", "references"]) {
276
279
  const target = join(dest, d);
277
280
  if (existsSync(target)) rmSync(target, { recursive: true, force: true });
278
281
  }
279
282
  for (const f of TRIFLUX_FILES) copyItem(f, dest);
280
283
  for (const d of TRIFLUX_DIRS) copyItem(d, dest);
281
- console.log(' DONE');
284
+ console.log(" DONE");
282
285
  }
283
286
 
284
287
  // ── Main ────────────────────────────────────────────────────────
285
288
 
286
- const target = process.argv[2] || 'all';
289
+ const target = process.argv[2] || "all";
287
290
 
288
291
  console.log(`pack: assembling packages (target=${target})`);
289
292
  console.log(`root: ${ROOT}`);
290
293
 
291
- if (target === 'core' || target === 'all') packCore();
292
- if (target === 'remote' || target === 'all') packRemote();
293
- if (target === 'triflux' || target === 'all') packTriflux();
294
+ if (target === "core" || target === "all") packCore();
295
+ if (target === "remote" || target === "all") packRemote();
296
+ if (target === "triflux" || target === "all") packTriflux();
294
297
 
295
- console.log('\nPack complete. Run `npm pack` in each package to create tarballs.');
298
+ console.log(
299
+ "\nPack complete. Run `npm pack` in each package to create tarballs.",
300
+ );
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  // scripts/preflight-cache.mjs — 세션 시작 시 preflight 점검 캐싱
3
3
 
4
- import { writeFileSync, mkdirSync, existsSync, readFileSync } from "node:fs";
5
- import { join, dirname } from "node:path";
4
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
6
5
  import { homedir } from "node:os";
6
+ import { dirname, join } from "node:path";
7
7
  import { fileURLToPath } from "node:url";
8
8
  import { checkHub, detectCodexPlan, probeClis } from "./lib/env-probe.mjs";
9
9
 
@@ -32,17 +32,15 @@ async function runPreflight() {
32
32
  };
33
33
  result.ok = result.hub.ok && result.route.ok;
34
34
 
35
- // CLI 가용성 → available_agents (triage에서 참조)
36
35
  const agents = [];
37
36
  if (result.codex.ok) agents.push("codex");
38
37
  if (result.gemini.ok) agents.push("gemini");
39
- agents.push("claude"); // claude는 항상 가용
38
+ agents.push("claude");
40
39
  result.available_agents = agents;
41
40
 
42
41
  return result;
43
42
  }
44
43
 
45
- // 캐시 읽기 (TTL 검증 포함)
46
44
  export function readPreflightCache() {
47
45
  try {
48
46
  const data = JSON.parse(readFileSync(CACHE_FILE, "utf8"));
@@ -51,19 +49,38 @@ export function readPreflightCache() {
51
49
  return null;
52
50
  }
53
51
 
54
- // 메인 실행
55
- if (process.argv[1]?.endsWith("preflight-cache.mjs")) {
52
+ export async function run(stdinData) {
53
+ void stdinData;
54
+
56
55
  const result = await runPreflight();
57
56
  mkdirSync(CACHE_DIR, { recursive: true });
58
57
  writeFileSync(CACHE_FILE, JSON.stringify(result, null, 2));
59
- // 간결 출력 (hook stdout)
58
+
60
59
  const summary = result.ok ? "preflight: ok" : "preflight: FAIL";
61
60
  const details = [];
62
61
  if (!result.hub.ok) details.push("hub:" + result.hub.state);
63
62
  else if (result.hub.restarted) details.push("hub:restarted");
64
63
  if (!result.route.ok) details.push("route:missing");
65
64
  if (result.available_agents.length === 1) details.push("agents:claude-only");
66
- console.log(details.length ? `${summary} (${details.join(", ")})` : summary);
65
+
66
+ return {
67
+ code: 0,
68
+ stdout: `${details.length ? `${summary} (${details.join(", ")})` : summary}\n`,
69
+ stderr: "",
70
+ };
71
+ }
72
+
73
+ const isMain =
74
+ process.argv[1] &&
75
+ import.meta.url.endsWith(
76
+ process.argv[1].replace(/\\/g, "/").split("/").pop(),
77
+ );
78
+
79
+ if (isMain) {
80
+ const result = await run();
81
+ if (result.stdout) process.stdout.write(result.stdout);
82
+ if (result.stderr) process.stderr.write(result.stderr);
83
+ process.exit(result.code);
67
84
  }
68
85
 
69
- export { runPreflight, CACHE_FILE, CACHE_TTL_MS };
86
+ export { CACHE_FILE, CACHE_TTL_MS, runPreflight };
@@ -1,14 +1,15 @@
1
1
  #!/usr/bin/env node
2
+
2
3
  // npm install 전 Hub를 안전하게 중지하여 EBUSY 방지
3
4
  // better-sqlite3.node 파일이 Hub 프로세스에 의해 잠기면 npm이 덮어쓸 수 없음
4
5
  //
5
6
  // v6.0.0: taskkill /T /F + Atomics.wait sleep + 파일 잠금 확인
6
7
  // (bin/triflux.mjs stopHubForUpdate 패턴과 동일)
7
8
 
8
- import { existsSync, readFileSync, unlinkSync, openSync, closeSync } from "fs";
9
- import { join, dirname } from "path";
10
- import { homedir } from "os";
11
9
  import { execFileSync } from "child_process";
10
+ import { closeSync, existsSync, openSync, readFileSync, unlinkSync } from "fs";
11
+ import { homedir } from "os";
12
+ import { dirname, join } from "path";
12
13
  import { fileURLToPath } from "url";
13
14
 
14
15
  const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -30,7 +31,9 @@ function stopHub() {
30
31
  process.kill(pid, 0); // 프로세스 존재 확인
31
32
  } catch {
32
33
  // 프로세스 없음 또는 PID 파일 손상 — PID 파일만 정리
33
- try { unlinkSync(HUB_PID_FILE); } catch {}
34
+ try {
35
+ unlinkSync(HUB_PID_FILE);
36
+ } catch {}
34
37
  return;
35
38
  }
36
39
 
@@ -39,12 +42,23 @@ function stopHub() {
39
42
  // D4 fix: PID 소유자 검증 — node 프로세스인지 확인 (PID 재사용 보호)
40
43
  if (process.platform === "win32") {
41
44
  try {
42
- const taskInfo = execFileSync("tasklist", ["/FI", `PID eq ${pid}`, "/FO", "CSV", "/NH"], {
43
- encoding: "utf8", stdio: ["pipe", "pipe", "ignore"], timeout: 5000, windowsHide: true,
44
- }).trim();
45
+ const taskInfo = execFileSync(
46
+ "tasklist",
47
+ ["/FI", `PID eq ${pid}`, "/FO", "CSV", "/NH"],
48
+ {
49
+ encoding: "utf8",
50
+ stdio: ["pipe", "pipe", "ignore"],
51
+ timeout: 5000,
52
+ windowsHide: true,
53
+ },
54
+ ).trim();
45
55
  if (!taskInfo.toLowerCase().includes("node")) {
46
- console.log(`[triflux preinstall] PID ${pid}은 node 프로세스가 아님 — kill 건너뜀`);
47
- try { unlinkSync(HUB_PID_FILE); } catch {}
56
+ console.log(
57
+ `[triflux preinstall] PID ${pid} node 프로세스가 아님 — kill 건너뜀`,
58
+ );
59
+ try {
60
+ unlinkSync(HUB_PID_FILE);
61
+ } catch {}
48
62
  return;
49
63
  }
50
64
  } catch {
@@ -65,17 +79,30 @@ function stopHub() {
65
79
  }
66
80
  } catch {
67
81
  // taskkill 실패 시 SIGKILL fallback
68
- try { process.kill(pid, "SIGKILL"); } catch {}
82
+ try {
83
+ process.kill(pid, "SIGKILL");
84
+ } catch {}
69
85
  }
70
86
 
71
87
  // 2단계: 프로세스 종료 대기 (최대 5초, 500ms 간격)
72
88
  for (let i = 0; i < 10; i++) {
73
89
  sleepMs(500);
74
- try { process.kill(pid, 0); } catch { break; }
90
+ try {
91
+ process.kill(pid, 0);
92
+ } catch {
93
+ break;
94
+ }
75
95
  }
76
96
 
77
97
  // 3단계: better-sqlite3.node 파일 잠금 해제 확인 (최대 3초)
78
- const sqliteNode = join(PKG_ROOT, "node_modules", "better-sqlite3", "build", "Release", "better_sqlite3.node");
98
+ const sqliteNode = join(
99
+ PKG_ROOT,
100
+ "node_modules",
101
+ "better-sqlite3",
102
+ "build",
103
+ "Release",
104
+ "better_sqlite3.node",
105
+ );
79
106
  if (existsSync(sqliteNode)) {
80
107
  for (let i = 0; i < 6; i++) {
81
108
  try {
@@ -89,7 +116,9 @@ function stopHub() {
89
116
  }
90
117
 
91
118
  // 4단계: PID 파일 정리 (종료 확인 후)
92
- try { unlinkSync(HUB_PID_FILE); } catch {}
119
+ try {
120
+ unlinkSync(HUB_PID_FILE);
121
+ } catch {}
93
122
  console.log(`[triflux preinstall] Hub 중지 완료 (PID ${pid})`);
94
123
  }
95
124