@su-record/vibe 2.7.12 → 2.7.14
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 -126
- package/LICENSE +21 -21
- package/README.md +449 -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 +294 -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 +258 -260
- package/commands/vibe.analyze.md +8 -0
- package/commands/vibe.review.md +10 -3
- package/commands/vibe.run.md +2078 -2022
- package/commands/vibe.spec.md +10 -10
- package/commands/vibe.spec.review.md +565 -558
- package/commands/vibe.utils.md +413 -413
- package/commands/vibe.verify.md +45 -0
- package/dist/cli/auth.d.ts.map +1 -1
- package/dist/cli/auth.js +1 -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/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +55 -70
- 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 +6 -7
- 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/setup.js +1 -1
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/skills.js +5 -5
- 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 -4
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/detect.js +32 -32
- package/dist/cli/index.js +51 -55
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/llm/claude-commands.js +16 -16
- package/dist/cli/llm/config.js +20 -20
- package/dist/cli/llm/config.js.map +1 -1
- package/dist/cli/llm/gemini-commands.d.ts +4 -6
- package/dist/cli/llm/gemini-commands.d.ts.map +1 -1
- package/dist/cli/llm/gemini-commands.js +52 -322
- package/dist/cli/llm/gemini-commands.js.map +1 -1
- package/dist/cli/llm/gpt-commands.js +21 -21
- package/dist/cli/llm/gpt-commands.js.map +1 -1
- package/dist/cli/llm/help.js +21 -21
- package/dist/cli/postinstall/constants.js +1 -1
- 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/inline-skills.js +1 -1
- package/dist/cli/postinstall/inline-skills.js.map +1 -1
- package/dist/cli/setup/Provisioner.js +42 -42
- package/dist/cli/types.d.ts +2 -18
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/utils.d.ts +0 -9
- package/dist/cli/utils.d.ts.map +1 -1
- package/dist/cli/utils.js +0 -28
- package/dist/cli/utils.js.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/config/GlobalConfigManager.d.ts +0 -2
- package/dist/infra/lib/config/GlobalConfigManager.d.ts.map +1 -1
- package/dist/infra/lib/config/GlobalConfigManager.js +0 -27
- package/dist/infra/lib/config/GlobalConfigManager.js.map +1 -1
- 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/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/auth.d.ts +4 -16
- package/dist/infra/lib/gemini/auth.d.ts.map +1 -1
- package/dist/infra/lib/gemini/auth.js +10 -405
- package/dist/infra/lib/gemini/auth.js.map +1 -1
- package/dist/infra/lib/gemini/capabilities.d.ts +4 -8
- package/dist/infra/lib/gemini/capabilities.d.ts.map +1 -1
- package/dist/infra/lib/gemini/capabilities.js +8 -166
- package/dist/infra/lib/gemini/capabilities.js.map +1 -1
- package/dist/infra/lib/gemini/chat.d.ts +4 -13
- package/dist/infra/lib/gemini/chat.d.ts.map +1 -1
- package/dist/infra/lib/gemini/chat.js +10 -323
- package/dist/infra/lib/gemini/chat.js.map +1 -1
- package/dist/infra/lib/gemini/completion.d.ts +5 -15
- package/dist/infra/lib/gemini/completion.d.ts.map +1 -1
- package/dist/infra/lib/gemini/completion.js +6 -97
- package/dist/infra/lib/gemini/completion.js.map +1 -1
- package/dist/infra/lib/gemini/constants.d.ts +2 -31
- package/dist/infra/lib/gemini/constants.d.ts.map +1 -1
- package/dist/infra/lib/gemini/constants.js +2 -77
- package/dist/infra/lib/gemini/constants.js.map +1 -1
- package/dist/infra/lib/gemini/index.d.ts +5 -8
- package/dist/infra/lib/gemini/index.d.ts.map +1 -1
- package/dist/infra/lib/gemini/index.js +4 -7
- package/dist/infra/lib/gemini/index.js.map +1 -1
- package/dist/infra/lib/gemini/models.d.ts +3 -4
- package/dist/infra/lib/gemini/models.d.ts.map +1 -1
- package/dist/infra/lib/gemini/models.js +8 -84
- package/dist/infra/lib/gemini/models.js.map +1 -1
- package/dist/infra/lib/gemini/orchestration.js +5 -5
- package/dist/infra/lib/gemini/types.d.ts +16 -44
- package/dist/infra/lib/gemini/types.d.ts.map +1 -1
- package/dist/infra/lib/gemini/types.js +1 -1
- package/dist/infra/lib/gpt/auth.d.ts +2 -5
- package/dist/infra/lib/gpt/auth.d.ts.map +1 -1
- package/dist/infra/lib/gpt/auth.js +8 -38
- package/dist/infra/lib/gpt/auth.js.map +1 -1
- package/dist/infra/lib/gpt/chat.d.ts +3 -3
- package/dist/infra/lib/gpt/chat.d.ts.map +1 -1
- package/dist/infra/lib/gpt/chat.js +37 -53
- package/dist/infra/lib/gpt/chat.js.map +1 -1
- package/dist/infra/lib/gpt/constants.d.ts +2 -5
- package/dist/infra/lib/gpt/constants.d.ts.map +1 -1
- package/dist/infra/lib/gpt/constants.js +4 -9
- package/dist/infra/lib/gpt/constants.js.map +1 -1
- package/dist/infra/lib/gpt/embedding.d.ts +1 -1
- package/dist/infra/lib/gpt/embedding.js +3 -3
- package/dist/infra/lib/gpt/embedding.js.map +1 -1
- package/dist/infra/lib/gpt/oauth.d.ts +6 -39
- package/dist/infra/lib/gpt/oauth.d.ts.map +1 -1
- package/dist/infra/lib/gpt/oauth.js +8 -340
- package/dist/infra/lib/gpt/oauth.js.map +1 -1
- package/dist/infra/lib/gpt/orchestration.js +5 -5
- package/dist/infra/lib/gpt/orchestration.js.map +1 -1
- package/dist/infra/lib/gpt/specializations.d.ts +2 -2
- package/dist/infra/lib/gpt/specializations.js +3 -3
- package/dist/infra/lib/gpt/specializations.js.map +1 -1
- package/dist/infra/lib/gpt/types.d.ts +1 -1
- package/dist/infra/lib/gpt/types.d.ts.map +1 -1
- package/dist/infra/lib/llm/auth/AuthProfileManager.d.ts +2 -2
- package/dist/infra/lib/llm/auth/AuthProfileManager.d.ts.map +1 -1
- package/dist/infra/lib/llm/auth/AuthProfileManager.js.map +1 -1
- package/dist/infra/lib/llm/auth/AuthProfileManager.test.js +1 -1
- package/dist/infra/lib/llm/auth/AuthProfileManager.test.js.map +1 -1
- package/dist/infra/lib/llm/auth/TokenRefresher.d.ts +1 -1
- package/dist/infra/lib/llm/auth/TokenRefresher.js +1 -1
- package/dist/infra/lib/llm/auth/index.d.ts +2 -12
- package/dist/infra/lib/llm/auth/index.d.ts.map +1 -1
- package/dist/infra/lib/llm/auth/index.js +5 -63
- package/dist/infra/lib/llm/auth/index.js.map +1 -1
- package/dist/infra/lib/llm/types.d.ts +1 -1
- package/dist/infra/lib/llm/types.d.ts.map +1 -1
- 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 +475 -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 -180
- package/skills/brand-assets/SKILL.md +146 -146
- package/skills/capability-loop/SKILL.md +167 -167
- 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 -147
- 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 +66 -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/commands/vibe.voice.md +0 -79
|
@@ -1,180 +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
|
|
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
|
|
@@ -1,146 +1,146 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: brand-assets
|
|
3
|
-
description: "Auto-generate app icons and favicons from SPEC brand information using Gemini Image API"
|
|
4
|
-
triggers: [icon, favicon, brand, logo, app icon, branding, assets]
|
|
5
|
-
priority: 65
|
|
6
|
-
---
|
|
7
|
-
# Brand Assets Generation Skill
|
|
8
|
-
|
|
9
|
-
Auto-generate app icons and favicons based on SPEC brand information.
|
|
10
|
-
|
|
11
|
-
## When to Use
|
|
12
|
-
|
|
13
|
-
- First-time project setup with `/vibe.run`
|
|
14
|
-
- When SPEC contains brand/design information
|
|
15
|
-
- When Gemini API key is configured
|
|
16
|
-
|
|
17
|
-
## Prerequisites
|
|
18
|
-
|
|
19
|
-
- Gemini API key configured (`vibe gemini auth`)
|
|
20
|
-
- SPEC with brand context (app name, colors, style)
|
|
21
|
-
|
|
22
|
-
## Generated Assets
|
|
23
|
-
|
|
24
|
-
### Web
|
|
25
|
-
- `favicon.ico` (16x16, 32x32, 48x48)
|
|
26
|
-
- `favicon-16x16.png`
|
|
27
|
-
- `favicon-32x32.png`
|
|
28
|
-
- `apple-touch-icon.png` (180x180)
|
|
29
|
-
- `android-chrome-192x192.png`
|
|
30
|
-
- `android-chrome-512x512.png`
|
|
31
|
-
|
|
32
|
-
### Mobile (if applicable)
|
|
33
|
-
- iOS: `AppIcon.appiconset/` with all sizes
|
|
34
|
-
- Android: `mipmap-*/` adaptive icons
|
|
35
|
-
|
|
36
|
-
## SPEC Brand Section
|
|
37
|
-
|
|
38
|
-
For best results, include brand info in your SPEC:
|
|
39
|
-
|
|
40
|
-
```yaml
|
|
41
|
-
<context>
|
|
42
|
-
Brand:
|
|
43
|
-
- App Name: MyApp
|
|
44
|
-
- Primary Color: #2F6BFF
|
|
45
|
-
- Style: Modern, minimal, flat design
|
|
46
|
-
- Icon Concept: Abstract geometric shape representing connectivity
|
|
47
|
-
</context>
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
## Generation Flow
|
|
51
|
-
|
|
52
|
-
```
|
|
53
|
-
SPEC Brand Info
|
|
54
|
-
|
|
|
55
|
-
v
|
|
56
|
-
Extract: name, colors, style keywords
|
|
57
|
-
|
|
|
58
|
-
v
|
|
59
|
-
Generate Prompt: "App icon for [name], [style], [colors]..."
|
|
60
|
-
|
|
|
61
|
-
v
|
|
62
|
-
Gemini Image API (gemini-2.5-flash-image)
|
|
63
|
-
|
|
|
64
|
-
v
|
|
65
|
-
Resize & Convert: All platform sizes
|
|
66
|
-
|
|
|
67
|
-
v
|
|
68
|
-
Save to: public/ or assets/
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
## Auto-Trigger Conditions
|
|
72
|
-
|
|
73
|
-
1. First `/vibe.run` execution (no existing icons)
|
|
74
|
-
2. SPEC contains brand/design context
|
|
75
|
-
3. Gemini API key is available
|
|
76
|
-
4. `--generate-icons` flag passed
|
|
77
|
-
|
|
78
|
-
## Skip Conditions
|
|
79
|
-
|
|
80
|
-
- Icons already exist (unless `--regenerate-icons`)
|
|
81
|
-
- No brand info in SPEC
|
|
82
|
-
- Gemini API not configured
|
|
83
|
-
|
|
84
|
-
## Prompt Template
|
|
85
|
-
|
|
86
|
-
```
|
|
87
|
-
Create a modern app icon for "[APP_NAME]".
|
|
88
|
-
|
|
89
|
-
Style: [STYLE_KEYWORDS]
|
|
90
|
-
Primary color: [PRIMARY_COLOR]
|
|
91
|
-
Design: Minimalist, professional, suitable for mobile app
|
|
92
|
-
Format: Square, clean edges, simple recognizable shape
|
|
93
|
-
Background: Solid color or subtle gradient
|
|
94
|
-
|
|
95
|
-
Requirements:
|
|
96
|
-
- Works at small sizes (16x16 to 512x512)
|
|
97
|
-
- No text or letters
|
|
98
|
-
- Single focal element
|
|
99
|
-
- High contrast for visibility
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
## Manual Usage
|
|
103
|
-
|
|
104
|
-
```bash
|
|
105
|
-
# [LLM_SCRIPT] = {{CORE_PATH}}/hooks/scripts/llm-orchestrate.js
|
|
106
|
-
# Generate via llm-orchestrate (when Gemini configured)
|
|
107
|
-
node "[LLM_SCRIPT]" gemini image "App icon for MyApp, primary color #2F6BFF, square format 1:1, simple recognizable design, works well at small sizes, no text or letters, solid or gradient background, modern minimalist" --output "./public/app-icon.png"
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
## Integration with /vibe.run
|
|
111
|
-
|
|
112
|
-
During Phase 1 (Setup), if brand assets don't exist:
|
|
113
|
-
|
|
114
|
-
1. Parse SPEC for brand context
|
|
115
|
-
2. Generate icon via Gemini Image API
|
|
116
|
-
3. Create all size variants
|
|
117
|
-
4. Place in appropriate directories
|
|
118
|
-
5. Update manifest files if needed
|
|
119
|
-
|
|
120
|
-
## Fallback Strategy
|
|
121
|
-
|
|
122
|
-
If Gemini Image fails:
|
|
123
|
-
1. Generate text-based monogram icon (first letter)
|
|
124
|
-
2. Use project primary color as background
|
|
125
|
-
3. Create simple geometric placeholder
|
|
126
|
-
|
|
127
|
-
## Output Structure
|
|
128
|
-
|
|
129
|
-
```
|
|
130
|
-
public/
|
|
131
|
-
favicon.ico
|
|
132
|
-
favicon-16x16.png
|
|
133
|
-
favicon-32x32.png
|
|
134
|
-
apple-touch-icon.png
|
|
135
|
-
android-chrome-192x192.png
|
|
136
|
-
android-chrome-512x512.png
|
|
137
|
-
site.webmanifest
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
## Done Criteria (K4)
|
|
141
|
-
|
|
142
|
-
- [ ] All required sizes generated (16x16 through 512x512)
|
|
143
|
-
- [ ] Icons work at small sizes (recognizable at 16x16)
|
|
144
|
-
- [ ] No text/letters in icon (illegible at small sizes)
|
|
145
|
-
- [ ] `site.webmanifest` updated with icon paths
|
|
146
|
-
- [ ] Fallback generated if Gemini API unavailable
|
|
1
|
+
---
|
|
2
|
+
name: brand-assets
|
|
3
|
+
description: "Auto-generate app icons and favicons from SPEC brand information using Gemini Image API"
|
|
4
|
+
triggers: [icon, favicon, brand, logo, app icon, branding, assets]
|
|
5
|
+
priority: 65
|
|
6
|
+
---
|
|
7
|
+
# Brand Assets Generation Skill
|
|
8
|
+
|
|
9
|
+
Auto-generate app icons and favicons based on SPEC brand information.
|
|
10
|
+
|
|
11
|
+
## When to Use
|
|
12
|
+
|
|
13
|
+
- First-time project setup with `/vibe.run`
|
|
14
|
+
- When SPEC contains brand/design information
|
|
15
|
+
- When Gemini API key is configured
|
|
16
|
+
|
|
17
|
+
## Prerequisites
|
|
18
|
+
|
|
19
|
+
- Gemini API key configured (`vibe gemini auth`)
|
|
20
|
+
- SPEC with brand context (app name, colors, style)
|
|
21
|
+
|
|
22
|
+
## Generated Assets
|
|
23
|
+
|
|
24
|
+
### Web
|
|
25
|
+
- `favicon.ico` (16x16, 32x32, 48x48)
|
|
26
|
+
- `favicon-16x16.png`
|
|
27
|
+
- `favicon-32x32.png`
|
|
28
|
+
- `apple-touch-icon.png` (180x180)
|
|
29
|
+
- `android-chrome-192x192.png`
|
|
30
|
+
- `android-chrome-512x512.png`
|
|
31
|
+
|
|
32
|
+
### Mobile (if applicable)
|
|
33
|
+
- iOS: `AppIcon.appiconset/` with all sizes
|
|
34
|
+
- Android: `mipmap-*/` adaptive icons
|
|
35
|
+
|
|
36
|
+
## SPEC Brand Section
|
|
37
|
+
|
|
38
|
+
For best results, include brand info in your SPEC:
|
|
39
|
+
|
|
40
|
+
```yaml
|
|
41
|
+
<context>
|
|
42
|
+
Brand:
|
|
43
|
+
- App Name: MyApp
|
|
44
|
+
- Primary Color: #2F6BFF
|
|
45
|
+
- Style: Modern, minimal, flat design
|
|
46
|
+
- Icon Concept: Abstract geometric shape representing connectivity
|
|
47
|
+
</context>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Generation Flow
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
SPEC Brand Info
|
|
54
|
+
|
|
|
55
|
+
v
|
|
56
|
+
Extract: name, colors, style keywords
|
|
57
|
+
|
|
|
58
|
+
v
|
|
59
|
+
Generate Prompt: "App icon for [name], [style], [colors]..."
|
|
60
|
+
|
|
|
61
|
+
v
|
|
62
|
+
Gemini Image API (gemini-2.5-flash-image)
|
|
63
|
+
|
|
|
64
|
+
v
|
|
65
|
+
Resize & Convert: All platform sizes
|
|
66
|
+
|
|
|
67
|
+
v
|
|
68
|
+
Save to: public/ or assets/
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Auto-Trigger Conditions
|
|
72
|
+
|
|
73
|
+
1. First `/vibe.run` execution (no existing icons)
|
|
74
|
+
2. SPEC contains brand/design context
|
|
75
|
+
3. Gemini API key is available
|
|
76
|
+
4. `--generate-icons` flag passed
|
|
77
|
+
|
|
78
|
+
## Skip Conditions
|
|
79
|
+
|
|
80
|
+
- Icons already exist (unless `--regenerate-icons`)
|
|
81
|
+
- No brand info in SPEC
|
|
82
|
+
- Gemini API not configured
|
|
83
|
+
|
|
84
|
+
## Prompt Template
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
Create a modern app icon for "[APP_NAME]".
|
|
88
|
+
|
|
89
|
+
Style: [STYLE_KEYWORDS]
|
|
90
|
+
Primary color: [PRIMARY_COLOR]
|
|
91
|
+
Design: Minimalist, professional, suitable for mobile app
|
|
92
|
+
Format: Square, clean edges, simple recognizable shape
|
|
93
|
+
Background: Solid color or subtle gradient
|
|
94
|
+
|
|
95
|
+
Requirements:
|
|
96
|
+
- Works at small sizes (16x16 to 512x512)
|
|
97
|
+
- No text or letters
|
|
98
|
+
- Single focal element
|
|
99
|
+
- High contrast for visibility
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Manual Usage
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# [LLM_SCRIPT] = {{CORE_PATH}}/hooks/scripts/llm-orchestrate.js
|
|
106
|
+
# Generate via llm-orchestrate (when Gemini configured)
|
|
107
|
+
node "[LLM_SCRIPT]" gemini image "App icon for MyApp, primary color #2F6BFF, square format 1:1, simple recognizable design, works well at small sizes, no text or letters, solid or gradient background, modern minimalist" --output "./public/app-icon.png"
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Integration with /vibe.run
|
|
111
|
+
|
|
112
|
+
During Phase 1 (Setup), if brand assets don't exist:
|
|
113
|
+
|
|
114
|
+
1. Parse SPEC for brand context
|
|
115
|
+
2. Generate icon via Gemini Image API
|
|
116
|
+
3. Create all size variants
|
|
117
|
+
4. Place in appropriate directories
|
|
118
|
+
5. Update manifest files if needed
|
|
119
|
+
|
|
120
|
+
## Fallback Strategy
|
|
121
|
+
|
|
122
|
+
If Gemini Image fails:
|
|
123
|
+
1. Generate text-based monogram icon (first letter)
|
|
124
|
+
2. Use project primary color as background
|
|
125
|
+
3. Create simple geometric placeholder
|
|
126
|
+
|
|
127
|
+
## Output Structure
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
public/
|
|
131
|
+
favicon.ico
|
|
132
|
+
favicon-16x16.png
|
|
133
|
+
favicon-32x32.png
|
|
134
|
+
apple-touch-icon.png
|
|
135
|
+
android-chrome-192x192.png
|
|
136
|
+
android-chrome-512x512.png
|
|
137
|
+
site.webmanifest
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Done Criteria (K4)
|
|
141
|
+
|
|
142
|
+
- [ ] All required sizes generated (16x16 through 512x512)
|
|
143
|
+
- [ ] Icons work at small sizes (recognizable at 16x16)
|
|
144
|
+
- [ ] No text/letters in icon (illegible at small sizes)
|
|
145
|
+
- [ ] `site.webmanifest` updated with icon paths
|
|
146
|
+
- [ ] Fallback generated if Gemini API unavailable
|