triflux 10.3.4 → 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 (329) hide show
  1. package/LICENSE +21 -21
  2. package/bin/tfx-doctor-tui.mjs +1 -1
  3. package/bin/tfx-doctor.mjs +6 -1
  4. package/bin/tfx-profile.mjs +1 -1
  5. package/bin/tfx-setup-tui.mjs +1 -1
  6. package/bin/tfx-setup.mjs +6 -1
  7. package/bin/triflux.mjs +2396 -1140
  8. package/hooks/agent-route-guard.mjs +12 -8
  9. package/hooks/cross-review-tracker.mjs +21 -8
  10. package/hooks/error-context.mjs +19 -7
  11. package/hooks/hook-adaptive-collector.mjs +18 -16
  12. package/hooks/hook-manager.mjs +93 -32
  13. package/hooks/hook-orchestrator.mjs +108 -24
  14. package/hooks/hook-registry.json +11 -0
  15. package/hooks/keyword-rules.json +6 -10
  16. package/hooks/lib/resolve-root.mjs +1 -1
  17. package/hooks/mcp-config-watcher.mjs +6 -2
  18. package/hooks/pipeline-stop.mjs +3 -6
  19. package/hooks/safety-guard.mjs +99 -28
  20. package/hooks/session-start-fast.mjs +143 -0
  21. package/hooks/subagent-verifier.mjs +5 -4
  22. package/hub/account-broker.mjs +256 -60
  23. package/hub/adaptive-diagnostic.mjs +75 -48
  24. package/hub/adaptive-inject.mjs +95 -57
  25. package/hub/adaptive-memory.mjs +156 -42
  26. package/hub/adaptive.mjs +60 -31
  27. package/hub/assign-callbacks.mjs +67 -30
  28. package/hub/bridge.mjs +0 -1
  29. package/hub/cli-adapter-base.mjs +200 -48
  30. package/hub/codex-adapter.mjs +76 -96
  31. package/hub/codex-compat.mjs +3 -3
  32. package/hub/codex-preflight.mjs +63 -37
  33. package/hub/delegator/contracts.mjs +19 -23
  34. package/hub/delegator/index.mjs +3 -3
  35. package/hub/delegator/service.mjs +88 -64
  36. package/hub/delegator/tool-definitions.mjs +5 -5
  37. package/hub/fullcycle.mjs +33 -17
  38. package/hub/gemini-adapter.mjs +69 -94
  39. package/hub/hitl.mjs +89 -30
  40. package/hub/intent.mjs +161 -38
  41. package/hub/lib/cache-guard.mjs +43 -17
  42. package/hub/lib/mcp-response-cache.mjs +66 -32
  43. package/hub/lib/memory-store.mjs +285 -111
  44. package/hub/lib/path-utils.mjs +35 -37
  45. package/hub/lib/process-utils.mjs +106 -37
  46. package/hub/lib/spawn-trace.mjs +527 -0
  47. package/hub/lib/ssh-command.mjs +34 -4
  48. package/hub/lib/ssh-retry.mjs +5 -1
  49. package/hub/lib/uuidv7.mjs +4 -3
  50. package/hub/memory-doctor.mjs +266 -106
  51. package/hub/middleware/request-logger.mjs +61 -34
  52. package/hub/paths.mjs +9 -9
  53. package/hub/pipeline/gates/confidence.mjs +34 -15
  54. package/hub/pipeline/gates/consensus.mjs +27 -15
  55. package/hub/pipeline/gates/index.mjs +7 -3
  56. package/hub/pipeline/gates/selfcheck.mjs +57 -19
  57. package/hub/pipeline/index.mjs +77 -42
  58. package/hub/pipeline/state.mjs +10 -10
  59. package/hub/pipeline/transitions.mjs +40 -23
  60. package/hub/platform.mjs +57 -48
  61. package/hub/promote-penalties.mjs +25 -7
  62. package/hub/quality/deslop.mjs +70 -49
  63. package/hub/research.mjs +32 -25
  64. package/hub/router.mjs +240 -107
  65. package/hub/routing/complexity.mjs +132 -29
  66. package/hub/routing/index.mjs +17 -12
  67. package/hub/routing/q-learning.mjs +76 -28
  68. package/hub/server.mjs +4 -4
  69. package/hub/session-fingerprint.mjs +126 -60
  70. package/hub/state.mjs +84 -43
  71. package/hub/store-adapter.mjs +59 -26
  72. package/hub/store.mjs +356 -153
  73. package/hub/team/agent-map.json +22 -7
  74. package/hub/team/ansi.mjs +186 -122
  75. package/hub/team/backend.mjs +28 -10
  76. package/hub/team/cli/commands/attach.mjs +29 -9
  77. package/hub/team/cli/commands/control.mjs +29 -8
  78. package/hub/team/cli/commands/debug.mjs +32 -11
  79. package/hub/team/cli/commands/focus.mjs +38 -11
  80. package/hub/team/cli/commands/interrupt.mjs +18 -6
  81. package/hub/team/cli/commands/kill.mjs +16 -5
  82. package/hub/team/cli/commands/list.mjs +11 -4
  83. package/hub/team/cli/commands/send.mjs +19 -6
  84. package/hub/team/cli/commands/start/index.mjs +154 -31
  85. package/hub/team/cli/commands/start/parse-args.mjs +38 -11
  86. package/hub/team/cli/commands/start/start-headless.mjs +112 -36
  87. package/hub/team/cli/commands/start/start-in-process.mjs +12 -2
  88. package/hub/team/cli/commands/start/start-mux.mjs +70 -21
  89. package/hub/team/cli/commands/start/start-wt.mjs +29 -12
  90. package/hub/team/cli/commands/status.mjs +43 -14
  91. package/hub/team/cli/commands/stop.mjs +11 -4
  92. package/hub/team/cli/commands/task.mjs +8 -3
  93. package/hub/team/cli/commands/tasks.mjs +1 -1
  94. package/hub/team/cli/index.mjs +2 -2
  95. package/hub/team/cli/manifest.mjs +38 -8
  96. package/hub/team/cli/render.mjs +30 -8
  97. package/hub/team/cli/services/attach-fallback.mjs +31 -11
  98. package/hub/team/cli/services/hub-client.mjs +42 -14
  99. package/hub/team/cli/services/member-selector.mjs +11 -4
  100. package/hub/team/cli/services/native-control.mjs +48 -21
  101. package/hub/team/cli/services/runtime-mode.mjs +2 -1
  102. package/hub/team/cli/services/state-store.mjs +25 -8
  103. package/hub/team/cli/services/task-model.mjs +16 -6
  104. package/hub/team/conductor-mesh-bridge.mjs +24 -23
  105. package/hub/team/conductor.mjs +8 -4
  106. package/hub/team/dashboard-anchor.mjs +4 -5
  107. package/hub/team/dashboard-layout.mjs +3 -1
  108. package/hub/team/dashboard-open.mjs +41 -21
  109. package/hub/team/dashboard.mjs +76 -28
  110. package/hub/team/event-log.mjs +18 -10
  111. package/hub/team/handoff.mjs +31 -15
  112. package/hub/team/headless.mjs +2 -1
  113. package/hub/team/health-probe.mjs +69 -54
  114. package/hub/team/launcher-template.mjs +16 -13
  115. package/hub/team/native-supervisor.mjs +65 -21
  116. package/hub/team/native.mjs +74 -35
  117. package/hub/team/nativeProxy.mjs +184 -113
  118. package/hub/team/notify.mjs +119 -76
  119. package/hub/team/orchestrator.mjs +9 -4
  120. package/hub/team/pane.mjs +12 -7
  121. package/hub/team/process-cleanup.mjs +25 -16
  122. package/hub/team/psmux.mjs +491 -201
  123. package/hub/team/remote-probe.mjs +68 -52
  124. package/hub/team/remote-session.mjs +117 -59
  125. package/hub/team/remote-watcher.mjs +61 -33
  126. package/hub/team/routing.mjs +51 -25
  127. package/hub/team/runtime-strategy.mjs +3 -1
  128. package/hub/team/session.mjs +98 -34
  129. package/hub/team/staleState.mjs +72 -30
  130. package/hub/team/swarm-locks.mjs +15 -13
  131. package/hub/team/swarm-planner.mjs +32 -21
  132. package/hub/team/swarm-reconciler.mjs +48 -23
  133. package/hub/team/tui-lite.mjs +266 -68
  134. package/hub/team/tui-remote-adapter.mjs +14 -10
  135. package/hub/team/tui-viewer.mjs +99 -43
  136. package/hub/team/tui.mjs +708 -271
  137. package/hub/team/worktree-lifecycle.mjs +152 -58
  138. package/hub/team/wt-manager.mjs +24 -14
  139. package/hub/token-mode.mjs +71 -71
  140. package/hub/tray.mjs +66 -23
  141. package/hub/workers/claude-worker.mjs +162 -118
  142. package/hub/workers/codex-mcp.mjs +192 -141
  143. package/hub/workers/delegator-mcp.mjs +507 -333
  144. package/hub/workers/factory.mjs +8 -8
  145. package/hub/workers/gemini-worker.mjs +115 -84
  146. package/hub/workers/interface.mjs +6 -1
  147. package/hub/workers/worker-utils.mjs +21 -14
  148. package/hud/colors.mjs +27 -9
  149. package/hud/constants.mjs +162 -26
  150. package/hud/context-monitor.mjs +82 -41
  151. package/hud/hud-qos-status.mjs +129 -49
  152. package/hud/mission-board.mjs +6 -3
  153. package/hud/providers/claude.mjs +226 -115
  154. package/hud/providers/codex.mjs +62 -22
  155. package/hud/providers/gemini.mjs +168 -56
  156. package/hud/renderers.mjs +384 -119
  157. package/hud/terminal.mjs +101 -31
  158. package/hud/utils.mjs +78 -38
  159. package/mesh/index.mjs +11 -5
  160. package/mesh/mesh-budget.mjs +18 -9
  161. package/mesh/mesh-heartbeat.mjs +1 -1
  162. package/mesh/mesh-queue.mjs +3 -5
  163. package/mesh/mesh-router.mjs +5 -4
  164. package/package.json +2 -1
  165. package/scripts/__tests__/gen-skill-docs.test.mjs +36 -7
  166. package/scripts/__tests__/keyword-detector.test.mjs +77 -28
  167. package/scripts/__tests__/mcp-guard-engine.test.mjs +58 -20
  168. package/scripts/__tests__/remote-spawn-transfer.test.mjs +30 -19
  169. package/scripts/__tests__/remote-spawn.test.mjs +10 -4
  170. package/scripts/__tests__/session-start-fast.test.mjs +36 -0
  171. package/scripts/__tests__/skill-template.test.mjs +98 -50
  172. package/scripts/__tests__/smoke.test.mjs +1 -1
  173. package/scripts/__tests__/spawn-trace.test.mjs +102 -0
  174. package/scripts/__tests__/tfx-doctor-diagnose.test.mjs +48 -0
  175. package/scripts/cache-doctor.mjs +11 -4
  176. package/scripts/cache-warmup.mjs +96 -37
  177. package/scripts/claudemd-sync.mjs +27 -17
  178. package/scripts/codex-gateway-preflight.mjs +52 -37
  179. package/scripts/codex-mcp-gateway-sync.mjs +59 -39
  180. package/scripts/completions/tfx.bash +47 -47
  181. package/scripts/completions/tfx.fish +44 -44
  182. package/scripts/completions/tfx.zsh +83 -83
  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 +45 -26
  193. package/scripts/keyword-detector.mjs +41 -20
  194. package/scripts/keyword-rules-expander.mjs +47 -30
  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 +300 -63
  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 +199 -84
  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 +16 -12
  229. package/scripts/tfx-batch-stats.mjs +32 -11
  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/agent-replay-8f0e10a9-9693-4410-96f5-a6b07e8ed995.jsonl +1 -0
  237. package/skills/.omc/state/idle-notif-cooldown.json +3 -0
  238. package/skills/.omc/state/last-tool-error.json +7 -0
  239. package/skills/.omc/state/subagent-tracking.json +7 -0
  240. package/skills/_templates/base.md +1 -6
  241. package/skills/merge-worktree/SKILL.md.tmpl +144 -0
  242. package/skills/shared/telemetry-segment.md +6 -0
  243. package/skills/star-prompt/SKILL.md.tmpl +222 -0
  244. package/skills/tfx-analysis/SKILL.md.tmpl +107 -0
  245. package/skills/tfx-analysis/skill.json +1 -6
  246. package/skills/tfx-auto/SKILL.md +1 -0
  247. package/skills/tfx-auto-codex/SKILL.md.tmpl +106 -0
  248. package/skills/tfx-auto-codex/skill.json +1 -3
  249. package/skills/tfx-autopilot/SKILL.md.tmpl +116 -0
  250. package/skills/tfx-autopilot/skill.json +1 -5
  251. package/skills/tfx-autoresearch/SKILL.md.tmpl +136 -0
  252. package/skills/tfx-autoroute/SKILL.md.tmpl +189 -0
  253. package/skills/tfx-autoroute/skill.json +1 -7
  254. package/skills/tfx-codex/SKILL.md +1 -0
  255. package/skills/tfx-codex/skill.json +1 -3
  256. package/skills/tfx-codex-swarm/SKILL.md.tmpl +16 -0
  257. package/skills/tfx-codex-swarm/evals/evals.json +1 -1
  258. package/skills/tfx-codex-swarm/skill.json +1 -4
  259. package/skills/tfx-codex-swarm-workspace/iteration-1/benchmark.json +54 -12
  260. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/with_skill/grading.json +35 -7
  261. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/without_skill/grading.json +35 -7
  262. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/with_skill/grading.json +25 -5
  263. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/without_skill/grading.json +25 -5
  264. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/with_skill/grading.json +20 -4
  265. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/without_skill/grading.json +16 -4
  266. package/skills/tfx-consensus/SKILL.md.tmpl +146 -0
  267. package/skills/tfx-debate/SKILL.md.tmpl +192 -0
  268. package/skills/tfx-debate/skill.json +1 -7
  269. package/skills/tfx-deep-analysis/SKILL.md.tmpl +228 -0
  270. package/skills/tfx-deep-analysis/skill.json +1 -5
  271. package/skills/tfx-deep-interview/SKILL.md.tmpl +203 -0
  272. package/skills/tfx-deep-plan/SKILL.md.tmpl +282 -0
  273. package/skills/tfx-deep-qa/SKILL.md.tmpl +165 -0
  274. package/skills/tfx-deep-qa/skill.json +1 -6
  275. package/skills/tfx-deep-research/SKILL.md.tmpl +217 -0
  276. package/skills/tfx-deep-review/SKILL.md.tmpl +179 -0
  277. package/skills/tfx-doctor/SKILL.md +21 -0
  278. package/skills/tfx-doctor/SKILL.md.tmpl +172 -0
  279. package/skills/tfx-doctor/skill.json +1 -3
  280. package/skills/tfx-find/SKILL.md +1 -0
  281. package/skills/tfx-forge/SKILL.md.tmpl +187 -0
  282. package/skills/tfx-fullcycle/SKILL.md.tmpl +286 -0
  283. package/skills/tfx-fullcycle/skill.json +1 -6
  284. package/skills/tfx-gemini/SKILL.md.tmpl +91 -0
  285. package/skills/tfx-gemini/skill.json +1 -3
  286. package/skills/tfx-hooks/SKILL.md.tmpl +216 -0
  287. package/skills/tfx-hooks/skill.json +1 -3
  288. package/skills/tfx-hub/SKILL.md.tmpl +212 -0
  289. package/skills/tfx-hub/skill.json +1 -3
  290. package/skills/tfx-index/SKILL.md +1 -0
  291. package/skills/tfx-index/skill.json +1 -6
  292. package/skills/tfx-interview/SKILL.md.tmpl +285 -0
  293. package/skills/tfx-multi/SKILL.md.tmpl +183 -0
  294. package/skills/tfx-multi/skill.json +1 -3
  295. package/skills/tfx-panel/SKILL.md.tmpl +189 -0
  296. package/skills/tfx-panel/skill.json +1 -7
  297. package/skills/tfx-persist/SKILL.md.tmpl +270 -0
  298. package/skills/tfx-persist/skill.json +1 -7
  299. package/skills/tfx-plan/SKILL.md +1 -0
  300. package/skills/tfx-plan/skill.json +1 -6
  301. package/skills/tfx-profile/SKILL.md.tmpl +239 -0
  302. package/skills/tfx-profile/skill.json +1 -3
  303. package/skills/tfx-prune/SKILL.md.tmpl +200 -0
  304. package/skills/tfx-prune/skill.json +1 -7
  305. package/skills/tfx-psmux-rules/SKILL.md.tmpl +326 -0
  306. package/skills/tfx-psmux-rules/skill.json +1 -4
  307. package/skills/tfx-qa/SKILL.md +1 -0
  308. package/skills/tfx-qa/skill.json +1 -6
  309. package/skills/tfx-ralph/SKILL.md.tmpl +28 -0
  310. package/skills/tfx-ralph/skill.json +1 -4
  311. package/skills/tfx-remote-setup/SKILL.md.tmpl +576 -0
  312. package/skills/tfx-remote-setup/skill.json +1 -3
  313. package/skills/tfx-remote-spawn/SKILL.md.tmpl +263 -0
  314. package/skills/tfx-remote-spawn/references/hosts.json +16 -0
  315. package/skills/tfx-remote-spawn/skill.json +1 -4
  316. package/skills/tfx-research/SKILL.md +1 -0
  317. package/skills/tfx-review/SKILL.md +1 -0
  318. package/skills/tfx-review/skill.json +1 -6
  319. package/skills/tfx-setup/SKILL.md.tmpl +504 -0
  320. package/skills/tfx-setup/skill.json +1 -3
  321. package/skills/tfx-swarm/SKILL.md +22 -0
  322. package/skills/tfx-swarm/SKILL.md.tmpl +218 -0
  323. package/tui/codex-profile.mjs +88 -33
  324. package/tui/core.mjs +45 -15
  325. package/tui/doctor.mjs +75 -28
  326. package/tui/gemini-profile.mjs +74 -29
  327. package/tui/monitor-data.mjs +8 -4
  328. package/tui/monitor.mjs +71 -27
  329. package/tui/setup.mjs +133 -42
package/tui/setup.mjs CHANGED
@@ -1,17 +1,34 @@
1
1
  #!/usr/bin/env node
2
2
  // tui/setup.mjs — Interactive triflux setup wizard TUI
3
3
  import { execFileSync } from "node:child_process";
4
- import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync, readdirSync } 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
+ import { DEFAULT_GEMINI_PROFILES } from "../scripts/lib/gemini-profiles.mjs";
8
9
  import {
9
- clear, box, table, divider, label, ok, warn, fail, info,
10
- select, confirm, spinner, sleep,
11
- RESET, DIM, BOLD, CYAN, AMBER, GREEN, RED, YELLOW, WHITE, GRAY,
12
- onExit, showCursor,
10
+ AMBER,
11
+ BOLD,
12
+ box,
13
+ CYAN,
14
+ clear,
15
+ confirm,
16
+ DIM,
17
+ divider,
18
+ fail,
19
+ GRAY,
20
+ GREEN,
21
+ info,
22
+ ok,
23
+ onExit,
24
+ RESET,
25
+ select,
26
+ showCursor,
27
+ spinner,
28
+ table,
29
+ warn,
30
+ YELLOW,
13
31
  } from "./core.mjs";
14
- import { DEFAULT_GEMINI_PROFILES } from "../scripts/lib/gemini-profiles.mjs";
15
32
 
16
33
  const PKG_ROOT = dirname(dirname(fileURLToPath(import.meta.url)));
17
34
  const CLAUDE_DIR = join(homedir(), ".claude");
@@ -22,21 +39,30 @@ const SETTINGS_PATH = join(CLAUDE_DIR, "settings.json");
22
39
  // ── Step Definitions ──
23
40
 
24
41
  const STEPS = [
25
- { id: "sync", name: "파일 동기화", desc: "스크립트/HUD/스킬을 ~/.claude/에 배포" },
26
- { id: "hud", name: "HUD 설정", desc: "settings.json에 statusLine 등록" },
27
- { id: "profiles", name: "Codex 프로파일", desc: "필수 프로파일 생성/확인" },
28
- { id: "gemini-profiles", name: "Gemini 프로필", desc: "triflux-profiles.json 생성/확인" },
29
- { id: "cli", name: "CLI 진단", desc: "Codex/Gemini/Claude CLI 확인" },
30
- { id: "mcp", name: "MCP 서버 확인", desc: "MCP 서버 인벤토리 점검" },
42
+ {
43
+ id: "sync",
44
+ name: "파일 동기화",
45
+ desc: "스크립트/HUD/스킬을 ~/.claude/에 배포",
46
+ },
47
+ { id: "hud", name: "HUD 설정", desc: "settings.json에 statusLine 등록" },
48
+ { id: "profiles", name: "Codex 프로파일", desc: "필수 프로파일 생성/확인" },
49
+ {
50
+ id: "gemini-profiles",
51
+ name: "Gemini 프로필",
52
+ desc: "triflux-profiles.json 생성/확인",
53
+ },
54
+ { id: "cli", name: "CLI 진단", desc: "Codex/Gemini/Claude CLI 확인" },
55
+ { id: "mcp", name: "MCP 서버 확인", desc: "MCP 서버 인벤토리 점검" },
31
56
  ];
32
57
 
33
58
  // ── Step Implementations ──
34
59
 
35
60
  function stepSync() {
36
61
  try {
37
- const out = execFileSync(process.execPath,
62
+ const _out = execFileSync(
63
+ process.execPath,
38
64
  [join(PKG_ROOT, "bin", "triflux.mjs"), "setup", "--json"],
39
- { timeout: 30000, encoding: "utf8", windowsHide: true }
65
+ { timeout: 30000, encoding: "utf8", windowsHide: true },
40
66
  );
41
67
  return { ok: true, detail: "파일 동기화 완료" };
42
68
  } catch (e) {
@@ -52,7 +78,9 @@ function stepHud() {
52
78
 
53
79
  const raw = readFileSync(SETTINGS_PATH, "utf8");
54
80
  let settings;
55
- try { settings = JSON.parse(raw); } catch {
81
+ try {
82
+ settings = JSON.parse(raw);
83
+ } catch {
56
84
  return { ok: false, detail: "settings.json 파싱 실패", action: "fix" };
57
85
  }
58
86
 
@@ -61,12 +89,18 @@ function stepHud() {
61
89
 
62
90
  // Check if statusLine already configured correctly
63
91
  if (settings.statusLine?.command?.includes("hud-qos-status")) {
64
- return { ok: true, detail: "statusLine 이미 설정됨", current: settings.statusLine };
92
+ return {
93
+ ok: true,
94
+ detail: "statusLine 이미 설정됨",
95
+ current: settings.statusLine,
96
+ };
65
97
  }
66
98
 
67
99
  return {
68
100
  ok: false,
69
- detail: settings.statusLine ? "statusLine이 다른 HUD를 가리킴" : "statusLine 미설정",
101
+ detail: settings.statusLine
102
+ ? "statusLine이 다른 HUD를 가리킴"
103
+ : "statusLine 미설정",
70
104
  action: "configure",
71
105
  current: settings.statusLine || null,
72
106
  target: {
@@ -96,14 +130,23 @@ function stepProfiles() {
96
130
  return { ok: true, detail: `필수 프로파일 ${required.length}개 확인됨` };
97
131
  }
98
132
 
99
- return { ok: false, detail: `누락: ${missing.join(", ")}`, missing, action: "create" };
133
+ return {
134
+ ok: false,
135
+ detail: `누락: ${missing.join(", ")}`,
136
+ missing,
137
+ action: "create",
138
+ };
100
139
  }
101
140
 
102
141
  function stepGeminiProfiles() {
103
142
  const configPath = join(GEMINI_DIR, "triflux-profiles.json");
104
143
  if (!existsSync(configPath)) {
105
144
  if (!existsSync(GEMINI_DIR)) mkdirSync(GEMINI_DIR, { recursive: true });
106
- writeFileSync(configPath, JSON.stringify(DEFAULT_GEMINI_PROFILES, null, 2) + "\n", "utf8");
145
+ writeFileSync(
146
+ configPath,
147
+ JSON.stringify(DEFAULT_GEMINI_PROFILES, null, 2) + "\n",
148
+ "utf8",
149
+ );
107
150
  return {
108
151
  ok: true,
109
152
  detail: `기본 프로필 ${Object.keys(DEFAULT_GEMINI_PROFILES.profiles).length}개 자동 생성됨`,
@@ -119,9 +162,17 @@ function stepGeminiProfiles() {
119
162
  const count = Object.keys(cfg.profiles || {}).length;
120
163
  return { ok: true, detail: `프로필 ${count}개 확인됨` };
121
164
  }
122
- return { ok: false, detail: `누락: ${missing.join(", ")}`, action: "update" };
165
+ return {
166
+ ok: false,
167
+ detail: `누락: ${missing.join(", ")}`,
168
+ action: "update",
169
+ };
123
170
  } catch {
124
- return { ok: false, detail: "triflux-profiles.json 파싱 실패", action: "recreate" };
171
+ return {
172
+ ok: false,
173
+ detail: "triflux-profiles.json 파싱 실패",
174
+ action: "recreate",
175
+ };
125
176
  }
126
177
  }
127
178
 
@@ -134,7 +185,9 @@ function stepCli() {
134
185
  ]) {
135
186
  try {
136
187
  execFileSync(process.platform === "win32" ? "where" : "which", [name], {
137
- timeout: 5000, encoding: "utf8", stdio: ["pipe", "pipe", "pipe"],
188
+ timeout: 5000,
189
+ encoding: "utf8",
190
+ stdio: ["pipe", "pipe", "pipe"],
138
191
  });
139
192
  results.push({ name, found: true });
140
193
  } catch {
@@ -142,7 +195,11 @@ function stepCli() {
142
195
  }
143
196
  }
144
197
  const allFound = results.every((r) => r.found);
145
- return { ok: allFound, results, detail: allFound ? "모든 CLI 확인됨" : "일부 CLI 미설치" };
198
+ return {
199
+ ok: allFound,
200
+ results,
201
+ detail: allFound ? "모든 CLI 확인됨" : "일부 CLI 미설치",
202
+ };
146
203
  }
147
204
 
148
205
  function stepMcp() {
@@ -159,7 +216,14 @@ function stepMcp() {
159
216
  }
160
217
  }
161
218
 
162
- const STEP_RUNNERS = { sync: stepSync, hud: stepHud, profiles: stepProfiles, "gemini-profiles": stepGeminiProfiles, cli: stepCli, mcp: stepMcp };
219
+ const STEP_RUNNERS = {
220
+ sync: stepSync,
221
+ hud: stepHud,
222
+ profiles: stepProfiles,
223
+ "gemini-profiles": stepGeminiProfiles,
224
+ cli: stepCli,
225
+ mcp: stepMcp,
226
+ };
163
227
 
164
228
  // ── UI ──
165
229
 
@@ -182,7 +246,9 @@ async function runWizard() {
182
246
  const step = STEPS[i];
183
247
  const progress = `${DIM}[${i + 1}/${STEPS.length}]${RESET}`;
184
248
 
185
- console.log(` ${progress} ${BOLD}${step.name}${RESET} ${DIM}— ${step.desc}${RESET}`);
249
+ console.log(
250
+ ` ${progress} ${BOLD}${step.name}${RESET} ${DIM}— ${step.desc}${RESET}`,
251
+ );
186
252
 
187
253
  const spin = spinner(`${step.name} 실행 중...`);
188
254
  const result = STEP_RUNNERS[step.id]();
@@ -208,7 +274,8 @@ async function handleStepFix(step, result) {
208
274
  if (result.action === "configure") {
209
275
  if (result.current) {
210
276
  warn(`현재 statusLine: ${JSON.stringify(result.current)}`);
211
- if (!(await confirm("triflux HUD로 덮어쓰시겠습니까?", false))) return;
277
+ if (!(await confirm("triflux HUD로 덮어쓰시겠습니까?", false)))
278
+ return;
212
279
  } else {
213
280
  if (!(await confirm("statusLine을 설정하시겠습니까?"))) return;
214
281
  }
@@ -216,7 +283,11 @@ async function handleStepFix(step, result) {
216
283
  const raw = readFileSync(SETTINGS_PATH, "utf8");
217
284
  const settings = JSON.parse(raw);
218
285
  settings.statusLine = result.target;
219
- writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2), "utf8");
286
+ writeFileSync(
287
+ SETTINGS_PATH,
288
+ JSON.stringify(settings, null, 2),
289
+ "utf8",
290
+ );
220
291
  ok("statusLine 설정 완료");
221
292
  } catch (e) {
222
293
  fail(`설정 실패: ${e.message}`);
@@ -227,11 +298,16 @@ async function handleStepFix(step, result) {
227
298
 
228
299
  case "profiles": {
229
300
  if (result.action === "create" && result.missing) {
230
- if (await confirm(`누락된 프로파일 ${result.missing.length}개를 생성하시겠습니까?`)) {
301
+ if (
302
+ await confirm(
303
+ `누락된 프로파일 ${result.missing.length}개를 생성하시겠습니까?`,
304
+ )
305
+ ) {
231
306
  try {
232
- execFileSync(process.execPath,
307
+ execFileSync(
308
+ process.execPath,
233
309
  [join(PKG_ROOT, "bin", "triflux.mjs"), "setup"],
234
- { timeout: 15000, stdio: "ignore", windowsHide: true }
310
+ { timeout: 15000, stdio: "ignore", windowsHide: true },
235
311
  );
236
312
  ok("프로파일 생성 완료");
237
313
  } catch {
@@ -248,7 +324,11 @@ async function handleStepFix(step, result) {
248
324
  const mcpCheck = join(PKG_ROOT, "scripts", "mcp-check.mjs");
249
325
  if (existsSync(mcpCheck)) {
250
326
  try {
251
- execFileSync(process.execPath, [mcpCheck], { timeout: 15000, stdio: "ignore", windowsHide: true });
327
+ execFileSync(process.execPath, [mcpCheck], {
328
+ timeout: 15000,
329
+ stdio: "ignore",
330
+ windowsHide: true,
331
+ });
252
332
  ok("MCP 인벤토리 재생성 완료");
253
333
  } catch {
254
334
  warn("MCP 인벤토리 재생성 실패 — 다음 세션에서 자동 재시도");
@@ -326,14 +406,18 @@ async function starRequest() {
326
406
  let ghOk = false;
327
407
  try {
328
408
  execFileSync("gh", ["auth", "status"], {
329
- timeout: 5000, encoding: "utf8", stdio: ["pipe", "pipe", "pipe"],
409
+ timeout: 5000,
410
+ encoding: "utf8",
411
+ stdio: ["pipe", "pipe", "pipe"],
330
412
  });
331
413
  ghOk = true;
332
414
  } catch {}
333
415
 
334
416
  if (!ghOk) {
335
417
  console.log();
336
- info(`${AMBER}⭐${RESET} 하나가 큰 차이를 만듭니다. ${CYAN}https://github.com/tellang/triflux${RESET}`);
418
+ info(
419
+ `${AMBER}⭐${RESET} 하나가 큰 차이를 만듭니다. ${CYAN}https://github.com/tellang/triflux${RESET}`,
420
+ );
337
421
  console.log();
338
422
  return;
339
423
  }
@@ -342,7 +426,9 @@ async function starRequest() {
342
426
  let alreadyStarred = false;
343
427
  try {
344
428
  execFileSync("gh", ["api", "user/starred/tellang/triflux"], {
345
- timeout: 5000, encoding: "utf8", stdio: ["pipe", "pipe", "pipe"],
429
+ timeout: 5000,
430
+ encoding: "utf8",
431
+ stdio: ["pipe", "pipe", "pipe"],
346
432
  });
347
433
  alreadyStarred = true;
348
434
  } catch {}
@@ -357,9 +443,14 @@ async function starRequest() {
357
443
 
358
444
  if (await confirm(`${AMBER}⭐${RESET} 하나가 큰 차이를 만듭니다.`, false)) {
359
445
  try {
360
- execFileSync("gh", ["api", "-X", "PUT", "/user/starred/tellang/triflux"], {
361
- timeout: 5000, stdio: ["pipe", "pipe", "pipe"],
362
- });
446
+ execFileSync(
447
+ "gh",
448
+ ["api", "-X", "PUT", "/user/starred/tellang/triflux"],
449
+ {
450
+ timeout: 5000,
451
+ stdio: ["pipe", "pipe", "pipe"],
452
+ },
453
+ );
363
454
  ok(`함께해 주셔서 감사합니다. ${AMBER}⭐${RESET}`);
364
455
  } catch {
365
456
  info(`${CYAN}https://github.com/tellang/triflux${RESET}`);
@@ -373,10 +464,10 @@ async function starRequest() {
373
464
  // ── Main Menu ──
374
465
 
375
466
  const MENU = [
376
- { label: "전체 설정 (Full Setup)", hint: "6단계 순서 실행" },
377
- { label: "단계별 선택 (Selective)", hint: "특정 단계만 실행" },
378
- { label: "현재 상태 확인 (Status)", hint: "설정 없이 진단만" },
379
- { label: "종료", hint: "Ctrl+C" },
467
+ { label: "전체 설정 (Full Setup)", hint: "6단계 순서 실행" },
468
+ { label: "단계별 선택 (Selective)", hint: "특정 단계만 실행" },
469
+ { label: "현재 상태 확인 (Status)", hint: "설정 없이 진단만" },
470
+ { label: "종료", hint: "Ctrl+C" },
380
471
  ];
381
472
 
382
473
  async function main() {