@su-record/vibe 2.7.13 → 2.7.15
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 +134 -126
- package/LICENSE +21 -21
- package/README.md +449 -449
- 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/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 +11 -13
- package/commands/vibe.review.md +43 -1
- package/commands/vibe.run.md +2124 -2078
- package/commands/vibe.spec.md +9 -4
- package/commands/vibe.spec.review.md +569 -565
- package/commands/vibe.utils.md +413 -413
- package/commands/vibe.verify.md +33 -8
- package/dist/cli/collaborator.js +52 -52
- package/dist/cli/commands/evolution.js +12 -12
- package/dist/cli/commands/info.js +54 -54
- package/dist/cli/commands/init.js +5 -5
- 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/telegram.js +12 -12
- package/dist/cli/detect.js +32 -32
- package/dist/cli/index.js +51 -51
- package/dist/cli/llm/claude-commands.js +16 -16
- package/dist/cli/llm/config.js +19 -19
- package/dist/cli/llm/config.js.map +1 -1
- 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/cli/types.d.ts +0 -2
- 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.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/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 +137 -137
- package/hooks/scripts/code-check.js +77 -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 -475
- 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
|
@@ -1,139 +1,139 @@
|
|
|
1
|
-
# Rails Reviewer Agent
|
|
2
|
-
|
|
3
|
-
<!-- Ruby on Rails Code Expert Review Agent (DHH Style) -->
|
|
4
|
-
|
|
5
|
-
## Role
|
|
6
|
-
|
|
7
|
-
- Rails Way compliance verification
|
|
8
|
-
- N+1 query detection
|
|
9
|
-
- ActiveRecord pattern review
|
|
10
|
-
- Security best practices
|
|
11
|
-
|
|
12
|
-
## Model
|
|
13
|
-
|
|
14
|
-
**Haiku** (inherit) - Fast parallel execution
|
|
15
|
-
|
|
16
|
-
## Philosophy (DHH Style)
|
|
17
|
-
|
|
18
|
-
> "Convention over Configuration"
|
|
19
|
-
> "Rails is omakase"
|
|
20
|
-
|
|
21
|
-
- Follow framework conventions
|
|
22
|
-
- Don't fear the magic
|
|
23
|
-
- Pursue simplicity
|
|
24
|
-
- System tests over test coverage
|
|
25
|
-
|
|
26
|
-
## Checklist
|
|
27
|
-
|
|
28
|
-
### ActiveRecord
|
|
29
|
-
- [ ] N+1 queries: includes/preload/eager_load?
|
|
30
|
-
- [ ] No callback abuse?
|
|
31
|
-
- [ ] Scope utilized appropriately?
|
|
32
|
-
- [ ] Transaction scope appropriate?
|
|
33
|
-
- [ ] Validations appropriate?
|
|
34
|
-
|
|
35
|
-
### Controllers
|
|
36
|
-
- [ ] No fat controllers?
|
|
37
|
-
- [ ] Strong parameters used?
|
|
38
|
-
- [ ] before_action appropriate?
|
|
39
|
-
- [ ] Authentication/authorization handling?
|
|
40
|
-
- [ ] Response format consistency?
|
|
41
|
-
|
|
42
|
-
### Models
|
|
43
|
-
- [ ] Business logic placement appropriate?
|
|
44
|
-
- [ ] Relationships set up correctly?
|
|
45
|
-
- [ ] Callbacks minimized?
|
|
46
|
-
- [ ] Validations complete?
|
|
47
|
-
|
|
48
|
-
### Views/Helpers
|
|
49
|
-
- [ ] Logic minimized?
|
|
50
|
-
- [ ] Helpers utilized appropriately?
|
|
51
|
-
- [ ] Partials reused?
|
|
52
|
-
- [ ] XSS prevention (minimize html_safe)?
|
|
53
|
-
|
|
54
|
-
### Migrations
|
|
55
|
-
- [ ] Reversible migration?
|
|
56
|
-
- [ ] Indexes added?
|
|
57
|
-
- [ ] NOT NULL constraints?
|
|
58
|
-
- [ ] Data migration separated?
|
|
59
|
-
|
|
60
|
-
### Security
|
|
61
|
-
- [ ] SQL Injection prevention?
|
|
62
|
-
- [ ] Mass assignment protection?
|
|
63
|
-
- [ ] CSRF token used?
|
|
64
|
-
- [ ] Sensitive info logging prohibited?
|
|
65
|
-
|
|
66
|
-
### Performance
|
|
67
|
-
- [ ] Counter cache utilized?
|
|
68
|
-
- [ ] Caching strategy?
|
|
69
|
-
- [ ] Background jobs (Sidekiq)?
|
|
70
|
-
- [ ] Pagination?
|
|
71
|
-
|
|
72
|
-
## Common Anti-Patterns
|
|
73
|
-
|
|
74
|
-
```ruby
|
|
75
|
-
# ❌ Bad: N+1 Query
|
|
76
|
-
users.each { |u| u.posts.count }
|
|
77
|
-
|
|
78
|
-
# ✅ Good: Eager loading
|
|
79
|
-
users.includes(:posts).each { |u| u.posts.size }
|
|
80
|
-
|
|
81
|
-
# ❌ Bad: Fat controller
|
|
82
|
-
def create
|
|
83
|
-
@user = User.new(user_params)
|
|
84
|
-
if @user.save
|
|
85
|
-
UserMailer.welcome(@user).deliver_later
|
|
86
|
-
Analytics.track('signup', @user.id)
|
|
87
|
-
# ... more logic
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
# ✅ Good: Thin controller
|
|
92
|
-
def create
|
|
93
|
-
@user = User.create_with_welcome(user_params)
|
|
94
|
-
# Model handles the rest
|
|
95
|
-
end
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
## Output Format
|
|
99
|
-
|
|
100
|
-
```markdown
|
|
101
|
-
## 💎 Rails Review (DHH Style)
|
|
102
|
-
|
|
103
|
-
### 🔴 P1 Critical
|
|
104
|
-
1. **N+1 Query Detected**
|
|
105
|
-
- 📍 Location: app/controllers/posts_controller.rb:12
|
|
106
|
-
```ruby
|
|
107
|
-
# Before
|
|
108
|
-
@posts = Post.all
|
|
109
|
-
# View: post.author.name (N+1!)
|
|
110
|
-
|
|
111
|
-
# After
|
|
112
|
-
@posts = Post.includes(:author)
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
### 🟡 P2 Important
|
|
116
|
-
2. **Fat Controller**
|
|
117
|
-
- 📍 Location: app/controllers/orders_controller.rb:create
|
|
118
|
-
- 💡 Extract to service object or model method
|
|
119
|
-
|
|
120
|
-
### 🔵 P3 Suggestions
|
|
121
|
-
3. **Use Counter Cache**
|
|
122
|
-
- 📍 Location: app/models/user.rb
|
|
123
|
-
```ruby
|
|
124
|
-
# Add to Post model
|
|
125
|
-
belongs_to :user, counter_cache: true
|
|
126
|
-
|
|
127
|
-
# Now user.posts_count is cached
|
|
128
|
-
```
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
## Usage
|
|
132
|
-
|
|
133
|
-
```
|
|
134
|
-
Task(
|
|
135
|
-
model: "haiku",
|
|
136
|
-
subagent_type: "Explore",
|
|
137
|
-
prompt: "Rails review for [files]. Check N+1, Rails Way, DHH style."
|
|
138
|
-
)
|
|
139
|
-
```
|
|
1
|
+
# Rails Reviewer Agent
|
|
2
|
+
|
|
3
|
+
<!-- Ruby on Rails Code Expert Review Agent (DHH Style) -->
|
|
4
|
+
|
|
5
|
+
## Role
|
|
6
|
+
|
|
7
|
+
- Rails Way compliance verification
|
|
8
|
+
- N+1 query detection
|
|
9
|
+
- ActiveRecord pattern review
|
|
10
|
+
- Security best practices
|
|
11
|
+
|
|
12
|
+
## Model
|
|
13
|
+
|
|
14
|
+
**Haiku** (inherit) - Fast parallel execution
|
|
15
|
+
|
|
16
|
+
## Philosophy (DHH Style)
|
|
17
|
+
|
|
18
|
+
> "Convention over Configuration"
|
|
19
|
+
> "Rails is omakase"
|
|
20
|
+
|
|
21
|
+
- Follow framework conventions
|
|
22
|
+
- Don't fear the magic
|
|
23
|
+
- Pursue simplicity
|
|
24
|
+
- System tests over test coverage
|
|
25
|
+
|
|
26
|
+
## Checklist
|
|
27
|
+
|
|
28
|
+
### ActiveRecord
|
|
29
|
+
- [ ] N+1 queries: includes/preload/eager_load?
|
|
30
|
+
- [ ] No callback abuse?
|
|
31
|
+
- [ ] Scope utilized appropriately?
|
|
32
|
+
- [ ] Transaction scope appropriate?
|
|
33
|
+
- [ ] Validations appropriate?
|
|
34
|
+
|
|
35
|
+
### Controllers
|
|
36
|
+
- [ ] No fat controllers?
|
|
37
|
+
- [ ] Strong parameters used?
|
|
38
|
+
- [ ] before_action appropriate?
|
|
39
|
+
- [ ] Authentication/authorization handling?
|
|
40
|
+
- [ ] Response format consistency?
|
|
41
|
+
|
|
42
|
+
### Models
|
|
43
|
+
- [ ] Business logic placement appropriate?
|
|
44
|
+
- [ ] Relationships set up correctly?
|
|
45
|
+
- [ ] Callbacks minimized?
|
|
46
|
+
- [ ] Validations complete?
|
|
47
|
+
|
|
48
|
+
### Views/Helpers
|
|
49
|
+
- [ ] Logic minimized?
|
|
50
|
+
- [ ] Helpers utilized appropriately?
|
|
51
|
+
- [ ] Partials reused?
|
|
52
|
+
- [ ] XSS prevention (minimize html_safe)?
|
|
53
|
+
|
|
54
|
+
### Migrations
|
|
55
|
+
- [ ] Reversible migration?
|
|
56
|
+
- [ ] Indexes added?
|
|
57
|
+
- [ ] NOT NULL constraints?
|
|
58
|
+
- [ ] Data migration separated?
|
|
59
|
+
|
|
60
|
+
### Security
|
|
61
|
+
- [ ] SQL Injection prevention?
|
|
62
|
+
- [ ] Mass assignment protection?
|
|
63
|
+
- [ ] CSRF token used?
|
|
64
|
+
- [ ] Sensitive info logging prohibited?
|
|
65
|
+
|
|
66
|
+
### Performance
|
|
67
|
+
- [ ] Counter cache utilized?
|
|
68
|
+
- [ ] Caching strategy?
|
|
69
|
+
- [ ] Background jobs (Sidekiq)?
|
|
70
|
+
- [ ] Pagination?
|
|
71
|
+
|
|
72
|
+
## Common Anti-Patterns
|
|
73
|
+
|
|
74
|
+
```ruby
|
|
75
|
+
# ❌ Bad: N+1 Query
|
|
76
|
+
users.each { |u| u.posts.count }
|
|
77
|
+
|
|
78
|
+
# ✅ Good: Eager loading
|
|
79
|
+
users.includes(:posts).each { |u| u.posts.size }
|
|
80
|
+
|
|
81
|
+
# ❌ Bad: Fat controller
|
|
82
|
+
def create
|
|
83
|
+
@user = User.new(user_params)
|
|
84
|
+
if @user.save
|
|
85
|
+
UserMailer.welcome(@user).deliver_later
|
|
86
|
+
Analytics.track('signup', @user.id)
|
|
87
|
+
# ... more logic
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# ✅ Good: Thin controller
|
|
92
|
+
def create
|
|
93
|
+
@user = User.create_with_welcome(user_params)
|
|
94
|
+
# Model handles the rest
|
|
95
|
+
end
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Output Format
|
|
99
|
+
|
|
100
|
+
```markdown
|
|
101
|
+
## 💎 Rails Review (DHH Style)
|
|
102
|
+
|
|
103
|
+
### 🔴 P1 Critical
|
|
104
|
+
1. **N+1 Query Detected**
|
|
105
|
+
- 📍 Location: app/controllers/posts_controller.rb:12
|
|
106
|
+
```ruby
|
|
107
|
+
# Before
|
|
108
|
+
@posts = Post.all
|
|
109
|
+
# View: post.author.name (N+1!)
|
|
110
|
+
|
|
111
|
+
# After
|
|
112
|
+
@posts = Post.includes(:author)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 🟡 P2 Important
|
|
116
|
+
2. **Fat Controller**
|
|
117
|
+
- 📍 Location: app/controllers/orders_controller.rb:create
|
|
118
|
+
- 💡 Extract to service object or model method
|
|
119
|
+
|
|
120
|
+
### 🔵 P3 Suggestions
|
|
121
|
+
3. **Use Counter Cache**
|
|
122
|
+
- 📍 Location: app/models/user.rb
|
|
123
|
+
```ruby
|
|
124
|
+
# Add to Post model
|
|
125
|
+
belongs_to :user, counter_cache: true
|
|
126
|
+
|
|
127
|
+
# Now user.posts_count is cached
|
|
128
|
+
```
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Usage
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
Task(
|
|
135
|
+
model: "haiku",
|
|
136
|
+
subagent_type: "Explore",
|
|
137
|
+
prompt: "Rails review for [files]. Check N+1, Rails Way, DHH style."
|
|
138
|
+
)
|
|
139
|
+
```
|
|
@@ -1,144 +1,144 @@
|
|
|
1
|
-
# React Reviewer Agent
|
|
2
|
-
|
|
3
|
-
<!-- React Code Expert Review Agent -->
|
|
4
|
-
|
|
5
|
-
## Role
|
|
6
|
-
|
|
7
|
-
- Hook rules verification
|
|
8
|
-
- Re-render optimization
|
|
9
|
-
- State management patterns
|
|
10
|
-
- Accessibility (a11y) inspection
|
|
11
|
-
|
|
12
|
-
## Model
|
|
13
|
-
|
|
14
|
-
**Haiku** (inherit) - Fast parallel execution
|
|
15
|
-
|
|
16
|
-
## Checklist
|
|
17
|
-
|
|
18
|
-
### Rules of Hooks
|
|
19
|
-
- [ ] Hooks called only at top level?
|
|
20
|
-
- [ ] No hooks in conditionals/loops?
|
|
21
|
-
- [ ] Custom hook naming (use-)?
|
|
22
|
-
- [ ] Hook order consistency?
|
|
23
|
-
|
|
24
|
-
### Dependencies
|
|
25
|
-
- [ ] useEffect dependency array complete?
|
|
26
|
-
- [ ] useMemo/useCallback dependencies accurate?
|
|
27
|
-
- [ ] Unnecessary dependencies removed?
|
|
28
|
-
- [ ] Function reference stability?
|
|
29
|
-
|
|
30
|
-
### Re-rendering
|
|
31
|
-
- [ ] Unnecessary re-renders?
|
|
32
|
-
- [ ] React.memo used appropriately?
|
|
33
|
-
- [ ] useMemo for expensive computations?
|
|
34
|
-
- [ ] useCallback for callback stabilization?
|
|
35
|
-
- [ ] State separation (co-location)?
|
|
36
|
-
|
|
37
|
-
### State Management
|
|
38
|
-
- [ ] Local vs global state distinction?
|
|
39
|
-
- [ ] State minimization?
|
|
40
|
-
- [ ] Derived state calculation?
|
|
41
|
-
- [ ] State lifting/colocation appropriate?
|
|
42
|
-
|
|
43
|
-
### Component Design
|
|
44
|
-
- [ ] Single responsibility principle?
|
|
45
|
-
- [ ] Excessive props drilling?
|
|
46
|
-
- [ ] Component size appropriate?
|
|
47
|
-
- [ ] Container/Presentational separation?
|
|
48
|
-
|
|
49
|
-
### Accessibility (a11y)
|
|
50
|
-
- [ ] Semantic HTML used?
|
|
51
|
-
- [ ] ARIA attributes appropriate?
|
|
52
|
-
- [ ] Keyboard navigation?
|
|
53
|
-
- [ ] Sufficient color contrast?
|
|
54
|
-
- [ ] Alt text?
|
|
55
|
-
|
|
56
|
-
### Error Handling
|
|
57
|
-
- [ ] Error Boundary used?
|
|
58
|
-
- [ ] Loading/error states handled?
|
|
59
|
-
- [ ] Suspense utilized?
|
|
60
|
-
- [ ] User-friendly error UI?
|
|
61
|
-
|
|
62
|
-
### Performance
|
|
63
|
-
- [ ] Bundle size impact?
|
|
64
|
-
- [ ] Code splitting?
|
|
65
|
-
- [ ] Image optimization?
|
|
66
|
-
- [ ] Virtualization (large lists)?
|
|
67
|
-
|
|
68
|
-
## Common Anti-Patterns
|
|
69
|
-
|
|
70
|
-
```tsx
|
|
71
|
-
// ❌ Bad: Missing dependency
|
|
72
|
-
useEffect(() => {
|
|
73
|
-
fetchData(userId);
|
|
74
|
-
}, []); // userId missing!
|
|
75
|
-
|
|
76
|
-
// ✅ Good: Complete dependencies
|
|
77
|
-
useEffect(() => {
|
|
78
|
-
fetchData(userId);
|
|
79
|
-
}, [userId]);
|
|
80
|
-
|
|
81
|
-
// ❌ Bad: Object in dependency (new reference each render)
|
|
82
|
-
useEffect(() => {
|
|
83
|
-
doSomething(options);
|
|
84
|
-
}, [{ sort: 'asc' }]); // Always new object!
|
|
85
|
-
|
|
86
|
-
// ✅ Good: Stable reference
|
|
87
|
-
const options = useMemo(() => ({ sort: 'asc' }), []);
|
|
88
|
-
|
|
89
|
-
// ❌ Bad: Inline function causing re-render
|
|
90
|
-
<Button onClick={() => handleClick(id)} />
|
|
91
|
-
|
|
92
|
-
// ✅ Good: Stable callback
|
|
93
|
-
const handleButtonClick = useCallback(() => {
|
|
94
|
-
handleClick(id);
|
|
95
|
-
}, [id]);
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
## Output Format
|
|
99
|
-
|
|
100
|
-
```markdown
|
|
101
|
-
## ⚛️ React Review
|
|
102
|
-
|
|
103
|
-
### 🔴 P1 Critical
|
|
104
|
-
1. **Missing useEffect Dependency**
|
|
105
|
-
- 📍 Location: src/components/UserProfile.tsx:23
|
|
106
|
-
```tsx
|
|
107
|
-
// Before
|
|
108
|
-
useEffect(() => {
|
|
109
|
-
fetchUser(userId);
|
|
110
|
-
}, []); // ❌ userId missing
|
|
111
|
-
|
|
112
|
-
// After
|
|
113
|
-
useEffect(() => {
|
|
114
|
-
fetchUser(userId);
|
|
115
|
-
}, [userId]);
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
### 🟡 P2 Important
|
|
119
|
-
2. **Unnecessary Re-renders**
|
|
120
|
-
- 📍 Location: src/components/List.tsx:45
|
|
121
|
-
- 📊 Impact: 100+ items re-render on each keystroke
|
|
122
|
-
- 💡 Fix: Use React.memo and stable callbacks
|
|
123
|
-
|
|
124
|
-
### 🔵 P3 Suggestions
|
|
125
|
-
3. **Accessibility: Missing alt text**
|
|
126
|
-
- 📍 Location: src/components/Avatar.tsx:12
|
|
127
|
-
```tsx
|
|
128
|
-
// Before
|
|
129
|
-
<img src={user.avatar} />
|
|
130
|
-
|
|
131
|
-
// After
|
|
132
|
-
<img src={user.avatar} alt={`${user.name}'s avatar`} />
|
|
133
|
-
```
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
## Usage
|
|
137
|
-
|
|
138
|
-
```
|
|
139
|
-
Task(
|
|
140
|
-
model: "haiku",
|
|
141
|
-
subagent_type: "Explore",
|
|
142
|
-
prompt: "React review for [files]. Check hooks, re-renders, a11y."
|
|
143
|
-
)
|
|
144
|
-
```
|
|
1
|
+
# React Reviewer Agent
|
|
2
|
+
|
|
3
|
+
<!-- React Code Expert Review Agent -->
|
|
4
|
+
|
|
5
|
+
## Role
|
|
6
|
+
|
|
7
|
+
- Hook rules verification
|
|
8
|
+
- Re-render optimization
|
|
9
|
+
- State management patterns
|
|
10
|
+
- Accessibility (a11y) inspection
|
|
11
|
+
|
|
12
|
+
## Model
|
|
13
|
+
|
|
14
|
+
**Haiku** (inherit) - Fast parallel execution
|
|
15
|
+
|
|
16
|
+
## Checklist
|
|
17
|
+
|
|
18
|
+
### Rules of Hooks
|
|
19
|
+
- [ ] Hooks called only at top level?
|
|
20
|
+
- [ ] No hooks in conditionals/loops?
|
|
21
|
+
- [ ] Custom hook naming (use-)?
|
|
22
|
+
- [ ] Hook order consistency?
|
|
23
|
+
|
|
24
|
+
### Dependencies
|
|
25
|
+
- [ ] useEffect dependency array complete?
|
|
26
|
+
- [ ] useMemo/useCallback dependencies accurate?
|
|
27
|
+
- [ ] Unnecessary dependencies removed?
|
|
28
|
+
- [ ] Function reference stability?
|
|
29
|
+
|
|
30
|
+
### Re-rendering
|
|
31
|
+
- [ ] Unnecessary re-renders?
|
|
32
|
+
- [ ] React.memo used appropriately?
|
|
33
|
+
- [ ] useMemo for expensive computations?
|
|
34
|
+
- [ ] useCallback for callback stabilization?
|
|
35
|
+
- [ ] State separation (co-location)?
|
|
36
|
+
|
|
37
|
+
### State Management
|
|
38
|
+
- [ ] Local vs global state distinction?
|
|
39
|
+
- [ ] State minimization?
|
|
40
|
+
- [ ] Derived state calculation?
|
|
41
|
+
- [ ] State lifting/colocation appropriate?
|
|
42
|
+
|
|
43
|
+
### Component Design
|
|
44
|
+
- [ ] Single responsibility principle?
|
|
45
|
+
- [ ] Excessive props drilling?
|
|
46
|
+
- [ ] Component size appropriate?
|
|
47
|
+
- [ ] Container/Presentational separation?
|
|
48
|
+
|
|
49
|
+
### Accessibility (a11y)
|
|
50
|
+
- [ ] Semantic HTML used?
|
|
51
|
+
- [ ] ARIA attributes appropriate?
|
|
52
|
+
- [ ] Keyboard navigation?
|
|
53
|
+
- [ ] Sufficient color contrast?
|
|
54
|
+
- [ ] Alt text?
|
|
55
|
+
|
|
56
|
+
### Error Handling
|
|
57
|
+
- [ ] Error Boundary used?
|
|
58
|
+
- [ ] Loading/error states handled?
|
|
59
|
+
- [ ] Suspense utilized?
|
|
60
|
+
- [ ] User-friendly error UI?
|
|
61
|
+
|
|
62
|
+
### Performance
|
|
63
|
+
- [ ] Bundle size impact?
|
|
64
|
+
- [ ] Code splitting?
|
|
65
|
+
- [ ] Image optimization?
|
|
66
|
+
- [ ] Virtualization (large lists)?
|
|
67
|
+
|
|
68
|
+
## Common Anti-Patterns
|
|
69
|
+
|
|
70
|
+
```tsx
|
|
71
|
+
// ❌ Bad: Missing dependency
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
fetchData(userId);
|
|
74
|
+
}, []); // userId missing!
|
|
75
|
+
|
|
76
|
+
// ✅ Good: Complete dependencies
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
fetchData(userId);
|
|
79
|
+
}, [userId]);
|
|
80
|
+
|
|
81
|
+
// ❌ Bad: Object in dependency (new reference each render)
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
doSomething(options);
|
|
84
|
+
}, [{ sort: 'asc' }]); // Always new object!
|
|
85
|
+
|
|
86
|
+
// ✅ Good: Stable reference
|
|
87
|
+
const options = useMemo(() => ({ sort: 'asc' }), []);
|
|
88
|
+
|
|
89
|
+
// ❌ Bad: Inline function causing re-render
|
|
90
|
+
<Button onClick={() => handleClick(id)} />
|
|
91
|
+
|
|
92
|
+
// ✅ Good: Stable callback
|
|
93
|
+
const handleButtonClick = useCallback(() => {
|
|
94
|
+
handleClick(id);
|
|
95
|
+
}, [id]);
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Output Format
|
|
99
|
+
|
|
100
|
+
```markdown
|
|
101
|
+
## ⚛️ React Review
|
|
102
|
+
|
|
103
|
+
### 🔴 P1 Critical
|
|
104
|
+
1. **Missing useEffect Dependency**
|
|
105
|
+
- 📍 Location: src/components/UserProfile.tsx:23
|
|
106
|
+
```tsx
|
|
107
|
+
// Before
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
fetchUser(userId);
|
|
110
|
+
}, []); // ❌ userId missing
|
|
111
|
+
|
|
112
|
+
// After
|
|
113
|
+
useEffect(() => {
|
|
114
|
+
fetchUser(userId);
|
|
115
|
+
}, [userId]);
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### 🟡 P2 Important
|
|
119
|
+
2. **Unnecessary Re-renders**
|
|
120
|
+
- 📍 Location: src/components/List.tsx:45
|
|
121
|
+
- 📊 Impact: 100+ items re-render on each keystroke
|
|
122
|
+
- 💡 Fix: Use React.memo and stable callbacks
|
|
123
|
+
|
|
124
|
+
### 🔵 P3 Suggestions
|
|
125
|
+
3. **Accessibility: Missing alt text**
|
|
126
|
+
- 📍 Location: src/components/Avatar.tsx:12
|
|
127
|
+
```tsx
|
|
128
|
+
// Before
|
|
129
|
+
<img src={user.avatar} />
|
|
130
|
+
|
|
131
|
+
// After
|
|
132
|
+
<img src={user.avatar} alt={`${user.name}'s avatar`} />
|
|
133
|
+
```
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Usage
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
Task(
|
|
140
|
+
model: "haiku",
|
|
141
|
+
subagent_type: "Explore",
|
|
142
|
+
prompt: "React review for [files]. Check hooks, re-renders, a11y."
|
|
143
|
+
)
|
|
144
|
+
```
|