@su-record/vibe 2.9.22 → 2.9.23

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 (466) hide show
  1. package/.env.example +37 -37
  2. package/CLAUDE.md +105 -105
  3. package/LICENSE +21 -21
  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/docs/api-documenter.md +99 -99
  11. package/agents/docs/changelog-writer.md +93 -93
  12. package/agents/e2e-tester.md +294 -294
  13. package/agents/event/event-comms.md +78 -78
  14. package/agents/event/event-content.md +68 -68
  15. package/agents/event/event-image.md +95 -95
  16. package/agents/event/event-ops.md +84 -84
  17. package/agents/event/event-scheduler.md +69 -69
  18. package/agents/event/event-speaker.md +86 -86
  19. package/agents/explorer-low.md +42 -42
  20. package/agents/explorer-medium.md +59 -59
  21. package/agents/explorer.md +48 -48
  22. package/agents/implementer-low.md +43 -43
  23. package/agents/implementer-medium.md +52 -52
  24. package/agents/implementer.md +54 -54
  25. package/agents/junior-mentor.md +141 -141
  26. package/agents/planning/requirements-analyst.md +84 -84
  27. package/agents/planning/ux-advisor.md +83 -83
  28. package/agents/qa/acceptance-tester.md +86 -86
  29. package/agents/qa/edge-case-finder.md +93 -93
  30. package/agents/qa/qa-coordinator.md +131 -131
  31. package/agents/refactor-cleaner.md +143 -143
  32. package/agents/research/best-practices-agent.md +199 -199
  33. package/agents/research/codebase-patterns-agent.md +157 -157
  34. package/agents/research/framework-docs-agent.md +188 -188
  35. package/agents/research/security-advisory-agent.md +213 -213
  36. package/agents/review/architecture-reviewer.md +107 -107
  37. package/agents/review/complexity-reviewer.md +116 -116
  38. package/agents/review/data-integrity-reviewer.md +88 -88
  39. package/agents/review/git-history-reviewer.md +103 -103
  40. package/agents/review/performance-reviewer.md +86 -86
  41. package/agents/review/python-reviewer.md +150 -150
  42. package/agents/review/rails-reviewer.md +139 -139
  43. package/agents/review/react-reviewer.md +144 -144
  44. package/agents/review/security-reviewer.md +80 -80
  45. package/agents/review/simplicity-reviewer.md +140 -140
  46. package/agents/review/test-coverage-reviewer.md +116 -116
  47. package/agents/review/typescript-reviewer.md +127 -127
  48. package/agents/searcher.md +54 -54
  49. package/agents/simplifier.md +120 -120
  50. package/agents/teams/debug-team.md +70 -70
  51. package/agents/teams/dev-team.md +88 -88
  52. package/agents/teams/docs-team.md +80 -80
  53. package/agents/teams/figma/figma-analyst.md +52 -52
  54. package/agents/teams/figma/figma-architect.md +112 -112
  55. package/agents/teams/figma/figma-auditor.md +82 -82
  56. package/agents/teams/figma/figma-builder.md +100 -100
  57. package/agents/teams/figma-team.md +85 -85
  58. package/agents/teams/fullstack-team.md +83 -83
  59. package/agents/teams/lite-team.md +69 -69
  60. package/agents/teams/migration-team.md +78 -78
  61. package/agents/teams/refactor-team.md +94 -94
  62. package/agents/teams/research-team.md +86 -86
  63. package/agents/teams/review-debate-team.md +125 -125
  64. package/agents/teams/security-team.md +81 -81
  65. package/agents/tester.md +49 -49
  66. package/agents/ui/ui-a11y-auditor.md +93 -93
  67. package/agents/ui/ui-antipattern-detector.md +102 -102
  68. package/agents/ui/ui-dataviz-advisor.md +69 -69
  69. package/agents/ui/ui-design-system-gen.md +57 -57
  70. package/agents/ui/ui-industry-analyzer.md +49 -49
  71. package/agents/ui/ui-layout-architect.md +65 -65
  72. package/agents/ui/ui-stack-implementer.md +68 -68
  73. package/agents/ui/ux-compliance-reviewer.md +81 -81
  74. package/agents/ui-previewer.md +258 -258
  75. package/commands/vibe.analyze.md +533 -533
  76. package/commands/vibe.contract.md +105 -105
  77. package/commands/vibe.docs.md +33 -33
  78. package/commands/vibe.event.md +163 -163
  79. package/commands/vibe.figma.md +584 -584
  80. package/commands/vibe.harness.md +177 -177
  81. package/commands/vibe.regress.md +73 -73
  82. package/commands/vibe.review.md +624 -624
  83. package/commands/vibe.run.md +1940 -1940
  84. package/commands/vibe.scaffold.md +195 -195
  85. package/commands/vibe.spec.md +577 -577
  86. package/commands/vibe.test.md +96 -96
  87. package/commands/vibe.trace.md +276 -276
  88. package/commands/vibe.utils.md +413 -413
  89. package/commands/vibe.verify.md +550 -550
  90. package/dist/cli/collaborator.js +52 -52
  91. package/dist/cli/commands/codex-proxy.js +15 -15
  92. package/dist/cli/commands/config.js +9 -9
  93. package/dist/cli/commands/evolution.js +12 -12
  94. package/dist/cli/commands/figma.js +20 -20
  95. package/dist/cli/commands/info.js +52 -52
  96. package/dist/cli/commands/init.d.ts.map +1 -1
  97. package/dist/cli/commands/init.js +16 -5
  98. package/dist/cli/commands/init.js.map +1 -1
  99. package/dist/cli/commands/remove.js +14 -14
  100. package/dist/cli/commands/sentinel.js +27 -27
  101. package/dist/cli/commands/skills.js +5 -5
  102. package/dist/cli/commands/slack.js +10 -10
  103. package/dist/cli/commands/stats.js +6 -6
  104. package/dist/cli/commands/telegram.js +12 -12
  105. package/dist/cli/commands/update.d.ts.map +1 -1
  106. package/dist/cli/commands/update.js +16 -0
  107. package/dist/cli/commands/update.js.map +1 -1
  108. package/dist/cli/detect.js +32 -32
  109. package/dist/cli/index.js +33 -33
  110. package/dist/cli/llm/claude-commands.js +16 -16
  111. package/dist/cli/llm/config.js +18 -18
  112. package/dist/cli/llm/gemini-commands.js +16 -16
  113. package/dist/cli/llm/gpt-commands.js +19 -19
  114. package/dist/cli/llm/help.js +21 -21
  115. package/dist/cli/postinstall/cursor-agents.js +32 -32
  116. package/dist/cli/postinstall/cursor-rules.js +83 -83
  117. package/dist/cli/postinstall/cursor-skills.js +743 -743
  118. package/dist/cli/setup/Provisioner.js +42 -42
  119. package/dist/infra/lib/DeepInit.js +24 -24
  120. package/dist/infra/lib/IterationTracker.js +11 -11
  121. package/dist/infra/lib/PythonParser.js +108 -108
  122. package/dist/infra/lib/ReviewRace.js +96 -96
  123. package/dist/infra/lib/SkillFrontmatter.js +28 -28
  124. package/dist/infra/lib/SkillQualityGate.js +9 -9
  125. package/dist/infra/lib/SkillRepository.js +159 -159
  126. package/dist/infra/lib/UltraQA.js +99 -99
  127. package/dist/infra/lib/autonomy/AuditStore.js +41 -41
  128. package/dist/infra/lib/autonomy/ConfirmationStore.js +30 -30
  129. package/dist/infra/lib/autonomy/EventOutbox.js +38 -38
  130. package/dist/infra/lib/autonomy/PolicyEngine.d.ts +3 -3
  131. package/dist/infra/lib/autonomy/PolicyEngine.js +18 -18
  132. package/dist/infra/lib/autonomy/SecuritySentinel.js +1 -1
  133. package/dist/infra/lib/autonomy/SuggestionStore.js +33 -33
  134. package/dist/infra/lib/embedding/VectorStore.js +22 -22
  135. package/dist/infra/lib/evolution/AgentAnalyzer.js +10 -10
  136. package/dist/infra/lib/evolution/DescriptionOptimizer.js +21 -21
  137. package/dist/infra/lib/evolution/GenerationRegistry.js +36 -36
  138. package/dist/infra/lib/evolution/InsightStore.js +90 -90
  139. package/dist/infra/lib/evolution/ParityTester.js +57 -57
  140. package/dist/infra/lib/evolution/RollbackManager.js +5 -5
  141. package/dist/infra/lib/evolution/SkillBenchmark.js +23 -23
  142. package/dist/infra/lib/evolution/SkillEvalRunner.js +50 -50
  143. package/dist/infra/lib/evolution/SkillGapDetector.js +10 -10
  144. package/dist/infra/lib/evolution/UsageTracker.js +28 -28
  145. package/dist/infra/lib/gemini/orchestration.js +5 -5
  146. package/dist/infra/lib/gpt/orchestration.js +4 -4
  147. package/dist/infra/lib/memory/KnowledgeGraph.js +4 -4
  148. package/dist/infra/lib/memory/MemorySearch.js +57 -57
  149. package/dist/infra/lib/memory/MemoryStorage.js +181 -181
  150. package/dist/infra/lib/memory/ObservationStore.js +28 -28
  151. package/dist/infra/lib/memory/ReflectionStore.js +30 -30
  152. package/dist/infra/lib/memory/SessionRAGRetriever.js +7 -7
  153. package/dist/infra/lib/memory/SessionRAGStore.js +225 -225
  154. package/dist/infra/lib/memory/SessionSummarizer.js +9 -9
  155. package/dist/infra/orchestrator/AgentManager.js +12 -12
  156. package/dist/infra/orchestrator/AgentRegistry.js +65 -65
  157. package/dist/infra/orchestrator/MultiLlmResearch.js +8 -8
  158. package/dist/infra/orchestrator/SwarmOrchestrator.test.js +16 -16
  159. package/dist/infra/orchestrator/parallelResearch.js +24 -24
  160. package/dist/tools/convention/analyzeComplexity.test.js +115 -115
  161. package/dist/tools/convention/validateCodeQuality.test.js +104 -104
  162. package/dist/tools/memory/createMemoryTimeline.js +10 -10
  163. package/dist/tools/memory/getMemoryGraph.js +12 -12
  164. package/dist/tools/memory/getSessionContext.js +9 -9
  165. package/dist/tools/memory/linkMemories.js +14 -14
  166. package/dist/tools/memory/listMemories.js +4 -4
  167. package/dist/tools/memory/recallMemory.js +4 -4
  168. package/dist/tools/memory/saveMemory.js +4 -4
  169. package/dist/tools/memory/searchMemoriesAdvanced.js +23 -23
  170. package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
  171. package/dist/tools/semantic/astGrep.test.js +6 -6
  172. package/dist/tools/spec/prdParser.test.js +171 -171
  173. package/dist/tools/spec/specGenerator.js +169 -169
  174. package/dist/tools/spec/traceabilityMatrix.js +64 -64
  175. package/dist/tools/spec/traceabilityMatrix.test.js +28 -28
  176. package/hooks/gemini-hooks.json +73 -73
  177. package/hooks/hooks.json +126 -126
  178. package/hooks/scripts/__tests__/keyword-detector.test.js +199 -199
  179. package/hooks/scripts/__tests__/pre-tool-guard.test.js +368 -368
  180. package/hooks/scripts/__tests__/sentinel-guard.test.js +208 -208
  181. package/hooks/scripts/auto-commit.js +97 -97
  182. package/hooks/scripts/auto-format.js +64 -64
  183. package/hooks/scripts/auto-test.js +81 -81
  184. package/hooks/scripts/code-check.js +268 -268
  185. package/hooks/scripts/codex-detect.js +46 -46
  186. package/hooks/scripts/codex-review-gate.js +80 -80
  187. package/hooks/scripts/command-log.js +32 -32
  188. package/hooks/scripts/context-save.js +353 -353
  189. package/hooks/scripts/evolution-engine.js +91 -91
  190. package/hooks/scripts/figma-extract.js +635 -635
  191. package/hooks/scripts/figma-guard.js +219 -219
  192. package/hooks/scripts/figma-refine.js +315 -315
  193. package/hooks/scripts/figma-to-scss.js +394 -394
  194. package/hooks/scripts/figma-validate.js +353 -353
  195. package/hooks/scripts/hud-status.js +321 -321
  196. package/hooks/scripts/keyword-detector.js +214 -214
  197. package/hooks/scripts/lib/scope-from-spec.js +261 -0
  198. package/hooks/scripts/llm-orchestrate.js +645 -645
  199. package/hooks/scripts/post-edit.js +32 -32
  200. package/hooks/scripts/pr-test-gate.js +52 -52
  201. package/hooks/scripts/pre-tool-dispatcher.js +5 -0
  202. package/hooks/scripts/pre-tool-guard.js +254 -254
  203. package/hooks/scripts/prompt-dispatcher.js +190 -190
  204. package/hooks/scripts/scope-guard.js +145 -0
  205. package/hooks/scripts/sentinel-guard.js +130 -130
  206. package/hooks/scripts/session-start.js +186 -177
  207. package/hooks/scripts/skill-injector.js +83 -83
  208. package/hooks/scripts/stop-notify.js +209 -209
  209. package/hooks/scripts/utils.js +257 -257
  210. package/languages/csharp-unity.md +515 -515
  211. package/languages/gdscript-godot.md +470 -470
  212. package/languages/ruby-rails.md +489 -489
  213. package/languages/typescript-angular.md +433 -433
  214. package/languages/typescript-astro.md +416 -416
  215. package/languages/typescript-electron.md +406 -406
  216. package/languages/typescript-nestjs.md +524 -524
  217. package/languages/typescript-svelte.md +407 -407
  218. package/languages/typescript-tauri.md +365 -365
  219. package/package.json +10 -5
  220. package/skills/agents-md/SKILL.md +121 -121
  221. package/skills/agents-md/rubrics/what-to-keep.md +49 -49
  222. package/skills/agents-md/templates/agents-md.md +36 -36
  223. package/skills/arch-guard/SKILL.md +181 -181
  224. package/skills/arch-guard/agents/detector.md +48 -48
  225. package/skills/arch-guard/agents/reporter.md +48 -48
  226. package/skills/arch-guard/agents/rule-generator.md +49 -49
  227. package/skills/arch-guard/agents/violation-checker.md +51 -51
  228. package/skills/arch-guard/frameworks/clean-architecture.md +108 -108
  229. package/skills/arch-guard/frameworks/solid.md +102 -102
  230. package/skills/arch-guard/scripts/check-boundaries.js +90 -90
  231. package/skills/arch-guard/templates/arch-rules.json +47 -47
  232. package/skills/arch-guard/templates/violation-report.md +53 -53
  233. package/skills/brand-assets/SKILL.md +147 -147
  234. package/skills/brand-assets/rubrics/asset-checklist.md +98 -98
  235. package/skills/brand-assets/templates/brand-guide.md +161 -161
  236. package/skills/capability-loop/SKILL.md +272 -272
  237. package/skills/capability-loop/agents/capability-designer.md +61 -61
  238. package/skills/capability-loop/agents/failure-analyst.md +55 -55
  239. package/skills/capability-loop/agents/implementer.md +50 -50
  240. package/skills/capability-loop/agents/tester.md +53 -53
  241. package/skills/capability-loop/templates/capability-spec.md +118 -118
  242. package/skills/capability-loop/templates/failure-analysis.md +118 -118
  243. package/skills/characterization-test/SKILL.md +207 -207
  244. package/skills/characterization-test/agents/behavior-capturer.md +50 -50
  245. package/skills/characterization-test/agents/coverage-checker.md +54 -54
  246. package/skills/characterization-test/agents/reporter.md +50 -50
  247. package/skills/characterization-test/agents/test-writer.md +49 -49
  248. package/skills/characterization-test/rubrics/coverage-criteria.md +53 -53
  249. package/skills/characterization-test/templates/test-template.ts +101 -101
  250. package/skills/chub-usage/SKILL.md +139 -139
  251. package/skills/claude-md-guide/SKILL.md +351 -351
  252. package/skills/claude-md-guide/rubrics/anti-patterns.md +88 -88
  253. package/skills/claude-md-guide/templates/claude-md.md +54 -54
  254. package/skills/commerce-patterns/SKILL.md +64 -64
  255. package/skills/commerce-patterns/rubrics/checkout-flow.md +48 -48
  256. package/skills/commerce-patterns/templates/product-schema.md +85 -85
  257. package/skills/commit-push-pr/SKILL.md +77 -77
  258. package/skills/commit-push-pr/agents/change-analyzer.md +55 -55
  259. package/skills/commit-push-pr/agents/message-writer.md +50 -50
  260. package/skills/commit-push-pr/agents/pr-writer.md +58 -58
  261. package/skills/commit-push-pr/agents/reviewer.md +52 -52
  262. package/skills/commit-push-pr/rubrics/commit-message.md +73 -73
  263. package/skills/commit-push-pr/templates/pr-body.md +63 -63
  264. package/skills/context7-usage/SKILL.md +106 -106
  265. package/skills/context7-usage/rubrics/when-to-use.md +50 -50
  266. package/skills/create-prd/SKILL.md +90 -90
  267. package/skills/create-prd/agents/edge-case-finder.md +48 -48
  268. package/skills/create-prd/agents/prioritizer.md +60 -60
  269. package/skills/create-prd/agents/requirements-writer.md +48 -48
  270. package/skills/create-prd/agents/researcher.md +55 -55
  271. package/skills/create-prd/agents/reviewer.md +54 -54
  272. package/skills/create-prd/frameworks/jobs-to-be-done.md +96 -96
  273. package/skills/create-prd/frameworks/rice-scoring.md +97 -97
  274. package/skills/create-prd/orchestrator.md +70 -70
  275. package/skills/create-prd/rubrics/completeness.md +58 -58
  276. package/skills/create-prd/templates/prd.md +139 -139
  277. package/skills/design-audit/SKILL.md +152 -152
  278. package/skills/design-audit/agents/a11y-auditor.md +43 -43
  279. package/skills/design-audit/agents/performance-auditor.md +46 -46
  280. package/skills/design-audit/agents/responsive-auditor.md +46 -46
  281. package/skills/design-audit/agents/scorer.md +47 -47
  282. package/skills/design-audit/agents/slop-detector.md +47 -47
  283. package/skills/design-audit/frameworks/core-web-vitals.md +107 -107
  284. package/skills/design-audit/frameworks/wcag-checklist.md +64 -64
  285. package/skills/design-audit/orchestrator.md +64 -64
  286. package/skills/design-audit/rubrics/ai-slop-patterns.md +83 -83
  287. package/skills/design-audit/rubrics/scoring.md +63 -63
  288. package/skills/design-audit/templates/report.md +88 -88
  289. package/skills/design-critique/SKILL.md +139 -139
  290. package/skills/design-critique/rubrics/ux-heuristics.md +143 -143
  291. package/skills/design-critique/templates/critique-report.md +86 -86
  292. package/skills/design-distill/SKILL.md +130 -130
  293. package/skills/design-distill/templates/design-system.md +132 -132
  294. package/skills/design-normalize/SKILL.md +133 -133
  295. package/skills/design-normalize/rubrics/token-naming.md +117 -117
  296. package/skills/design-normalize/templates/token-audit.md +89 -89
  297. package/skills/design-polish/SKILL.md +131 -131
  298. package/skills/design-polish/rubrics/polish-checklist.md +68 -68
  299. package/skills/design-polish/templates/polish-report.md +64 -64
  300. package/skills/design-teach/SKILL.md +182 -182
  301. package/skills/design-teach/rubrics/brand-personality.md +73 -73
  302. package/skills/design-teach/templates/design-context.json +36 -36
  303. package/skills/devlog/SKILL.md +143 -143
  304. package/skills/e2e-commerce/SKILL.md +62 -62
  305. package/skills/e2e-commerce/templates/test-scenarios.md +170 -170
  306. package/skills/event-comms/SKILL.md +172 -172
  307. package/skills/event-comms/templates/email-invite.md +99 -99
  308. package/skills/event-comms/templates/sns-post.md +133 -133
  309. package/skills/event-ops/SKILL.md +207 -207
  310. package/skills/event-ops/rubrics/contingency.md +85 -85
  311. package/skills/event-ops/templates/d-day-checklist.md +65 -65
  312. package/skills/event-planning/SKILL.md +144 -144
  313. package/skills/event-planning/rubrics/timeline.md +70 -70
  314. package/skills/event-planning/templates/event-plan.md +91 -91
  315. package/skills/exec-plan/SKILL.md +149 -149
  316. package/skills/exec-plan/agents/decomposer.md +47 -47
  317. package/skills/exec-plan/agents/dependency-mapper.md +44 -44
  318. package/skills/exec-plan/agents/estimator.md +43 -43
  319. package/skills/exec-plan/agents/validator.md +55 -55
  320. package/skills/exec-plan/orchestrator.md +70 -70
  321. package/skills/exec-plan/rubrics/complexity-scoring.md +75 -75
  322. package/skills/exec-plan/templates/plan.md +147 -147
  323. package/skills/git-worktree/SKILL.md +73 -73
  324. package/skills/git-worktree/rubrics/when-to-use.md +55 -55
  325. package/skills/handoff/SKILL.md +110 -110
  326. package/skills/handoff/agents/context-summarizer.md +51 -51
  327. package/skills/handoff/agents/document-writer.md +63 -63
  328. package/skills/handoff/agents/state-collector.md +53 -53
  329. package/skills/handoff/agents/verifier.md +48 -48
  330. package/skills/handoff/rubrics/completeness.md +62 -62
  331. package/skills/handoff/templates/handoff.md +107 -107
  332. package/skills/parallel-research/SKILL.md +104 -104
  333. package/skills/parallel-research/agents/best-practices.md +43 -43
  334. package/skills/parallel-research/agents/codebase-patterns.md +46 -46
  335. package/skills/parallel-research/agents/framework-docs.md +45 -45
  336. package/skills/parallel-research/agents/security-advisory.md +46 -46
  337. package/skills/parallel-research/agents/synthesizer.md +57 -57
  338. package/skills/parallel-research/experts/best-practices.md +50 -50
  339. package/skills/parallel-research/experts/codebase-patterns.md +70 -70
  340. package/skills/parallel-research/experts/framework-docs.md +65 -65
  341. package/skills/parallel-research/experts/security-advisory.md +69 -69
  342. package/skills/parallel-research/orchestrator.md +79 -79
  343. package/skills/parallel-research/templates/awesome-list.md +32 -32
  344. package/skills/parallel-research/templates/paper.md +88 -88
  345. package/skills/parallel-research/templates/synthesis.md +101 -101
  346. package/skills/prioritization-frameworks/SKILL.md +87 -87
  347. package/skills/prioritization-frameworks/rubrics/frameworks.md +79 -79
  348. package/skills/prioritization-frameworks/templates/scoring-matrix.md +69 -69
  349. package/skills/priority-todos/SKILL.md +64 -64
  350. package/skills/priority-todos/rubrics/prioritization.md +70 -70
  351. package/skills/priority-todos/templates/todo-board.md +59 -59
  352. package/skills/seo-checklist/SKILL.md +58 -58
  353. package/skills/seo-checklist/frameworks/structured-data.md +153 -153
  354. package/skills/seo-checklist/rubrics/content-seo.md +42 -42
  355. package/skills/seo-checklist/rubrics/technical-seo.md +48 -48
  356. package/skills/techdebt/SKILL.md +124 -124
  357. package/skills/techdebt/agents/analyzer.md +50 -50
  358. package/skills/techdebt/agents/fixer.md +41 -41
  359. package/skills/techdebt/agents/reviewer.md +47 -47
  360. package/skills/techdebt/agents/scanner.md +44 -44
  361. package/skills/techdebt/orchestrator.md +70 -70
  362. package/skills/techdebt/rubrics/severity.md +51 -51
  363. package/skills/techdebt/scripts/scan.js +90 -90
  364. package/skills/techdebt/templates/report.md +86 -86
  365. package/skills/tool-fallback/SKILL.md +104 -104
  366. package/skills/tool-fallback/rubrics/fallback-chain.md +58 -58
  367. package/skills/typescript-advanced-types/SKILL.md +67 -67
  368. package/skills/typescript-advanced-types/rubrics/type-patterns.md +109 -109
  369. package/skills/ui-ux-pro-max/SKILL.md +236 -236
  370. package/skills/ui-ux-pro-max/reference/color-and-contrast.md +517 -517
  371. package/skills/ui-ux-pro-max/reference/interaction-design.md +544 -544
  372. package/skills/ui-ux-pro-max/reference/motion-design.md +591 -591
  373. package/skills/ui-ux-pro-max/reference/responsive-design.md +463 -463
  374. package/skills/ui-ux-pro-max/reference/spatial-design.md +390 -390
  375. package/skills/ui-ux-pro-max/reference/typography.md +455 -455
  376. package/skills/ui-ux-pro-max/reference/ux-writing.md +469 -469
  377. package/skills/ui-ux-pro-max/rubrics/interaction-states.md +83 -83
  378. package/skills/ui-ux-pro-max/rubrics/responsive-breakpoints.md +99 -99
  379. package/skills/user-personas/SKILL.md +75 -75
  380. package/skills/user-personas/rubrics/research-methods.md +56 -56
  381. package/skills/user-personas/templates/persona.md +89 -89
  382. package/skills/vercel-react-best-practices/SKILL.md +60 -60
  383. package/skills/vercel-react-best-practices/rubrics/performance.md +82 -82
  384. package/skills/vercel-react-best-practices/rubrics/server-components.md +86 -86
  385. package/skills/vibe-contract/SKILL.md +166 -166
  386. package/skills/vibe-docs/templates/architecture.md +80 -80
  387. package/skills/vibe-docs/templates/readme.md +84 -84
  388. package/skills/vibe-docs/templates/release-notes.md +74 -74
  389. package/skills/vibe-figma/SKILL.md +363 -363
  390. package/skills/vibe-figma/rubrics/extraction-checklist.md +51 -51
  391. package/skills/vibe-figma/templates/component-index.md +126 -126
  392. package/skills/vibe-figma/templates/component-spec.md +168 -168
  393. package/skills/vibe-figma/templates/figma-handoff.md +100 -100
  394. package/skills/vibe-figma/templates/remapped-tree.md +277 -277
  395. package/skills/vibe-figma-convert/SKILL.md +235 -235
  396. package/skills/vibe-figma-convert/rubrics/conversion-rules.md +141 -141
  397. package/skills/vibe-figma-convert/templates/component.md +140 -140
  398. package/skills/vibe-figma-extract/SKILL.md +219 -219
  399. package/skills/vibe-figma-extract/rubrics/image-rules.md +157 -157
  400. package/skills/vibe-interview/SKILL.md +358 -358
  401. package/skills/vibe-interview/checklists/api.md +101 -101
  402. package/skills/vibe-interview/checklists/feature.md +88 -88
  403. package/skills/vibe-interview/checklists/library.md +95 -95
  404. package/skills/vibe-interview/checklists/mobile.md +89 -89
  405. package/skills/vibe-interview/checklists/webapp.md +97 -97
  406. package/skills/vibe-interview/checklists/website.md +99 -99
  407. package/skills/vibe-plan/SKILL.md +254 -254
  408. package/skills/vibe-regress/SKILL.md +174 -174
  409. package/skills/vibe-regress/templates/bug.md +44 -44
  410. package/skills/vibe-regress/templates/test-jest.md +29 -29
  411. package/skills/vibe-regress/templates/test-vitest.md +30 -30
  412. package/skills/vibe-spec/SKILL.md +1195 -1195
  413. package/skills/vibe-spec-review/SKILL.md +726 -726
  414. package/skills/vibe-test/SKILL.md +247 -247
  415. package/skills/video-production/SKILL.md +52 -52
  416. package/skills/video-production/rubrics/quality-checklist.md +58 -58
  417. package/skills/video-production/templates/production-plan.md +104 -104
  418. package/vibe/config.json +29 -29
  419. package/vibe/constitution.md +227 -227
  420. package/vibe/rules/principles/communication-guide.md +98 -98
  421. package/vibe/rules/principles/development-philosophy.md +52 -52
  422. package/vibe/rules/principles/quick-start.md +102 -102
  423. package/vibe/rules/quality/bdd-contract-testing.md +393 -393
  424. package/vibe/rules/quality/checklist.md +276 -276
  425. package/vibe/rules/quality/performance.md +236 -236
  426. package/vibe/rules/quality/testing-strategy.md +440 -440
  427. package/vibe/rules/standards/anti-patterns.md +541 -541
  428. package/vibe/rules/standards/code-structure.md +291 -291
  429. package/vibe/rules/standards/complexity-metrics.md +313 -313
  430. package/vibe/rules/standards/git-workflow.md +237 -237
  431. package/vibe/rules/standards/naming-conventions.md +198 -198
  432. package/vibe/rules/standards/security.md +305 -305
  433. package/vibe/rules/writing/document-style.md +74 -74
  434. package/vibe/setup.sh +31 -31
  435. package/vibe/templates/claudemd-template.md +74 -74
  436. package/vibe/templates/constitution-template.md +267 -267
  437. package/vibe/templates/contract-backend-template.md +526 -526
  438. package/vibe/templates/contract-frontend-template.md +599 -599
  439. package/vibe/templates/feature-template.md +96 -96
  440. package/vibe/templates/plan-template.md +194 -194
  441. package/vibe/templates/spec-template.md +221 -221
  442. package/vibe/ui-ux-data/charts.csv +26 -26
  443. package/vibe/ui-ux-data/colors.csv +97 -97
  444. package/vibe/ui-ux-data/icons.csv +101 -101
  445. package/vibe/ui-ux-data/landing.csv +31 -31
  446. package/vibe/ui-ux-data/products.csv +96 -96
  447. package/vibe/ui-ux-data/react-performance.csv +45 -45
  448. package/vibe/ui-ux-data/stacks/astro.csv +54 -54
  449. package/vibe/ui-ux-data/stacks/flutter.csv +53 -53
  450. package/vibe/ui-ux-data/stacks/html-tailwind.csv +56 -56
  451. package/vibe/ui-ux-data/stacks/jetpack-compose.csv +53 -53
  452. package/vibe/ui-ux-data/stacks/nextjs.csv +53 -53
  453. package/vibe/ui-ux-data/stacks/nuxt-ui.csv +51 -51
  454. package/vibe/ui-ux-data/stacks/nuxtjs.csv +59 -59
  455. package/vibe/ui-ux-data/stacks/react-native.csv +52 -52
  456. package/vibe/ui-ux-data/stacks/react.csv +54 -54
  457. package/vibe/ui-ux-data/stacks/shadcn.csv +61 -61
  458. package/vibe/ui-ux-data/stacks/svelte.csv +54 -54
  459. package/vibe/ui-ux-data/stacks/swiftui.csv +51 -51
  460. package/vibe/ui-ux-data/stacks/vue.csv +50 -50
  461. package/vibe/ui-ux-data/styles.csv +68 -68
  462. package/vibe/ui-ux-data/typography.csv +57 -57
  463. package/vibe/ui-ux-data/ui-reasoning.csv +101 -101
  464. package/vibe/ui-ux-data/ux-guidelines.csv +99 -99
  465. package/vibe/ui-ux-data/version.json +31 -31
  466. package/vibe/ui-ux-data/web-interface.csv +31 -31
@@ -1,130 +1,130 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Sentinel Guard — PreToolUse hook
4
- * Protects sentinel files and blocks dangerous operations.
5
- * Runs before pre-tool-guard.js.
6
- */
7
-
8
- const SENTINEL_PATH_PREFIX = 'src/infra/lib/autonomy/';
9
-
10
- const SENTINEL_PATH_RE = /^(\.\/|\.\\)?src[\\/]infra[\\/]lib[\\/]autonomy[\\/]/;
11
-
12
- const DANGEROUS_BASH_RE =
13
- /\b(rm\s+-rf|kill\s+-9|drop\s+table|truncate|shutdown|reboot|mkfs|dd\s+if=)\b/i;
14
-
15
- /**
16
- * Extract file path from tool input
17
- */
18
- function extractFilePath(toolName, input) {
19
- if (!input) return null;
20
- try {
21
- const parsed = typeof input === 'string' ? JSON.parse(input) : input;
22
- if (toolName === 'Write' || toolName === 'Edit' || toolName === 'Read') {
23
- return parsed.file_path || parsed.filePath || null;
24
- }
25
- } catch {
26
- // Not JSON, try as plain string
27
- return typeof input === 'string' ? input : null;
28
- }
29
- return null;
30
- }
31
-
32
- /**
33
- * Extract command from Bash tool input
34
- */
35
- function extractBashCommand(input) {
36
- if (!input) return null;
37
- try {
38
- const parsed = typeof input === 'string' ? JSON.parse(input) : input;
39
- return parsed.command || null;
40
- } catch {
41
- return typeof input === 'string' ? input : null;
42
- }
43
- }
44
-
45
- /**
46
- * Check if path targets sentinel files
47
- */
48
- function isSentinelPath(filePath) {
49
- if (!filePath) return false;
50
- const normalized = filePath.replace(/\\/g, '/').replace(/^\.\//, '');
51
- return normalized.startsWith(SENTINEL_PATH_PREFIX) || SENTINEL_PATH_RE.test(filePath);
52
- }
53
-
54
- /**
55
- * Main guard logic
56
- */
57
- function guard(toolName, toolInput) {
58
- // Write/Edit targeting sentinel files → block
59
- if (toolName === 'Write' || toolName === 'Edit') {
60
- const filePath = extractFilePath(toolName, toolInput);
61
- if (isSentinelPath(filePath)) {
62
- return {
63
- decision: 'block',
64
- reason: `Sentinel files are protected. Cannot modify: ${filePath}`,
65
- };
66
- }
67
- }
68
-
69
- // Bash targeting sentinel files or dangerous commands
70
- if (toolName === 'Bash') {
71
- const command = extractBashCommand(toolInput);
72
- if (command && isSentinelPath(command)) {
73
- return {
74
- decision: 'block',
75
- reason: `Sentinel files are protected. Dangerous command targeting sentinel path.`,
76
- };
77
- }
78
- if (command && DANGEROUS_BASH_RE.test(command)) {
79
- // Check if command targets sentinel files
80
- if (command.includes(SENTINEL_PATH_PREFIX) || command.includes('src/infra/lib/autonomy')) {
81
- return {
82
- decision: 'block',
83
- reason: `Dangerous command targeting sentinel path: ${command}`,
84
- };
85
- }
86
- }
87
- }
88
-
89
- // Allow — return undefined for normal flow
90
- return undefined;
91
- }
92
-
93
- import fs from 'fs';
94
-
95
- /**
96
- * stdin에서 JSON 페이로드 읽기 (Claude Code 하네스 호환)
97
- */
98
- function readStdinSync() {
99
- try {
100
- if (process.stdin.isTTY) return null;
101
- // fd 0을 직접 사용 (Windows는 '/dev/stdin'이 없음)
102
- const buf = Buffer.alloc(65536);
103
- const bytesRead = fs.readSync(0, buf, 0, buf.length, null);
104
- if (bytesRead > 0) {
105
- return JSON.parse(buf.toString('utf-8', 0, bytesRead));
106
- }
107
- } catch { /* 폴백 */ }
108
- return null;
109
- }
110
-
111
- // Main execution: stdin JSON 우선, argv 폴백
112
- const stdinPayload = readStdinSync();
113
- const toolName = stdinPayload?.tool_name || process.argv[2] || '';
114
- const toolInput = stdinPayload?.tool_input
115
- ? (typeof stdinPayload.tool_input === 'string'
116
- ? stdinPayload.tool_input
117
- : JSON.stringify(stdinPayload.tool_input))
118
- : (process.argv[3] || process.env.TOOL_INPUT || '');
119
-
120
- import { logHookDecision } from './utils.js';
121
-
122
- const result = guard(toolName, toolInput);
123
-
124
- if (result) {
125
- logHookDecision('sentinel-guard', toolName, 'block', result.reason);
126
- console.log(JSON.stringify(result));
127
- process.exit(2); // deny 규약
128
- }
129
-
130
- process.exit(0);
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Sentinel Guard — PreToolUse hook
4
+ * Protects sentinel files and blocks dangerous operations.
5
+ * Runs before pre-tool-guard.js.
6
+ */
7
+
8
+ const SENTINEL_PATH_PREFIX = 'src/infra/lib/autonomy/';
9
+
10
+ const SENTINEL_PATH_RE = /^(\.\/|\.\\)?src[\\/]infra[\\/]lib[\\/]autonomy[\\/]/;
11
+
12
+ const DANGEROUS_BASH_RE =
13
+ /\b(rm\s+-rf|kill\s+-9|drop\s+table|truncate|shutdown|reboot|mkfs|dd\s+if=)\b/i;
14
+
15
+ /**
16
+ * Extract file path from tool input
17
+ */
18
+ function extractFilePath(toolName, input) {
19
+ if (!input) return null;
20
+ try {
21
+ const parsed = typeof input === 'string' ? JSON.parse(input) : input;
22
+ if (toolName === 'Write' || toolName === 'Edit' || toolName === 'Read') {
23
+ return parsed.file_path || parsed.filePath || null;
24
+ }
25
+ } catch {
26
+ // Not JSON, try as plain string
27
+ return typeof input === 'string' ? input : null;
28
+ }
29
+ return null;
30
+ }
31
+
32
+ /**
33
+ * Extract command from Bash tool input
34
+ */
35
+ function extractBashCommand(input) {
36
+ if (!input) return null;
37
+ try {
38
+ const parsed = typeof input === 'string' ? JSON.parse(input) : input;
39
+ return parsed.command || null;
40
+ } catch {
41
+ return typeof input === 'string' ? input : null;
42
+ }
43
+ }
44
+
45
+ /**
46
+ * Check if path targets sentinel files
47
+ */
48
+ function isSentinelPath(filePath) {
49
+ if (!filePath) return false;
50
+ const normalized = filePath.replace(/\\/g, '/').replace(/^\.\//, '');
51
+ return normalized.startsWith(SENTINEL_PATH_PREFIX) || SENTINEL_PATH_RE.test(filePath);
52
+ }
53
+
54
+ /**
55
+ * Main guard logic
56
+ */
57
+ function guard(toolName, toolInput) {
58
+ // Write/Edit targeting sentinel files → block
59
+ if (toolName === 'Write' || toolName === 'Edit') {
60
+ const filePath = extractFilePath(toolName, toolInput);
61
+ if (isSentinelPath(filePath)) {
62
+ return {
63
+ decision: 'block',
64
+ reason: `Sentinel files are protected. Cannot modify: ${filePath}`,
65
+ };
66
+ }
67
+ }
68
+
69
+ // Bash targeting sentinel files or dangerous commands
70
+ if (toolName === 'Bash') {
71
+ const command = extractBashCommand(toolInput);
72
+ if (command && isSentinelPath(command)) {
73
+ return {
74
+ decision: 'block',
75
+ reason: `Sentinel files are protected. Dangerous command targeting sentinel path.`,
76
+ };
77
+ }
78
+ if (command && DANGEROUS_BASH_RE.test(command)) {
79
+ // Check if command targets sentinel files
80
+ if (command.includes(SENTINEL_PATH_PREFIX) || command.includes('src/infra/lib/autonomy')) {
81
+ return {
82
+ decision: 'block',
83
+ reason: `Dangerous command targeting sentinel path: ${command}`,
84
+ };
85
+ }
86
+ }
87
+ }
88
+
89
+ // Allow — return undefined for normal flow
90
+ return undefined;
91
+ }
92
+
93
+ import fs from 'fs';
94
+
95
+ /**
96
+ * stdin에서 JSON 페이로드 읽기 (Claude Code 하네스 호환)
97
+ */
98
+ function readStdinSync() {
99
+ try {
100
+ if (process.stdin.isTTY) return null;
101
+ // fd 0을 직접 사용 (Windows는 '/dev/stdin'이 없음)
102
+ const buf = Buffer.alloc(65536);
103
+ const bytesRead = fs.readSync(0, buf, 0, buf.length, null);
104
+ if (bytesRead > 0) {
105
+ return JSON.parse(buf.toString('utf-8', 0, bytesRead));
106
+ }
107
+ } catch { /* 폴백 */ }
108
+ return null;
109
+ }
110
+
111
+ // Main execution: stdin JSON 우선, argv 폴백
112
+ const stdinPayload = readStdinSync();
113
+ const toolName = stdinPayload?.tool_name || process.argv[2] || '';
114
+ const toolInput = stdinPayload?.tool_input
115
+ ? (typeof stdinPayload.tool_input === 'string'
116
+ ? stdinPayload.tool_input
117
+ : JSON.stringify(stdinPayload.tool_input))
118
+ : (process.argv[3] || process.env.TOOL_INPUT || '');
119
+
120
+ import { logHookDecision } from './utils.js';
121
+
122
+ const result = guard(toolName, toolInput);
123
+
124
+ if (result) {
125
+ logHookDecision('sentinel-guard', toolName, 'block', result.reason);
126
+ console.log(JSON.stringify(result));
127
+ process.exit(2); // deny 규약
128
+ }
129
+
130
+ process.exit(0);
@@ -1,177 +1,186 @@
1
- /**
2
- * SessionStart Hook - 세션 시작 시 메모리/시간 로드 + 버전 체크
3
- */
4
- import { getToolsBaseUrl, PROJECT_DIR } from './utils.js';
5
- import fs from 'fs';
6
- import path from 'path';
7
- import os from 'os';
8
- import https from 'https';
9
- import { execSync } from 'child_process';
10
-
11
- const BASE_URL = getToolsBaseUrl();
12
-
13
- /**
14
- * npm 레지스트리에서 최신 버전 조회 (타임아웃 3초)
15
- */
16
- function fetchLatestVersion() {
17
- return new Promise((resolve) => {
18
- const req = https.get(
19
- 'https://registry.npmjs.org/@su-record/vibe/latest',
20
- { timeout: 3000, headers: { 'Accept': 'application/json' } },
21
- (res) => {
22
- let data = '';
23
- res.on('data', (chunk) => { data += chunk; });
24
- res.on('end', () => {
25
- try {
26
- resolve(JSON.parse(data).version || null);
27
- } catch { resolve(null); }
28
- });
29
- },
30
- );
31
- req.on('error', () => resolve(null));
32
- req.on('timeout', () => { req.destroy(); resolve(null); });
33
- });
34
- }
35
-
36
- function compareVersions(a, b) {
37
- const partsA = a.replace(/^v/, '').split('.').map(Number);
38
- const partsB = b.replace(/^v/, '').split('.').map(Number);
39
- for (let i = 0; i < 3; i++) {
40
- const numA = partsA[i] || 0;
41
- const numB = partsB[i] || 0;
42
- if (numA > numB) return 1;
43
- if (numA < numB) return -1;
44
- }
45
- return 0;
46
- }
47
-
48
- function getCurrentVersion() {
49
- try {
50
- let globalNpmPath;
51
- try {
52
- globalNpmPath = execSync('npm root -g', { encoding: 'utf8', timeout: 3000 }).trim();
53
- } catch {
54
- const homeDir = os.homedir();
55
- const fallbacks = [
56
- '/usr/local/lib/node_modules',
57
- path.join(homeDir, '.npm-global', 'lib', 'node_modules'),
58
- ];
59
- globalNpmPath = fallbacks.find(p => fs.existsSync(p)) || fallbacks[0];
60
- }
61
- const pkgPath = path.join(globalNpmPath, '@su-record', 'vibe', 'package.json');
62
- if (fs.existsSync(pkgPath)) {
63
- return JSON.parse(fs.readFileSync(pkgPath, 'utf8')).version || null;
64
- }
65
- } catch { /* ignore */ }
66
- return null;
67
- }
68
-
69
- async function main() {
70
- try {
71
- const [memoryModule, timeModule] = await Promise.all([
72
- import(`${BASE_URL}memory/index.js`),
73
- import(`${BASE_URL}time/index.js`),
74
- ]);
75
-
76
- const [session, time, memories, latestVersion] = await Promise.all([
77
- memoryModule.startSession({ projectPath: PROJECT_DIR }),
78
- timeModule.getCurrentTime({ format: 'human', timezone: 'Asia/Seoul' }),
79
- memoryModule.listMemories({ limit: 5, projectPath: PROJECT_DIR }),
80
- fetchLatestVersion(),
81
- ]);
82
-
83
- console.log(session.content[0].text);
84
- console.log('\n' + time.content[0].text);
85
- console.log('\n[Recent Memories]');
86
- console.log(memories.content[0].text);
87
-
88
- // Version check
89
- if (latestVersion) {
90
- const currentVersion = getCurrentVersion();
91
- if (currentVersion && compareVersions(latestVersion, currentVersion) > 0) {
92
- console.log(`\n⬆️ Harness update available: v${currentVersion} → v${latestVersion}`);
93
- console.log(' Run: vibe upgrade');
94
- }
95
- }
96
-
97
- // Autonomy status summary
98
- try {
99
- const fs = await import('fs');
100
- const configPath = `${PROJECT_DIR}/.claude/vibe/config.json`;
101
- let autonomyMode = 'suggest';
102
- let sentinelEnabled = true;
103
-
104
- if (fs.existsSync(configPath)) {
105
- const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
106
- autonomyMode = config.autonomy?.mode || 'suggest';
107
- sentinelEnabled = config.sentinel?.enabled !== false;
108
- }
109
-
110
- const LIB_BASE_A = (await import('./utils.js')).getLibBaseUrl();
111
- const memModA = await import(`${LIB_BASE_A}memory/MemoryStorage.js`);
112
- const storageA = new memModA.MemoryStorage(PROJECT_DIR);
113
- const db = storageA.getDatabase();
114
-
115
- const last24h = new Date(Date.now() - 86_400_000).toISOString();
116
- let totalActions = 0;
117
- let allowedActions = 0;
118
- let blockedActions = 0;
119
- let pendingSuggestions = 0;
120
- let pendingConfirmations = 0;
121
-
122
- try {
123
- totalActions = db.prepare('SELECT COUNT(*) as c FROM audit_events WHERE createdAt >= ?').get(last24h)?.c ?? 0;
124
- allowedActions = db.prepare("SELECT COUNT(*) as c FROM audit_events WHERE createdAt >= ? AND outcome = 'allowed'").get(last24h)?.c ?? 0;
125
- blockedActions = db.prepare("SELECT COUNT(*) as c FROM audit_events WHERE createdAt >= ? AND outcome = 'blocked'").get(last24h)?.c ?? 0;
126
- } catch { /* table not initialized yet */ }
127
-
128
- try {
129
- pendingSuggestions = db.prepare("SELECT COUNT(*) as c FROM suggestions WHERE status = 'pending'").get()?.c ?? 0;
130
- } catch { /* table not initialized yet */ }
131
-
132
- try {
133
- pendingConfirmations = db.prepare("SELECT COUNT(*) as c FROM confirmations WHERE status = 'pending'").get()?.c ?? 0;
134
- } catch { /* table not initialized yet */ }
135
-
136
- const parts = [`${autonomyMode} mode`];
137
- if (sentinelEnabled) parts.push('sentinel ON');
138
- if (pendingConfirmations > 0) parts.push(`${pendingConfirmations} pending confirmations`);
139
- if (pendingSuggestions > 0) parts.push(`${pendingSuggestions} suggestions`);
140
- if (totalActions > 0) parts.push(`${totalActions} actions (${allowedActions} ok, ${blockedActions} blocked)`);
141
-
142
- console.log(`\n🤖 Autonomy: ${parts.join(' | ')}`);
143
- storageA.close();
144
- } catch { /* autonomy not yet initialized, skip */ }
145
-
146
- // Evolution status summary
147
- try {
148
- const LIB_BASE = (await import('./utils.js')).getLibBaseUrl();
149
- const [memMod, regMod, insMod] = await Promise.all([
150
- import(`${LIB_BASE}memory/MemoryStorage.js`),
151
- import(`${LIB_BASE}evolution/GenerationRegistry.js`),
152
- import(`${LIB_BASE}evolution/InsightStore.js`),
153
- ]);
154
- const storage = new memMod.MemoryStorage(PROJECT_DIR);
155
- const registry = new regMod.GenerationRegistry(storage);
156
- const insightStore = new insMod.InsightStore(storage);
157
-
158
- const genStats = registry.getStats();
159
- const active = genStats.byStatus?.active || 0;
160
- const drafts = genStats.byStatus?.draft || 0;
161
- const gaps = insightStore.getByType('skill_gap').length;
162
-
163
- if (active > 0 || drafts > 0 || gaps > 0) {
164
- const parts = [];
165
- if (active > 0) parts.push(`${active} active skills`);
166
- if (drafts > 0) parts.push(`${drafts} pending approval`);
167
- if (gaps > 0) parts.push(`${gaps} gaps detected`);
168
- console.log(`\n🧬 Evolution: ${parts.join(', ')}`);
169
- }
170
- storage.close();
171
- } catch { /* evolution not yet initialized, skip */ }
172
- } catch (e) {
173
- console.log('[Session] Error:', e.message);
174
- }
175
- }
176
-
177
- main();
1
+ /**
2
+ * SessionStart Hook - 세션 시작 시 메모리/시간 로드 + 버전 체크
3
+ */
4
+ import { getToolsBaseUrl, PROJECT_DIR } from './utils.js';
5
+ import fs from 'fs';
6
+ import path from 'path';
7
+ import os from 'os';
8
+ import https from 'https';
9
+ import { execSync } from 'child_process';
10
+
11
+ const BASE_URL = getToolsBaseUrl();
12
+
13
+ /**
14
+ * npm 레지스트리에서 최신 버전 조회 (타임아웃 3초)
15
+ */
16
+ function fetchLatestVersion() {
17
+ return new Promise((resolve) => {
18
+ const req = https.get(
19
+ 'https://registry.npmjs.org/@su-record/vibe/latest',
20
+ { timeout: 3000, headers: { 'Accept': 'application/json' } },
21
+ (res) => {
22
+ let data = '';
23
+ res.on('data', (chunk) => { data += chunk; });
24
+ res.on('end', () => {
25
+ try {
26
+ resolve(JSON.parse(data).version || null);
27
+ } catch { resolve(null); }
28
+ });
29
+ },
30
+ );
31
+ req.on('error', () => resolve(null));
32
+ req.on('timeout', () => { req.destroy(); resolve(null); });
33
+ });
34
+ }
35
+
36
+ function compareVersions(a, b) {
37
+ const partsA = a.replace(/^v/, '').split('.').map(Number);
38
+ const partsB = b.replace(/^v/, '').split('.').map(Number);
39
+ for (let i = 0; i < 3; i++) {
40
+ const numA = partsA[i] || 0;
41
+ const numB = partsB[i] || 0;
42
+ if (numA > numB) return 1;
43
+ if (numA < numB) return -1;
44
+ }
45
+ return 0;
46
+ }
47
+
48
+ function getCurrentVersion() {
49
+ try {
50
+ let globalNpmPath;
51
+ try {
52
+ globalNpmPath = execSync('npm root -g', { encoding: 'utf8', timeout: 3000 }).trim();
53
+ } catch {
54
+ const homeDir = os.homedir();
55
+ const fallbacks = [
56
+ '/usr/local/lib/node_modules',
57
+ path.join(homeDir, '.npm-global', 'lib', 'node_modules'),
58
+ ];
59
+ globalNpmPath = fallbacks.find(p => fs.existsSync(p)) || fallbacks[0];
60
+ }
61
+ const pkgPath = path.join(globalNpmPath, '@su-record', 'vibe', 'package.json');
62
+ if (fs.existsSync(pkgPath)) {
63
+ return JSON.parse(fs.readFileSync(pkgPath, 'utf8')).version || null;
64
+ }
65
+ } catch { /* ignore */ }
66
+ return null;
67
+ }
68
+
69
+ async function main() {
70
+ try {
71
+ const [memoryModule, timeModule] = await Promise.all([
72
+ import(`${BASE_URL}memory/index.js`),
73
+ import(`${BASE_URL}time/index.js`),
74
+ ]);
75
+
76
+ const [session, time, memories, latestVersion] = await Promise.all([
77
+ memoryModule.startSession({ projectPath: PROJECT_DIR }),
78
+ timeModule.getCurrentTime({ format: 'human', timezone: 'Asia/Seoul' }),
79
+ memoryModule.listMemories({ limit: 5, projectPath: PROJECT_DIR }),
80
+ fetchLatestVersion(),
81
+ ]);
82
+
83
+ console.log(session.content[0].text);
84
+ console.log('\n' + time.content[0].text);
85
+ console.log('\n[Recent Memories]');
86
+ console.log(memories.content[0].text);
87
+
88
+ // Version check
89
+ if (latestVersion) {
90
+ const currentVersion = getCurrentVersion();
91
+ if (currentVersion && compareVersions(latestVersion, currentVersion) > 0) {
92
+ console.log(`\n⬆️ Harness update available: v${currentVersion} → v${latestVersion}`);
93
+ console.log(' Run: vibe upgrade');
94
+ }
95
+ }
96
+
97
+ // Scope sync — 활성 SPEC 기반으로 scope.json 자동 갱신 (수동 관리면 스킵)
98
+ try {
99
+ const { syncScopeFile } = await import('./lib/scope-from-spec.js');
100
+ const result = syncScopeFile(PROJECT_DIR);
101
+ if (result.action === 'created' || result.action === 'updated' || result.action === 'removed') {
102
+ console.log(`\n🚧 Scope ${result.action} from active SPECs (.claude/vibe/scope.json)`);
103
+ }
104
+ } catch { /* scope sync is best-effort */ }
105
+
106
+ // Autonomy status summary
107
+ try {
108
+ const fs = await import('fs');
109
+ const configPath = `${PROJECT_DIR}/.claude/vibe/config.json`;
110
+ let autonomyMode = 'suggest';
111
+ let sentinelEnabled = true;
112
+
113
+ if (fs.existsSync(configPath)) {
114
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
115
+ autonomyMode = config.autonomy?.mode || 'suggest';
116
+ sentinelEnabled = config.sentinel?.enabled !== false;
117
+ }
118
+
119
+ const LIB_BASE_A = (await import('./utils.js')).getLibBaseUrl();
120
+ const memModA = await import(`${LIB_BASE_A}memory/MemoryStorage.js`);
121
+ const storageA = new memModA.MemoryStorage(PROJECT_DIR);
122
+ const db = storageA.getDatabase();
123
+
124
+ const last24h = new Date(Date.now() - 86_400_000).toISOString();
125
+ let totalActions = 0;
126
+ let allowedActions = 0;
127
+ let blockedActions = 0;
128
+ let pendingSuggestions = 0;
129
+ let pendingConfirmations = 0;
130
+
131
+ try {
132
+ totalActions = db.prepare('SELECT COUNT(*) as c FROM audit_events WHERE createdAt >= ?').get(last24h)?.c ?? 0;
133
+ allowedActions = db.prepare("SELECT COUNT(*) as c FROM audit_events WHERE createdAt >= ? AND outcome = 'allowed'").get(last24h)?.c ?? 0;
134
+ blockedActions = db.prepare("SELECT COUNT(*) as c FROM audit_events WHERE createdAt >= ? AND outcome = 'blocked'").get(last24h)?.c ?? 0;
135
+ } catch { /* table not initialized yet */ }
136
+
137
+ try {
138
+ pendingSuggestions = db.prepare("SELECT COUNT(*) as c FROM suggestions WHERE status = 'pending'").get()?.c ?? 0;
139
+ } catch { /* table not initialized yet */ }
140
+
141
+ try {
142
+ pendingConfirmations = db.prepare("SELECT COUNT(*) as c FROM confirmations WHERE status = 'pending'").get()?.c ?? 0;
143
+ } catch { /* table not initialized yet */ }
144
+
145
+ const parts = [`${autonomyMode} mode`];
146
+ if (sentinelEnabled) parts.push('sentinel ON');
147
+ if (pendingConfirmations > 0) parts.push(`${pendingConfirmations} pending confirmations`);
148
+ if (pendingSuggestions > 0) parts.push(`${pendingSuggestions} suggestions`);
149
+ if (totalActions > 0) parts.push(`${totalActions} actions (${allowedActions} ok, ${blockedActions} blocked)`);
150
+
151
+ console.log(`\n🤖 Autonomy: ${parts.join(' | ')}`);
152
+ storageA.close();
153
+ } catch { /* autonomy not yet initialized, skip */ }
154
+
155
+ // Evolution status summary
156
+ try {
157
+ const LIB_BASE = (await import('./utils.js')).getLibBaseUrl();
158
+ const [memMod, regMod, insMod] = await Promise.all([
159
+ import(`${LIB_BASE}memory/MemoryStorage.js`),
160
+ import(`${LIB_BASE}evolution/GenerationRegistry.js`),
161
+ import(`${LIB_BASE}evolution/InsightStore.js`),
162
+ ]);
163
+ const storage = new memMod.MemoryStorage(PROJECT_DIR);
164
+ const registry = new regMod.GenerationRegistry(storage);
165
+ const insightStore = new insMod.InsightStore(storage);
166
+
167
+ const genStats = registry.getStats();
168
+ const active = genStats.byStatus?.active || 0;
169
+ const drafts = genStats.byStatus?.draft || 0;
170
+ const gaps = insightStore.getByType('skill_gap').length;
171
+
172
+ if (active > 0 || drafts > 0 || gaps > 0) {
173
+ const parts = [];
174
+ if (active > 0) parts.push(`${active} active skills`);
175
+ if (drafts > 0) parts.push(`${drafts} pending approval`);
176
+ if (gaps > 0) parts.push(`${gaps} gaps detected`);
177
+ console.log(`\n🧬 Evolution: ${parts.join(', ')}`);
178
+ }
179
+ storage.close();
180
+ } catch { /* evolution not yet initialized, skip */ }
181
+ } catch (e) {
182
+ console.log('[Session] Error:', e.message);
183
+ }
184
+ }
185
+
186
+ main();