@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,214 +1,214 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Keyword Detector & Combiner
|
|
4
|
-
* 매직 키워드 감지 및 조합 처리
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { VIBE_PATH, PROJECT_DIR } from './utils.js';
|
|
8
|
-
|
|
9
|
-
// 매직 키워드 정의
|
|
10
|
-
const MAGIC_KEYWORDS = {
|
|
11
|
-
// 지속성 모드 (완료까지 계속)
|
|
12
|
-
ralph: {
|
|
13
|
-
name: 'Ralph Loop',
|
|
14
|
-
description: 'Continue until task is verified complete',
|
|
15
|
-
flags: ['persistence', 'verification'],
|
|
16
|
-
output: '[RALPH MODE] Self-referential completion loop activated. Will continue until ALL tasks verified complete. NO early stopping.',
|
|
17
|
-
},
|
|
18
|
-
|
|
19
|
-
// 울트라워크 모드 (병렬 + 자동 계속)
|
|
20
|
-
ultrawork: {
|
|
21
|
-
name: 'Ultrawork',
|
|
22
|
-
description: 'Maximum parallel execution, no pause',
|
|
23
|
-
flags: ['parallel', 'auto_continue', 'no_confirmation'],
|
|
24
|
-
output: '[ULTRAWORK MODE] Use PARALLEL Task calls. Auto-continue through ALL phases. Auto-retry on errors up to 3 times. Do NOT ask for confirmation between phases.',
|
|
25
|
-
},
|
|
26
|
-
ulw: {
|
|
27
|
-
alias: 'ultrawork',
|
|
28
|
-
},
|
|
29
|
-
울트라워크: {
|
|
30
|
-
alias: 'ultrawork',
|
|
31
|
-
},
|
|
32
|
-
|
|
33
|
-
// 계획 모드
|
|
34
|
-
plan: {
|
|
35
|
-
name: 'Plan Mode',
|
|
36
|
-
description: 'Planning interview mode',
|
|
37
|
-
flags: ['planning', 'interview'],
|
|
38
|
-
output: '[PLAN MODE] Enter planning interview mode. Gather requirements before implementation.',
|
|
39
|
-
},
|
|
40
|
-
|
|
41
|
-
// Ralph + Plan 조합
|
|
42
|
-
ralplan: {
|
|
43
|
-
name: 'Ralph Plan',
|
|
44
|
-
description: 'Iterative planning with persistence',
|
|
45
|
-
flags: ['persistence', 'planning', 'iteration'],
|
|
46
|
-
output: '[RALPLAN MODE] Iterative planning with consensus. Will refine plan until approved, then execute with Ralph persistence.',
|
|
47
|
-
},
|
|
48
|
-
|
|
49
|
-
// 검증 모드
|
|
50
|
-
verify: {
|
|
51
|
-
name: 'Verify Mode',
|
|
52
|
-
description: 'Strict verification after each step',
|
|
53
|
-
flags: ['verification', 'strict'],
|
|
54
|
-
output: '[VERIFY MODE] Strict verification enabled. Every change must be verified before proceeding.',
|
|
55
|
-
},
|
|
56
|
-
|
|
57
|
-
// 탐색 모드
|
|
58
|
-
explore: {
|
|
59
|
-
name: 'Explore Mode',
|
|
60
|
-
description: 'Deep codebase exploration',
|
|
61
|
-
flags: ['exploration', 'thorough'],
|
|
62
|
-
output: '[EXPLORE MODE] Deep exploration enabled. Use multiple Explore agents for thorough codebase analysis.',
|
|
63
|
-
},
|
|
64
|
-
|
|
65
|
-
// 빠른 모드
|
|
66
|
-
quick: {
|
|
67
|
-
name: 'Quick Mode',
|
|
68
|
-
description: 'Fast execution, minimal verification',
|
|
69
|
-
flags: ['fast', 'minimal_verification'],
|
|
70
|
-
output: '[QUICK MODE] Fast execution mode. Minimal verification, single round reviews.',
|
|
71
|
-
},
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
// 키워드 조합 시너지
|
|
75
|
-
const KEYWORD_SYNERGIES = {
|
|
76
|
-
'ralph+ultrawork': {
|
|
77
|
-
name: 'Ralph Ultrawork',
|
|
78
|
-
output: '[RALPH+ULTRAWORK] Maximum persistence AND parallel execution. Will NOT stop until ALL phases complete with verification.',
|
|
79
|
-
},
|
|
80
|
-
'ralph+verify': {
|
|
81
|
-
name: 'Ralph Verify',
|
|
82
|
-
output: '[RALPH+VERIFY] Persistent completion with strict verification at each step.',
|
|
83
|
-
},
|
|
84
|
-
'ultrawork+explore': {
|
|
85
|
-
name: 'Ultrawork Explore',
|
|
86
|
-
output: '[ULTRAWORK+EXPLORE] Parallel exploration agents for maximum coverage.',
|
|
87
|
-
},
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* 텍스트에서 키워드 추출
|
|
92
|
-
*/
|
|
93
|
-
function detectKeywords(text) {
|
|
94
|
-
const lowerText = text.toLowerCase();
|
|
95
|
-
const detected = [];
|
|
96
|
-
const resolvedKeywords = new Map();
|
|
97
|
-
|
|
98
|
-
for (const [keyword, config] of Object.entries(MAGIC_KEYWORDS)) {
|
|
99
|
-
// 키워드 매칭 (단어 경계)
|
|
100
|
-
const regex = new RegExp(`\\b${keyword}\\b`, 'i');
|
|
101
|
-
if (regex.test(lowerText)) {
|
|
102
|
-
// alias 해결
|
|
103
|
-
const resolved = config.alias ? MAGIC_KEYWORDS[config.alias] : config;
|
|
104
|
-
const resolvedName = config.alias || keyword;
|
|
105
|
-
|
|
106
|
-
if (!resolvedKeywords.has(resolvedName)) {
|
|
107
|
-
resolvedKeywords.set(resolvedName, resolved);
|
|
108
|
-
detected.push({
|
|
109
|
-
keyword: resolvedName,
|
|
110
|
-
original: keyword,
|
|
111
|
-
...resolved,
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return detected;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* 키워드 조합 처리
|
|
122
|
-
*/
|
|
123
|
-
function processCombinations(detected) {
|
|
124
|
-
if (detected.length <= 1) {
|
|
125
|
-
return null;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// 키워드 이름 정렬하여 조합 키 생성
|
|
129
|
-
const keywordNames = detected.map(d => d.keyword).sort();
|
|
130
|
-
|
|
131
|
-
// 모든 2-조합 확인
|
|
132
|
-
for (let i = 0; i < keywordNames.length; i++) {
|
|
133
|
-
for (let j = i + 1; j < keywordNames.length; j++) {
|
|
134
|
-
const comboKey = `${keywordNames[i]}+${keywordNames[j]}`;
|
|
135
|
-
if (KEYWORD_SYNERGIES[comboKey]) {
|
|
136
|
-
return KEYWORD_SYNERGIES[comboKey];
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
return null;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* 모든 플래그 수집
|
|
146
|
-
*/
|
|
147
|
-
function collectFlags(detected) {
|
|
148
|
-
const flags = new Set();
|
|
149
|
-
for (const d of detected) {
|
|
150
|
-
if (d.flags) {
|
|
151
|
-
d.flags.forEach(f => flags.add(f));
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return Array.from(flags);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* 출력 생성
|
|
159
|
-
*/
|
|
160
|
-
function generateOutput(detected, combination) {
|
|
161
|
-
const outputs = [];
|
|
162
|
-
|
|
163
|
-
// 시너지 조합 우선
|
|
164
|
-
if (combination) {
|
|
165
|
-
outputs.push(combination.output);
|
|
166
|
-
} else {
|
|
167
|
-
// 개별 키워드 출력
|
|
168
|
-
for (const d of detected) {
|
|
169
|
-
if (d.output) {
|
|
170
|
-
outputs.push(d.output);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// 모든 플래그 수집
|
|
176
|
-
const flags = collectFlags(detected);
|
|
177
|
-
if (flags.length > 0) {
|
|
178
|
-
outputs.push(`[FLAGS] ${flags.join(', ')}`);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
return outputs.join('\n');
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// 메인 실행
|
|
185
|
-
const input = process.argv.slice(2).join(' ') || process.env.USER_PROMPT || '';
|
|
186
|
-
|
|
187
|
-
if (!input) {
|
|
188
|
-
console.log(`
|
|
189
|
-
VIBE Keyword Detector
|
|
190
|
-
|
|
191
|
-
Available magic keywords:
|
|
192
|
-
${Object.entries(MAGIC_KEYWORDS)
|
|
193
|
-
.filter(([_, v]) => !v.alias)
|
|
194
|
-
.map(([k, v]) => ` ${k.padEnd(12)} - ${v.description}`)
|
|
195
|
-
.join('\n')}
|
|
196
|
-
|
|
197
|
-
Keyword combinations:
|
|
198
|
-
${Object.entries(KEYWORD_SYNERGIES)
|
|
199
|
-
.map(([k, v]) => ` ${k.padEnd(20)} - ${v.name}`)
|
|
200
|
-
.join('\n')}
|
|
201
|
-
|
|
202
|
-
Usage:
|
|
203
|
-
node keyword-detector.js "implement login ralph ultrawork"
|
|
204
|
-
`);
|
|
205
|
-
process.exit(0);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
const detected = detectKeywords(input);
|
|
209
|
-
|
|
210
|
-
if (detected.length > 0) {
|
|
211
|
-
const combination = processCombinations(detected);
|
|
212
|
-
const output = generateOutput(detected, combination);
|
|
213
|
-
console.log(output);
|
|
214
|
-
}
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Keyword Detector & Combiner
|
|
4
|
+
* 매직 키워드 감지 및 조합 처리
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { VIBE_PATH, PROJECT_DIR } from './utils.js';
|
|
8
|
+
|
|
9
|
+
// 매직 키워드 정의
|
|
10
|
+
const MAGIC_KEYWORDS = {
|
|
11
|
+
// 지속성 모드 (완료까지 계속)
|
|
12
|
+
ralph: {
|
|
13
|
+
name: 'Ralph Loop',
|
|
14
|
+
description: 'Continue until task is verified complete',
|
|
15
|
+
flags: ['persistence', 'verification'],
|
|
16
|
+
output: '[RALPH MODE] Self-referential completion loop activated. Will continue until ALL tasks verified complete. NO early stopping.',
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
// 울트라워크 모드 (병렬 + 자동 계속)
|
|
20
|
+
ultrawork: {
|
|
21
|
+
name: 'Ultrawork',
|
|
22
|
+
description: 'Maximum parallel execution, no pause',
|
|
23
|
+
flags: ['parallel', 'auto_continue', 'no_confirmation'],
|
|
24
|
+
output: '[ULTRAWORK MODE] Use PARALLEL Task calls. Auto-continue through ALL phases. Auto-retry on errors up to 3 times. Do NOT ask for confirmation between phases.',
|
|
25
|
+
},
|
|
26
|
+
ulw: {
|
|
27
|
+
alias: 'ultrawork',
|
|
28
|
+
},
|
|
29
|
+
울트라워크: {
|
|
30
|
+
alias: 'ultrawork',
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
// 계획 모드
|
|
34
|
+
plan: {
|
|
35
|
+
name: 'Plan Mode',
|
|
36
|
+
description: 'Planning interview mode',
|
|
37
|
+
flags: ['planning', 'interview'],
|
|
38
|
+
output: '[PLAN MODE] Enter planning interview mode. Gather requirements before implementation.',
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
// Ralph + Plan 조합
|
|
42
|
+
ralplan: {
|
|
43
|
+
name: 'Ralph Plan',
|
|
44
|
+
description: 'Iterative planning with persistence',
|
|
45
|
+
flags: ['persistence', 'planning', 'iteration'],
|
|
46
|
+
output: '[RALPLAN MODE] Iterative planning with consensus. Will refine plan until approved, then execute with Ralph persistence.',
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
// 검증 모드
|
|
50
|
+
verify: {
|
|
51
|
+
name: 'Verify Mode',
|
|
52
|
+
description: 'Strict verification after each step',
|
|
53
|
+
flags: ['verification', 'strict'],
|
|
54
|
+
output: '[VERIFY MODE] Strict verification enabled. Every change must be verified before proceeding.',
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
// 탐색 모드
|
|
58
|
+
explore: {
|
|
59
|
+
name: 'Explore Mode',
|
|
60
|
+
description: 'Deep codebase exploration',
|
|
61
|
+
flags: ['exploration', 'thorough'],
|
|
62
|
+
output: '[EXPLORE MODE] Deep exploration enabled. Use multiple Explore agents for thorough codebase analysis.',
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
// 빠른 모드
|
|
66
|
+
quick: {
|
|
67
|
+
name: 'Quick Mode',
|
|
68
|
+
description: 'Fast execution, minimal verification',
|
|
69
|
+
flags: ['fast', 'minimal_verification'],
|
|
70
|
+
output: '[QUICK MODE] Fast execution mode. Minimal verification, single round reviews.',
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
// 키워드 조합 시너지
|
|
75
|
+
const KEYWORD_SYNERGIES = {
|
|
76
|
+
'ralph+ultrawork': {
|
|
77
|
+
name: 'Ralph Ultrawork',
|
|
78
|
+
output: '[RALPH+ULTRAWORK] Maximum persistence AND parallel execution. Will NOT stop until ALL phases complete with verification.',
|
|
79
|
+
},
|
|
80
|
+
'ralph+verify': {
|
|
81
|
+
name: 'Ralph Verify',
|
|
82
|
+
output: '[RALPH+VERIFY] Persistent completion with strict verification at each step.',
|
|
83
|
+
},
|
|
84
|
+
'ultrawork+explore': {
|
|
85
|
+
name: 'Ultrawork Explore',
|
|
86
|
+
output: '[ULTRAWORK+EXPLORE] Parallel exploration agents for maximum coverage.',
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* 텍스트에서 키워드 추출
|
|
92
|
+
*/
|
|
93
|
+
function detectKeywords(text) {
|
|
94
|
+
const lowerText = text.toLowerCase();
|
|
95
|
+
const detected = [];
|
|
96
|
+
const resolvedKeywords = new Map();
|
|
97
|
+
|
|
98
|
+
for (const [keyword, config] of Object.entries(MAGIC_KEYWORDS)) {
|
|
99
|
+
// 키워드 매칭 (단어 경계)
|
|
100
|
+
const regex = new RegExp(`\\b${keyword}\\b`, 'i');
|
|
101
|
+
if (regex.test(lowerText)) {
|
|
102
|
+
// alias 해결
|
|
103
|
+
const resolved = config.alias ? MAGIC_KEYWORDS[config.alias] : config;
|
|
104
|
+
const resolvedName = config.alias || keyword;
|
|
105
|
+
|
|
106
|
+
if (!resolvedKeywords.has(resolvedName)) {
|
|
107
|
+
resolvedKeywords.set(resolvedName, resolved);
|
|
108
|
+
detected.push({
|
|
109
|
+
keyword: resolvedName,
|
|
110
|
+
original: keyword,
|
|
111
|
+
...resolved,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return detected;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* 키워드 조합 처리
|
|
122
|
+
*/
|
|
123
|
+
function processCombinations(detected) {
|
|
124
|
+
if (detected.length <= 1) {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// 키워드 이름 정렬하여 조합 키 생성
|
|
129
|
+
const keywordNames = detected.map(d => d.keyword).sort();
|
|
130
|
+
|
|
131
|
+
// 모든 2-조합 확인
|
|
132
|
+
for (let i = 0; i < keywordNames.length; i++) {
|
|
133
|
+
for (let j = i + 1; j < keywordNames.length; j++) {
|
|
134
|
+
const comboKey = `${keywordNames[i]}+${keywordNames[j]}`;
|
|
135
|
+
if (KEYWORD_SYNERGIES[comboKey]) {
|
|
136
|
+
return KEYWORD_SYNERGIES[comboKey];
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* 모든 플래그 수집
|
|
146
|
+
*/
|
|
147
|
+
function collectFlags(detected) {
|
|
148
|
+
const flags = new Set();
|
|
149
|
+
for (const d of detected) {
|
|
150
|
+
if (d.flags) {
|
|
151
|
+
d.flags.forEach(f => flags.add(f));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return Array.from(flags);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* 출력 생성
|
|
159
|
+
*/
|
|
160
|
+
function generateOutput(detected, combination) {
|
|
161
|
+
const outputs = [];
|
|
162
|
+
|
|
163
|
+
// 시너지 조합 우선
|
|
164
|
+
if (combination) {
|
|
165
|
+
outputs.push(combination.output);
|
|
166
|
+
} else {
|
|
167
|
+
// 개별 키워드 출력
|
|
168
|
+
for (const d of detected) {
|
|
169
|
+
if (d.output) {
|
|
170
|
+
outputs.push(d.output);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// 모든 플래그 수집
|
|
176
|
+
const flags = collectFlags(detected);
|
|
177
|
+
if (flags.length > 0) {
|
|
178
|
+
outputs.push(`[FLAGS] ${flags.join(', ')}`);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return outputs.join('\n');
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// 메인 실행
|
|
185
|
+
const input = process.argv.slice(2).join(' ') || process.env.USER_PROMPT || '';
|
|
186
|
+
|
|
187
|
+
if (!input) {
|
|
188
|
+
console.log(`
|
|
189
|
+
VIBE Keyword Detector
|
|
190
|
+
|
|
191
|
+
Available magic keywords:
|
|
192
|
+
${Object.entries(MAGIC_KEYWORDS)
|
|
193
|
+
.filter(([_, v]) => !v.alias)
|
|
194
|
+
.map(([k, v]) => ` ${k.padEnd(12)} - ${v.description}`)
|
|
195
|
+
.join('\n')}
|
|
196
|
+
|
|
197
|
+
Keyword combinations:
|
|
198
|
+
${Object.entries(KEYWORD_SYNERGIES)
|
|
199
|
+
.map(([k, v]) => ` ${k.padEnd(20)} - ${v.name}`)
|
|
200
|
+
.join('\n')}
|
|
201
|
+
|
|
202
|
+
Usage:
|
|
203
|
+
node keyword-detector.js "implement login ralph ultrawork"
|
|
204
|
+
`);
|
|
205
|
+
process.exit(0);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const detected = detectKeywords(input);
|
|
209
|
+
|
|
210
|
+
if (detected.length > 0) {
|
|
211
|
+
const combination = processCombinations(detected);
|
|
212
|
+
const output = generateOutput(detected, combination);
|
|
213
|
+
console.log(output);
|
|
214
|
+
}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scope synthesizer — derive allow-glob patterns from active SPECs.
|
|
3
|
+
*
|
|
4
|
+
* 활성 SPEC(`.claude/vibe/specs/*.md` with frontmatter status ∈ pending|in-progress|active)을
|
|
5
|
+
* 스캔해 백틱으로 감싼 파일 경로를 수집 → `<dir>/**` glob으로 변환한다.
|
|
6
|
+
*
|
|
7
|
+
* 수동 편집된 scope.json은 건드리지 않는다 — `auto: true` 플래그가 있는 파일만 덮어쓴다.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import fs from 'fs';
|
|
11
|
+
import path from 'path';
|
|
12
|
+
|
|
13
|
+
const ACTIVE_STATUSES = new Set(['pending', 'in-progress', 'in_progress', 'active', 'running']);
|
|
14
|
+
|
|
15
|
+
// 항상 허용: SPEC/plan/TODO 등 메타 문서는 구현 중에도 갱신 가능해야 함
|
|
16
|
+
const DEFAULT_ALLOW = ['.claude/vibe/**', 'CLAUDE.md', 'AGENTS.md'];
|
|
17
|
+
|
|
18
|
+
function readFrontmatter(content) {
|
|
19
|
+
if (!content.startsWith('---')) return {};
|
|
20
|
+
const end = content.indexOf('\n---', 3);
|
|
21
|
+
if (end < 0) return {};
|
|
22
|
+
const block = content.slice(3, end);
|
|
23
|
+
const out = {};
|
|
24
|
+
for (const line of block.split('\n')) {
|
|
25
|
+
const m = line.match(/^([a-zA-Z_][\w-]*)\s*:\s*(.*)$/);
|
|
26
|
+
if (m) out[m[1]] = m[2].trim();
|
|
27
|
+
}
|
|
28
|
+
return out;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* 본문에서 백틱으로 감싼 파일 경로 후보 추출.
|
|
33
|
+
* - 확장자 있는 경로 (foo.ts, hooks/scripts/bar.js)
|
|
34
|
+
* - 슬래시 포함 상대경로 (src/cli/commands)
|
|
35
|
+
* - 절대경로(/etc/...) 및 URL(http://...) 제외
|
|
36
|
+
*/
|
|
37
|
+
// 허용 파일명 확장자 (실제 소스/자산). SPEC에 적힌 임의 토큰을 걸러낸다.
|
|
38
|
+
const ALLOWED_EXTS = new Set([
|
|
39
|
+
'ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'json', 'md', 'mdx',
|
|
40
|
+
'css', 'scss', 'sass', 'less', 'html', 'yaml', 'yml', 'toml',
|
|
41
|
+
'py', 'rs', 'go', 'java', 'kt', 'rb', 'php', 'swift', 'c', 'cpp', 'h', 'hpp',
|
|
42
|
+
'sh', 'bash', 'sql', 'env', 'feature', 'txt', 'svg', 'png', 'jpg', 'webp',
|
|
43
|
+
]);
|
|
44
|
+
|
|
45
|
+
function extractPaths(markdown) {
|
|
46
|
+
const paths = new Set();
|
|
47
|
+
const backtickRe = /`([^`\n]+)`/g;
|
|
48
|
+
let m;
|
|
49
|
+
while ((m = backtickRe.exec(markdown)) !== null) {
|
|
50
|
+
const raw = m[1].trim();
|
|
51
|
+
if (!raw || raw.length > 200) continue;
|
|
52
|
+
if (raw.startsWith('/') || raw.startsWith('~')) continue; // 시스템/홈
|
|
53
|
+
if (raw.startsWith('http') || raw.includes('://')) continue;
|
|
54
|
+
if (/[\s{}[\]()<>`'"=,;|&$?!*@#%^+]/.test(raw)) continue; // 코드/템플릿/속성 접근자
|
|
55
|
+
|
|
56
|
+
const hasSlash = raw.includes('/');
|
|
57
|
+
const extMatch = raw.match(/\.([a-zA-Z0-9]{1,6})$/);
|
|
58
|
+
const ext = extMatch ? extMatch[1].toLowerCase() : null;
|
|
59
|
+
|
|
60
|
+
// 확장자 있으면 화이트리스트 체크, 없으면 디렉토리로 간주 (슬래시 필수)
|
|
61
|
+
if (ext) {
|
|
62
|
+
if (!ALLOWED_EXTS.has(ext)) continue;
|
|
63
|
+
} else {
|
|
64
|
+
if (!hasSlash) continue;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// 명백한 비경로 제외
|
|
68
|
+
if (/^[A-Z_]+$/.test(raw)) continue; // 상수
|
|
69
|
+
if (/^\d+$/.test(raw)) continue; // 숫자
|
|
70
|
+
if (raw.startsWith('.') && !raw.startsWith('./') && !raw.startsWith('.claude')) continue;
|
|
71
|
+
|
|
72
|
+
const normalized = raw.replace(/^\.\//, '').replace(/\\/g, '/');
|
|
73
|
+
// 각 세그먼트 안전성 재검증 — "a.b.c" 같은 필드 경로 제거
|
|
74
|
+
const segments = normalized.split('/');
|
|
75
|
+
const lastSeg = segments[segments.length - 1];
|
|
76
|
+
// 파일명에 점이 2개 이상이면 보통 필드 경로 (except .test.ts, .d.ts 같은 허용 패턴)
|
|
77
|
+
const dotCount = (lastSeg.match(/\./g) || []).length;
|
|
78
|
+
if (dotCount > 2) continue;
|
|
79
|
+
if (dotCount === 2 && !/\.(test|spec|d|config|module|stories)\.[a-z]+$/i.test(lastSeg)) continue;
|
|
80
|
+
|
|
81
|
+
paths.add(normalized);
|
|
82
|
+
}
|
|
83
|
+
return [...paths];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* 경로 목록 → glob 패턴 집합.
|
|
88
|
+
* - 확장자 있는 파일: dirname을 `<dir>/**`로
|
|
89
|
+
* - 디렉토리(확장자 없음, 슬래시 포함): `<path>/**`
|
|
90
|
+
* - 최상위 파일은 그대로 포함
|
|
91
|
+
*/
|
|
92
|
+
function pathsToGlobs(paths) {
|
|
93
|
+
const globs = new Set();
|
|
94
|
+
for (const p of paths) {
|
|
95
|
+
const hasExt = /\.[a-zA-Z0-9]{1,6}$/.test(p);
|
|
96
|
+
if (hasExt) {
|
|
97
|
+
const dir = path.posix.dirname(p);
|
|
98
|
+
if (dir && dir !== '.') globs.add(`${dir}/**`);
|
|
99
|
+
else globs.add(p);
|
|
100
|
+
} else {
|
|
101
|
+
const trimmed = p.replace(/\/+$/, '');
|
|
102
|
+
globs.add(`${trimmed}/**`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return collapseDominated([...globs]);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* `a/**`가 `a/b/**`를 포함하면 후자 제거.
|
|
110
|
+
*/
|
|
111
|
+
function collapseDominated(globs) {
|
|
112
|
+
const sorted = [...new Set(globs)].sort((a, b) => a.length - b.length);
|
|
113
|
+
const kept = [];
|
|
114
|
+
for (const g of sorted) {
|
|
115
|
+
const base = g.replace(/\/\*\*$/, '');
|
|
116
|
+
const dominated = kept.some(k => {
|
|
117
|
+
const kb = k.replace(/\/\*\*$/, '');
|
|
118
|
+
return g !== k && g.endsWith('/**') && k.endsWith('/**') && (base === kb || base.startsWith(kb + '/'));
|
|
119
|
+
});
|
|
120
|
+
if (!dominated) kept.push(g);
|
|
121
|
+
}
|
|
122
|
+
return kept;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* 프로젝트의 활성 SPEC 목록 수집.
|
|
127
|
+
*/
|
|
128
|
+
export function findActiveSpecs(projectDir) {
|
|
129
|
+
const specsDir = path.join(projectDir, '.claude', 'vibe', 'specs');
|
|
130
|
+
if (!fs.existsSync(specsDir)) return [];
|
|
131
|
+
const results = [];
|
|
132
|
+
const walk = (dir) => {
|
|
133
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
134
|
+
const full = path.join(dir, entry.name);
|
|
135
|
+
if (entry.isDirectory()) walk(full);
|
|
136
|
+
else if (entry.isFile() && entry.name.endsWith('.md')) results.push(full);
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
walk(specsDir);
|
|
140
|
+
return results.filter(f => {
|
|
141
|
+
try {
|
|
142
|
+
const content = fs.readFileSync(f, 'utf-8');
|
|
143
|
+
const fm = readFrontmatter(content);
|
|
144
|
+
const status = (fm.status || '').toLowerCase();
|
|
145
|
+
if (!fm.status) return true; // status 없으면 활성 간주
|
|
146
|
+
return ACTIVE_STATUSES.has(status);
|
|
147
|
+
} catch { return false; }
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* SPEC 파일 목록 → scope.json 객체.
|
|
153
|
+
*/
|
|
154
|
+
export function synthesizeScope(specFiles, { projectDir } = {}) {
|
|
155
|
+
const allPaths = new Set();
|
|
156
|
+
const sourceNames = [];
|
|
157
|
+
for (const f of specFiles) {
|
|
158
|
+
try {
|
|
159
|
+
const content = fs.readFileSync(f, 'utf-8');
|
|
160
|
+
for (const p of extractPaths(content)) allPaths.add(p);
|
|
161
|
+
sourceNames.push(path.relative(projectDir || '.', f).replace(/\\/g, '/'));
|
|
162
|
+
} catch { /* ignore */ }
|
|
163
|
+
}
|
|
164
|
+
const derived = pathsToGlobs([...allPaths]);
|
|
165
|
+
// 파일시스템 검증: 디렉토리 glob은 실제 존재할 때만 포함. 파일은 파일명만
|
|
166
|
+
// 있을 수 있으므로 (중첩 경로의 basename), 확장자 있으면 통과.
|
|
167
|
+
const verified = projectDir
|
|
168
|
+
? derived.filter(g => {
|
|
169
|
+
if (!g.endsWith('/**')) return true; // 파일은 유지
|
|
170
|
+
const base = g.replace(/\/\*\*$/, '');
|
|
171
|
+
try { return fs.existsSync(path.join(projectDir, base)); }
|
|
172
|
+
catch { return false; }
|
|
173
|
+
})
|
|
174
|
+
: derived;
|
|
175
|
+
const allow = collapseDominated([...DEFAULT_ALLOW, ...verified]);
|
|
176
|
+
return {
|
|
177
|
+
auto: true,
|
|
178
|
+
mode: 'warn',
|
|
179
|
+
allow,
|
|
180
|
+
deny: [],
|
|
181
|
+
reason: sourceNames.length > 0
|
|
182
|
+
? `auto-derived from active SPECs: ${sourceNames.join(', ')}`
|
|
183
|
+
: 'auto-derived (no active SPECs found)',
|
|
184
|
+
generatedAt: new Date().toISOString(),
|
|
185
|
+
sources: sourceNames,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* scope.json을 활성 SPEC 기반으로 동기화.
|
|
191
|
+
* - 파일 없음 → 생성 (활성 SPEC이 있을 때만)
|
|
192
|
+
* - 파일 있음 + `auto: true` → 갱신
|
|
193
|
+
* - 파일 있음 + `auto` 없거나 false → 수동 관리 중, 건드리지 않음
|
|
194
|
+
*
|
|
195
|
+
* @returns {{ action: 'created'|'updated'|'skipped-manual'|'skipped-no-specs'|'unchanged', path: string }}
|
|
196
|
+
*/
|
|
197
|
+
export function syncScopeFile(projectDir) {
|
|
198
|
+
const scopePath = path.join(projectDir, '.claude', 'vibe', 'scope.json');
|
|
199
|
+
const specs = findActiveSpecs(projectDir);
|
|
200
|
+
|
|
201
|
+
// 기존 파일이 수동 관리면 스킵
|
|
202
|
+
if (fs.existsSync(scopePath)) {
|
|
203
|
+
try {
|
|
204
|
+
const existing = JSON.parse(fs.readFileSync(scopePath, 'utf-8'));
|
|
205
|
+
if (existing.auto !== true) {
|
|
206
|
+
return { action: 'skipped-manual', path: scopePath };
|
|
207
|
+
}
|
|
208
|
+
} catch { /* 파싱 실패 → 자동 생성 덮어쓰기 */ }
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (specs.length === 0) {
|
|
212
|
+
// 자동 파일만 있고 활성 SPEC 없음 → 제거
|
|
213
|
+
if (fs.existsSync(scopePath)) {
|
|
214
|
+
try {
|
|
215
|
+
const existing = JSON.parse(fs.readFileSync(scopePath, 'utf-8'));
|
|
216
|
+
if (existing.auto === true) {
|
|
217
|
+
fs.unlinkSync(scopePath);
|
|
218
|
+
return { action: 'removed', path: scopePath };
|
|
219
|
+
}
|
|
220
|
+
} catch { /* ignore */ }
|
|
221
|
+
}
|
|
222
|
+
return { action: 'skipped-no-specs', path: scopePath };
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const next = synthesizeScope(specs, { projectDir });
|
|
226
|
+
const nextStr = JSON.stringify(next, null, 2);
|
|
227
|
+
|
|
228
|
+
// 변경 없음 체크 (generatedAt 제외)
|
|
229
|
+
if (fs.existsSync(scopePath)) {
|
|
230
|
+
try {
|
|
231
|
+
const existing = JSON.parse(fs.readFileSync(scopePath, 'utf-8'));
|
|
232
|
+
const { generatedAt: _a, ...exRest } = existing;
|
|
233
|
+
const { generatedAt: _b, ...nextRest } = next;
|
|
234
|
+
if (JSON.stringify(exRest) === JSON.stringify(nextRest)) {
|
|
235
|
+
return { action: 'unchanged', path: scopePath };
|
|
236
|
+
}
|
|
237
|
+
} catch { /* ignore */ }
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const existed = fs.existsSync(scopePath);
|
|
241
|
+
fs.mkdirSync(path.dirname(scopePath), { recursive: true });
|
|
242
|
+
fs.writeFileSync(scopePath, nextStr + '\n', 'utf-8');
|
|
243
|
+
return { action: existed ? 'updated' : 'created', path: scopePath };
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// CLI 엔트리: `node hooks/scripts/lib/scope-from-spec.js [projectDir]`
|
|
247
|
+
// init/update나 스크립트에서 자동 동기화 용도로 직접 호출 가능.
|
|
248
|
+
import { fileURLToPath } from 'url';
|
|
249
|
+
if (process.argv[1] && fileURLToPath(import.meta.url) === path.resolve(process.argv[1])) {
|
|
250
|
+
const dir = process.argv[2] || process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
251
|
+
const result = syncScopeFile(dir);
|
|
252
|
+
const label = {
|
|
253
|
+
created: '✓ scope.json created',
|
|
254
|
+
updated: '✓ scope.json updated',
|
|
255
|
+
unchanged: '· scope.json unchanged',
|
|
256
|
+
removed: '✓ scope.json removed (no active SPECs)',
|
|
257
|
+
'skipped-manual': '· scope.json is manually managed (auto=false)',
|
|
258
|
+
'skipped-no-specs': '· no active SPECs — scope.json not generated',
|
|
259
|
+
}[result.action] || result.action;
|
|
260
|
+
console.log(`[scope-sync] ${label}`);
|
|
261
|
+
}
|