@su-record/vibe 2.9.21 → 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.
- package/.env.example +37 -37
- package/CLAUDE.md +105 -104
- package/LICENSE +21 -21
- package/agents/architect-low.md +41 -41
- package/agents/architect-medium.md +59 -59
- package/agents/architect.md +80 -80
- package/agents/build-error-resolver.md +115 -115
- package/agents/compounder.md +261 -261
- package/agents/diagrammer.md +178 -178
- package/agents/docs/api-documenter.md +99 -99
- package/agents/docs/changelog-writer.md +93 -93
- package/agents/e2e-tester.md +294 -294
- package/agents/event/event-comms.md +78 -78
- package/agents/event/event-content.md +68 -68
- package/agents/event/event-image.md +95 -95
- package/agents/event/event-ops.md +84 -84
- package/agents/event/event-scheduler.md +69 -69
- package/agents/event/event-speaker.md +86 -86
- package/agents/explorer-low.md +42 -42
- package/agents/explorer-medium.md +59 -59
- package/agents/explorer.md +48 -48
- package/agents/implementer-low.md +43 -43
- package/agents/implementer-medium.md +52 -52
- package/agents/implementer.md +54 -54
- package/agents/junior-mentor.md +141 -141
- package/agents/planning/requirements-analyst.md +84 -84
- package/agents/planning/ux-advisor.md +83 -83
- package/agents/qa/acceptance-tester.md +86 -86
- package/agents/qa/edge-case-finder.md +93 -93
- package/agents/qa/qa-coordinator.md +131 -131
- package/agents/refactor-cleaner.md +143 -143
- package/agents/research/best-practices-agent.md +199 -199
- package/agents/research/codebase-patterns-agent.md +157 -157
- package/agents/research/framework-docs-agent.md +188 -188
- package/agents/research/security-advisory-agent.md +213 -213
- package/agents/review/architecture-reviewer.md +107 -107
- package/agents/review/complexity-reviewer.md +116 -116
- package/agents/review/data-integrity-reviewer.md +88 -88
- package/agents/review/git-history-reviewer.md +103 -103
- package/agents/review/performance-reviewer.md +86 -86
- package/agents/review/python-reviewer.md +150 -150
- package/agents/review/rails-reviewer.md +139 -139
- package/agents/review/react-reviewer.md +144 -144
- package/agents/review/security-reviewer.md +80 -80
- package/agents/review/simplicity-reviewer.md +140 -140
- package/agents/review/test-coverage-reviewer.md +116 -116
- package/agents/review/typescript-reviewer.md +127 -127
- package/agents/searcher.md +54 -54
- package/agents/simplifier.md +120 -120
- package/agents/teams/debug-team.md +70 -70
- package/agents/teams/dev-team.md +88 -88
- package/agents/teams/docs-team.md +80 -80
- package/agents/teams/figma/figma-analyst.md +52 -52
- package/agents/teams/figma/figma-architect.md +112 -112
- package/agents/teams/figma/figma-auditor.md +82 -82
- package/agents/teams/figma/figma-builder.md +100 -100
- package/agents/teams/figma-team.md +85 -85
- package/agents/teams/fullstack-team.md +83 -83
- package/agents/teams/lite-team.md +69 -69
- package/agents/teams/migration-team.md +78 -78
- package/agents/teams/refactor-team.md +94 -94
- package/agents/teams/research-team.md +86 -86
- package/agents/teams/review-debate-team.md +125 -125
- package/agents/teams/security-team.md +81 -81
- package/agents/tester.md +49 -49
- package/agents/ui/ui-a11y-auditor.md +93 -93
- package/agents/ui/ui-antipattern-detector.md +102 -102
- package/agents/ui/ui-dataviz-advisor.md +69 -69
- package/agents/ui/ui-design-system-gen.md +57 -57
- package/agents/ui/ui-industry-analyzer.md +49 -49
- package/agents/ui/ui-layout-architect.md +65 -65
- package/agents/ui/ui-stack-implementer.md +68 -68
- package/agents/ui/ux-compliance-reviewer.md +81 -81
- package/agents/ui-previewer.md +258 -258
- package/commands/vibe.analyze.md +533 -533
- package/commands/vibe.contract.md +105 -105
- package/commands/vibe.docs.md +33 -33
- package/commands/vibe.event.md +163 -163
- package/commands/vibe.figma.md +584 -584
- package/commands/vibe.harness.md +177 -177
- package/commands/vibe.regress.md +73 -73
- package/commands/vibe.review.md +624 -624
- package/commands/vibe.run.md +1940 -1940
- package/commands/vibe.scaffold.md +195 -195
- package/commands/vibe.spec.md +577 -577
- package/commands/vibe.test.md +96 -0
- package/commands/vibe.trace.md +276 -276
- package/commands/vibe.utils.md +413 -413
- package/commands/vibe.verify.md +550 -550
- package/dist/cli/collaborator.js +52 -52
- package/dist/cli/commands/codex-proxy.js +15 -15
- package/dist/cli/commands/config.js +9 -9
- package/dist/cli/commands/evolution.js +12 -12
- package/dist/cli/commands/figma.js +20 -20
- package/dist/cli/commands/info.js +52 -52
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +16 -5
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/remove.js +14 -14
- package/dist/cli/commands/sentinel.js +27 -27
- package/dist/cli/commands/skills.js +5 -5
- package/dist/cli/commands/slack.js +10 -10
- package/dist/cli/commands/stats.js +6 -6
- package/dist/cli/commands/telegram.js +12 -12
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +16 -0
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/detect.js +32 -32
- package/dist/cli/index.js +33 -33
- package/dist/cli/llm/claude-commands.js +16 -16
- package/dist/cli/llm/config.js +18 -18
- package/dist/cli/llm/gemini-commands.js +16 -16
- package/dist/cli/llm/gpt-commands.js +19 -19
- package/dist/cli/llm/help.js +21 -21
- package/dist/cli/postinstall/cursor-agents.js +32 -32
- package/dist/cli/postinstall/cursor-rules.js +83 -83
- package/dist/cli/postinstall/cursor-skills.js +743 -743
- package/dist/cli/setup/Provisioner.js +42 -42
- package/dist/infra/lib/DeepInit.js +24 -24
- package/dist/infra/lib/IterationTracker.js +11 -11
- package/dist/infra/lib/PythonParser.js +108 -108
- package/dist/infra/lib/ReviewRace.js +96 -96
- package/dist/infra/lib/SkillFrontmatter.js +28 -28
- package/dist/infra/lib/SkillQualityGate.js +9 -9
- package/dist/infra/lib/SkillRepository.js +159 -159
- package/dist/infra/lib/UltraQA.js +99 -99
- package/dist/infra/lib/autonomy/AuditStore.js +41 -41
- package/dist/infra/lib/autonomy/ConfirmationStore.js +30 -30
- package/dist/infra/lib/autonomy/EventOutbox.js +38 -38
- package/dist/infra/lib/autonomy/PolicyEngine.d.ts +3 -3
- package/dist/infra/lib/autonomy/PolicyEngine.js +18 -18
- package/dist/infra/lib/autonomy/SecuritySentinel.js +1 -1
- package/dist/infra/lib/autonomy/SuggestionStore.js +33 -33
- package/dist/infra/lib/embedding/VectorStore.js +22 -22
- package/dist/infra/lib/evolution/AgentAnalyzer.js +10 -10
- package/dist/infra/lib/evolution/DescriptionOptimizer.js +21 -21
- package/dist/infra/lib/evolution/GenerationRegistry.js +36 -36
- package/dist/infra/lib/evolution/InsightStore.js +90 -90
- package/dist/infra/lib/evolution/ParityTester.js +57 -57
- package/dist/infra/lib/evolution/RollbackManager.js +5 -5
- package/dist/infra/lib/evolution/SkillBenchmark.js +23 -23
- package/dist/infra/lib/evolution/SkillEvalRunner.js +50 -50
- package/dist/infra/lib/evolution/SkillGapDetector.js +10 -10
- package/dist/infra/lib/evolution/UsageTracker.js +28 -28
- package/dist/infra/lib/gemini/orchestration.js +5 -5
- package/dist/infra/lib/gpt/orchestration.js +4 -4
- package/dist/infra/lib/memory/KnowledgeGraph.js +4 -4
- package/dist/infra/lib/memory/MemorySearch.js +57 -57
- package/dist/infra/lib/memory/MemoryStorage.js +181 -181
- package/dist/infra/lib/memory/ObservationStore.js +28 -28
- package/dist/infra/lib/memory/ReflectionStore.js +30 -30
- package/dist/infra/lib/memory/SessionRAGRetriever.js +7 -7
- package/dist/infra/lib/memory/SessionRAGStore.js +225 -225
- package/dist/infra/lib/memory/SessionSummarizer.js +9 -9
- package/dist/infra/orchestrator/AgentManager.js +12 -12
- package/dist/infra/orchestrator/AgentRegistry.js +65 -65
- package/dist/infra/orchestrator/MultiLlmResearch.js +8 -8
- package/dist/infra/orchestrator/SwarmOrchestrator.test.js +16 -16
- package/dist/infra/orchestrator/parallelResearch.js +24 -24
- package/dist/tools/convention/analyzeComplexity.test.js +115 -115
- package/dist/tools/convention/validateCodeQuality.test.js +104 -104
- package/dist/tools/memory/createMemoryTimeline.js +10 -10
- package/dist/tools/memory/getMemoryGraph.js +12 -12
- package/dist/tools/memory/getSessionContext.js +9 -9
- package/dist/tools/memory/linkMemories.js +14 -14
- package/dist/tools/memory/listMemories.js +4 -4
- package/dist/tools/memory/recallMemory.js +4 -4
- package/dist/tools/memory/saveMemory.js +4 -4
- package/dist/tools/memory/searchMemoriesAdvanced.js +23 -23
- package/dist/tools/semantic/analyzeDependencyGraph.js +12 -12
- package/dist/tools/semantic/astGrep.test.js +6 -6
- package/dist/tools/spec/prdParser.test.js +171 -171
- package/dist/tools/spec/specGenerator.js +169 -169
- package/dist/tools/spec/traceabilityMatrix.js +64 -64
- package/dist/tools/spec/traceabilityMatrix.test.js +28 -28
- package/hooks/gemini-hooks.json +73 -73
- package/hooks/hooks.json +126 -126
- package/hooks/scripts/__tests__/keyword-detector.test.js +199 -199
- package/hooks/scripts/__tests__/pre-tool-guard.test.js +368 -368
- package/hooks/scripts/__tests__/sentinel-guard.test.js +208 -208
- package/hooks/scripts/auto-commit.js +97 -97
- package/hooks/scripts/auto-format.js +64 -64
- package/hooks/scripts/auto-test.js +81 -81
- package/hooks/scripts/code-check.js +268 -268
- package/hooks/scripts/codex-detect.js +46 -46
- package/hooks/scripts/codex-review-gate.js +80 -80
- package/hooks/scripts/command-log.js +32 -32
- package/hooks/scripts/context-save.js +353 -353
- package/hooks/scripts/evolution-engine.js +91 -91
- package/hooks/scripts/figma-extract.js +635 -635
- package/hooks/scripts/figma-guard.js +219 -219
- package/hooks/scripts/figma-refine.js +315 -315
- package/hooks/scripts/figma-to-scss.js +394 -394
- package/hooks/scripts/figma-validate.js +353 -353
- package/hooks/scripts/hud-status.js +321 -321
- package/hooks/scripts/keyword-detector.js +214 -214
- package/hooks/scripts/lib/scope-from-spec.js +261 -0
- package/hooks/scripts/llm-orchestrate.js +645 -645
- package/hooks/scripts/post-edit.js +32 -32
- package/hooks/scripts/pr-test-gate.js +52 -52
- package/hooks/scripts/pre-tool-dispatcher.js +5 -0
- package/hooks/scripts/pre-tool-guard.js +254 -254
- package/hooks/scripts/prompt-dispatcher.js +190 -190
- package/hooks/scripts/scope-guard.js +145 -0
- package/hooks/scripts/sentinel-guard.js +130 -130
- package/hooks/scripts/session-start.js +186 -177
- package/hooks/scripts/skill-injector.js +83 -83
- package/hooks/scripts/stop-notify.js +209 -209
- package/hooks/scripts/utils.js +257 -257
- package/languages/csharp-unity.md +515 -515
- package/languages/gdscript-godot.md +470 -470
- package/languages/ruby-rails.md +489 -489
- package/languages/typescript-angular.md +433 -433
- package/languages/typescript-astro.md +416 -416
- package/languages/typescript-electron.md +406 -406
- package/languages/typescript-nestjs.md +524 -524
- package/languages/typescript-svelte.md +407 -407
- package/languages/typescript-tauri.md +365 -365
- package/package.json +10 -5
- package/skills/agents-md/SKILL.md +121 -121
- package/skills/agents-md/rubrics/what-to-keep.md +49 -49
- package/skills/agents-md/templates/agents-md.md +36 -36
- package/skills/arch-guard/SKILL.md +181 -181
- package/skills/arch-guard/agents/detector.md +48 -48
- package/skills/arch-guard/agents/reporter.md +48 -48
- package/skills/arch-guard/agents/rule-generator.md +49 -49
- package/skills/arch-guard/agents/violation-checker.md +51 -51
- package/skills/arch-guard/frameworks/clean-architecture.md +108 -108
- package/skills/arch-guard/frameworks/solid.md +102 -102
- package/skills/arch-guard/scripts/check-boundaries.js +90 -90
- package/skills/arch-guard/templates/arch-rules.json +47 -47
- package/skills/arch-guard/templates/violation-report.md +53 -53
- package/skills/brand-assets/SKILL.md +147 -147
- package/skills/brand-assets/rubrics/asset-checklist.md +98 -98
- package/skills/brand-assets/templates/brand-guide.md +161 -161
- package/skills/capability-loop/SKILL.md +272 -272
- package/skills/capability-loop/agents/capability-designer.md +61 -61
- package/skills/capability-loop/agents/failure-analyst.md +55 -55
- package/skills/capability-loop/agents/implementer.md +50 -50
- package/skills/capability-loop/agents/tester.md +53 -53
- package/skills/capability-loop/templates/capability-spec.md +118 -118
- package/skills/capability-loop/templates/failure-analysis.md +118 -118
- package/skills/characterization-test/SKILL.md +207 -207
- package/skills/characterization-test/agents/behavior-capturer.md +50 -50
- package/skills/characterization-test/agents/coverage-checker.md +54 -54
- package/skills/characterization-test/agents/reporter.md +50 -50
- package/skills/characterization-test/agents/test-writer.md +49 -49
- package/skills/characterization-test/rubrics/coverage-criteria.md +53 -53
- package/skills/characterization-test/templates/test-template.ts +101 -101
- package/skills/chub-usage/SKILL.md +139 -139
- package/skills/claude-md-guide/SKILL.md +351 -351
- package/skills/claude-md-guide/rubrics/anti-patterns.md +88 -88
- package/skills/claude-md-guide/templates/claude-md.md +54 -54
- package/skills/commerce-patterns/SKILL.md +64 -64
- package/skills/commerce-patterns/rubrics/checkout-flow.md +48 -48
- package/skills/commerce-patterns/templates/product-schema.md +85 -85
- package/skills/commit-push-pr/SKILL.md +77 -77
- package/skills/commit-push-pr/agents/change-analyzer.md +55 -55
- package/skills/commit-push-pr/agents/message-writer.md +50 -50
- package/skills/commit-push-pr/agents/pr-writer.md +58 -58
- package/skills/commit-push-pr/agents/reviewer.md +52 -52
- package/skills/commit-push-pr/rubrics/commit-message.md +73 -73
- package/skills/commit-push-pr/templates/pr-body.md +63 -63
- package/skills/context7-usage/SKILL.md +106 -106
- package/skills/context7-usage/rubrics/when-to-use.md +50 -50
- package/skills/create-prd/SKILL.md +90 -90
- package/skills/create-prd/agents/edge-case-finder.md +48 -48
- package/skills/create-prd/agents/prioritizer.md +60 -60
- package/skills/create-prd/agents/requirements-writer.md +48 -48
- package/skills/create-prd/agents/researcher.md +55 -55
- package/skills/create-prd/agents/reviewer.md +54 -54
- package/skills/create-prd/frameworks/jobs-to-be-done.md +96 -96
- package/skills/create-prd/frameworks/rice-scoring.md +97 -97
- package/skills/create-prd/orchestrator.md +70 -70
- package/skills/create-prd/rubrics/completeness.md +58 -58
- package/skills/create-prd/templates/prd.md +139 -139
- package/skills/design-audit/SKILL.md +152 -152
- package/skills/design-audit/agents/a11y-auditor.md +43 -43
- package/skills/design-audit/agents/performance-auditor.md +46 -46
- package/skills/design-audit/agents/responsive-auditor.md +46 -46
- package/skills/design-audit/agents/scorer.md +47 -47
- package/skills/design-audit/agents/slop-detector.md +47 -47
- package/skills/design-audit/frameworks/core-web-vitals.md +107 -107
- package/skills/design-audit/frameworks/wcag-checklist.md +64 -64
- package/skills/design-audit/orchestrator.md +64 -64
- package/skills/design-audit/rubrics/ai-slop-patterns.md +83 -83
- package/skills/design-audit/rubrics/scoring.md +63 -63
- package/skills/design-audit/templates/report.md +88 -88
- package/skills/design-critique/SKILL.md +139 -139
- package/skills/design-critique/rubrics/ux-heuristics.md +143 -143
- package/skills/design-critique/templates/critique-report.md +86 -86
- package/skills/design-distill/SKILL.md +130 -130
- package/skills/design-distill/templates/design-system.md +132 -132
- package/skills/design-normalize/SKILL.md +133 -133
- package/skills/design-normalize/rubrics/token-naming.md +117 -117
- package/skills/design-normalize/templates/token-audit.md +89 -89
- package/skills/design-polish/SKILL.md +131 -131
- package/skills/design-polish/rubrics/polish-checklist.md +68 -68
- package/skills/design-polish/templates/polish-report.md +64 -64
- package/skills/design-teach/SKILL.md +182 -182
- package/skills/design-teach/rubrics/brand-personality.md +73 -73
- package/skills/design-teach/templates/design-context.json +36 -36
- package/skills/devlog/SKILL.md +143 -143
- package/skills/e2e-commerce/SKILL.md +62 -62
- package/skills/e2e-commerce/templates/test-scenarios.md +170 -170
- package/skills/event-comms/SKILL.md +172 -172
- package/skills/event-comms/templates/email-invite.md +99 -99
- package/skills/event-comms/templates/sns-post.md +133 -133
- package/skills/event-ops/SKILL.md +207 -207
- package/skills/event-ops/rubrics/contingency.md +85 -85
- package/skills/event-ops/templates/d-day-checklist.md +65 -65
- package/skills/event-planning/SKILL.md +144 -144
- package/skills/event-planning/rubrics/timeline.md +70 -70
- package/skills/event-planning/templates/event-plan.md +91 -91
- package/skills/exec-plan/SKILL.md +149 -149
- package/skills/exec-plan/agents/decomposer.md +47 -47
- package/skills/exec-plan/agents/dependency-mapper.md +44 -44
- package/skills/exec-plan/agents/estimator.md +43 -43
- package/skills/exec-plan/agents/validator.md +55 -55
- package/skills/exec-plan/orchestrator.md +70 -70
- package/skills/exec-plan/rubrics/complexity-scoring.md +75 -75
- package/skills/exec-plan/templates/plan.md +147 -147
- package/skills/git-worktree/SKILL.md +73 -73
- package/skills/git-worktree/rubrics/when-to-use.md +55 -55
- package/skills/handoff/SKILL.md +110 -110
- package/skills/handoff/agents/context-summarizer.md +51 -51
- package/skills/handoff/agents/document-writer.md +63 -63
- package/skills/handoff/agents/state-collector.md +53 -53
- package/skills/handoff/agents/verifier.md +48 -48
- package/skills/handoff/rubrics/completeness.md +62 -62
- package/skills/handoff/templates/handoff.md +107 -107
- package/skills/parallel-research/SKILL.md +104 -104
- package/skills/parallel-research/agents/best-practices.md +43 -43
- package/skills/parallel-research/agents/codebase-patterns.md +46 -46
- package/skills/parallel-research/agents/framework-docs.md +45 -45
- package/skills/parallel-research/agents/security-advisory.md +46 -46
- package/skills/parallel-research/agents/synthesizer.md +57 -57
- package/skills/parallel-research/experts/best-practices.md +50 -50
- package/skills/parallel-research/experts/codebase-patterns.md +70 -70
- package/skills/parallel-research/experts/framework-docs.md +65 -65
- package/skills/parallel-research/experts/security-advisory.md +69 -69
- package/skills/parallel-research/orchestrator.md +79 -79
- package/skills/parallel-research/templates/awesome-list.md +32 -32
- package/skills/parallel-research/templates/paper.md +88 -88
- package/skills/parallel-research/templates/synthesis.md +101 -101
- package/skills/prioritization-frameworks/SKILL.md +87 -87
- package/skills/prioritization-frameworks/rubrics/frameworks.md +79 -79
- package/skills/prioritization-frameworks/templates/scoring-matrix.md +69 -69
- package/skills/priority-todos/SKILL.md +64 -64
- package/skills/priority-todos/rubrics/prioritization.md +70 -70
- package/skills/priority-todos/templates/todo-board.md +59 -59
- package/skills/seo-checklist/SKILL.md +58 -58
- package/skills/seo-checklist/frameworks/structured-data.md +153 -153
- package/skills/seo-checklist/rubrics/content-seo.md +42 -42
- package/skills/seo-checklist/rubrics/technical-seo.md +48 -48
- package/skills/techdebt/SKILL.md +124 -124
- package/skills/techdebt/agents/analyzer.md +50 -50
- package/skills/techdebt/agents/fixer.md +41 -41
- package/skills/techdebt/agents/reviewer.md +47 -47
- package/skills/techdebt/agents/scanner.md +44 -44
- package/skills/techdebt/orchestrator.md +70 -70
- package/skills/techdebt/rubrics/severity.md +51 -51
- package/skills/techdebt/scripts/scan.js +90 -90
- package/skills/techdebt/templates/report.md +86 -86
- package/skills/tool-fallback/SKILL.md +104 -104
- package/skills/tool-fallback/rubrics/fallback-chain.md +58 -58
- package/skills/typescript-advanced-types/SKILL.md +67 -67
- package/skills/typescript-advanced-types/rubrics/type-patterns.md +109 -109
- package/skills/ui-ux-pro-max/SKILL.md +236 -236
- package/skills/ui-ux-pro-max/reference/color-and-contrast.md +517 -517
- package/skills/ui-ux-pro-max/reference/interaction-design.md +544 -544
- package/skills/ui-ux-pro-max/reference/motion-design.md +591 -591
- package/skills/ui-ux-pro-max/reference/responsive-design.md +463 -463
- package/skills/ui-ux-pro-max/reference/spatial-design.md +390 -390
- package/skills/ui-ux-pro-max/reference/typography.md +455 -455
- package/skills/ui-ux-pro-max/reference/ux-writing.md +469 -469
- package/skills/ui-ux-pro-max/rubrics/interaction-states.md +83 -83
- package/skills/ui-ux-pro-max/rubrics/responsive-breakpoints.md +99 -99
- package/skills/user-personas/SKILL.md +75 -75
- package/skills/user-personas/rubrics/research-methods.md +56 -56
- package/skills/user-personas/templates/persona.md +89 -89
- package/skills/vercel-react-best-practices/SKILL.md +60 -60
- package/skills/vercel-react-best-practices/rubrics/performance.md +82 -82
- package/skills/vercel-react-best-practices/rubrics/server-components.md +86 -86
- package/skills/vibe-contract/SKILL.md +166 -166
- package/skills/vibe-docs/templates/architecture.md +80 -80
- package/skills/vibe-docs/templates/readme.md +84 -84
- package/skills/vibe-docs/templates/release-notes.md +74 -74
- package/skills/vibe-figma/SKILL.md +363 -363
- package/skills/vibe-figma/rubrics/extraction-checklist.md +51 -51
- package/skills/vibe-figma/templates/component-index.md +126 -126
- package/skills/vibe-figma/templates/component-spec.md +168 -168
- package/skills/vibe-figma/templates/figma-handoff.md +100 -100
- package/skills/vibe-figma/templates/remapped-tree.md +277 -277
- package/skills/vibe-figma-convert/SKILL.md +235 -235
- package/skills/vibe-figma-convert/rubrics/conversion-rules.md +141 -141
- package/skills/vibe-figma-convert/templates/component.md +140 -140
- package/skills/vibe-figma-extract/SKILL.md +219 -219
- package/skills/vibe-figma-extract/rubrics/image-rules.md +157 -157
- package/skills/vibe-interview/SKILL.md +358 -358
- package/skills/vibe-interview/checklists/api.md +101 -101
- package/skills/vibe-interview/checklists/feature.md +88 -88
- package/skills/vibe-interview/checklists/library.md +95 -95
- package/skills/vibe-interview/checklists/mobile.md +89 -89
- package/skills/vibe-interview/checklists/webapp.md +97 -97
- package/skills/vibe-interview/checklists/website.md +99 -99
- package/skills/vibe-plan/SKILL.md +254 -254
- package/skills/vibe-regress/SKILL.md +174 -174
- package/skills/vibe-regress/templates/bug.md +44 -44
- package/skills/vibe-regress/templates/test-jest.md +29 -29
- package/skills/vibe-regress/templates/test-vitest.md +30 -30
- package/skills/vibe-spec/SKILL.md +1195 -1195
- package/skills/vibe-spec-review/SKILL.md +726 -726
- package/skills/vibe-test/SKILL.md +247 -0
- package/skills/video-production/SKILL.md +52 -52
- package/skills/video-production/rubrics/quality-checklist.md +58 -58
- package/skills/video-production/templates/production-plan.md +104 -104
- package/vibe/config.json +29 -29
- package/vibe/constitution.md +227 -227
- package/vibe/rules/principles/communication-guide.md +98 -98
- package/vibe/rules/principles/development-philosophy.md +52 -52
- package/vibe/rules/principles/quick-start.md +102 -102
- package/vibe/rules/quality/bdd-contract-testing.md +393 -393
- package/vibe/rules/quality/checklist.md +276 -276
- package/vibe/rules/quality/performance.md +236 -236
- package/vibe/rules/quality/testing-strategy.md +440 -440
- package/vibe/rules/standards/anti-patterns.md +541 -541
- package/vibe/rules/standards/code-structure.md +291 -291
- package/vibe/rules/standards/complexity-metrics.md +313 -313
- package/vibe/rules/standards/git-workflow.md +237 -237
- package/vibe/rules/standards/naming-conventions.md +198 -198
- package/vibe/rules/standards/security.md +305 -305
- package/vibe/rules/writing/document-style.md +74 -74
- package/vibe/setup.sh +31 -31
- package/vibe/templates/claudemd-template.md +74 -74
- package/vibe/templates/constitution-template.md +267 -267
- package/vibe/templates/contract-backend-template.md +526 -526
- package/vibe/templates/contract-frontend-template.md +599 -599
- package/vibe/templates/feature-template.md +96 -96
- package/vibe/templates/plan-template.md +194 -194
- package/vibe/templates/spec-template.md +221 -221
- package/vibe/ui-ux-data/charts.csv +26 -26
- package/vibe/ui-ux-data/colors.csv +97 -97
- package/vibe/ui-ux-data/icons.csv +101 -101
- package/vibe/ui-ux-data/landing.csv +31 -31
- package/vibe/ui-ux-data/products.csv +96 -96
- package/vibe/ui-ux-data/react-performance.csv +45 -45
- package/vibe/ui-ux-data/stacks/astro.csv +54 -54
- package/vibe/ui-ux-data/stacks/flutter.csv +53 -53
- package/vibe/ui-ux-data/stacks/html-tailwind.csv +56 -56
- package/vibe/ui-ux-data/stacks/jetpack-compose.csv +53 -53
- package/vibe/ui-ux-data/stacks/nextjs.csv +53 -53
- package/vibe/ui-ux-data/stacks/nuxt-ui.csv +51 -51
- package/vibe/ui-ux-data/stacks/nuxtjs.csv +59 -59
- package/vibe/ui-ux-data/stacks/react-native.csv +52 -52
- package/vibe/ui-ux-data/stacks/react.csv +54 -54
- package/vibe/ui-ux-data/stacks/shadcn.csv +61 -61
- package/vibe/ui-ux-data/stacks/svelte.csv +54 -54
- package/vibe/ui-ux-data/stacks/swiftui.csv +51 -51
- package/vibe/ui-ux-data/stacks/vue.csv +50 -50
- package/vibe/ui-ux-data/styles.csv +68 -68
- package/vibe/ui-ux-data/typography.csv +57 -57
- package/vibe/ui-ux-data/ui-reasoning.csv +101 -101
- package/vibe/ui-ux-data/ux-guidelines.csv +99 -99
- package/vibe/ui-ux-data/version.json +31 -31
- 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
|
-
//
|
|
98
|
-
try {
|
|
99
|
-
const
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
|
|
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();
|