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.
Files changed (131) hide show
  1. package/README.md +177 -177
  2. package/dist/cli.js +19 -2
  3. package/package.json +42 -42
  4. package/template/.claude/CLAUDE.md +174 -174
  5. package/template/.claude/agents/01-orchestration/agent-selector.md +130 -130
  6. package/template/.claude/agents/01-orchestration/checkpoint-manager.md +142 -142
  7. package/template/.claude/agents/01-orchestration/context-manager.md +138 -138
  8. package/template/.claude/agents/01-orchestration/error-recovery.md +182 -182
  9. package/template/.claude/agents/01-orchestration/orchestrator.md +114 -114
  10. package/template/.claude/agents/01-orchestration/parallel-coordinator.md +141 -141
  11. package/template/.claude/agents/01-orchestration/task-decomposer.md +121 -121
  12. package/template/.claude/agents/01-orchestration/workflow-router.md +114 -114
  13. package/template/.claude/agents/02-typescript/bun-runtime-expert.md +197 -197
  14. package/template/.claude/agents/02-typescript/esm-resolver.md +193 -193
  15. package/template/.claude/agents/02-typescript/import-alias-enforcer.md +158 -158
  16. package/template/.claude/agents/02-typescript/ts-generics-helper.md +183 -183
  17. package/template/.claude/agents/02-typescript/ts-migration-helper.md +238 -238
  18. package/template/.claude/agents/02-typescript/ts-strict-checker.md +180 -180
  19. package/template/.claude/agents/02-typescript/ts-types-analyzer.md +199 -199
  20. package/template/.claude/agents/02-typescript/type-definition-writer.md +187 -187
  21. package/template/.claude/agents/02-typescript/zod-schema-designer.md +212 -212
  22. package/template/.claude/agents/02-typescript/zod-validator.md +158 -158
  23. package/template/.claude/agents/03-testing/playwright-assertions.md +265 -265
  24. package/template/.claude/agents/03-testing/playwright-e2e.md +247 -247
  25. package/template/.claude/agents/03-testing/playwright-fixtures.md +234 -234
  26. package/template/.claude/agents/03-testing/playwright-multi-viewport.md +256 -256
  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 -248
  29. package/template/.claude/agents/03-testing/test-data-generator.md +254 -254
  30. package/template/.claude/agents/03-testing/tester-integration.md +278 -278
  31. package/template/.claude/agents/03-testing/tester-unit.md +207 -207
  32. package/template/.claude/agents/03-testing/vitest-config.md +287 -287
  33. package/template/.claude/agents/04-docker/container-health.md +255 -255
  34. package/template/.claude/agents/04-docker/deployment-validator.md +225 -225
  35. package/template/.claude/agents/04-docker/docker-compose-designer.md +281 -281
  36. package/template/.claude/agents/04-docker/docker-env-manager.md +235 -235
  37. package/template/.claude/agents/04-docker/docker-multi-stage.md +241 -241
  38. package/template/.claude/agents/04-docker/dockerfile-optimizer.md +208 -208
  39. package/template/.claude/agents/05-database/database-seeder.md +273 -273
  40. package/template/.claude/agents/05-database/mongodb-query-optimizer.md +230 -230
  41. package/template/.claude/agents/05-database/mongoose-aggregation.md +306 -306
  42. package/template/.claude/agents/05-database/mongoose-index-optimizer.md +182 -182
  43. package/template/.claude/agents/05-database/mongoose-schema-designer.md +267 -267
  44. package/template/.claude/agents/06-security/auth-session-validator.md +68 -68
  45. package/template/.claude/agents/06-security/input-sanitizer.md +80 -80
  46. package/template/.claude/agents/06-security/owasp-checker.md +97 -97
  47. package/template/.claude/agents/06-security/permission-auditor.md +100 -100
  48. package/template/.claude/agents/06-security/security-auditor.md +84 -84
  49. package/template/.claude/agents/06-security/sensitive-data-scanner.md +83 -83
  50. package/template/.claude/agents/07-documentation/api-documenter.md +136 -136
  51. package/template/.claude/agents/07-documentation/changelog-manager.md +105 -105
  52. package/template/.claude/agents/07-documentation/documenter.md +76 -76
  53. package/template/.claude/agents/07-documentation/domain-updater.md +81 -81
  54. package/template/.claude/agents/07-documentation/jsdoc-generator.md +114 -114
  55. package/template/.claude/agents/07-documentation/readme-generator.md +135 -135
  56. package/template/.claude/agents/08-git/branch-manager.md +58 -58
  57. package/template/.claude/agents/08-git/commit-manager.md +63 -63
  58. package/template/.claude/agents/08-git/pr-creator.md +76 -76
  59. package/template/.claude/agents/09-quality/code-reviewer.md +71 -71
  60. package/template/.claude/agents/09-quality/quality-checker.md +67 -67
  61. package/template/.claude/agents/10-research/best-practices-finder.md +89 -89
  62. package/template/.claude/agents/10-research/competitor-analyzer.md +106 -106
  63. package/template/.claude/agents/10-research/pattern-researcher.md +93 -93
  64. package/template/.claude/agents/10-research/research-cache-manager.md +76 -76
  65. package/template/.claude/agents/10-research/research-web.md +98 -98
  66. package/template/.claude/agents/10-research/tech-evaluator.md +101 -101
  67. package/template/.claude/agents/11-ui-ux/accessibility-auditor.md +136 -136
  68. package/template/.claude/agents/11-ui-ux/design-system-enforcer.md +125 -125
  69. package/template/.claude/agents/11-ui-ux/skeleton-generator.md +118 -118
  70. package/template/.claude/agents/11-ui-ux/ui-desktop.md +132 -132
  71. package/template/.claude/agents/11-ui-ux/ui-mobile.md +98 -98
  72. package/template/.claude/agents/11-ui-ux/ui-tablet.md +110 -110
  73. package/template/.claude/agents/12-performance/api-latency-analyzer.md +156 -156
  74. package/template/.claude/agents/12-performance/bundle-analyzer.md +113 -113
  75. package/template/.claude/agents/12-performance/memory-leak-detector.md +137 -137
  76. package/template/.claude/agents/12-performance/performance-profiler.md +115 -115
  77. package/template/.claude/agents/12-performance/query-optimizer.md +124 -124
  78. package/template/.claude/agents/12-performance/render-optimizer.md +154 -154
  79. package/template/.claude/agents/13-debugging/build-error-fixer.md +207 -207
  80. package/template/.claude/agents/13-debugging/debugger.md +149 -149
  81. package/template/.claude/agents/13-debugging/error-stack-analyzer.md +141 -141
  82. package/template/.claude/agents/13-debugging/network-debugger.md +208 -208
  83. package/template/.claude/agents/13-debugging/runtime-error-fixer.md +181 -181
  84. package/template/.claude/agents/13-debugging/type-error-resolver.md +185 -185
  85. package/template/.claude/agents/14-validation/final-validator.md +93 -93
  86. package/template/.claude/agents/_backup/analyzer.md +134 -134
  87. package/template/.claude/agents/_backup/code-reviewer.md +279 -279
  88. package/template/.claude/agents/_backup/commit-manager.md +219 -219
  89. package/template/.claude/agents/_backup/debugger.md +280 -280
  90. package/template/.claude/agents/_backup/documenter.md +237 -237
  91. package/template/.claude/agents/_backup/domain-updater.md +197 -197
  92. package/template/.claude/agents/_backup/final-validator.md +169 -169
  93. package/template/.claude/agents/_backup/orchestrator.md +149 -149
  94. package/template/.claude/agents/_backup/performance.md +232 -232
  95. package/template/.claude/agents/_backup/quality-checker.md +240 -240
  96. package/template/.claude/agents/_backup/research.md +315 -315
  97. package/template/.claude/agents/_backup/security-auditor.md +192 -192
  98. package/template/.claude/agents/_backup/tester.md +566 -566
  99. package/template/.claude/agents/_backup/ui-ux-reviewer.md +247 -247
  100. package/template/.claude/config/README.md +30 -30
  101. package/template/.claude/config/mcp-config.json +344 -344
  102. package/template/.claude/config/project-config.json +53 -53
  103. package/template/.claude/config/quality-gates.json +46 -46
  104. package/template/.claude/config/security-rules.json +45 -45
  105. package/template/.claude/config/testing-config.json +164 -164
  106. package/template/.claude/hooks/SETUP.md +126 -126
  107. package/template/.claude/hooks/run-hook.ts +176 -176
  108. package/template/.claude/hooks/stop-validator.ts +914 -824
  109. package/template/.claude/hooks/user-prompt-submit.ts +886 -886
  110. package/template/.claude/scripts/mcp-quick-install.ts +151 -151
  111. package/template/.claude/scripts/setup-mcps.ts +651 -651
  112. package/template/.claude/settings.json +275 -275
  113. package/template/.claude/skills/bun-runtime/SKILL.md +430 -430
  114. package/template/.claude/skills/codebase-knowledge/domains/claude-system.md +431 -431
  115. package/template/.claude/skills/codebase-knowledge/domains/mcp-integration.md +295 -295
  116. package/template/.claude/skills/debugging-patterns/SKILL.md +485 -485
  117. package/template/.claude/skills/docker-patterns/SKILL.md +555 -555
  118. package/template/.claude/skills/git-workflow/SKILL.md +454 -454
  119. package/template/.claude/skills/mongoose-patterns/SKILL.md +499 -499
  120. package/template/.claude/skills/nextjs-app-router/SKILL.md +327 -327
  121. package/template/.claude/skills/performance-patterns/SKILL.md +547 -547
  122. package/template/.claude/skills/playwright-automation/SKILL.md +438 -438
  123. package/template/.claude/skills/react-patterns/SKILL.md +389 -389
  124. package/template/.claude/skills/research-cache/SKILL.md +222 -222
  125. package/template/.claude/skills/shadcn-ui/SKILL.md +511 -511
  126. package/template/.claude/skills/tailwind-patterns/SKILL.md +465 -465
  127. package/template/.claude/skills/test-coverage/SKILL.md +467 -467
  128. package/template/.claude/skills/trpc-api/SKILL.md +434 -434
  129. package/template/.claude/skills/typescript-strict/SKILL.md +367 -367
  130. package/template/.claude/skills/zod-validation/SKILL.md +403 -403
  131. package/template/CLAUDE.md +117 -117
@@ -1,306 +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
- {
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
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