@su-record/vibe 2.5.11 → 2.5.13

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 (341) hide show
  1. package/CLAUDE.md +243 -0
  2. package/LICENSE +21 -21
  3. package/README.md +262 -262
  4. package/agents/architect-low.md +41 -41
  5. package/agents/architect-medium.md +59 -59
  6. package/agents/architect.md +80 -80
  7. package/agents/build-error-resolver.md +115 -115
  8. package/agents/compounder.md +261 -261
  9. package/agents/diagrammer.md +178 -178
  10. package/agents/e2e-tester.md +266 -266
  11. package/agents/explorer-low.md +42 -42
  12. package/agents/explorer-medium.md +59 -59
  13. package/agents/explorer.md +48 -48
  14. package/agents/implementer-low.md +43 -43
  15. package/agents/implementer-medium.md +52 -52
  16. package/agents/implementer.md +54 -54
  17. package/agents/refactor-cleaner.md +143 -143
  18. package/agents/research/best-practices-agent.md +189 -189
  19. package/agents/research/codebase-patterns-agent.md +147 -147
  20. package/agents/research/framework-docs-agent.md +178 -178
  21. package/agents/research/security-advisory-agent.md +203 -203
  22. package/agents/review/architecture-reviewer.md +107 -107
  23. package/agents/review/complexity-reviewer.md +116 -116
  24. package/agents/review/data-integrity-reviewer.md +88 -88
  25. package/agents/review/git-history-reviewer.md +103 -103
  26. package/agents/review/performance-reviewer.md +86 -86
  27. package/agents/review/python-reviewer.md +150 -150
  28. package/agents/review/rails-reviewer.md +139 -139
  29. package/agents/review/react-reviewer.md +144 -144
  30. package/agents/review/security-reviewer.md +80 -80
  31. package/agents/review/simplicity-reviewer.md +140 -140
  32. package/agents/review/test-coverage-reviewer.md +116 -116
  33. package/agents/review/typescript-reviewer.md +127 -127
  34. package/agents/searcher.md +54 -54
  35. package/agents/simplifier.md +120 -120
  36. package/agents/tester.md +49 -49
  37. package/agents/ui-previewer.md +129 -129
  38. package/commands/vibe.analyze.md +356 -356
  39. package/commands/vibe.reason.md +329 -329
  40. package/commands/vibe.review.md +326 -326
  41. package/commands/vibe.run.md +1117 -1051
  42. package/commands/vibe.spec.md +1058 -1058
  43. package/commands/vibe.utils.md +353 -296
  44. package/commands/vibe.verify.md +375 -375
  45. package/dist/cli/collaborator.js +52 -52
  46. package/dist/cli/detect.js +32 -32
  47. package/dist/cli/index.js +102 -102
  48. package/dist/cli/llm.js +144 -144
  49. package/dist/cli/mcp.d.ts +49 -0
  50. package/dist/cli/mcp.d.ts.map +1 -0
  51. package/dist/cli/mcp.js +169 -0
  52. package/dist/cli/mcp.js.map +1 -0
  53. package/dist/cli/postinstall.js +180 -2
  54. package/dist/cli/postinstall.js.map +1 -1
  55. package/dist/cli/setup/GlobalInstaller.d.ts +24 -0
  56. package/dist/cli/setup/GlobalInstaller.d.ts.map +1 -0
  57. package/dist/cli/setup/GlobalInstaller.js +130 -0
  58. package/dist/cli/setup/GlobalInstaller.js.map +1 -0
  59. package/dist/cli/setup/LanguageDetector.d.ts +16 -0
  60. package/dist/cli/setup/LanguageDetector.d.ts.map +1 -0
  61. package/dist/cli/setup/LanguageDetector.js +49 -0
  62. package/dist/cli/setup/LanguageDetector.js.map +1 -0
  63. package/dist/cli/setup/LegacyMigration.d.ts +25 -0
  64. package/dist/cli/setup/LegacyMigration.d.ts.map +1 -0
  65. package/dist/cli/setup/LegacyMigration.js +162 -0
  66. package/dist/cli/setup/LegacyMigration.js.map +1 -0
  67. package/dist/cli/setup/ProjectSetup.d.ts +30 -0
  68. package/dist/cli/setup/ProjectSetup.d.ts.map +1 -0
  69. package/dist/cli/setup/ProjectSetup.js +238 -0
  70. package/dist/cli/setup/ProjectSetup.js.map +1 -0
  71. package/dist/cli/setup/index.d.ts +14 -0
  72. package/dist/cli/setup/index.d.ts.map +1 -0
  73. package/dist/cli/setup/index.js +18 -0
  74. package/dist/cli/setup/index.js.map +1 -0
  75. package/dist/cli/setup.d.ts +10 -77
  76. package/dist/cli/setup.d.ts.map +1 -1
  77. package/dist/cli/setup.js +15 -592
  78. package/dist/cli/setup.js.map +1 -1
  79. package/dist/lib/DeepInit.d.ts +0 -2
  80. package/dist/lib/DeepInit.d.ts.map +1 -1
  81. package/dist/lib/DeepInit.js +24 -26
  82. package/dist/lib/DeepInit.js.map +1 -1
  83. package/dist/lib/IterationTracker.d.ts +0 -2
  84. package/dist/lib/IterationTracker.d.ts.map +1 -1
  85. package/dist/lib/IterationTracker.js +11 -13
  86. package/dist/lib/IterationTracker.js.map +1 -1
  87. package/dist/lib/ModelRouter.d.ts +0 -2
  88. package/dist/lib/ModelRouter.d.ts.map +1 -1
  89. package/dist/lib/ModelRouter.js +0 -2
  90. package/dist/lib/ModelRouter.js.map +1 -1
  91. package/dist/lib/OrchestrateWorkflow.d.ts +1 -3
  92. package/dist/lib/OrchestrateWorkflow.d.ts.map +1 -1
  93. package/dist/lib/OrchestrateWorkflow.js +1 -3
  94. package/dist/lib/OrchestrateWorkflow.js.map +1 -1
  95. package/dist/lib/PythonParser.js +108 -108
  96. package/dist/lib/SkillFrontmatter.d.ts +0 -2
  97. package/dist/lib/SkillFrontmatter.d.ts.map +1 -1
  98. package/dist/lib/SkillFrontmatter.js +28 -30
  99. package/dist/lib/SkillFrontmatter.js.map +1 -1
  100. package/dist/lib/SkillQualityGate.d.ts +0 -2
  101. package/dist/lib/SkillQualityGate.d.ts.map +1 -1
  102. package/dist/lib/SkillQualityGate.js +9 -11
  103. package/dist/lib/SkillQualityGate.js.map +1 -1
  104. package/dist/lib/SkillRepository.d.ts +117 -0
  105. package/dist/lib/SkillRepository.d.ts.map +1 -0
  106. package/dist/lib/SkillRepository.js +477 -0
  107. package/dist/lib/SkillRepository.js.map +1 -0
  108. package/dist/lib/UltraQA.d.ts +0 -2
  109. package/dist/lib/UltraQA.d.ts.map +1 -1
  110. package/dist/lib/UltraQA.js +77 -79
  111. package/dist/lib/UltraQA.js.map +1 -1
  112. package/dist/lib/gemini-mcp.d.ts +10 -0
  113. package/dist/lib/gemini-mcp.d.ts.map +1 -0
  114. package/dist/lib/gemini-mcp.js +353 -0
  115. package/dist/lib/gemini-mcp.js.map +1 -0
  116. package/dist/lib/gpt-api.js +4 -4
  117. package/dist/lib/gpt-mcp.d.ts +10 -0
  118. package/dist/lib/gpt-mcp.d.ts.map +1 -0
  119. package/dist/lib/gpt-mcp.js +352 -0
  120. package/dist/lib/gpt-mcp.js.map +1 -0
  121. package/dist/lib/llm/auth/ApiKeyManager.d.ts +21 -0
  122. package/dist/lib/llm/auth/ApiKeyManager.d.ts.map +1 -0
  123. package/dist/lib/llm/auth/ApiKeyManager.js +43 -0
  124. package/dist/lib/llm/auth/ApiKeyManager.js.map +1 -0
  125. package/dist/lib/llm/auth/ConfigManager.d.ts +29 -0
  126. package/dist/lib/llm/auth/ConfigManager.d.ts.map +1 -0
  127. package/dist/lib/llm/auth/ConfigManager.js +67 -0
  128. package/dist/lib/llm/auth/ConfigManager.js.map +1 -0
  129. package/dist/lib/llm/auth/index.d.ts +25 -0
  130. package/dist/lib/llm/auth/index.d.ts.map +1 -0
  131. package/dist/lib/llm/auth/index.js +83 -0
  132. package/dist/lib/llm/auth/index.js.map +1 -0
  133. package/dist/lib/llm/index.d.ts +10 -0
  134. package/dist/lib/llm/index.d.ts.map +1 -0
  135. package/dist/lib/llm/index.js +12 -0
  136. package/dist/lib/llm/index.js.map +1 -0
  137. package/dist/lib/llm/types.d.ts +96 -0
  138. package/dist/lib/llm/types.d.ts.map +1 -0
  139. package/dist/lib/llm/types.js +17 -0
  140. package/dist/lib/llm/types.js.map +1 -0
  141. package/dist/lib/llm/utils/index.d.ts +6 -0
  142. package/dist/lib/llm/utils/index.d.ts.map +1 -0
  143. package/dist/lib/llm/utils/index.js +6 -0
  144. package/dist/lib/llm/utils/index.js.map +1 -0
  145. package/dist/lib/llm/utils/retry.d.ts +25 -0
  146. package/dist/lib/llm/utils/retry.d.ts.map +1 -0
  147. package/dist/lib/llm/utils/retry.js +72 -0
  148. package/dist/lib/llm/utils/retry.js.map +1 -0
  149. package/dist/lib/llm/utils/stream.d.ts +13 -0
  150. package/dist/lib/llm/utils/stream.d.ts.map +1 -0
  151. package/dist/lib/llm/utils/stream.js +110 -0
  152. package/dist/lib/llm/utils/stream.js.map +1 -0
  153. package/dist/lib/memory/KnowledgeGraph.js +4 -4
  154. package/dist/lib/memory/MemorySearch.js +20 -20
  155. package/dist/lib/memory/MemoryStorage.js +64 -64
  156. package/dist/orchestrator/AgentExecutor.d.ts +23 -0
  157. package/dist/orchestrator/AgentExecutor.d.ts.map +1 -0
  158. package/dist/orchestrator/AgentExecutor.js +231 -0
  159. package/dist/orchestrator/AgentExecutor.js.map +1 -0
  160. package/dist/orchestrator/AgentManager.d.ts +73 -0
  161. package/dist/orchestrator/AgentManager.d.ts.map +1 -0
  162. package/dist/orchestrator/AgentManager.js +184 -0
  163. package/dist/orchestrator/AgentManager.js.map +1 -0
  164. package/dist/orchestrator/LLMCluster.d.ts +70 -0
  165. package/dist/orchestrator/LLMCluster.d.ts.map +1 -0
  166. package/dist/orchestrator/LLMCluster.js +91 -0
  167. package/dist/orchestrator/LLMCluster.js.map +1 -0
  168. package/dist/orchestrator/MultiLlmResearch.d.ts +27 -0
  169. package/dist/orchestrator/MultiLlmResearch.d.ts.map +1 -0
  170. package/dist/orchestrator/MultiLlmResearch.js +145 -0
  171. package/dist/orchestrator/MultiLlmResearch.js.map +1 -0
  172. package/dist/orchestrator/SessionStore.d.ts +41 -0
  173. package/dist/orchestrator/SessionStore.d.ts.map +1 -0
  174. package/dist/orchestrator/SessionStore.js +117 -0
  175. package/dist/orchestrator/SessionStore.js.map +1 -0
  176. package/dist/orchestrator/SmartRouter.d.ts +68 -0
  177. package/dist/orchestrator/SmartRouter.d.ts.map +1 -0
  178. package/dist/orchestrator/SmartRouter.js +256 -0
  179. package/dist/orchestrator/SmartRouter.js.map +1 -0
  180. package/dist/orchestrator/backgroundAgent.d.ts +10 -28
  181. package/dist/orchestrator/backgroundAgent.d.ts.map +1 -1
  182. package/dist/orchestrator/backgroundAgent.js +11 -346
  183. package/dist/orchestrator/backgroundAgent.js.map +1 -1
  184. package/dist/orchestrator/index.d.ts +3 -0
  185. package/dist/orchestrator/index.d.ts.map +1 -1
  186. package/dist/orchestrator/index.js +4 -0
  187. package/dist/orchestrator/index.js.map +1 -1
  188. package/dist/orchestrator/orchestrator.d.ts +19 -154
  189. package/dist/orchestrator/orchestrator.d.ts.map +1 -1
  190. package/dist/orchestrator/orchestrator.js +90 -514
  191. package/dist/orchestrator/orchestrator.js.map +1 -1
  192. package/dist/orchestrator/parallelResearch.d.ts +5 -12
  193. package/dist/orchestrator/parallelResearch.d.ts.map +1 -1
  194. package/dist/orchestrator/parallelResearch.js +10 -193
  195. package/dist/orchestrator/parallelResearch.js.map +1 -1
  196. package/dist/tools/analytics/getUsageAnalytics.d.ts +10 -0
  197. package/dist/tools/analytics/getUsageAnalytics.d.ts.map +1 -0
  198. package/dist/tools/analytics/getUsageAnalytics.js +246 -0
  199. package/dist/tools/analytics/getUsageAnalytics.js.map +1 -0
  200. package/dist/tools/analytics/index.d.ts +5 -0
  201. package/dist/tools/analytics/index.d.ts.map +1 -0
  202. package/dist/tools/analytics/index.js +5 -0
  203. package/dist/tools/analytics/index.js.map +1 -0
  204. package/dist/tools/convention/analyzeComplexity.test.js +115 -115
  205. package/dist/tools/convention/getCodingGuide.d.ts +7 -0
  206. package/dist/tools/convention/getCodingGuide.d.ts.map +1 -0
  207. package/dist/tools/convention/getCodingGuide.js +69 -0
  208. package/dist/tools/convention/getCodingGuide.js.map +1 -0
  209. package/dist/tools/convention/validateCodeQuality.test.js +104 -104
  210. package/dist/tools/index.d.ts +2 -0
  211. package/dist/tools/index.d.ts.map +1 -1
  212. package/dist/tools/index.js +2 -0
  213. package/dist/tools/index.js.map +1 -1
  214. package/dist/tools/planning/analyzeRequirements.d.ts +9 -0
  215. package/dist/tools/planning/analyzeRequirements.d.ts.map +1 -0
  216. package/dist/tools/planning/analyzeRequirements.js +171 -0
  217. package/dist/tools/planning/analyzeRequirements.js.map +1 -0
  218. package/dist/tools/planning/createUserStories.d.ts +9 -0
  219. package/dist/tools/planning/createUserStories.d.ts.map +1 -0
  220. package/dist/tools/planning/createUserStories.js +124 -0
  221. package/dist/tools/planning/createUserStories.js.map +1 -0
  222. package/dist/tools/planning/featureRoadmap.d.ts +10 -0
  223. package/dist/tools/planning/featureRoadmap.d.ts.map +1 -0
  224. package/dist/tools/planning/featureRoadmap.js +207 -0
  225. package/dist/tools/planning/featureRoadmap.js.map +1 -0
  226. package/dist/tools/planning/generatePrd.d.ts +11 -0
  227. package/dist/tools/planning/generatePrd.d.ts.map +1 -0
  228. package/dist/tools/planning/generatePrd.js +161 -0
  229. package/dist/tools/planning/generatePrd.js.map +1 -0
  230. package/dist/tools/planning/index.d.ts +8 -0
  231. package/dist/tools/planning/index.d.ts.map +1 -0
  232. package/dist/tools/planning/index.js +8 -0
  233. package/dist/tools/planning/index.js.map +1 -0
  234. package/dist/tools/prompt/analyzePrompt.d.ts +7 -0
  235. package/dist/tools/prompt/analyzePrompt.d.ts.map +1 -0
  236. package/dist/tools/prompt/analyzePrompt.js +150 -0
  237. package/dist/tools/prompt/analyzePrompt.js.map +1 -0
  238. package/dist/tools/prompt/enhancePrompt.d.ts +8 -0
  239. package/dist/tools/prompt/enhancePrompt.d.ts.map +1 -0
  240. package/dist/tools/prompt/enhancePrompt.js +110 -0
  241. package/dist/tools/prompt/enhancePrompt.js.map +1 -0
  242. package/dist/tools/prompt/enhancePromptGemini.d.ts +8 -0
  243. package/dist/tools/prompt/enhancePromptGemini.d.ts.map +1 -0
  244. package/dist/tools/prompt/enhancePromptGemini.js +332 -0
  245. package/dist/tools/prompt/enhancePromptGemini.js.map +1 -0
  246. package/dist/tools/prompt/index.d.ts +7 -0
  247. package/dist/tools/prompt/index.d.ts.map +1 -0
  248. package/dist/tools/prompt/index.js +7 -0
  249. package/dist/tools/prompt/index.js.map +1 -0
  250. package/dist/tools/reasoning/applyReasoningFramework.d.ts +8 -0
  251. package/dist/tools/reasoning/applyReasoningFramework.d.ts.map +1 -0
  252. package/dist/tools/reasoning/applyReasoningFramework.js +266 -0
  253. package/dist/tools/reasoning/applyReasoningFramework.js.map +1 -0
  254. package/dist/tools/reasoning/index.d.ts +5 -0
  255. package/dist/tools/reasoning/index.d.ts.map +1 -0
  256. package/dist/tools/reasoning/index.js +5 -0
  257. package/dist/tools/reasoning/index.js.map +1 -0
  258. package/dist/tools/thinking/analyzeProblem.d.ts +7 -0
  259. package/dist/tools/thinking/analyzeProblem.d.ts.map +1 -0
  260. package/dist/tools/thinking/analyzeProblem.js +55 -0
  261. package/dist/tools/thinking/analyzeProblem.js.map +1 -0
  262. package/dist/tools/thinking/breakDownProblem.d.ts +8 -0
  263. package/dist/tools/thinking/breakDownProblem.d.ts.map +1 -0
  264. package/dist/tools/thinking/breakDownProblem.js +145 -0
  265. package/dist/tools/thinking/breakDownProblem.js.map +1 -0
  266. package/dist/tools/thinking/createThinkingChain.d.ts +7 -0
  267. package/dist/tools/thinking/createThinkingChain.d.ts.map +1 -0
  268. package/dist/tools/thinking/createThinkingChain.js +44 -0
  269. package/dist/tools/thinking/createThinkingChain.js.map +1 -0
  270. package/dist/tools/thinking/formatAsPlan.d.ts +9 -0
  271. package/dist/tools/thinking/formatAsPlan.d.ts.map +1 -0
  272. package/dist/tools/thinking/formatAsPlan.js +78 -0
  273. package/dist/tools/thinking/formatAsPlan.js.map +1 -0
  274. package/dist/tools/thinking/index.d.ts +10 -0
  275. package/dist/tools/thinking/index.d.ts.map +1 -0
  276. package/dist/tools/thinking/index.js +10 -0
  277. package/dist/tools/thinking/index.js.map +1 -0
  278. package/dist/tools/thinking/stepByStepAnalysis.d.ts +8 -0
  279. package/dist/tools/thinking/stepByStepAnalysis.d.ts.map +1 -0
  280. package/dist/tools/thinking/stepByStepAnalysis.js +63 -0
  281. package/dist/tools/thinking/stepByStepAnalysis.js.map +1 -0
  282. package/dist/tools/thinking/thinkAloudProcess.d.ts +8 -0
  283. package/dist/tools/thinking/thinkAloudProcess.d.ts.map +1 -0
  284. package/dist/tools/thinking/thinkAloudProcess.js +80 -0
  285. package/dist/tools/thinking/thinkAloudProcess.js.map +1 -0
  286. package/hooks/hooks.json +222 -222
  287. package/hooks/scripts/code-check.js +22 -22
  288. package/hooks/scripts/code-review.js +22 -22
  289. package/hooks/scripts/complexity.js +22 -22
  290. package/hooks/scripts/compound.js +23 -23
  291. package/hooks/scripts/context-save.js +33 -33
  292. package/hooks/scripts/generate-brand-assets.js +472 -0
  293. package/hooks/scripts/hud-multiline.js +262 -264
  294. package/hooks/scripts/hud-status.js +291 -293
  295. package/hooks/scripts/keyword-detector.js +214 -216
  296. package/hooks/scripts/llm-orchestrate.js +171 -171
  297. package/hooks/scripts/post-edit.js +97 -97
  298. package/hooks/scripts/post-tool-verify.js +210 -212
  299. package/hooks/scripts/pre-tool-guard.js +125 -127
  300. package/hooks/scripts/recall.js +22 -22
  301. package/hooks/scripts/session-start.js +30 -30
  302. package/hooks/scripts/skill-injector.js +191 -193
  303. package/hooks/scripts/utils.js +97 -97
  304. package/languages/csharp-unity.md +515 -515
  305. package/languages/gdscript-godot.md +470 -470
  306. package/languages/ruby-rails.md +489 -489
  307. package/languages/typescript-angular.md +433 -433
  308. package/languages/typescript-astro.md +416 -416
  309. package/languages/typescript-electron.md +406 -406
  310. package/languages/typescript-nestjs.md +524 -524
  311. package/languages/typescript-svelte.md +407 -407
  312. package/languages/typescript-tauri.md +365 -365
  313. package/package.json +83 -83
  314. package/skills/brand-assets.md +141 -0
  315. package/skills/commerce-patterns.md +361 -0
  316. package/skills/context7-usage.md +102 -102
  317. package/skills/e2e-commerce.md +304 -0
  318. package/skills/frontend-design.md +92 -0
  319. package/skills/git-worktree.md +181 -181
  320. package/skills/parallel-research.md +77 -77
  321. package/skills/priority-todos.md +239 -239
  322. package/skills/seo-checklist.md +244 -0
  323. package/skills/tool-fallback.md +190 -190
  324. package/skills/vibe-capabilities.md +161 -161
  325. package/vibe/constitution.md +227 -227
  326. package/vibe/rules/core/communication-guide.md +98 -98
  327. package/vibe/rules/core/development-philosophy.md +52 -52
  328. package/vibe/rules/core/quick-start.md +102 -102
  329. package/vibe/rules/quality/bdd-contract-testing.md +393 -393
  330. package/vibe/rules/quality/checklist.md +276 -276
  331. package/vibe/rules/quality/testing-strategy.md +440 -440
  332. package/vibe/rules/standards/anti-patterns.md +541 -541
  333. package/vibe/rules/standards/code-structure.md +291 -291
  334. package/vibe/rules/standards/complexity-metrics.md +313 -313
  335. package/vibe/rules/standards/naming-conventions.md +198 -198
  336. package/vibe/setup.sh +31 -31
  337. package/vibe/templates/constitution-template.md +252 -252
  338. package/vibe/templates/contract-backend-template.md +526 -526
  339. package/vibe/templates/contract-frontend-template.md +599 -599
  340. package/vibe/templates/feature-template.md +96 -96
  341. package/vibe/templates/spec-template.md +221 -221
@@ -1,293 +1,291 @@
1
- #!/usr/bin/env node
2
- /**
3
- * HUD Status Manager
4
- * 실시간 상태 시각화 (Claude Code statusline 연동)
5
- *
6
- * Inspired by oh-my-claudecode's HUD visualization
7
- */
8
-
9
- import fs from 'fs';
10
- import path from 'path';
11
- import os from 'os';
12
-
13
- // 상태 저장 경로
14
- const STATE_DIR = path.join(os.homedir(), '.claude', '.vibe-hud');
15
- const STATE_FILE = path.join(STATE_DIR, 'state.json');
16
-
17
- // 기본 상태
18
- const DEFAULT_STATE = {
19
- mode: 'idle', // idle | ultrawork | spec | review
20
- feature: null,
21
- phase: { current: 0, total: 0, name: '' },
22
- agents: [], // 실행 중인 에이전트들
23
- context: { used: 0, total: 200000 }, // 컨텍스트 사용량
24
- lastUpdate: null,
25
- };
26
-
27
- // 상태 아이콘
28
- const MODE_ICONS = {
29
- idle: '💤',
30
- ultrawork: '🚀',
31
- spec: '📝',
32
- review: '🔍',
33
- implementing: '🔨',
34
- testing: '🧪',
35
- error: '❌',
36
- };
37
-
38
- // 건강 상태 색상 (ANSI)
39
- const HEALTH_COLORS = {
40
- good: '\x1b[32m', // 녹색
41
- warning: '\x1b[33m', // 노란색
42
- critical: '\x1b[31m', // 빨간색
43
- reset: '\x1b[0m',
44
- };
45
-
46
- /**
47
- * 상태 디렉토리 초기화
48
- */
49
- function ensureStateDir() {
50
- if (!fs.existsSync(STATE_DIR)) {
51
- fs.mkdirSync(STATE_DIR, { recursive: true });
52
- }
53
- }
54
-
55
- /**
56
- * 현재 상태 로드
57
- */
58
- function loadState() {
59
- try {
60
- if (fs.existsSync(STATE_FILE)) {
61
- return JSON.parse(fs.readFileSync(STATE_FILE, 'utf8'));
62
- }
63
- } catch {
64
- // 무시
65
- }
66
- return { ...DEFAULT_STATE };
67
- }
68
-
69
- /**
70
- * 상태 저장
71
- */
72
- function saveState(state) {
73
- ensureStateDir();
74
- state.lastUpdate = new Date().toISOString();
75
- fs.writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));
76
- }
77
-
78
- /**
79
- * 상태 업데이트
80
- */
81
- function updateState(updates) {
82
- const state = loadState();
83
- Object.assign(state, updates);
84
- saveState(state);
85
- return state;
86
- }
87
-
88
- /**
89
- * 컨텍스트 건강 상태
90
- */
91
- function getContextHealth(used, total) {
92
- const percentage = (used / total) * 100;
93
- if (percentage >= 90) return 'critical';
94
- if (percentage >= 70) return 'warning';
95
- return 'good';
96
- }
97
-
98
- /**
99
- * 상태 라인 포맷 (minimal)
100
- */
101
- function formatMinimal(state) {
102
- const icon = MODE_ICONS[state.mode] || '💤';
103
- const phase = state.phase.total > 0
104
- ? `${state.phase.current}/${state.phase.total}`
105
- : '';
106
- return `${icon} ${state.mode}${phase ? ` [${phase}]` : ''}`;
107
- }
108
-
109
- /**
110
- * 상태 라인 포맷 (focused - default)
111
- */
112
- function formatFocused(state) {
113
- const icon = MODE_ICONS[state.mode] || '💤';
114
- const feature = state.feature ? `: ${state.feature}` : '';
115
- const phase = state.phase.total > 0
116
- ? ` [Phase ${state.phase.current}/${state.phase.total}]`
117
- : '';
118
-
119
- const contextPct = Math.round((state.context.used / state.context.total) * 100);
120
- const contextHealth = getContextHealth(state.context.used, state.context.total);
121
- const contextColor = HEALTH_COLORS[contextHealth];
122
-
123
- return `${icon} ${state.mode}${feature}${phase} | ${contextColor}CTX: ${contextPct}%${HEALTH_COLORS.reset}`;
124
- }
125
-
126
- /**
127
- * 상태 라인 포맷 (full)
128
- */
129
- function formatFull(state) {
130
- const lines = [];
131
- const icon = MODE_ICONS[state.mode] || '💤';
132
-
133
- lines.push(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
134
- lines.push(`${icon} VIBE HUD`);
135
- lines.push(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
136
-
137
- lines.push(`Mode: ${state.mode}`);
138
- if (state.feature) {
139
- lines.push(`Feature: ${state.feature}`);
140
- }
141
-
142
- if (state.phase.total > 0) {
143
- const progress = Math.round((state.phase.current / state.phase.total) * 100);
144
- const bar = createProgressBar(progress);
145
- lines.push(`Phase: ${state.phase.current}/${state.phase.total} ${state.phase.name}`);
146
- lines.push(` ${bar} ${progress}%`);
147
- }
148
-
149
- if (state.agents.length > 0) {
150
- lines.push(`Agents: ${state.agents.map(a => `${a.name}(${a.model})`).join(', ')}`);
151
- }
152
-
153
- const contextPct = Math.round((state.context.used / state.context.total) * 100);
154
- const contextHealth = getContextHealth(state.context.used, state.context.total);
155
- const contextColor = HEALTH_COLORS[contextHealth];
156
- lines.push(`Context: ${contextColor}${contextPct}%${HEALTH_COLORS.reset} (${state.context.used}/${state.context.total})`);
157
-
158
- lines.push(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
159
-
160
- return lines.join('\n');
161
- }
162
-
163
- /**
164
- * 프로그레스 생성
165
- */
166
- function createProgressBar(percentage, width = 20) {
167
- const filled = Math.round((percentage / 100) * width);
168
- const empty = width - filled;
169
- return `[${'█'.repeat(filled)}${'░'.repeat(empty)}]`;
170
- }
171
-
172
- /**
173
- * CLI 명령 처리
174
- */
175
- function handleCommand(args) {
176
- const command = args[0];
177
- const params = args.slice(1);
178
-
179
- switch (command) {
180
- case 'show':
181
- case 'status': {
182
- const format = params[0] || 'focused';
183
- const state = loadState();
184
- if (format === 'minimal') console.log(formatMinimal(state));
185
- else if (format === 'full') console.log(formatFull(state));
186
- else console.log(formatFocused(state));
187
- break;
188
- }
189
-
190
- case 'set': {
191
- const key = params[0];
192
- const value = params[1];
193
- if (key && value !== undefined) {
194
- const updates = {};
195
- // 중첩 처리 (예: phase.current)
196
- if (key.includes('.')) {
197
- const [parent, child] = key.split('.');
198
- const state = loadState();
199
- updates[parent] = { ...(state[parent] || {}), [child]: isNaN(value) ? value : Number(value) };
200
- } else {
201
- updates[key] = isNaN(value) ? value : Number(value);
202
- }
203
- updateState(updates);
204
- console.log(`✓ Updated ${key}`);
205
- }
206
- break;
207
- }
208
-
209
- case 'start': {
210
- const mode = params[0] || 'ultrawork';
211
- const feature = params[1] || null;
212
- updateState({
213
- mode,
214
- feature,
215
- phase: { current: 0, total: 0, name: '' },
216
- agents: [],
217
- });
218
- console.log(`🚀 Started ${mode}${feature ? `: ${feature}` : ''}`);
219
- break;
220
- }
221
-
222
- case 'phase': {
223
- const current = parseInt(params[0], 10) || 1;
224
- const total = parseInt(params[1], 10) || current;
225
- const name = params.slice(2).join(' ') || '';
226
- updateState({ phase: { current, total, name } });
227
- console.log(`📍 Phase ${current}/${total}${name ? `: ${name}` : ''}`);
228
- break;
229
- }
230
-
231
- case 'agent': {
232
- const action = params[0]; // add | remove | clear
233
- const state = loadState();
234
- if (action === 'add') {
235
- const name = params[1];
236
- const model = params[2] || 'sonnet';
237
- state.agents.push({ name, model, startTime: Date.now() });
238
- saveState(state);
239
- console.log(`🤖 Agent added: ${name} (${model})`);
240
- } else if (action === 'remove') {
241
- const name = params[1];
242
- state.agents = state.agents.filter(a => a.name !== name);
243
- saveState(state);
244
- console.log(`🤖 Agent removed: ${name}`);
245
- } else if (action === 'clear') {
246
- state.agents = [];
247
- saveState(state);
248
- console.log(`🤖 All agents cleared`);
249
- }
250
- break;
251
- }
252
-
253
- case 'context': {
254
- const used = parseInt(params[0], 10) || 0;
255
- const total = parseInt(params[1], 10) || 200000;
256
- updateState({ context: { used, total } });
257
- const pct = Math.round((used / total) * 100);
258
- console.log(`📊 Context: ${pct}%`);
259
- break;
260
- }
261
-
262
- case 'done':
263
- case 'reset': {
264
- saveState({ ...DEFAULT_STATE });
265
- console.log(`💤 HUD reset`);
266
- break;
267
- }
268
-
269
- default:
270
- console.log(`
271
- VIBE HUD - Real-time status visualization
272
-
273
- Commands:
274
- show [format] Show current status (minimal|focused|full)
275
- start [mode] [feature] Start tracking (ultrawork|spec|review)
276
- phase <current> <total> [name] Update phase progress
277
- agent add|remove|clear [name] [model] Manage agents
278
- context <used> [total] Update context usage
279
- set <key> <value> Set arbitrary state value
280
- done|reset Reset to idle state
281
-
282
- Examples:
283
- node hud-status.js show full
284
- node hud-status.js start ultrawork "login-feature"
285
- node hud-status.js phase 2 5 "Implementing core"
286
- node hud-status.js agent add "explore-1" haiku
287
- `);
288
- }
289
- }
290
-
291
- // 메인 실행
292
- const args = process.argv.slice(2);
293
- handleCommand(args);
1
+ #!/usr/bin/env node
2
+ /**
3
+ * HUD Status Manager
4
+ * 실시간 상태 시각화 (Claude Code statusline 연동)
5
+ */
6
+
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import os from 'os';
10
+
11
+ // 상태 저장 경로
12
+ const STATE_DIR = path.join(os.homedir(), '.claude', '.vibe-hud');
13
+ const STATE_FILE = path.join(STATE_DIR, 'state.json');
14
+
15
+ // 기본 상태
16
+ const DEFAULT_STATE = {
17
+ mode: 'idle', // idle | ultrawork | spec | review
18
+ feature: null,
19
+ phase: { current: 0, total: 0, name: '' },
20
+ agents: [], // 실행 중인 에이전트들
21
+ context: { used: 0, total: 200000 }, // 컨텍스트 사용량
22
+ lastUpdate: null,
23
+ };
24
+
25
+ // 상태 아이콘
26
+ const MODE_ICONS = {
27
+ idle: '💤',
28
+ ultrawork: '🚀',
29
+ spec: '📝',
30
+ review: '🔍',
31
+ implementing: '🔨',
32
+ testing: '🧪',
33
+ error: '',
34
+ };
35
+
36
+ // 건강 상태 색상 (ANSI)
37
+ const HEALTH_COLORS = {
38
+ good: '\x1b[32m', // 녹색
39
+ warning: '\x1b[33m', // 노란색
40
+ critical: '\x1b[31m', // 빨간색
41
+ reset: '\x1b[0m',
42
+ };
43
+
44
+ /**
45
+ * 상태 디렉토리 초기화
46
+ */
47
+ function ensureStateDir() {
48
+ if (!fs.existsSync(STATE_DIR)) {
49
+ fs.mkdirSync(STATE_DIR, { recursive: true });
50
+ }
51
+ }
52
+
53
+ /**
54
+ * 현재 상태 로드
55
+ */
56
+ function loadState() {
57
+ try {
58
+ if (fs.existsSync(STATE_FILE)) {
59
+ return JSON.parse(fs.readFileSync(STATE_FILE, 'utf8'));
60
+ }
61
+ } catch {
62
+ // 무시
63
+ }
64
+ return { ...DEFAULT_STATE };
65
+ }
66
+
67
+ /**
68
+ * 상태 저장
69
+ */
70
+ function saveState(state) {
71
+ ensureStateDir();
72
+ state.lastUpdate = new Date().toISOString();
73
+ fs.writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));
74
+ }
75
+
76
+ /**
77
+ * 상태 업데이트
78
+ */
79
+ function updateState(updates) {
80
+ const state = loadState();
81
+ Object.assign(state, updates);
82
+ saveState(state);
83
+ return state;
84
+ }
85
+
86
+ /**
87
+ * 컨텍스트 건강 상태
88
+ */
89
+ function getContextHealth(used, total) {
90
+ const percentage = (used / total) * 100;
91
+ if (percentage >= 90) return 'critical';
92
+ if (percentage >= 70) return 'warning';
93
+ return 'good';
94
+ }
95
+
96
+ /**
97
+ * 상태 라인 포맷 (minimal)
98
+ */
99
+ function formatMinimal(state) {
100
+ const icon = MODE_ICONS[state.mode] || '💤';
101
+ const phase = state.phase.total > 0
102
+ ? `${state.phase.current}/${state.phase.total}`
103
+ : '';
104
+ return `${icon} ${state.mode}${phase ? ` [${phase}]` : ''}`;
105
+ }
106
+
107
+ /**
108
+ * 상태 라인 포맷 (focused - default)
109
+ */
110
+ function formatFocused(state) {
111
+ const icon = MODE_ICONS[state.mode] || '💤';
112
+ const feature = state.feature ? `: ${state.feature}` : '';
113
+ const phase = state.phase.total > 0
114
+ ? ` [Phase ${state.phase.current}/${state.phase.total}]`
115
+ : '';
116
+
117
+ const contextPct = Math.round((state.context.used / state.context.total) * 100);
118
+ const contextHealth = getContextHealth(state.context.used, state.context.total);
119
+ const contextColor = HEALTH_COLORS[contextHealth];
120
+
121
+ return `${icon} ${state.mode}${feature}${phase} | ${contextColor}CTX: ${contextPct}%${HEALTH_COLORS.reset}`;
122
+ }
123
+
124
+ /**
125
+ * 상태 라인 포맷 (full)
126
+ */
127
+ function formatFull(state) {
128
+ const lines = [];
129
+ const icon = MODE_ICONS[state.mode] || '💤';
130
+
131
+ lines.push(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
132
+ lines.push(`${icon} VIBE HUD`);
133
+ lines.push(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
134
+
135
+ lines.push(`Mode: ${state.mode}`);
136
+ if (state.feature) {
137
+ lines.push(`Feature: ${state.feature}`);
138
+ }
139
+
140
+ if (state.phase.total > 0) {
141
+ const progress = Math.round((state.phase.current / state.phase.total) * 100);
142
+ const bar = createProgressBar(progress);
143
+ lines.push(`Phase: ${state.phase.current}/${state.phase.total} ${state.phase.name}`);
144
+ lines.push(` ${bar} ${progress}%`);
145
+ }
146
+
147
+ if (state.agents.length > 0) {
148
+ lines.push(`Agents: ${state.agents.map(a => `${a.name}(${a.model})`).join(', ')}`);
149
+ }
150
+
151
+ const contextPct = Math.round((state.context.used / state.context.total) * 100);
152
+ const contextHealth = getContextHealth(state.context.used, state.context.total);
153
+ const contextColor = HEALTH_COLORS[contextHealth];
154
+ lines.push(`Context: ${contextColor}${contextPct}%${HEALTH_COLORS.reset} (${state.context.used}/${state.context.total})`);
155
+
156
+ lines.push(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
157
+
158
+ return lines.join('\n');
159
+ }
160
+
161
+ /**
162
+ * 프로그레스 바 생성
163
+ */
164
+ function createProgressBar(percentage, width = 20) {
165
+ const filled = Math.round((percentage / 100) * width);
166
+ const empty = width - filled;
167
+ return `[${'█'.repeat(filled)}${'░'.repeat(empty)}]`;
168
+ }
169
+
170
+ /**
171
+ * CLI 명령 처리
172
+ */
173
+ function handleCommand(args) {
174
+ const command = args[0];
175
+ const params = args.slice(1);
176
+
177
+ switch (command) {
178
+ case 'show':
179
+ case 'status': {
180
+ const format = params[0] || 'focused';
181
+ const state = loadState();
182
+ if (format === 'minimal') console.log(formatMinimal(state));
183
+ else if (format === 'full') console.log(formatFull(state));
184
+ else console.log(formatFocused(state));
185
+ break;
186
+ }
187
+
188
+ case 'set': {
189
+ const key = params[0];
190
+ const value = params[1];
191
+ if (key && value !== undefined) {
192
+ const updates = {};
193
+ // 중첩 처리 (예: phase.current)
194
+ if (key.includes('.')) {
195
+ const [parent, child] = key.split('.');
196
+ const state = loadState();
197
+ updates[parent] = { ...(state[parent] || {}), [child]: isNaN(value) ? value : Number(value) };
198
+ } else {
199
+ updates[key] = isNaN(value) ? value : Number(value);
200
+ }
201
+ updateState(updates);
202
+ console.log(`✓ Updated ${key}`);
203
+ }
204
+ break;
205
+ }
206
+
207
+ case 'start': {
208
+ const mode = params[0] || 'ultrawork';
209
+ const feature = params[1] || null;
210
+ updateState({
211
+ mode,
212
+ feature,
213
+ phase: { current: 0, total: 0, name: '' },
214
+ agents: [],
215
+ });
216
+ console.log(`🚀 Started ${mode}${feature ? `: ${feature}` : ''}`);
217
+ break;
218
+ }
219
+
220
+ case 'phase': {
221
+ const current = parseInt(params[0], 10) || 1;
222
+ const total = parseInt(params[1], 10) || current;
223
+ const name = params.slice(2).join(' ') || '';
224
+ updateState({ phase: { current, total, name } });
225
+ console.log(`📍 Phase ${current}/${total}${name ? `: ${name}` : ''}`);
226
+ break;
227
+ }
228
+
229
+ case 'agent': {
230
+ const action = params[0]; // add | remove | clear
231
+ const state = loadState();
232
+ if (action === 'add') {
233
+ const name = params[1];
234
+ const model = params[2] || 'sonnet';
235
+ state.agents.push({ name, model, startTime: Date.now() });
236
+ saveState(state);
237
+ console.log(`🤖 Agent added: ${name} (${model})`);
238
+ } else if (action === 'remove') {
239
+ const name = params[1];
240
+ state.agents = state.agents.filter(a => a.name !== name);
241
+ saveState(state);
242
+ console.log(`🤖 Agent removed: ${name}`);
243
+ } else if (action === 'clear') {
244
+ state.agents = [];
245
+ saveState(state);
246
+ console.log(`🤖 All agents cleared`);
247
+ }
248
+ break;
249
+ }
250
+
251
+ case 'context': {
252
+ const used = parseInt(params[0], 10) || 0;
253
+ const total = parseInt(params[1], 10) || 200000;
254
+ updateState({ context: { used, total } });
255
+ const pct = Math.round((used / total) * 100);
256
+ console.log(`📊 Context: ${pct}%`);
257
+ break;
258
+ }
259
+
260
+ case 'done':
261
+ case 'reset': {
262
+ saveState({ ...DEFAULT_STATE });
263
+ console.log(`💤 HUD reset`);
264
+ break;
265
+ }
266
+
267
+ default:
268
+ console.log(`
269
+ VIBE HUD - Real-time status visualization
270
+
271
+ Commands:
272
+ show [format] Show current status (minimal|focused|full)
273
+ start [mode] [feature] Start tracking (ultrawork|spec|review)
274
+ phase <current> <total> [name] Update phase progress
275
+ agent add|remove|clear [name] [model] Manage agents
276
+ context <used> [total] Update context usage
277
+ set <key> <value> Set arbitrary state value
278
+ done|reset Reset to idle state
279
+
280
+ Examples:
281
+ node hud-status.js show full
282
+ node hud-status.js start ultrawork "login-feature"
283
+ node hud-status.js phase 2 5 "Implementing core"
284
+ node hud-status.js agent add "explore-1" haiku
285
+ `);
286
+ }
287
+ }
288
+
289
+ // 메인 실행
290
+ const args = process.argv.slice(2);
291
+ handleCommand(args);