start-vibing 2.0.11 → 2.0.13
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/README.md +177 -177
- package/dist/cli.js +19 -2
- package/package.json +42 -42
- package/template/.claude/CLAUDE.md +174 -174
- package/template/.claude/agents/01-orchestration/agent-selector.md +130 -130
- package/template/.claude/agents/01-orchestration/checkpoint-manager.md +142 -142
- package/template/.claude/agents/01-orchestration/context-manager.md +138 -138
- package/template/.claude/agents/01-orchestration/error-recovery.md +182 -182
- package/template/.claude/agents/01-orchestration/orchestrator.md +114 -114
- package/template/.claude/agents/01-orchestration/parallel-coordinator.md +141 -141
- package/template/.claude/agents/01-orchestration/task-decomposer.md +121 -121
- package/template/.claude/agents/01-orchestration/workflow-router.md +114 -114
- package/template/.claude/agents/02-typescript/bun-runtime-expert.md +197 -197
- package/template/.claude/agents/02-typescript/esm-resolver.md +193 -193
- package/template/.claude/agents/02-typescript/import-alias-enforcer.md +158 -158
- package/template/.claude/agents/02-typescript/ts-generics-helper.md +183 -183
- package/template/.claude/agents/02-typescript/ts-migration-helper.md +238 -238
- package/template/.claude/agents/02-typescript/ts-strict-checker.md +180 -180
- package/template/.claude/agents/02-typescript/ts-types-analyzer.md +199 -199
- package/template/.claude/agents/02-typescript/type-definition-writer.md +187 -187
- package/template/.claude/agents/02-typescript/zod-schema-designer.md +212 -212
- package/template/.claude/agents/02-typescript/zod-validator.md +158 -158
- package/template/.claude/agents/03-testing/playwright-assertions.md +265 -265
- package/template/.claude/agents/03-testing/playwright-e2e.md +247 -247
- package/template/.claude/agents/03-testing/playwright-fixtures.md +234 -234
- package/template/.claude/agents/03-testing/playwright-multi-viewport.md +256 -256
- package/template/.claude/agents/03-testing/playwright-page-objects.md +247 -247
- package/template/.claude/agents/03-testing/test-cleanup-manager.md +248 -248
- package/template/.claude/agents/03-testing/test-data-generator.md +254 -254
- package/template/.claude/agents/03-testing/tester-integration.md +278 -278
- package/template/.claude/agents/03-testing/tester-unit.md +207 -207
- package/template/.claude/agents/03-testing/vitest-config.md +287 -287
- package/template/.claude/agents/04-docker/container-health.md +255 -255
- package/template/.claude/agents/04-docker/deployment-validator.md +225 -225
- package/template/.claude/agents/04-docker/docker-compose-designer.md +281 -281
- package/template/.claude/agents/04-docker/docker-env-manager.md +235 -235
- package/template/.claude/agents/04-docker/docker-multi-stage.md +241 -241
- package/template/.claude/agents/04-docker/dockerfile-optimizer.md +208 -208
- package/template/.claude/agents/05-database/database-seeder.md +273 -273
- package/template/.claude/agents/05-database/mongodb-query-optimizer.md +230 -230
- package/template/.claude/agents/05-database/mongoose-aggregation.md +306 -306
- package/template/.claude/agents/05-database/mongoose-index-optimizer.md +182 -182
- package/template/.claude/agents/05-database/mongoose-schema-designer.md +267 -267
- package/template/.claude/agents/06-security/auth-session-validator.md +68 -68
- package/template/.claude/agents/06-security/input-sanitizer.md +80 -80
- package/template/.claude/agents/06-security/owasp-checker.md +97 -97
- package/template/.claude/agents/06-security/permission-auditor.md +100 -100
- package/template/.claude/agents/06-security/security-auditor.md +84 -84
- package/template/.claude/agents/06-security/sensitive-data-scanner.md +83 -83
- package/template/.claude/agents/07-documentation/api-documenter.md +136 -136
- package/template/.claude/agents/07-documentation/changelog-manager.md +105 -105
- package/template/.claude/agents/07-documentation/documenter.md +76 -76
- package/template/.claude/agents/07-documentation/domain-updater.md +81 -81
- package/template/.claude/agents/07-documentation/jsdoc-generator.md +114 -114
- package/template/.claude/agents/07-documentation/readme-generator.md +135 -135
- package/template/.claude/agents/08-git/branch-manager.md +58 -58
- package/template/.claude/agents/08-git/commit-manager.md +63 -63
- package/template/.claude/agents/08-git/pr-creator.md +76 -76
- package/template/.claude/agents/09-quality/code-reviewer.md +71 -71
- package/template/.claude/agents/09-quality/quality-checker.md +67 -67
- package/template/.claude/agents/10-research/best-practices-finder.md +89 -89
- package/template/.claude/agents/10-research/competitor-analyzer.md +106 -106
- package/template/.claude/agents/10-research/pattern-researcher.md +93 -93
- package/template/.claude/agents/10-research/research-cache-manager.md +76 -76
- package/template/.claude/agents/10-research/research-web.md +98 -98
- package/template/.claude/agents/10-research/tech-evaluator.md +101 -101
- package/template/.claude/agents/11-ui-ux/accessibility-auditor.md +136 -136
- package/template/.claude/agents/11-ui-ux/design-system-enforcer.md +125 -125
- package/template/.claude/agents/11-ui-ux/skeleton-generator.md +118 -118
- package/template/.claude/agents/11-ui-ux/ui-desktop.md +132 -132
- package/template/.claude/agents/11-ui-ux/ui-mobile.md +98 -98
- package/template/.claude/agents/11-ui-ux/ui-tablet.md +110 -110
- package/template/.claude/agents/12-performance/api-latency-analyzer.md +156 -156
- package/template/.claude/agents/12-performance/bundle-analyzer.md +113 -113
- package/template/.claude/agents/12-performance/memory-leak-detector.md +137 -137
- package/template/.claude/agents/12-performance/performance-profiler.md +115 -115
- package/template/.claude/agents/12-performance/query-optimizer.md +124 -124
- package/template/.claude/agents/12-performance/render-optimizer.md +154 -154
- package/template/.claude/agents/13-debugging/build-error-fixer.md +207 -207
- package/template/.claude/agents/13-debugging/debugger.md +149 -149
- package/template/.claude/agents/13-debugging/error-stack-analyzer.md +141 -141
- package/template/.claude/agents/13-debugging/network-debugger.md +208 -208
- package/template/.claude/agents/13-debugging/runtime-error-fixer.md +181 -181
- package/template/.claude/agents/13-debugging/type-error-resolver.md +185 -185
- package/template/.claude/agents/14-validation/final-validator.md +93 -93
- package/template/.claude/agents/_backup/analyzer.md +134 -134
- package/template/.claude/agents/_backup/code-reviewer.md +279 -279
- package/template/.claude/agents/_backup/commit-manager.md +219 -219
- package/template/.claude/agents/_backup/debugger.md +280 -280
- package/template/.claude/agents/_backup/documenter.md +237 -237
- package/template/.claude/agents/_backup/domain-updater.md +197 -197
- package/template/.claude/agents/_backup/final-validator.md +169 -169
- package/template/.claude/agents/_backup/orchestrator.md +149 -149
- package/template/.claude/agents/_backup/performance.md +232 -232
- package/template/.claude/agents/_backup/quality-checker.md +240 -240
- package/template/.claude/agents/_backup/research.md +315 -315
- package/template/.claude/agents/_backup/security-auditor.md +192 -192
- package/template/.claude/agents/_backup/tester.md +566 -566
- package/template/.claude/agents/_backup/ui-ux-reviewer.md +247 -247
- package/template/.claude/config/README.md +30 -30
- package/template/.claude/config/mcp-config.json +344 -344
- package/template/.claude/config/project-config.json +53 -53
- package/template/.claude/config/quality-gates.json +46 -46
- package/template/.claude/config/security-rules.json +45 -45
- package/template/.claude/config/testing-config.json +164 -164
- package/template/.claude/hooks/SETUP.md +126 -126
- package/template/.claude/hooks/run-hook.ts +176 -176
- package/template/.claude/hooks/stop-validator.ts +914 -824
- package/template/.claude/hooks/user-prompt-submit.ts +886 -886
- package/template/.claude/scripts/mcp-quick-install.ts +151 -151
- package/template/.claude/scripts/setup-mcps.ts +651 -651
- package/template/.claude/settings.json +275 -275
- package/template/.claude/skills/bun-runtime/SKILL.md +430 -430
- package/template/.claude/skills/codebase-knowledge/domains/claude-system.md +431 -431
- package/template/.claude/skills/codebase-knowledge/domains/mcp-integration.md +295 -295
- package/template/.claude/skills/debugging-patterns/SKILL.md +485 -485
- package/template/.claude/skills/docker-patterns/SKILL.md +555 -555
- package/template/.claude/skills/git-workflow/SKILL.md +454 -454
- package/template/.claude/skills/mongoose-patterns/SKILL.md +499 -499
- package/template/.claude/skills/nextjs-app-router/SKILL.md +327 -327
- package/template/.claude/skills/performance-patterns/SKILL.md +547 -547
- package/template/.claude/skills/playwright-automation/SKILL.md +438 -438
- package/template/.claude/skills/react-patterns/SKILL.md +389 -389
- package/template/.claude/skills/research-cache/SKILL.md +222 -222
- package/template/.claude/skills/shadcn-ui/SKILL.md +511 -511
- package/template/.claude/skills/tailwind-patterns/SKILL.md +465 -465
- package/template/.claude/skills/test-coverage/SKILL.md +467 -467
- package/template/.claude/skills/trpc-api/SKILL.md +434 -434
- package/template/.claude/skills/typescript-strict/SKILL.md +367 -367
- package/template/.claude/skills/zod-validation/SKILL.md +403 -403
- package/template/CLAUDE.md +117 -117
|
@@ -1,124 +1,124 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: query-optimizer
|
|
3
|
-
description: "AUTOMATICALLY invoke when database queries are slow. Triggers: 'slow query', 'N+1', 'query performance', database bottleneck. Optimizes MongoDB/Mongoose queries. PROACTIVELY improves query performance."
|
|
4
|
-
model: sonnet
|
|
5
|
-
tools: Read, Bash, Grep, Glob
|
|
6
|
-
skills: codebase-knowledge, performance-patterns, mongoose-patterns
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Query Optimizer Agent
|
|
10
|
-
|
|
11
|
-
You optimize MongoDB/Mongoose queries for performance.
|
|
12
|
-
|
|
13
|
-
## Common Issues
|
|
14
|
-
|
|
15
|
-
### N+1 Query Problem
|
|
16
|
-
|
|
17
|
-
```typescript
|
|
18
|
-
// ❌ N+1 queries
|
|
19
|
-
const users = await User.find();
|
|
20
|
-
for (const user of users) {
|
|
21
|
-
const posts = await Post.find({ userId: user._id }); // N queries
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// ✅ Single query with populate
|
|
25
|
-
const users = await User.find().populate('posts');
|
|
26
|
-
|
|
27
|
-
// ✅ Or aggregation
|
|
28
|
-
const results = await User.aggregate([
|
|
29
|
-
{ $lookup: { from: 'posts', localField: '_id', foreignField: 'userId', as: 'posts' } },
|
|
30
|
-
]);
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
### Missing Indexes
|
|
34
|
-
|
|
35
|
-
```typescript
|
|
36
|
-
// Schema with indexes
|
|
37
|
-
const UserSchema = new Schema({
|
|
38
|
-
email: { type: String, unique: true }, // Auto-indexed
|
|
39
|
-
username: { type: String, index: true },
|
|
40
|
-
createdAt: { type: Date, index: -1 }, // Descending for recent first
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
// Compound index for common queries
|
|
44
|
-
UserSchema.index({ status: 1, createdAt: -1 });
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### Over-fetching
|
|
48
|
-
|
|
49
|
-
```typescript
|
|
50
|
-
// ❌ Fetch all fields
|
|
51
|
-
const users = await User.find();
|
|
52
|
-
|
|
53
|
-
// ✅ Select only needed fields
|
|
54
|
-
const users = await User.find().select('name email');
|
|
55
|
-
|
|
56
|
-
// ✅ Lean for read-only
|
|
57
|
-
const users = await User.find().select('name email').lean();
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
## Query Analysis
|
|
61
|
-
|
|
62
|
-
```javascript
|
|
63
|
-
// Check query execution
|
|
64
|
-
const result = await User.find({ status: 'active' }).explain('executionStats');
|
|
65
|
-
|
|
66
|
-
// Look for:
|
|
67
|
-
// - executionStats.totalDocsExamined vs nReturned
|
|
68
|
-
// - Ratio should be close to 1:1
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
## Index Strategies
|
|
72
|
-
|
|
73
|
-
### ESR Rule (Equality, Sort, Range)
|
|
74
|
-
|
|
75
|
-
```typescript
|
|
76
|
-
// Query: { status: 'active', age: { $gt: 18 } } sorted by createdAt
|
|
77
|
-
// Index order: status (E), createdAt (S), age (R)
|
|
78
|
-
UserSchema.index({ status: 1, createdAt: -1, age: 1 });
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
### Covered Queries
|
|
82
|
-
|
|
83
|
-
```typescript
|
|
84
|
-
// Index covers the query (no document fetch needed)
|
|
85
|
-
UserSchema.index({ email: 1, name: 1 });
|
|
86
|
-
const user = await User.findOne({ email }).select('name').lean();
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
## Output Format
|
|
90
|
-
|
|
91
|
-
```markdown
|
|
92
|
-
## Query Optimization Report
|
|
93
|
-
|
|
94
|
-
### Queries Analyzed
|
|
95
|
-
|
|
96
|
-
| Query | Docs Examined | Returned | Ratio | Status |
|
|
97
|
-
| ------------------- | ------------- | -------- | ----- | ------ |
|
|
98
|
-
| User.find({status}) | 10000 | 100 | 100:1 | ❌ |
|
|
99
|
-
|
|
100
|
-
### Recommendations
|
|
101
|
-
|
|
102
|
-
1. Add index: `UserSchema.index({ status: 1 })`
|
|
103
|
-
2. Use projection: `.select('name email')`
|
|
104
|
-
3. Add `.lean()` for read-only queries
|
|
105
|
-
|
|
106
|
-
### Suggested Indexes
|
|
107
|
-
|
|
108
|
-
\`\`\`typescript
|
|
109
|
-
UserSchema.index({ status: 1, createdAt: -1 });
|
|
110
|
-
\`\`\`
|
|
111
|
-
|
|
112
|
-
### Expected Improvement
|
|
113
|
-
|
|
114
|
-
- Query time: 500ms → 5ms
|
|
115
|
-
- Docs examined: 10000 → 100
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
## Critical Rules
|
|
119
|
-
|
|
120
|
-
1. **EXPLAIN FIRST** - Analyze before optimizing
|
|
121
|
-
2. **INDEX STRATEGICALLY** - ESR rule
|
|
122
|
-
3. **USE PROJECTION** - Only fetch needed fields
|
|
123
|
-
4. **LEAN READS** - .lean() for read-only
|
|
124
|
-
5. **AVOID N+1** - Use populate or aggregation
|
|
1
|
+
---
|
|
2
|
+
name: query-optimizer
|
|
3
|
+
description: "AUTOMATICALLY invoke when database queries are slow. Triggers: 'slow query', 'N+1', 'query performance', database bottleneck. Optimizes MongoDB/Mongoose queries. PROACTIVELY improves query performance."
|
|
4
|
+
model: sonnet
|
|
5
|
+
tools: Read, Bash, Grep, Glob
|
|
6
|
+
skills: codebase-knowledge, performance-patterns, mongoose-patterns
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Query Optimizer Agent
|
|
10
|
+
|
|
11
|
+
You optimize MongoDB/Mongoose queries for performance.
|
|
12
|
+
|
|
13
|
+
## Common Issues
|
|
14
|
+
|
|
15
|
+
### N+1 Query Problem
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
// ❌ N+1 queries
|
|
19
|
+
const users = await User.find();
|
|
20
|
+
for (const user of users) {
|
|
21
|
+
const posts = await Post.find({ userId: user._id }); // N queries
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// ✅ Single query with populate
|
|
25
|
+
const users = await User.find().populate('posts');
|
|
26
|
+
|
|
27
|
+
// ✅ Or aggregation
|
|
28
|
+
const results = await User.aggregate([
|
|
29
|
+
{ $lookup: { from: 'posts', localField: '_id', foreignField: 'userId', as: 'posts' } },
|
|
30
|
+
]);
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Missing Indexes
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
// Schema with indexes
|
|
37
|
+
const UserSchema = new Schema({
|
|
38
|
+
email: { type: String, unique: true }, // Auto-indexed
|
|
39
|
+
username: { type: String, index: true },
|
|
40
|
+
createdAt: { type: Date, index: -1 }, // Descending for recent first
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Compound index for common queries
|
|
44
|
+
UserSchema.index({ status: 1, createdAt: -1 });
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Over-fetching
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
// ❌ Fetch all fields
|
|
51
|
+
const users = await User.find();
|
|
52
|
+
|
|
53
|
+
// ✅ Select only needed fields
|
|
54
|
+
const users = await User.find().select('name email');
|
|
55
|
+
|
|
56
|
+
// ✅ Lean for read-only
|
|
57
|
+
const users = await User.find().select('name email').lean();
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Query Analysis
|
|
61
|
+
|
|
62
|
+
```javascript
|
|
63
|
+
// Check query execution
|
|
64
|
+
const result = await User.find({ status: 'active' }).explain('executionStats');
|
|
65
|
+
|
|
66
|
+
// Look for:
|
|
67
|
+
// - executionStats.totalDocsExamined vs nReturned
|
|
68
|
+
// - Ratio should be close to 1:1
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Index Strategies
|
|
72
|
+
|
|
73
|
+
### ESR Rule (Equality, Sort, Range)
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
// Query: { status: 'active', age: { $gt: 18 } } sorted by createdAt
|
|
77
|
+
// Index order: status (E), createdAt (S), age (R)
|
|
78
|
+
UserSchema.index({ status: 1, createdAt: -1, age: 1 });
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Covered Queries
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
// Index covers the query (no document fetch needed)
|
|
85
|
+
UserSchema.index({ email: 1, name: 1 });
|
|
86
|
+
const user = await User.findOne({ email }).select('name').lean();
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Output Format
|
|
90
|
+
|
|
91
|
+
```markdown
|
|
92
|
+
## Query Optimization Report
|
|
93
|
+
|
|
94
|
+
### Queries Analyzed
|
|
95
|
+
|
|
96
|
+
| Query | Docs Examined | Returned | Ratio | Status |
|
|
97
|
+
| ------------------- | ------------- | -------- | ----- | ------ |
|
|
98
|
+
| User.find({status}) | 10000 | 100 | 100:1 | ❌ |
|
|
99
|
+
|
|
100
|
+
### Recommendations
|
|
101
|
+
|
|
102
|
+
1. Add index: `UserSchema.index({ status: 1 })`
|
|
103
|
+
2. Use projection: `.select('name email')`
|
|
104
|
+
3. Add `.lean()` for read-only queries
|
|
105
|
+
|
|
106
|
+
### Suggested Indexes
|
|
107
|
+
|
|
108
|
+
\`\`\`typescript
|
|
109
|
+
UserSchema.index({ status: 1, createdAt: -1 });
|
|
110
|
+
\`\`\`
|
|
111
|
+
|
|
112
|
+
### Expected Improvement
|
|
113
|
+
|
|
114
|
+
- Query time: 500ms → 5ms
|
|
115
|
+
- Docs examined: 10000 → 100
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Critical Rules
|
|
119
|
+
|
|
120
|
+
1. **EXPLAIN FIRST** - Analyze before optimizing
|
|
121
|
+
2. **INDEX STRATEGICALLY** - ESR rule
|
|
122
|
+
3. **USE PROJECTION** - Only fetch needed fields
|
|
123
|
+
4. **LEAN READS** - .lean() for read-only
|
|
124
|
+
5. **AVOID N+1** - Use populate or aggregation
|
|
@@ -1,154 +1,154 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: render-optimizer
|
|
3
|
-
description: "AUTOMATICALLY invoke when React components re-render excessively. Triggers: 're-render', 'React performance', 'slow component', UI lag. Optimizes React render performance. PROACTIVELY fixes render issues."
|
|
4
|
-
model: sonnet
|
|
5
|
-
tools: Read, Grep, Glob, Edit
|
|
6
|
-
skills: performance-patterns, react-patterns
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Render Optimizer Agent
|
|
10
|
-
|
|
11
|
-
You optimize React component render performance.
|
|
12
|
-
|
|
13
|
-
## Common Issues
|
|
14
|
-
|
|
15
|
-
### 1. Unnecessary Re-renders
|
|
16
|
-
|
|
17
|
-
```typescript
|
|
18
|
-
// ❌ Object created every render
|
|
19
|
-
<Button style={{ color: 'blue' }} />
|
|
20
|
-
|
|
21
|
-
// ✅ Stable reference
|
|
22
|
-
const buttonStyle = { color: 'blue' };
|
|
23
|
-
<Button style={buttonStyle} />
|
|
24
|
-
|
|
25
|
-
// ✅ Or useMemo
|
|
26
|
-
const buttonStyle = useMemo(() => ({ color: 'blue' }), []);
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
### 2. Missing Memoization
|
|
30
|
-
|
|
31
|
-
```typescript
|
|
32
|
-
// ❌ Expensive calculation every render
|
|
33
|
-
function Component({ items }) {
|
|
34
|
-
const sorted = items.sort((a, b) => a.name.localeCompare(b.name));
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// ✅ Memoized
|
|
38
|
-
function Component({ items }) {
|
|
39
|
-
const sorted = useMemo(() => [...items].sort((a, b) => a.name.localeCompare(b.name)), [items]);
|
|
40
|
-
}
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
### 3. Callback Recreation
|
|
44
|
-
|
|
45
|
-
```typescript
|
|
46
|
-
// ❌ New function every render
|
|
47
|
-
<Button onClick={() => handleClick(id)} />
|
|
48
|
-
|
|
49
|
-
// ✅ Stable callback
|
|
50
|
-
const handleClick = useCallback((id) => {
|
|
51
|
-
// handle click
|
|
52
|
-
}, []);
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### 4. Context Over-subscription
|
|
56
|
-
|
|
57
|
-
```typescript
|
|
58
|
-
// ❌ All consumers re-render on any change
|
|
59
|
-
const AppContext = createContext({ user, theme, settings });
|
|
60
|
-
|
|
61
|
-
// ✅ Split contexts
|
|
62
|
-
const UserContext = createContext(user);
|
|
63
|
-
const ThemeContext = createContext(theme);
|
|
64
|
-
const SettingsContext = createContext(settings);
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
## Optimization Patterns
|
|
68
|
-
|
|
69
|
-
### React.memo
|
|
70
|
-
|
|
71
|
-
```typescript
|
|
72
|
-
// Wrap pure components
|
|
73
|
-
const Card = memo(function Card({ title, content }) {
|
|
74
|
-
return (
|
|
75
|
-
<div>
|
|
76
|
-
<h2>{title}</h2>
|
|
77
|
-
<p>{content}</p>
|
|
78
|
-
</div>
|
|
79
|
-
);
|
|
80
|
-
});
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### Virtualization for Lists
|
|
84
|
-
|
|
85
|
-
```typescript
|
|
86
|
-
import { useVirtualizer } from '@tanstack/react-virtual';
|
|
87
|
-
|
|
88
|
-
function VirtualList({ items }) {
|
|
89
|
-
const virtualizer = useVirtualizer({
|
|
90
|
-
count: items.length,
|
|
91
|
-
getScrollElement: () => parentRef.current,
|
|
92
|
-
estimateSize: () => 50,
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
return (
|
|
96
|
-
<div ref={parentRef} style={{ height: '400px', overflow: 'auto' }}>
|
|
97
|
-
<div style={{ height: virtualizer.getTotalSize() }}>
|
|
98
|
-
{virtualizer.getVirtualItems().map(virtualRow => (
|
|
99
|
-
<div key={virtualRow.index}>
|
|
100
|
-
{items[virtualRow.index]}
|
|
101
|
-
</div>
|
|
102
|
-
))}
|
|
103
|
-
</div>
|
|
104
|
-
</div>
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
## Detection
|
|
110
|
-
|
|
111
|
-
```typescript
|
|
112
|
-
// React DevTools Profiler
|
|
113
|
-
// - Flamegraph shows render time
|
|
114
|
-
// - "Why did this render?" feature
|
|
115
|
-
// - Highlight updates option
|
|
116
|
-
|
|
117
|
-
// Console logging (dev only)
|
|
118
|
-
useEffect(() => {
|
|
119
|
-
console.log('Component rendered');
|
|
120
|
-
});
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
## Output Format
|
|
124
|
-
|
|
125
|
-
```markdown
|
|
126
|
-
## Render Performance Report
|
|
127
|
-
|
|
128
|
-
### Issues Found
|
|
129
|
-
|
|
130
|
-
| Component | Issue | Impact |
|
|
131
|
-
| --------- | ------------------- | ---------------- |
|
|
132
|
-
| UserList | Missing memo | 50 re-renders |
|
|
133
|
-
| Card | Inline style object | Per-click render |
|
|
134
|
-
|
|
135
|
-
### Fixes Applied
|
|
136
|
-
|
|
137
|
-
1. Added React.memo to UserList
|
|
138
|
-
2. Extracted style to constant
|
|
139
|
-
3. Added useMemo to sort operation
|
|
140
|
-
|
|
141
|
-
### Before/After
|
|
142
|
-
|
|
143
|
-
| Metric | Before | After |
|
|
144
|
-
| ----------------- | ------ | ----- |
|
|
145
|
-
| Renders per click | 50 | 1 |
|
|
146
|
-
| Frame rate | 45fps | 60fps |
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
## Critical Rules
|
|
150
|
-
|
|
151
|
-
1. **PROFILE FIRST** - Use React DevTools
|
|
152
|
-
2. **MEMO WISELY** - Not everything needs memo
|
|
153
|
-
3. **STABLE REFERENCES** - Objects, arrays, functions
|
|
154
|
-
4. **VIRTUALIZE LISTS** - For 100+ items
|
|
1
|
+
---
|
|
2
|
+
name: render-optimizer
|
|
3
|
+
description: "AUTOMATICALLY invoke when React components re-render excessively. Triggers: 're-render', 'React performance', 'slow component', UI lag. Optimizes React render performance. PROACTIVELY fixes render issues."
|
|
4
|
+
model: sonnet
|
|
5
|
+
tools: Read, Grep, Glob, Edit
|
|
6
|
+
skills: performance-patterns, react-patterns
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Render Optimizer Agent
|
|
10
|
+
|
|
11
|
+
You optimize React component render performance.
|
|
12
|
+
|
|
13
|
+
## Common Issues
|
|
14
|
+
|
|
15
|
+
### 1. Unnecessary Re-renders
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
// ❌ Object created every render
|
|
19
|
+
<Button style={{ color: 'blue' }} />
|
|
20
|
+
|
|
21
|
+
// ✅ Stable reference
|
|
22
|
+
const buttonStyle = { color: 'blue' };
|
|
23
|
+
<Button style={buttonStyle} />
|
|
24
|
+
|
|
25
|
+
// ✅ Or useMemo
|
|
26
|
+
const buttonStyle = useMemo(() => ({ color: 'blue' }), []);
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 2. Missing Memoization
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
// ❌ Expensive calculation every render
|
|
33
|
+
function Component({ items }) {
|
|
34
|
+
const sorted = items.sort((a, b) => a.name.localeCompare(b.name));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// ✅ Memoized
|
|
38
|
+
function Component({ items }) {
|
|
39
|
+
const sorted = useMemo(() => [...items].sort((a, b) => a.name.localeCompare(b.name)), [items]);
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 3. Callback Recreation
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
// ❌ New function every render
|
|
47
|
+
<Button onClick={() => handleClick(id)} />
|
|
48
|
+
|
|
49
|
+
// ✅ Stable callback
|
|
50
|
+
const handleClick = useCallback((id) => {
|
|
51
|
+
// handle click
|
|
52
|
+
}, []);
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 4. Context Over-subscription
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
// ❌ All consumers re-render on any change
|
|
59
|
+
const AppContext = createContext({ user, theme, settings });
|
|
60
|
+
|
|
61
|
+
// ✅ Split contexts
|
|
62
|
+
const UserContext = createContext(user);
|
|
63
|
+
const ThemeContext = createContext(theme);
|
|
64
|
+
const SettingsContext = createContext(settings);
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Optimization Patterns
|
|
68
|
+
|
|
69
|
+
### React.memo
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
// Wrap pure components
|
|
73
|
+
const Card = memo(function Card({ title, content }) {
|
|
74
|
+
return (
|
|
75
|
+
<div>
|
|
76
|
+
<h2>{title}</h2>
|
|
77
|
+
<p>{content}</p>
|
|
78
|
+
</div>
|
|
79
|
+
);
|
|
80
|
+
});
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Virtualization for Lists
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
import { useVirtualizer } from '@tanstack/react-virtual';
|
|
87
|
+
|
|
88
|
+
function VirtualList({ items }) {
|
|
89
|
+
const virtualizer = useVirtualizer({
|
|
90
|
+
count: items.length,
|
|
91
|
+
getScrollElement: () => parentRef.current,
|
|
92
|
+
estimateSize: () => 50,
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
return (
|
|
96
|
+
<div ref={parentRef} style={{ height: '400px', overflow: 'auto' }}>
|
|
97
|
+
<div style={{ height: virtualizer.getTotalSize() }}>
|
|
98
|
+
{virtualizer.getVirtualItems().map(virtualRow => (
|
|
99
|
+
<div key={virtualRow.index}>
|
|
100
|
+
{items[virtualRow.index]}
|
|
101
|
+
</div>
|
|
102
|
+
))}
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Detection
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
// React DevTools Profiler
|
|
113
|
+
// - Flamegraph shows render time
|
|
114
|
+
// - "Why did this render?" feature
|
|
115
|
+
// - Highlight updates option
|
|
116
|
+
|
|
117
|
+
// Console logging (dev only)
|
|
118
|
+
useEffect(() => {
|
|
119
|
+
console.log('Component rendered');
|
|
120
|
+
});
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Output Format
|
|
124
|
+
|
|
125
|
+
```markdown
|
|
126
|
+
## Render Performance Report
|
|
127
|
+
|
|
128
|
+
### Issues Found
|
|
129
|
+
|
|
130
|
+
| Component | Issue | Impact |
|
|
131
|
+
| --------- | ------------------- | ---------------- |
|
|
132
|
+
| UserList | Missing memo | 50 re-renders |
|
|
133
|
+
| Card | Inline style object | Per-click render |
|
|
134
|
+
|
|
135
|
+
### Fixes Applied
|
|
136
|
+
|
|
137
|
+
1. Added React.memo to UserList
|
|
138
|
+
2. Extracted style to constant
|
|
139
|
+
3. Added useMemo to sort operation
|
|
140
|
+
|
|
141
|
+
### Before/After
|
|
142
|
+
|
|
143
|
+
| Metric | Before | After |
|
|
144
|
+
| ----------------- | ------ | ----- |
|
|
145
|
+
| Renders per click | 50 | 1 |
|
|
146
|
+
| Frame rate | 45fps | 60fps |
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Critical Rules
|
|
150
|
+
|
|
151
|
+
1. **PROFILE FIRST** - Use React DevTools
|
|
152
|
+
2. **MEMO WISELY** - Not everything needs memo
|
|
153
|
+
3. **STABLE REFERENCES** - Objects, arrays, functions
|
|
154
|
+
4. **VIRTUALIZE LISTS** - For 100+ items
|