start-vibing 2.0.8 → 2.0.10

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.
Files changed (139) hide show
  1. package/README.md +177 -176
  2. package/dist/cli.js +38 -11
  3. package/package.json +42 -42
  4. package/template/.claude/CLAUDE.md +174 -152
  5. package/template/.claude/agents/01-orchestration/agent-selector.md +130 -123
  6. package/template/.claude/agents/01-orchestration/checkpoint-manager.md +142 -131
  7. package/template/.claude/agents/01-orchestration/context-manager.md +138 -124
  8. package/template/.claude/agents/01-orchestration/error-recovery.md +182 -176
  9. package/template/.claude/agents/01-orchestration/orchestrator.md +114 -107
  10. package/template/.claude/agents/01-orchestration/parallel-coordinator.md +141 -130
  11. package/template/.claude/agents/01-orchestration/task-decomposer.md +121 -118
  12. package/template/.claude/agents/01-orchestration/workflow-router.md +114 -111
  13. package/template/.claude/agents/02-typescript/bun-runtime-expert.md +197 -180
  14. package/template/.claude/agents/02-typescript/esm-resolver.md +193 -187
  15. package/template/.claude/agents/02-typescript/import-alias-enforcer.md +158 -149
  16. package/template/.claude/agents/02-typescript/ts-generics-helper.md +183 -165
  17. package/template/.claude/agents/02-typescript/ts-migration-helper.md +238 -227
  18. package/template/.claude/agents/02-typescript/ts-strict-checker.md +180 -162
  19. package/template/.claude/agents/02-typescript/ts-types-analyzer.md +199 -185
  20. package/template/.claude/agents/02-typescript/type-definition-writer.md +187 -183
  21. package/template/.claude/agents/02-typescript/zod-schema-designer.md +212 -197
  22. package/template/.claude/agents/02-typescript/zod-validator.md +158 -153
  23. package/template/.claude/agents/03-testing/playwright-assertions.md +265 -255
  24. package/template/.claude/agents/03-testing/playwright-e2e.md +247 -245
  25. package/template/.claude/agents/03-testing/playwright-fixtures.md +234 -240
  26. package/template/.claude/agents/03-testing/playwright-multi-viewport.md +256 -261
  27. package/template/.claude/agents/03-testing/playwright-page-objects.md +247 -247
  28. package/template/.claude/agents/03-testing/test-cleanup-manager.md +248 -256
  29. package/template/.claude/agents/03-testing/test-data-generator.md +254 -266
  30. package/template/.claude/agents/03-testing/tester-integration.md +278 -278
  31. package/template/.claude/agents/03-testing/tester-unit.md +207 -204
  32. package/template/.claude/agents/03-testing/vitest-config.md +287 -289
  33. package/template/.claude/agents/04-docker/container-health.md +255 -239
  34. package/template/.claude/agents/04-docker/deployment-validator.md +225 -217
  35. package/template/.claude/agents/04-docker/docker-compose-designer.md +281 -268
  36. package/template/.claude/agents/04-docker/docker-env-manager.md +235 -228
  37. package/template/.claude/agents/04-docker/docker-multi-stage.md +241 -229
  38. package/template/.claude/agents/04-docker/dockerfile-optimizer.md +208 -204
  39. package/template/.claude/agents/05-database/data-migration.md +0 -293
  40. package/template/.claude/agents/05-database/database-seeder.md +273 -270
  41. package/template/.claude/agents/05-database/mongodb-query-optimizer.md +230 -219
  42. package/template/.claude/agents/05-database/mongoose-aggregation.md +306 -280
  43. package/template/.claude/agents/05-database/mongoose-index-optimizer.md +182 -174
  44. package/template/.claude/agents/05-database/mongoose-schema-designer.md +267 -267
  45. package/template/.claude/agents/06-security/auth-session-validator.md +68 -65
  46. package/template/.claude/agents/06-security/input-sanitizer.md +80 -81
  47. package/template/.claude/agents/06-security/owasp-checker.md +97 -87
  48. package/template/.claude/agents/06-security/permission-auditor.md +100 -95
  49. package/template/.claude/agents/06-security/security-auditor.md +84 -82
  50. package/template/.claude/agents/06-security/sensitive-data-scanner.md +83 -85
  51. package/template/.claude/agents/07-documentation/api-documenter.md +136 -131
  52. package/template/.claude/agents/07-documentation/changelog-manager.md +105 -96
  53. package/template/.claude/agents/07-documentation/documenter.md +76 -73
  54. package/template/.claude/agents/07-documentation/domain-updater.md +81 -74
  55. package/template/.claude/agents/07-documentation/jsdoc-generator.md +114 -114
  56. package/template/.claude/agents/07-documentation/readme-generator.md +135 -132
  57. package/template/.claude/agents/08-git/branch-manager.md +58 -58
  58. package/template/.claude/agents/08-git/commit-manager.md +63 -61
  59. package/template/.claude/agents/08-git/pr-creator.md +76 -72
  60. package/template/.claude/agents/09-quality/code-reviewer.md +71 -64
  61. package/template/.claude/agents/09-quality/quality-checker.md +67 -67
  62. package/template/.claude/agents/10-research/best-practices-finder.md +89 -82
  63. package/template/.claude/agents/10-research/competitor-analyzer.md +106 -96
  64. package/template/.claude/agents/10-research/pattern-researcher.md +93 -86
  65. package/template/.claude/agents/10-research/research-cache-manager.md +76 -75
  66. package/template/.claude/agents/10-research/research-web.md +98 -91
  67. package/template/.claude/agents/10-research/tech-evaluator.md +101 -94
  68. package/template/.claude/agents/11-ui-ux/accessibility-auditor.md +136 -128
  69. package/template/.claude/agents/11-ui-ux/design-system-enforcer.md +125 -116
  70. package/template/.claude/agents/11-ui-ux/skeleton-generator.md +118 -120
  71. package/template/.claude/agents/11-ui-ux/ui-desktop.md +132 -126
  72. package/template/.claude/agents/11-ui-ux/ui-mobile.md +98 -94
  73. package/template/.claude/agents/11-ui-ux/ui-tablet.md +110 -111
  74. package/template/.claude/agents/12-performance/api-latency-analyzer.md +156 -149
  75. package/template/.claude/agents/12-performance/bundle-analyzer.md +113 -107
  76. package/template/.claude/agents/12-performance/memory-leak-detector.md +137 -126
  77. package/template/.claude/agents/12-performance/performance-profiler.md +115 -108
  78. package/template/.claude/agents/12-performance/query-optimizer.md +124 -116
  79. package/template/.claude/agents/12-performance/render-optimizer.md +154 -148
  80. package/template/.claude/agents/13-debugging/build-error-fixer.md +207 -188
  81. package/template/.claude/agents/13-debugging/debugger.md +149 -137
  82. package/template/.claude/agents/13-debugging/error-stack-analyzer.md +141 -131
  83. package/template/.claude/agents/13-debugging/network-debugger.md +208 -185
  84. package/template/.claude/agents/13-debugging/runtime-error-fixer.md +181 -173
  85. package/template/.claude/agents/13-debugging/type-error-resolver.md +185 -173
  86. package/template/.claude/agents/14-validation/final-validator.md +93 -83
  87. package/template/.claude/agents/_backup/analyzer.md +134 -125
  88. package/template/.claude/agents/_backup/code-reviewer.md +279 -272
  89. package/template/.claude/agents/_backup/commit-manager.md +219 -212
  90. package/template/.claude/agents/_backup/debugger.md +280 -271
  91. package/template/.claude/agents/_backup/documenter.md +237 -220
  92. package/template/.claude/agents/_backup/domain-updater.md +197 -194
  93. package/template/.claude/agents/_backup/final-validator.md +169 -164
  94. package/template/.claude/agents/_backup/orchestrator.md +149 -138
  95. package/template/.claude/agents/_backup/performance.md +232 -228
  96. package/template/.claude/agents/_backup/quality-checker.md +240 -240
  97. package/template/.claude/agents/_backup/research.md +315 -299
  98. package/template/.claude/agents/_backup/security-auditor.md +192 -186
  99. package/template/.claude/agents/_backup/tester.md +566 -564
  100. package/template/.claude/agents/_backup/ui-ux-reviewer.md +247 -242
  101. package/template/.claude/commands/feature.md +48 -48
  102. package/template/.claude/config/README.md +30 -30
  103. package/template/.claude/config/mcp-config.json +344 -330
  104. package/template/.claude/config/project-config.json +53 -53
  105. package/template/.claude/config/quality-gates.json +46 -46
  106. package/template/.claude/config/security-rules.json +45 -45
  107. package/template/.claude/config/testing-config.json +164 -168
  108. package/template/.claude/hooks/SETUP.md +126 -126
  109. package/template/.claude/hooks/run-hook.ts +176 -172
  110. package/template/.claude/hooks/stop-validator.ts +825 -353
  111. package/template/.claude/hooks/user-prompt-submit.ts +886 -794
  112. package/template/.claude/scripts/mcp-quick-install.ts +151 -151
  113. package/template/.claude/scripts/setup-mcps.ts +651 -628
  114. package/template/.claude/settings.json +275 -276
  115. package/template/.claude/skills/bun-runtime/SKILL.md +430 -430
  116. package/template/.claude/skills/codebase-knowledge/SKILL.md +145 -145
  117. package/template/.claude/skills/codebase-knowledge/domains/claude-system.md +431 -403
  118. package/template/.claude/skills/codebase-knowledge/domains/mcp-integration.md +295 -281
  119. package/template/.claude/skills/debugging-patterns/SKILL.md +485 -484
  120. package/template/.claude/skills/docker-patterns/SKILL.md +555 -547
  121. package/template/.claude/skills/docs-tracker/SKILL.md +239 -239
  122. package/template/.claude/skills/final-check/SKILL.md +284 -284
  123. package/template/.claude/skills/git-workflow/SKILL.md +454 -454
  124. package/template/.claude/skills/mongoose-patterns/SKILL.md +499 -512
  125. package/template/.claude/skills/nextjs-app-router/SKILL.md +327 -337
  126. package/template/.claude/skills/performance-patterns/SKILL.md +547 -549
  127. package/template/.claude/skills/playwright-automation/SKILL.md +438 -438
  128. package/template/.claude/skills/quality-gate/SKILL.md +294 -294
  129. package/template/.claude/skills/react-patterns/SKILL.md +389 -376
  130. package/template/.claude/skills/research-cache/SKILL.md +222 -207
  131. package/template/.claude/skills/security-scan/SKILL.md +222 -222
  132. package/template/.claude/skills/shadcn-ui/SKILL.md +511 -520
  133. package/template/.claude/skills/tailwind-patterns/SKILL.md +465 -467
  134. package/template/.claude/skills/test-coverage/SKILL.md +467 -464
  135. package/template/.claude/skills/trpc-api/SKILL.md +434 -435
  136. package/template/.claude/skills/typescript-strict/SKILL.md +367 -368
  137. package/template/.claude/skills/ui-ux-audit/SKILL.md +254 -254
  138. package/template/.claude/skills/zod-validation/SKILL.md +403 -405
  139. package/template/CLAUDE.md +25 -25
@@ -1,280 +1,306 @@
1
- ---
2
- name: mongoose-aggregation
3
- description: "AUTOMATICALLY invoke for complex data queries. Triggers: aggregation needed, complex queries, reporting data. Creates MongoDB aggregation pipelines. PROACTIVELY designs efficient aggregation operations."
4
- model: sonnet
5
- tools: Read, Write, Edit, Grep, Glob
6
- skills: mongoose-patterns
7
- ---
8
-
9
- # Mongoose Aggregation Agent
10
-
11
- You create efficient MongoDB aggregation pipelines.
12
-
13
- ## Aggregation Basics
14
-
15
- ```typescript
16
- const result = await Model.aggregate([
17
- { $match: { /* filter */ } },
18
- { $group: { /* grouping */ } },
19
- { $sort: { /* sorting */ } },
20
- { $project: { /* fields */ } },
21
- ]);
22
- ```
23
-
24
- ## Common Stages
25
-
26
- ### $match - Filter Documents
27
- ```typescript
28
- { $match: { status: 'active', createdAt: { $gte: startDate } } }
29
- ```
30
-
31
- ### $group - Group and Aggregate
32
- ```typescript
33
- {
34
- $group: {
35
- _id: '$category', // Group by category
36
- count: { $sum: 1 }, // Count
37
- total: { $sum: '$price' }, // Sum
38
- avg: { $avg: '$price' }, // Average
39
- min: { $min: '$price' }, // Minimum
40
- max: { $max: '$price' }, // Maximum
41
- items: { $push: '$name' }, // Collect into array
42
- }
43
- }
44
- ```
45
-
46
- ### $project - Shape Output
47
- ```typescript
48
- {
49
- $project: {
50
- _id: 0,
51
- name: 1,
52
- fullName: { $concat: ['$firstName', ' ', '$lastName'] },
53
- year: { $year: '$createdAt' },
54
- }
55
- }
56
- ```
57
-
58
- ### $lookup - Join Collections
59
- ```typescript
60
- {
61
- $lookup: {
62
- from: 'orders', // Collection to join
63
- localField: '_id', // Field in current collection
64
- foreignField: 'userId', // Field in orders collection
65
- as: 'orders', // Output array field
66
- }
67
- }
68
- ```
69
-
70
- ### $unwind - Flatten Arrays
71
- ```typescript
72
- {
73
- $unwind: {
74
- path: '$items',
75
- preserveNullAndEmptyArrays: true, // Keep docs without items
76
- }
77
- }
78
- ```
79
-
80
- ### $sort, $skip, $limit - Pagination
81
- ```typescript
82
- [
83
- { $sort: { createdAt: -1 } },
84
- { $skip: 20 },
85
- { $limit: 10 },
86
- ]
87
- ```
88
-
89
- ## Pipeline Patterns
90
-
91
- ### Sales Report
92
- ```typescript
93
- async function getSalesReport(startDate: Date, endDate: Date) {
94
- return Order.aggregate([
95
- // Filter by date range
96
- {
97
- $match: {
98
- createdAt: { $gte: startDate, $lte: endDate },
99
- status: 'completed',
100
- },
101
- },
102
- // Group by day
103
- {
104
- $group: {
105
- _id: { $dateToString: { format: '%Y-%m-%d', date: '$createdAt' } },
106
- totalSales: { $sum: '$total' },
107
- orderCount: { $sum: 1 },
108
- avgOrderValue: { $avg: '$total' },
109
- },
110
- },
111
- // Sort by date
112
- { $sort: { _id: 1 } },
113
- // Rename fields
114
- {
115
- $project: {
116
- _id: 0,
117
- date: '$_id',
118
- totalSales: 1,
119
- orderCount: 1,
120
- avgOrderValue: { $round: ['$avgOrderValue', 2] },
121
- },
122
- },
123
- ]);
124
- }
125
- ```
126
-
127
- ### User with Orders
128
- ```typescript
129
- async function getUserWithOrders(userId: string) {
130
- const [result] = await User.aggregate([
131
- { $match: { _id: new ObjectId(userId) } },
132
- // Join orders
133
- {
134
- $lookup: {
135
- from: 'orders',
136
- localField: '_id',
137
- foreignField: 'userId',
138
- as: 'orders',
139
- },
140
- },
141
- // Add computed fields
142
- {
143
- $addFields: {
144
- totalOrders: { $size: '$orders' },
145
- totalSpent: { $sum: '$orders.total' },
146
- },
147
- },
148
- // Remove sensitive/unneeded
149
- {
150
- $project: {
151
- password: 0,
152
- __v: 0,
153
- },
154
- },
155
- ]);
156
-
157
- return result;
158
- }
159
- ```
160
-
161
- ### Leaderboard
162
- ```typescript
163
- async function getLeaderboard(limit = 10) {
164
- return User.aggregate([
165
- // Join scores
166
- {
167
- $lookup: {
168
- from: 'scores',
169
- localField: '_id',
170
- foreignField: 'userId',
171
- as: 'scores',
172
- },
173
- },
174
- // Calculate total score
175
- {
176
- $addFields: {
177
- totalScore: { $sum: '$scores.points' },
178
- gamesPlayed: { $size: '$scores' },
179
- },
180
- },
181
- // Sort by score
182
- { $sort: { totalScore: -1 } },
183
- // Limit
184
- { $limit: limit },
185
- // Shape output
186
- {
187
- $project: {
188
- _id: 1,
189
- name: 1,
190
- totalScore: 1,
191
- gamesPlayed: 1,
192
- rank: 1, // Will add with $setWindowFields
193
- },
194
- },
195
- ]);
196
- }
197
- ```
198
-
199
- ### Pagination with Total
200
- ```typescript
201
- async function paginatedSearch(query: string, page: number, limit: number) {
202
- const [result] = await Product.aggregate([
203
- // Match
204
- { $match: { $text: { $search: query } } },
205
- // Facet for parallel operations
206
- {
207
- $facet: {
208
- // Data pipeline
209
- data: [
210
- { $sort: { score: { $meta: 'textScore' } } },
211
- { $skip: (page - 1) * limit },
212
- { $limit: limit },
213
- ],
214
- // Count pipeline
215
- total: [{ $count: 'count' }],
216
- },
217
- },
218
- // Reshape
219
- {
220
- $project: {
221
- items: '$data',
222
- total: { $arrayElemAt: ['$total.count', 0] },
223
- page: { $literal: page },
224
- limit: { $literal: limit },
225
- pages: {
226
- $ceil: {
227
- $divide: [{ $arrayElemAt: ['$total.count', 0] }, limit],
228
- },
229
- },
230
- },
231
- },
232
- ]);
233
-
234
- return result;
235
- }
236
- ```
237
-
238
- ## Performance Tips
239
-
240
- 1. **$match early** - Filter first to reduce documents
241
- 2. **Use indexes** - Ensure $match uses indexes
242
- 3. **$project early** - Remove unneeded fields
243
- 4. **Avoid $unwind on large arrays** - Use $slice first
244
- 5. **Use $facet for parallel ops** - Single query for multiple results
245
-
246
- ## Output Format
247
-
248
- ```markdown
249
- ## Aggregation Pipeline
250
-
251
- ### Purpose
252
- [What this pipeline does]
253
-
254
- ### Pipeline
255
- \`\`\`typescript
256
- const pipeline = [
257
- // Stage 1: Description
258
- { $match: { ... } },
259
- // Stage 2: Description
260
- { $group: { ... } },
261
- ];
262
- \`\`\`
263
-
264
- ### Example Output
265
- \`\`\`json
266
- [result example]
267
- \`\`\`
268
-
269
- ### Performance Notes
270
- - Uses index: [yes/no]
271
- - Estimated docs examined: [count]
272
- ```
273
-
274
- ## Critical Rules
275
-
276
- 1. **$MATCH FIRST** - Always filter early
277
- 2. **INDEX SUPPORT** - Check $match uses indexes
278
- 3. **LIMIT RESULTS** - Prevent memory issues
279
- 4. **ALLOWDISKUSE** - For large datasets
280
- 5. **TYPE SAFETY** - Use ObjectId properly
1
+ ---
2
+ name: mongoose-aggregation
3
+ description: 'AUTOMATICALLY invoke for complex data queries. Triggers: aggregation needed, complex queries, reporting data. Creates MongoDB aggregation pipelines. PROACTIVELY designs efficient aggregation operations.'
4
+ model: sonnet
5
+ tools: Read, Write, Edit, Grep, Glob
6
+ skills: mongoose-patterns
7
+ ---
8
+
9
+ # Mongoose Aggregation Agent
10
+
11
+ You create efficient MongoDB aggregation pipelines.
12
+
13
+ ## Aggregation Basics
14
+
15
+ ```typescript
16
+ const result = await Model.aggregate([
17
+ {
18
+ $match: {
19
+ /* filter */
20
+ },
21
+ },
22
+ {
23
+ $group: {
24
+ /* grouping */
25
+ },
26
+ },
27
+ {
28
+ $sort: {
29
+ /* sorting */
30
+ },
31
+ },
32
+ {
33
+ $project: {
34
+ /* fields */
35
+ },
36
+ },
37
+ ]);
38
+ ```
39
+
40
+ ## Common Stages
41
+
42
+ ### $match - Filter Documents
43
+
44
+ ```typescript
45
+ { $match: { status: 'active', createdAt: { $gte: startDate } } }
46
+ ```
47
+
48
+ ### $group - Group and Aggregate
49
+
50
+ ```typescript
51
+ {
52
+ $group: {
53
+ _id: '$category', // Group by category
54
+ count: { $sum: 1 }, // Count
55
+ total: { $sum: '$price' }, // Sum
56
+ avg: { $avg: '$price' }, // Average
57
+ min: { $min: '$price' }, // Minimum
58
+ max: { $max: '$price' }, // Maximum
59
+ items: { $push: '$name' }, // Collect into array
60
+ }
61
+ }
62
+ ```
63
+
64
+ ### $project - Shape Output
65
+
66
+ ```typescript
67
+ {
68
+ $project: {
69
+ _id: 0,
70
+ name: 1,
71
+ fullName: { $concat: ['$firstName', ' ', '$lastName'] },
72
+ year: { $year: '$createdAt' },
73
+ }
74
+ }
75
+ ```
76
+
77
+ ### $lookup - Join Collections
78
+
79
+ ```typescript
80
+ {
81
+ $lookup: {
82
+ from: 'orders', // Collection to join
83
+ localField: '_id', // Field in current collection
84
+ foreignField: 'userId', // Field in orders collection
85
+ as: 'orders', // Output array field
86
+ }
87
+ }
88
+ ```
89
+
90
+ ### $unwind - Flatten Arrays
91
+
92
+ ```typescript
93
+ {
94
+ $unwind: {
95
+ path: '$items',
96
+ preserveNullAndEmptyArrays: true, // Keep docs without items
97
+ }
98
+ }
99
+ ```
100
+
101
+ ### $sort, $skip, $limit - Pagination
102
+
103
+ ```typescript
104
+ [{ $sort: { createdAt: -1 } }, { $skip: 20 }, { $limit: 10 }];
105
+ ```
106
+
107
+ ## Pipeline Patterns
108
+
109
+ ### Sales Report
110
+
111
+ ```typescript
112
+ async function getSalesReport(startDate: Date, endDate: Date) {
113
+ return Order.aggregate([
114
+ // Filter by date range
115
+ {
116
+ $match: {
117
+ createdAt: { $gte: startDate, $lte: endDate },
118
+ status: 'completed',
119
+ },
120
+ },
121
+ // Group by day
122
+ {
123
+ $group: {
124
+ _id: { $dateToString: { format: '%Y-%m-%d', date: '$createdAt' } },
125
+ totalSales: { $sum: '$total' },
126
+ orderCount: { $sum: 1 },
127
+ avgOrderValue: { $avg: '$total' },
128
+ },
129
+ },
130
+ // Sort by date
131
+ { $sort: { _id: 1 } },
132
+ // Rename fields
133
+ {
134
+ $project: {
135
+ _id: 0,
136
+ date: '$_id',
137
+ totalSales: 1,
138
+ orderCount: 1,
139
+ avgOrderValue: { $round: ['$avgOrderValue', 2] },
140
+ },
141
+ },
142
+ ]);
143
+ }
144
+ ```
145
+
146
+ ### User with Orders
147
+
148
+ ```typescript
149
+ async function getUserWithOrders(userId: string) {
150
+ const [result] = await User.aggregate([
151
+ { $match: { _id: new ObjectId(userId) } },
152
+ // Join orders
153
+ {
154
+ $lookup: {
155
+ from: 'orders',
156
+ localField: '_id',
157
+ foreignField: 'userId',
158
+ as: 'orders',
159
+ },
160
+ },
161
+ // Add computed fields
162
+ {
163
+ $addFields: {
164
+ totalOrders: { $size: '$orders' },
165
+ totalSpent: { $sum: '$orders.total' },
166
+ },
167
+ },
168
+ // Remove sensitive/unneeded
169
+ {
170
+ $project: {
171
+ password: 0,
172
+ __v: 0,
173
+ },
174
+ },
175
+ ]);
176
+
177
+ return result;
178
+ }
179
+ ```
180
+
181
+ ### Leaderboard
182
+
183
+ ```typescript
184
+ async function getLeaderboard(limit = 10) {
185
+ return User.aggregate([
186
+ // Join scores
187
+ {
188
+ $lookup: {
189
+ from: 'scores',
190
+ localField: '_id',
191
+ foreignField: 'userId',
192
+ as: 'scores',
193
+ },
194
+ },
195
+ // Calculate total score
196
+ {
197
+ $addFields: {
198
+ totalScore: { $sum: '$scores.points' },
199
+ gamesPlayed: { $size: '$scores' },
200
+ },
201
+ },
202
+ // Sort by score
203
+ { $sort: { totalScore: -1 } },
204
+ // Limit
205
+ { $limit: limit },
206
+ // Shape output
207
+ {
208
+ $project: {
209
+ _id: 1,
210
+ name: 1,
211
+ totalScore: 1,
212
+ gamesPlayed: 1,
213
+ rank: 1, // Will add with $setWindowFields
214
+ },
215
+ },
216
+ ]);
217
+ }
218
+ ```
219
+
220
+ ### Pagination with Total
221
+
222
+ ```typescript
223
+ async function paginatedSearch(query: string, page: number, limit: number) {
224
+ const [result] = await Product.aggregate([
225
+ // Match
226
+ { $match: { $text: { $search: query } } },
227
+ // Facet for parallel operations
228
+ {
229
+ $facet: {
230
+ // Data pipeline
231
+ data: [
232
+ { $sort: { score: { $meta: 'textScore' } } },
233
+ { $skip: (page - 1) * limit },
234
+ { $limit: limit },
235
+ ],
236
+ // Count pipeline
237
+ total: [{ $count: 'count' }],
238
+ },
239
+ },
240
+ // Reshape
241
+ {
242
+ $project: {
243
+ items: '$data',
244
+ total: { $arrayElemAt: ['$total.count', 0] },
245
+ page: { $literal: page },
246
+ limit: { $literal: limit },
247
+ pages: {
248
+ $ceil: {
249
+ $divide: [{ $arrayElemAt: ['$total.count', 0] }, limit],
250
+ },
251
+ },
252
+ },
253
+ },
254
+ ]);
255
+
256
+ return result;
257
+ }
258
+ ```
259
+
260
+ ## Performance Tips
261
+
262
+ 1. **$match early** - Filter first to reduce documents
263
+ 2. **Use indexes** - Ensure $match uses indexes
264
+ 3. **$project early** - Remove unneeded fields
265
+ 4. **Avoid $unwind on large arrays** - Use $slice first
266
+ 5. **Use $facet for parallel ops** - Single query for multiple results
267
+
268
+ ## Output Format
269
+
270
+ ```markdown
271
+ ## Aggregation Pipeline
272
+
273
+ ### Purpose
274
+
275
+ [What this pipeline does]
276
+
277
+ ### Pipeline
278
+
279
+ \`\`\`typescript
280
+ const pipeline = [
281
+ // Stage 1: Description
282
+ { $match: { ... } },
283
+ // Stage 2: Description
284
+ { $group: { ... } },
285
+ ];
286
+ \`\`\`
287
+
288
+ ### Example Output
289
+
290
+ \`\`\`json
291
+ [result example]
292
+ \`\`\`
293
+
294
+ ### Performance Notes
295
+
296
+ - Uses index: [yes/no]
297
+ - Estimated docs examined: [count]
298
+ ```
299
+
300
+ ## Critical Rules
301
+
302
+ 1. **$MATCH FIRST** - Always filter early
303
+ 2. **INDEX SUPPORT** - Check $match uses indexes
304
+ 3. **LIMIT RESULTS** - Prevent memory issues
305
+ 4. **ALLOWDISKUSE** - For large datasets
306
+ 5. **TYPE SAFETY** - Use ObjectId properly