@su-record/vibe 2.7.10 → 2.7.12
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 +126 -222
- package/LICENSE +21 -21
- package/README.md +580 -580
- 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 +266 -266
- 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/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/tester.md +49 -49
- package/agents/ui/ui-a11y-auditor.md +93 -93
- package/agents/ui/ui-antipattern-detector.md +94 -94
- 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 +260 -260
- package/commands/vibe.run.md +83 -0
- package/commands/vibe.spec.review.md +558 -558
- package/commands/vibe.utils.md +413 -413
- package/commands/vibe.voice.md +79 -79
- package/dist/cli/auth.d.ts +1 -1
- package/dist/cli/auth.d.ts.map +1 -1
- package/dist/cli/auth.js +15 -7
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/collaborator.js +52 -52
- package/dist/cli/commands/evolution.js +12 -12
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +1 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +62 -56
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +9 -6
- 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.d.ts +13 -0
- package/dist/cli/commands/skills.d.ts.map +1 -0
- package/dist/cli/commands/skills.js +83 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/commands/slack.js +10 -10
- package/dist/cli/commands/telegram.js +12 -12
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +3 -0
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/detect.js +32 -32
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +64 -47
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/llm/claude-commands.js +16 -16
- package/dist/cli/llm/config.js +18 -18
- package/dist/cli/llm/gemini-commands.js +47 -47
- package/dist/cli/llm/gpt-commands.js +19 -19
- package/dist/cli/llm/help.js +21 -21
- package/dist/cli/postinstall/constants.d.ts +8 -0
- package/dist/cli/postinstall/constants.d.ts.map +1 -1
- package/dist/cli/postinstall/constants.js +33 -0
- package/dist/cli/postinstall/constants.js.map +1 -1
- 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/postinstall/index.d.ts +1 -1
- package/dist/cli/postinstall/index.d.ts.map +1 -1
- package/dist/cli/postinstall/index.js +1 -1
- package/dist/cli/postinstall/index.js.map +1 -1
- package/dist/cli/setup/ProjectSetup.d.ts.map +1 -1
- package/dist/cli/setup/ProjectSetup.js +5 -0
- package/dist/cli/setup/ProjectSetup.js.map +1 -1
- package/dist/cli/setup/Provisioner.js +42 -42
- package/dist/cli/types.d.ts +1 -0
- package/dist/cli/types.d.ts.map +1 -1
- 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.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.d.ts +79 -0
- package/dist/infra/lib/evolution/DescriptionOptimizer.d.ts.map +1 -0
- package/dist/infra/lib/evolution/DescriptionOptimizer.js +259 -0
- package/dist/infra/lib/evolution/DescriptionOptimizer.js.map +1 -0
- package/dist/infra/lib/evolution/GenerationRegistry.js +36 -36
- package/dist/infra/lib/evolution/InsightStore.js +90 -90
- package/dist/infra/lib/evolution/RollbackManager.js +5 -5
- package/dist/infra/lib/evolution/SkillBenchmark.d.ts +81 -0
- package/dist/infra/lib/evolution/SkillBenchmark.d.ts.map +1 -0
- package/dist/infra/lib/evolution/SkillBenchmark.js +233 -0
- package/dist/infra/lib/evolution/SkillBenchmark.js.map +1 -0
- package/dist/infra/lib/evolution/SkillClassifier.d.ts +35 -0
- package/dist/infra/lib/evolution/SkillClassifier.d.ts.map +1 -0
- package/dist/infra/lib/evolution/SkillClassifier.js +167 -0
- package/dist/infra/lib/evolution/SkillClassifier.js.map +1 -0
- package/dist/infra/lib/evolution/SkillEvalRunner.d.ts +102 -0
- package/dist/infra/lib/evolution/SkillEvalRunner.d.ts.map +1 -0
- package/dist/infra/lib/evolution/SkillEvalRunner.js +256 -0
- package/dist/infra/lib/evolution/SkillEvalRunner.js.map +1 -0
- package/dist/infra/lib/evolution/SkillGapDetector.js +10 -10
- package/dist/infra/lib/evolution/UsageTracker.js +28 -28
- package/dist/infra/lib/evolution/__tests__/eval.test.d.ts +2 -0
- package/dist/infra/lib/evolution/__tests__/eval.test.d.ts.map +1 -0
- package/dist/infra/lib/evolution/__tests__/eval.test.js +539 -0
- package/dist/infra/lib/evolution/__tests__/eval.test.js.map +1 -0
- package/dist/infra/lib/evolution/index.d.ts +8 -0
- package/dist/infra/lib/evolution/index.d.ts.map +1 -1
- package/dist/infra/lib/evolution/index.js +5 -0
- package/dist/infra/lib/evolution/index.js.map +1 -1
- package/dist/infra/lib/gemini/constants.js +14 -14
- package/dist/infra/lib/gemini/orchestration.js +5 -5
- package/dist/infra/lib/gpt/oauth.js +44 -44
- 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 +137 -137
- package/hooks/scripts/code-check.js +70 -70
- package/hooks/scripts/context-save.js +212 -212
- package/hooks/scripts/hud-status.js +291 -291
- package/hooks/scripts/keyword-detector.js +214 -214
- package/hooks/scripts/llm-orchestrate.js +646 -646
- package/hooks/scripts/post-edit.js +32 -32
- package/hooks/scripts/pre-tool-guard.js +125 -125
- package/hooks/scripts/prompt-dispatcher.js +185 -185
- package/hooks/scripts/sentinel-guard.js +104 -104
- package/hooks/scripts/session-start.js +106 -106
- package/hooks/scripts/stop-notify.js +209 -209
- package/hooks/scripts/utils.js +100 -100
- 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 +121 -121
- package/skills/agents-md/SKILL.md +120 -120
- package/skills/arch-guard/SKILL.md +180 -0
- package/skills/brand-assets/SKILL.md +146 -146
- package/skills/capability-loop/SKILL.md +167 -0
- package/skills/characterization-test/SKILL.md +206 -206
- package/skills/commerce-patterns/SKILL.md +59 -59
- package/skills/commit-push-pr/SKILL.md +75 -75
- package/skills/context7-usage/SKILL.md +105 -105
- package/skills/core-capabilities/SKILL.md +48 -48
- package/skills/e2e-commerce/SKILL.md +57 -57
- package/skills/exec-plan/SKILL.md +147 -0
- package/skills/frontend-design/SKILL.md +73 -73
- package/skills/git-worktree/SKILL.md +72 -72
- package/skills/handoff/SKILL.md +109 -109
- package/skills/parallel-research/SKILL.md +87 -87
- package/skills/priority-todos/SKILL.md +63 -63
- package/skills/seo-checklist/SKILL.md +57 -57
- package/skills/techdebt/SKILL.md +122 -122
- package/skills/tool-fallback/SKILL.md +103 -103
- package/skills/typescript-advanced-types/SKILL.md +65 -65
- package/skills/ui-ux-pro-max/SKILL.md +206 -206
- package/skills/vercel-react-best-practices/SKILL.md +59 -59
- package/skills/video-production/SKILL.md +51 -51
- 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/constitution-template.md +252 -252
- 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/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
package/package.json
CHANGED
|
@@ -1,121 +1,121 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@su-record/vibe",
|
|
3
|
-
"version": "2.7.
|
|
4
|
-
"description": "AI Coding Framework for Claude Code — 49 agents, 41+ tools, multi-LLM orchestration",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "dist/cli/index.js",
|
|
7
|
-
"exports": {
|
|
8
|
-
".": "./dist/cli/index.js",
|
|
9
|
-
"./agent": {
|
|
10
|
-
"types": "./dist/agent/index.d.ts",
|
|
11
|
-
"default": "./dist/agent/index.js"
|
|
12
|
-
},
|
|
13
|
-
"./tools": "./dist/tools/index.js",
|
|
14
|
-
"./tools/memory": "./dist/tools/memory/index.js",
|
|
15
|
-
"./tools/convention": "./dist/tools/convention/index.js",
|
|
16
|
-
"./tools/semantic": "./dist/tools/semantic/index.js",
|
|
17
|
-
"./tools/ui": "./dist/tools/ui/index.js",
|
|
18
|
-
"./tools/time": "./dist/tools/time/index.js",
|
|
19
|
-
"./tools/interaction": "./dist/tools/interaction/index.js",
|
|
20
|
-
"./orchestrator": "./dist/infra/orchestrator/index.js",
|
|
21
|
-
"./interface": {
|
|
22
|
-
"types": "./dist/interface/index.d.ts",
|
|
23
|
-
"default": "./dist/interface/index.js"
|
|
24
|
-
},
|
|
25
|
-
"./router": {
|
|
26
|
-
"types": "./dist/router/index.d.ts",
|
|
27
|
-
"default": "./dist/router/index.js"
|
|
28
|
-
},
|
|
29
|
-
"./memory": {
|
|
30
|
-
"types": "./dist/infra/lib/memory/index.d.ts",
|
|
31
|
-
"default": "./dist/infra/lib/memory/index.js"
|
|
32
|
-
},
|
|
33
|
-
"./policy": {
|
|
34
|
-
"types": "./dist/infra/policy/index.d.ts",
|
|
35
|
-
"default": "./dist/infra/policy/index.js"
|
|
36
|
-
},
|
|
37
|
-
"./lib/gpt": "./dist/infra/lib/gpt-api.js",
|
|
38
|
-
"./lib/gemini": "./dist/infra/lib/gemini-api.js"
|
|
39
|
-
},
|
|
40
|
-
"bin": {
|
|
41
|
-
"vibe": "dist/cli/index.js"
|
|
42
|
-
},
|
|
43
|
-
"scripts": {
|
|
44
|
-
"build": "tsc && chmod +x dist/cli/index.js",
|
|
45
|
-
"dev": "tsc --watch",
|
|
46
|
-
"test": "vitest run",
|
|
47
|
-
"test:watch": "vitest",
|
|
48
|
-
"prepublishOnly": "pnpm build",
|
|
49
|
-
"postinstall": "node -e \"import('./dist/cli/postinstall/main.js').then(m=>m.main()).catch(()=>{})\"",
|
|
50
|
-
"release": "pnpm version patch && npm publish --access public"
|
|
51
|
-
},
|
|
52
|
-
"keywords": [
|
|
53
|
-
"ai",
|
|
54
|
-
"core",
|
|
55
|
-
"coding",
|
|
56
|
-
"spec-driven",
|
|
57
|
-
"claude",
|
|
58
|
-
"agent",
|
|
59
|
-
"requirements",
|
|
60
|
-
"user-story",
|
|
61
|
-
"ultrawork",
|
|
62
|
-
"parallel-agents",
|
|
63
|
-
"memory-management",
|
|
64
|
-
"knowledge-graph",
|
|
65
|
-
"code-analysis",
|
|
66
|
-
"code-quality"
|
|
67
|
-
],
|
|
68
|
-
"author": "Su",
|
|
69
|
-
"license": "MIT",
|
|
70
|
-
"repository": {
|
|
71
|
-
"type": "git",
|
|
72
|
-
"url": "git+https://github.com/su-record/vibe.git"
|
|
73
|
-
},
|
|
74
|
-
"homepage": "https://github.com/su-record/vibe#readme",
|
|
75
|
-
"publishConfig": {
|
|
76
|
-
"access": "public"
|
|
77
|
-
},
|
|
78
|
-
"engines": {
|
|
79
|
-
"node": ">=18.0.0"
|
|
80
|
-
},
|
|
81
|
-
"optionalDependencies": {
|
|
82
|
-
"@ast-grep/napi": "^0.40.5"
|
|
83
|
-
},
|
|
84
|
-
"dependencies": {
|
|
85
|
-
"@anthropic-ai/claude-agent-sdk": "^0.2.6",
|
|
86
|
-
"@clack/prompts": "^1.0.0",
|
|
87
|
-
"better-sqlite3": "^12.6.2",
|
|
88
|
-
"chalk": "^5.3.0",
|
|
89
|
-
"glob": "^13.0.1",
|
|
90
|
-
"node-cron": "^3.0.3",
|
|
91
|
-
"papaparse": "^5.5.3",
|
|
92
|
-
"playwright": "^1.58.2",
|
|
93
|
-
"ts-morph": "^26.0.0",
|
|
94
|
-
"uuidv7": "^1.1.0",
|
|
95
|
-
"vscode-languageserver-protocol": "^3.17.5",
|
|
96
|
-
"zod": "^4.3.6"
|
|
97
|
-
},
|
|
98
|
-
"devDependencies": {
|
|
99
|
-
"@types/better-sqlite3": "^7.6.13",
|
|
100
|
-
"@types/node": "^22.0.0",
|
|
101
|
-
"@types/node-cron": "^3.0.11",
|
|
102
|
-
"@types/papaparse": "^5.5.2",
|
|
103
|
-
"ajv": "^8.17.1",
|
|
104
|
-
"typescript": "^5.5.4",
|
|
105
|
-
"vitest": "^4.0.9"
|
|
106
|
-
},
|
|
107
|
-
"files": [
|
|
108
|
-
"dist/",
|
|
109
|
-
"vibe/",
|
|
110
|
-
"languages/",
|
|
111
|
-
"commands/",
|
|
112
|
-
"agents/",
|
|
113
|
-
"skills/",
|
|
114
|
-
"hooks/",
|
|
115
|
-
".env.example",
|
|
116
|
-
".env",
|
|
117
|
-
"CLAUDE.md",
|
|
118
|
-
"README.md",
|
|
119
|
-
"LICENSE"
|
|
120
|
-
]
|
|
121
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@su-record/vibe",
|
|
3
|
+
"version": "2.7.12",
|
|
4
|
+
"description": "AI Coding Framework for Claude Code — 49 agents, 41+ tools, multi-LLM orchestration",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/cli/index.js",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./dist/cli/index.js",
|
|
9
|
+
"./agent": {
|
|
10
|
+
"types": "./dist/agent/index.d.ts",
|
|
11
|
+
"default": "./dist/agent/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./tools": "./dist/tools/index.js",
|
|
14
|
+
"./tools/memory": "./dist/tools/memory/index.js",
|
|
15
|
+
"./tools/convention": "./dist/tools/convention/index.js",
|
|
16
|
+
"./tools/semantic": "./dist/tools/semantic/index.js",
|
|
17
|
+
"./tools/ui": "./dist/tools/ui/index.js",
|
|
18
|
+
"./tools/time": "./dist/tools/time/index.js",
|
|
19
|
+
"./tools/interaction": "./dist/tools/interaction/index.js",
|
|
20
|
+
"./orchestrator": "./dist/infra/orchestrator/index.js",
|
|
21
|
+
"./interface": {
|
|
22
|
+
"types": "./dist/interface/index.d.ts",
|
|
23
|
+
"default": "./dist/interface/index.js"
|
|
24
|
+
},
|
|
25
|
+
"./router": {
|
|
26
|
+
"types": "./dist/router/index.d.ts",
|
|
27
|
+
"default": "./dist/router/index.js"
|
|
28
|
+
},
|
|
29
|
+
"./memory": {
|
|
30
|
+
"types": "./dist/infra/lib/memory/index.d.ts",
|
|
31
|
+
"default": "./dist/infra/lib/memory/index.js"
|
|
32
|
+
},
|
|
33
|
+
"./policy": {
|
|
34
|
+
"types": "./dist/infra/policy/index.d.ts",
|
|
35
|
+
"default": "./dist/infra/policy/index.js"
|
|
36
|
+
},
|
|
37
|
+
"./lib/gpt": "./dist/infra/lib/gpt-api.js",
|
|
38
|
+
"./lib/gemini": "./dist/infra/lib/gemini-api.js"
|
|
39
|
+
},
|
|
40
|
+
"bin": {
|
|
41
|
+
"vibe": "dist/cli/index.js"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsc && chmod +x dist/cli/index.js",
|
|
45
|
+
"dev": "tsc --watch",
|
|
46
|
+
"test": "vitest run",
|
|
47
|
+
"test:watch": "vitest",
|
|
48
|
+
"prepublishOnly": "pnpm build",
|
|
49
|
+
"postinstall": "node -e \"import('./dist/cli/postinstall/main.js').then(m=>m.main()).catch(()=>{})\"",
|
|
50
|
+
"release": "pnpm version patch && npm publish --access public"
|
|
51
|
+
},
|
|
52
|
+
"keywords": [
|
|
53
|
+
"ai",
|
|
54
|
+
"core",
|
|
55
|
+
"coding",
|
|
56
|
+
"spec-driven",
|
|
57
|
+
"claude",
|
|
58
|
+
"agent",
|
|
59
|
+
"requirements",
|
|
60
|
+
"user-story",
|
|
61
|
+
"ultrawork",
|
|
62
|
+
"parallel-agents",
|
|
63
|
+
"memory-management",
|
|
64
|
+
"knowledge-graph",
|
|
65
|
+
"code-analysis",
|
|
66
|
+
"code-quality"
|
|
67
|
+
],
|
|
68
|
+
"author": "Su",
|
|
69
|
+
"license": "MIT",
|
|
70
|
+
"repository": {
|
|
71
|
+
"type": "git",
|
|
72
|
+
"url": "git+https://github.com/su-record/vibe.git"
|
|
73
|
+
},
|
|
74
|
+
"homepage": "https://github.com/su-record/vibe#readme",
|
|
75
|
+
"publishConfig": {
|
|
76
|
+
"access": "public"
|
|
77
|
+
},
|
|
78
|
+
"engines": {
|
|
79
|
+
"node": ">=18.0.0"
|
|
80
|
+
},
|
|
81
|
+
"optionalDependencies": {
|
|
82
|
+
"@ast-grep/napi": "^0.40.5"
|
|
83
|
+
},
|
|
84
|
+
"dependencies": {
|
|
85
|
+
"@anthropic-ai/claude-agent-sdk": "^0.2.6",
|
|
86
|
+
"@clack/prompts": "^1.0.0",
|
|
87
|
+
"better-sqlite3": "^12.6.2",
|
|
88
|
+
"chalk": "^5.3.0",
|
|
89
|
+
"glob": "^13.0.1",
|
|
90
|
+
"node-cron": "^3.0.3",
|
|
91
|
+
"papaparse": "^5.5.3",
|
|
92
|
+
"playwright": "^1.58.2",
|
|
93
|
+
"ts-morph": "^26.0.0",
|
|
94
|
+
"uuidv7": "^1.1.0",
|
|
95
|
+
"vscode-languageserver-protocol": "^3.17.5",
|
|
96
|
+
"zod": "^4.3.6"
|
|
97
|
+
},
|
|
98
|
+
"devDependencies": {
|
|
99
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
100
|
+
"@types/node": "^22.0.0",
|
|
101
|
+
"@types/node-cron": "^3.0.11",
|
|
102
|
+
"@types/papaparse": "^5.5.2",
|
|
103
|
+
"ajv": "^8.17.1",
|
|
104
|
+
"typescript": "^5.5.4",
|
|
105
|
+
"vitest": "^4.0.9"
|
|
106
|
+
},
|
|
107
|
+
"files": [
|
|
108
|
+
"dist/",
|
|
109
|
+
"vibe/",
|
|
110
|
+
"languages/",
|
|
111
|
+
"commands/",
|
|
112
|
+
"agents/",
|
|
113
|
+
"skills/",
|
|
114
|
+
"hooks/",
|
|
115
|
+
".env.example",
|
|
116
|
+
".env",
|
|
117
|
+
"CLAUDE.md",
|
|
118
|
+
"README.md",
|
|
119
|
+
"LICENSE"
|
|
120
|
+
]
|
|
121
|
+
}
|
|
@@ -1,120 +1,120 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: agents-md
|
|
3
|
-
description: "Optimize AGENTS.md / CLAUDE.md by removing discoverable info and keeping only gotchas. Based on Addy Osmani's AGENTS.md principles. Activates on agents.md, claude.md, context file optimization."
|
|
4
|
-
triggers: [agents.md, claude.md, context file, optimize agents, optimize claude]
|
|
5
|
-
priority: 50
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# agents-md — Context File Optimizer
|
|
9
|
-
|
|
10
|
-
AGENTS.md / CLAUDE.md를 최적화한다.
|
|
11
|
-
근거: https://addyosmani.com/blog/agents-md/
|
|
12
|
-
|
|
13
|
-
## 핵심 원칙
|
|
14
|
-
|
|
15
|
-
**한 줄 테스트**: "에이전트가 코드를 읽어서 스스로 알 수 있는가?" → Yes면 삭제.
|
|
16
|
-
|
|
17
|
-
## Step 1: 대상 파일 찾기
|
|
18
|
-
|
|
19
|
-
프로젝트 루트에서 다음 파일을 탐색한다:
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
Glob: pattern="AGENTS.md"
|
|
23
|
-
Glob: pattern="CLAUDE.md"
|
|
24
|
-
Glob: pattern=".cursorrules"
|
|
25
|
-
Glob: pattern=".github/copilot-instructions.md"
|
|
26
|
-
Glob: pattern=".windsurfrules"
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
대상 파일이 없으면 새로 생성할지 사용자에게 확인한다.
|
|
30
|
-
|
|
31
|
-
## Step 2: 현재 내용 분류
|
|
32
|
-
|
|
33
|
-
파일의 각 항목을 다음 기준으로 분류한다:
|
|
34
|
-
|
|
35
|
-
### 삭제 (Discoverable)
|
|
36
|
-
|
|
37
|
-
에이전트가 코드 탐색으로 발견 가능한 정보:
|
|
38
|
-
|
|
39
|
-
| 유형 | 예시 | 발견 경로 |
|
|
40
|
-
|------|------|----------|
|
|
41
|
-
| 디렉토리 구조 | "src/에 컴포넌트가 있다" | `ls`, `Glob` |
|
|
42
|
-
| 기술 스택 | "React + TypeScript 사용" | `package.json`, 파일 확장자 |
|
|
43
|
-
| Phase/진행 테이블 | "Phase 1 ✅, Phase 2 ✅..." | 이력일 뿐, 행동 지침 아님 |
|
|
44
|
-
| 빌드/테스트 커맨드 | "npm test로 테스트 실행" | `package.json` scripts |
|
|
45
|
-
| API 엔드포인트 목록 | "POST /api/users" | 라우터 코드 |
|
|
46
|
-
| 기능별 상세 설명 | "Phase 3에서 서킷브레이커 구현" | 해당 코드 읽으면 파악 가능 |
|
|
47
|
-
| 아키텍처 다이어그램 | ASCII 박스 다이어그램 | 개념적 설명, 실수 방지 효과 없음 |
|
|
48
|
-
|
|
49
|
-
### 유지 (Non-discoverable)
|
|
50
|
-
|
|
51
|
-
에이전트가 코드만으로 알 수 없는 함정과 규칙:
|
|
52
|
-
|
|
53
|
-
| 유형 | 예시 |
|
|
54
|
-
|------|------|
|
|
55
|
-
| 런타임 함정 | "Bun이다, Node가 아니다" (package.json에 명시 안 됨) |
|
|
56
|
-
| 금지 패턴 | "require() 쓰지 말 것", "React 패턴 금지" |
|
|
57
|
-
| SSOT 위치 | "model-registry.ts만 수정할 것, 하드코딩 금지" |
|
|
58
|
-
| 불변 순서/규칙 | "우선순위: A → B → C, 이 순서 변경 금지" |
|
|
59
|
-
| 재시도/폴백 제한 | "최대 2회, 3회 이상 금지" |
|
|
60
|
-
| 도구 선택 | "Zod만 사용, joi/yup 금지" |
|
|
61
|
-
| 네이밍 컨벤션 | 비표준 패턴 (표준이면 삭제) |
|
|
62
|
-
| 프로젝트 한 줄 소개 | 코드만으로 목적 파악 어려운 경우 |
|
|
63
|
-
| 언어/응답 지시 | "한글로 답변" 같은 선호 |
|
|
64
|
-
|
|
65
|
-
### 앵커링 주의
|
|
66
|
-
|
|
67
|
-
기술 이름을 언급하면 에이전트가 해당 기술로 편향된다. "무엇을 쓰지 말라"는 유용하지만, "우리는 X를 쓴다"는 코드에서 이미 보인다면 불필요.
|
|
68
|
-
|
|
69
|
-
## Step 3: 재구성
|
|
70
|
-
|
|
71
|
-
다음 구조로 재작성한다:
|
|
72
|
-
|
|
73
|
-
```markdown
|
|
74
|
-
# {프로젝트명} — {한 줄 소개}
|
|
75
|
-
|
|
76
|
-
{프로젝트가 무엇을 하는지 1-2문장. 코드만으로 목적 파악이 어려운 경우에만.}
|
|
77
|
-
|
|
78
|
-
# Gotchas
|
|
79
|
-
|
|
80
|
-
- **{함정 제목}.** {구체적 금지/규칙 설명}.
|
|
81
|
-
- ...
|
|
82
|
-
|
|
83
|
-
# Naming
|
|
84
|
-
|
|
85
|
-
{비표준 네이밍 패턴이 있을 때만. 표준(camelCase 등)이면 생략.}
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
규칙:
|
|
89
|
-
- 섹션은 최대 3개 (소개, Gotchas, Naming)
|
|
90
|
-
- Gotchas 항목은 각각 **볼드 제목 + 구체적 do/don't**
|
|
91
|
-
- "~를 사용한다" 보다 "~를 쓰지 말 것"이 더 유용
|
|
92
|
-
- 전체 50줄 이내 목표
|
|
93
|
-
|
|
94
|
-
## Step 4: CLAUDE.md 분리 (해당 시)
|
|
95
|
-
|
|
96
|
-
CLAUDE.md가 존재하면 Claude 전용 지시만 남긴다:
|
|
97
|
-
|
|
98
|
-
```markdown
|
|
99
|
-
{Claude 전용 지시. 예: "답변은 반드시 한글로 답변할 것."}
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
공통 규칙은 AGENTS.md에 둔다. Claude Code는 둘 다 읽는다.
|
|
103
|
-
|
|
104
|
-
## Step 5: 결과 보고
|
|
105
|
-
|
|
106
|
-
```markdown
|
|
107
|
-
## AGENTS.md 최적화 결과
|
|
108
|
-
|
|
109
|
-
| 지표 | Before | After |
|
|
110
|
-
|------|--------|-------|
|
|
111
|
-
| 줄 수 | N | N |
|
|
112
|
-
| 삭제 항목 | - | N개 (discoverable) |
|
|
113
|
-
| 유지 항목 | - | N개 (gotchas) |
|
|
114
|
-
|
|
115
|
-
### 삭제된 항목
|
|
116
|
-
- {항목}: {삭제 이유}
|
|
117
|
-
|
|
118
|
-
### 유지/추가된 항목
|
|
119
|
-
- {항목}: {유지 이유}
|
|
120
|
-
```
|
|
1
|
+
---
|
|
2
|
+
name: agents-md
|
|
3
|
+
description: "Optimize AGENTS.md / CLAUDE.md by removing discoverable info and keeping only gotchas. Based on Addy Osmani's AGENTS.md principles. Activates on agents.md, claude.md, context file optimization."
|
|
4
|
+
triggers: [agents.md, claude.md, context file, optimize agents, optimize claude]
|
|
5
|
+
priority: 50
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# agents-md — Context File Optimizer
|
|
9
|
+
|
|
10
|
+
AGENTS.md / CLAUDE.md를 최적화한다.
|
|
11
|
+
근거: https://addyosmani.com/blog/agents-md/
|
|
12
|
+
|
|
13
|
+
## 핵심 원칙
|
|
14
|
+
|
|
15
|
+
**한 줄 테스트**: "에이전트가 코드를 읽어서 스스로 알 수 있는가?" → Yes면 삭제.
|
|
16
|
+
|
|
17
|
+
## Step 1: 대상 파일 찾기
|
|
18
|
+
|
|
19
|
+
프로젝트 루트에서 다음 파일을 탐색한다:
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
Glob: pattern="AGENTS.md"
|
|
23
|
+
Glob: pattern="CLAUDE.md"
|
|
24
|
+
Glob: pattern=".cursorrules"
|
|
25
|
+
Glob: pattern=".github/copilot-instructions.md"
|
|
26
|
+
Glob: pattern=".windsurfrules"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
대상 파일이 없으면 새로 생성할지 사용자에게 확인한다.
|
|
30
|
+
|
|
31
|
+
## Step 2: 현재 내용 분류
|
|
32
|
+
|
|
33
|
+
파일의 각 항목을 다음 기준으로 분류한다:
|
|
34
|
+
|
|
35
|
+
### 삭제 (Discoverable)
|
|
36
|
+
|
|
37
|
+
에이전트가 코드 탐색으로 발견 가능한 정보:
|
|
38
|
+
|
|
39
|
+
| 유형 | 예시 | 발견 경로 |
|
|
40
|
+
|------|------|----------|
|
|
41
|
+
| 디렉토리 구조 | "src/에 컴포넌트가 있다" | `ls`, `Glob` |
|
|
42
|
+
| 기술 스택 | "React + TypeScript 사용" | `package.json`, 파일 확장자 |
|
|
43
|
+
| Phase/진행 테이블 | "Phase 1 ✅, Phase 2 ✅..." | 이력일 뿐, 행동 지침 아님 |
|
|
44
|
+
| 빌드/테스트 커맨드 | "npm test로 테스트 실행" | `package.json` scripts |
|
|
45
|
+
| API 엔드포인트 목록 | "POST /api/users" | 라우터 코드 |
|
|
46
|
+
| 기능별 상세 설명 | "Phase 3에서 서킷브레이커 구현" | 해당 코드 읽으면 파악 가능 |
|
|
47
|
+
| 아키텍처 다이어그램 | ASCII 박스 다이어그램 | 개념적 설명, 실수 방지 효과 없음 |
|
|
48
|
+
|
|
49
|
+
### 유지 (Non-discoverable)
|
|
50
|
+
|
|
51
|
+
에이전트가 코드만으로 알 수 없는 함정과 규칙:
|
|
52
|
+
|
|
53
|
+
| 유형 | 예시 |
|
|
54
|
+
|------|------|
|
|
55
|
+
| 런타임 함정 | "Bun이다, Node가 아니다" (package.json에 명시 안 됨) |
|
|
56
|
+
| 금지 패턴 | "require() 쓰지 말 것", "React 패턴 금지" |
|
|
57
|
+
| SSOT 위치 | "model-registry.ts만 수정할 것, 하드코딩 금지" |
|
|
58
|
+
| 불변 순서/규칙 | "우선순위: A → B → C, 이 순서 변경 금지" |
|
|
59
|
+
| 재시도/폴백 제한 | "최대 2회, 3회 이상 금지" |
|
|
60
|
+
| 도구 선택 | "Zod만 사용, joi/yup 금지" |
|
|
61
|
+
| 네이밍 컨벤션 | 비표준 패턴 (표준이면 삭제) |
|
|
62
|
+
| 프로젝트 한 줄 소개 | 코드만으로 목적 파악 어려운 경우 |
|
|
63
|
+
| 언어/응답 지시 | "한글로 답변" 같은 선호 |
|
|
64
|
+
|
|
65
|
+
### 앵커링 주의
|
|
66
|
+
|
|
67
|
+
기술 이름을 언급하면 에이전트가 해당 기술로 편향된다. "무엇을 쓰지 말라"는 유용하지만, "우리는 X를 쓴다"는 코드에서 이미 보인다면 불필요.
|
|
68
|
+
|
|
69
|
+
## Step 3: 재구성
|
|
70
|
+
|
|
71
|
+
다음 구조로 재작성한다:
|
|
72
|
+
|
|
73
|
+
```markdown
|
|
74
|
+
# {프로젝트명} — {한 줄 소개}
|
|
75
|
+
|
|
76
|
+
{프로젝트가 무엇을 하는지 1-2문장. 코드만으로 목적 파악이 어려운 경우에만.}
|
|
77
|
+
|
|
78
|
+
# Gotchas
|
|
79
|
+
|
|
80
|
+
- **{함정 제목}.** {구체적 금지/규칙 설명}.
|
|
81
|
+
- ...
|
|
82
|
+
|
|
83
|
+
# Naming
|
|
84
|
+
|
|
85
|
+
{비표준 네이밍 패턴이 있을 때만. 표준(camelCase 등)이면 생략.}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
규칙:
|
|
89
|
+
- 섹션은 최대 3개 (소개, Gotchas, Naming)
|
|
90
|
+
- Gotchas 항목은 각각 **볼드 제목 + 구체적 do/don't**
|
|
91
|
+
- "~를 사용한다" 보다 "~를 쓰지 말 것"이 더 유용
|
|
92
|
+
- 전체 50줄 이내 목표
|
|
93
|
+
|
|
94
|
+
## Step 4: CLAUDE.md 분리 (해당 시)
|
|
95
|
+
|
|
96
|
+
CLAUDE.md가 존재하면 Claude 전용 지시만 남긴다:
|
|
97
|
+
|
|
98
|
+
```markdown
|
|
99
|
+
{Claude 전용 지시. 예: "답변은 반드시 한글로 답변할 것."}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
공통 규칙은 AGENTS.md에 둔다. Claude Code는 둘 다 읽는다.
|
|
103
|
+
|
|
104
|
+
## Step 5: 결과 보고
|
|
105
|
+
|
|
106
|
+
```markdown
|
|
107
|
+
## AGENTS.md 최적화 결과
|
|
108
|
+
|
|
109
|
+
| 지표 | Before | After |
|
|
110
|
+
|------|--------|-------|
|
|
111
|
+
| 줄 수 | N | N |
|
|
112
|
+
| 삭제 항목 | - | N개 (discoverable) |
|
|
113
|
+
| 유지 항목 | - | N개 (gotchas) |
|
|
114
|
+
|
|
115
|
+
### 삭제된 항목
|
|
116
|
+
- {항목}: {삭제 이유}
|
|
117
|
+
|
|
118
|
+
### 유지/추가된 항목
|
|
119
|
+
- {항목}: {유지 이유}
|
|
120
|
+
```
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: arch-guard
|
|
3
|
+
description: "Generate architecture boundary tests that mechanically enforce layer constraints."
|
|
4
|
+
triggers: [arch guard, architecture test, layer test, boundary test, structural test, arch validation]
|
|
5
|
+
priority: 60
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Arch Guard — Architecture Boundary Test Generator
|
|
9
|
+
|
|
10
|
+
> **Principle**: "Mechanical enforcement over documentation." If a rule exists only in docs, it will be violated. Turn architecture constraints into failing tests.
|
|
11
|
+
|
|
12
|
+
## When to Use
|
|
13
|
+
|
|
14
|
+
| Scenario | Signal |
|
|
15
|
+
|----------|--------|
|
|
16
|
+
| `vibe init` / `vibe update` | Auto-generate for detected stack |
|
|
17
|
+
| New layer/module added | Boundaries need enforcement |
|
|
18
|
+
| Architecture violation found in review | Prevent recurrence with test |
|
|
19
|
+
| "Services should not import UI" type rules | Turn into automated check |
|
|
20
|
+
|
|
21
|
+
## Core Flow
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
DETECT → INFER → GENERATE → VERIFY
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Step 1: DETECT — Identify Project Architecture
|
|
28
|
+
|
|
29
|
+
Analyze the project to determine its layer structure:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
Parallel exploration:
|
|
33
|
+
- Agent 1: Scan directory structure (src/, app/, lib/, etc.)
|
|
34
|
+
- Agent 2: Read existing architecture docs (CLAUDE.md, README, ADR)
|
|
35
|
+
- Agent 3: Analyze import graph (which files import what)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Common patterns to detect:**
|
|
39
|
+
|
|
40
|
+
| Pattern | Layers | Typical Stacks |
|
|
41
|
+
|---------|--------|----------------|
|
|
42
|
+
| MVC | Controller → Service → Model | Rails, NestJS, Spring |
|
|
43
|
+
| Clean Architecture | UI → Application → Domain → Infrastructure | General |
|
|
44
|
+
| Feature-based | Feature A ↛ Feature B internals | Next.js, React |
|
|
45
|
+
| Hexagonal | Adapters → Ports → Domain | DDD projects |
|
|
46
|
+
| Component hierarchy | Page → Feature → Shared → UI Primitives | Frontend |
|
|
47
|
+
|
|
48
|
+
### Step 2: INFER — Define Boundary Rules
|
|
49
|
+
|
|
50
|
+
From detected structure, generate rules:
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
// Rule format
|
|
54
|
+
interface ArchRule {
|
|
55
|
+
name: string; // "service-no-ui-import"
|
|
56
|
+
from: string; // Glob pattern: "src/services/**"
|
|
57
|
+
cannotImport: string[]; // ["src/components/**", "src/pages/**"]
|
|
58
|
+
canImport: string[]; // ["src/models/**", "src/utils/**"]
|
|
59
|
+
reason: string; // "Services must be UI-agnostic"
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Default rules by stack:**
|
|
64
|
+
|
|
65
|
+
| Stack | Rule |
|
|
66
|
+
|-------|------|
|
|
67
|
+
| Next.js / React | `components/` cannot import from `pages/` or `app/` |
|
|
68
|
+
| Next.js / React | `lib/` cannot import from `components/` |
|
|
69
|
+
| NestJS | `*.service.ts` cannot import from `*.controller.ts` |
|
|
70
|
+
| NestJS | `*.module.ts` is the only valid cross-boundary import |
|
|
71
|
+
| General TS | `src/domain/` cannot import from `src/infra/` |
|
|
72
|
+
| General TS | No circular dependencies between top-level dirs |
|
|
73
|
+
| Python Django | `models.py` cannot import from `views.py` |
|
|
74
|
+
| Python FastAPI | `schemas/` cannot import from `routers/` |
|
|
75
|
+
|
|
76
|
+
### Step 3: GENERATE — Create Test File
|
|
77
|
+
|
|
78
|
+
Output: `tests/arch-guard.test.ts` (or equivalent for stack)
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
/**
|
|
82
|
+
* Architecture Boundary Tests
|
|
83
|
+
* Generated by arch-guard skill
|
|
84
|
+
*
|
|
85
|
+
* These tests enforce architectural constraints mechanically.
|
|
86
|
+
* If a test fails, it means an import violates the intended architecture.
|
|
87
|
+
*/
|
|
88
|
+
import { describe, it, expect } from 'vitest';
|
|
89
|
+
import fs from 'fs';
|
|
90
|
+
import path from 'path';
|
|
91
|
+
|
|
92
|
+
// Helper: extract imports from a file
|
|
93
|
+
function extractImports(filePath: string): string[] {
|
|
94
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
95
|
+
const importRegex = /(?:import|require)\s*\(?['"]([^'"]+)['"]\)?/g;
|
|
96
|
+
const imports: string[] = [];
|
|
97
|
+
let match;
|
|
98
|
+
while ((match = importRegex.exec(content)) !== null) {
|
|
99
|
+
imports.push(match[1]);
|
|
100
|
+
}
|
|
101
|
+
return imports;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Helper: resolve relative import to absolute path
|
|
105
|
+
function resolveImport(fromFile: string, importPath: string): string {
|
|
106
|
+
if (importPath.startsWith('.')) {
|
|
107
|
+
return path.resolve(path.dirname(fromFile), importPath);
|
|
108
|
+
}
|
|
109
|
+
return importPath; // external package
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Helper: glob files matching pattern
|
|
113
|
+
function globFiles(pattern: string, baseDir: string): string[] {
|
|
114
|
+
// Use fast-glob or manual recursive scan
|
|
115
|
+
// Implementation depends on available dependencies
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
describe('Architecture Boundaries', () => {
|
|
119
|
+
// GENERATED RULES GO HERE
|
|
120
|
+
// Each rule becomes a test case:
|
|
121
|
+
|
|
122
|
+
it('services cannot import UI components', () => {
|
|
123
|
+
const serviceFiles = globFiles('src/services/**/*.ts', process.cwd());
|
|
124
|
+
const violations: string[] = [];
|
|
125
|
+
|
|
126
|
+
for (const file of serviceFiles) {
|
|
127
|
+
const imports = extractImports(file);
|
|
128
|
+
for (const imp of imports) {
|
|
129
|
+
const resolved = resolveImport(file, imp);
|
|
130
|
+
if (resolved.includes('/components/') || resolved.includes('/pages/')) {
|
|
131
|
+
violations.push(`${file} imports ${imp}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
expect(violations).toEqual([]);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Step 4: VERIFY — Run and Fix
|
|
142
|
+
|
|
143
|
+
1. Run the generated tests: `npx vitest run tests/arch-guard.test.ts`
|
|
144
|
+
2. If violations found:
|
|
145
|
+
- Report each violation with file:line
|
|
146
|
+
- Suggest fix (move shared code to appropriate layer)
|
|
147
|
+
- Do NOT auto-fix — violations need human review
|
|
148
|
+
|
|
149
|
+
## Output Files
|
|
150
|
+
|
|
151
|
+
| File | Purpose |
|
|
152
|
+
|------|---------|
|
|
153
|
+
| `tests/arch-guard.test.ts` | Executable boundary tests |
|
|
154
|
+
| `.claude/vibe/arch-rules.json` | Machine-readable rules (for CI) |
|
|
155
|
+
|
|
156
|
+
## Customization
|
|
157
|
+
|
|
158
|
+
Users can add custom rules to `.claude/vibe/arch-rules.json`:
|
|
159
|
+
|
|
160
|
+
```json
|
|
161
|
+
{
|
|
162
|
+
"rules": [
|
|
163
|
+
{
|
|
164
|
+
"name": "no-direct-db-in-handlers",
|
|
165
|
+
"from": "src/handlers/**",
|
|
166
|
+
"cannotImport": ["src/db/**"],
|
|
167
|
+
"reason": "Handlers must use services, not direct DB access"
|
|
168
|
+
}
|
|
169
|
+
]
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
The test generator reads this file and adds custom rules to the test suite.
|
|
174
|
+
|
|
175
|
+
## Integration
|
|
176
|
+
|
|
177
|
+
- `vibe init` → auto-detect and generate initial arch-guard tests
|
|
178
|
+
- `vibe update` → refresh rules if directory structure changed
|
|
179
|
+
- Pre-commit hook → run arch-guard tests before commit
|
|
180
|
+
- `/vibe.review` → architecture-reviewer checks against arch-rules.json
|