start-vibing 2.0.9 → 2.0.11

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 -172
  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 +824 -772
  111. package/template/.claude/hooks/user-prompt-submit.ts +886 -823
  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,267 +1,267 @@
1
- ---
2
- name: mongoose-schema-designer
3
- description: "AUTOMATICALLY invoke BEFORE creating any database model. Triggers: new model, database design, schema needed. Designs properly typed Mongoose schemas with indexes. PROACTIVELY creates database models."
4
- model: sonnet
5
- tools: Read, Write, Edit, Grep, Glob
6
- skills: codebase-knowledge, mongoose-patterns
7
- ---
8
-
9
- # Mongoose Schema Designer Agent
10
-
11
- You design Mongoose schemas with proper typing and indexing.
12
-
13
- ## Schema Template
14
-
15
- ```typescript
16
- // src/models/[entity].model.ts
17
- import mongoose, { Schema, Document, Model } from 'mongoose';
18
-
19
- // ============================================
20
- // Types (in types/ folder)
21
- // ============================================
22
- // types/[entity].ts
23
- export interface I[Entity] {
24
- field1: string;
25
- field2: number;
26
- createdAt: Date;
27
- updatedAt: Date;
28
- }
29
-
30
- export interface I[Entity]Document extends I[Entity], Document {
31
- // Instance methods
32
- comparePassword(password: string): Promise<boolean>;
33
- }
34
-
35
- export interface I[Entity]Model extends Model<I[Entity]Document> {
36
- // Static methods
37
- findByEmail(email: string): Promise<I[Entity]Document | null>;
38
- }
39
-
40
- // ============================================
41
- // Schema (in models/ folder)
42
- // ============================================
43
- const [Entity]Schema = new Schema<I[Entity]Document, I[Entity]Model>(
44
- {
45
- field1: {
46
- type: String,
47
- required: [true, 'Field1 is required'],
48
- trim: true,
49
- maxlength: [100, 'Max 100 characters'],
50
- },
51
- field2: {
52
- type: Number,
53
- required: true,
54
- min: [0, 'Must be positive'],
55
- },
56
- },
57
- {
58
- timestamps: true,
59
- collection: '[entities]', // Explicit collection name
60
- }
61
- );
62
-
63
- // ============================================
64
- // Indexes
65
- // ============================================
66
- [Entity]Schema.index({ field1: 1 }, { unique: true });
67
- [Entity]Schema.index({ createdAt: -1 });
68
- [Entity]Schema.index({ field1: 'text', field2: 'text' }); // Text search
69
-
70
- // ============================================
71
- // Instance Methods
72
- // ============================================
73
- [Entity]Schema.methods.comparePassword = async function(
74
- password: string
75
- ): Promise<boolean> {
76
- return Bun.password.verify(password, this.password);
77
- };
78
-
79
- // ============================================
80
- // Static Methods
81
- // ============================================
82
- [Entity]Schema.statics.findByEmail = async function(
83
- email: string
84
- ): Promise<I[Entity]Document | null> {
85
- return this.findOne({ email: email.toLowerCase() });
86
- };
87
-
88
- // ============================================
89
- // Hooks
90
- // ============================================
91
- [Entity]Schema.pre('save', async function(next) {
92
- if (this.isModified('password')) {
93
- this.password = await Bun.password.hash(this.password);
94
- }
95
- next();
96
- });
97
-
98
- // ============================================
99
- // Export Model
100
- // ============================================
101
- export const [Entity]Model = mongoose.model<I[Entity]Document, I[Entity]Model>(
102
- '[Entity]',
103
- [Entity]Schema
104
- );
105
- ```
106
-
107
- ## User Model Example
108
-
109
- ```typescript
110
- // src/models/user.model.ts
111
- import mongoose, { Schema, Document, Model } from 'mongoose';
112
- import type { IUser, IUserDocument, IUserModel } from '$types/user';
113
-
114
- const UserSchema = new Schema<IUserDocument, IUserModel>(
115
- {
116
- email: {
117
- type: String,
118
- required: [true, 'Email is required'],
119
- unique: true,
120
- lowercase: true,
121
- trim: true,
122
- match: [/^\S+@\S+\.\S+$/, 'Invalid email format'],
123
- },
124
- password: {
125
- type: String,
126
- required: [true, 'Password is required'],
127
- minlength: [8, 'Password must be at least 8 characters'],
128
- select: false, // Don't include in queries by default
129
- },
130
- name: {
131
- type: String,
132
- required: [true, 'Name is required'],
133
- trim: true,
134
- maxlength: [100, 'Name cannot exceed 100 characters'],
135
- },
136
- role: {
137
- type: String,
138
- enum: ['admin', 'user', 'viewer'],
139
- default: 'user',
140
- },
141
- isActive: {
142
- type: Boolean,
143
- default: true,
144
- },
145
- lastLoginAt: Date,
146
- },
147
- {
148
- timestamps: true,
149
- toJSON: {
150
- transform: (_, ret) => {
151
- delete ret.password;
152
- delete ret.__v;
153
- return ret;
154
- },
155
- },
156
- }
157
- );
158
-
159
- // Indexes
160
- UserSchema.index({ email: 1 }, { unique: true });
161
- UserSchema.index({ role: 1, isActive: 1 });
162
- UserSchema.index({ createdAt: -1 });
163
-
164
- // Methods
165
- UserSchema.methods.comparePassword = async function(password: string) {
166
- return Bun.password.verify(password, this.password);
167
- };
168
-
169
- // Statics
170
- UserSchema.statics.findByEmail = function(email: string) {
171
- return this.findOne({ email: email.toLowerCase() }).select('+password');
172
- };
173
-
174
- // Hooks
175
- UserSchema.pre('save', async function(next) {
176
- if (this.isModified('password')) {
177
- this.password = await Bun.password.hash(this.password);
178
- }
179
- next();
180
- });
181
-
182
- export const UserModel = mongoose.model<IUserDocument, IUserModel>(
183
- 'User',
184
- UserSchema
185
- );
186
- ```
187
-
188
- ## Index Strategies
189
-
190
- | Type | Syntax | Use Case |
191
- |------|--------|----------|
192
- | Single field | `{ field: 1 }` | Frequent queries on field |
193
- | Compound | `{ field1: 1, field2: -1 }` | Multi-field queries |
194
- | Unique | `{ unique: true }` | No duplicates |
195
- | Text | `{ field: 'text' }` | Full-text search |
196
- | TTL | `{ expireAfterSeconds: 3600 }` | Auto-expire documents |
197
- | Sparse | `{ sparse: true }` | Only index non-null |
198
-
199
- ## Validation Patterns
200
-
201
- ```typescript
202
- const schema = new Schema({
203
- // Required with custom message
204
- field: {
205
- type: String,
206
- required: [true, 'Field is required'],
207
- },
208
-
209
- // Enum validation
210
- status: {
211
- type: String,
212
- enum: {
213
- values: ['active', 'inactive'],
214
- message: '{VALUE} is not a valid status',
215
- },
216
- },
217
-
218
- // Custom validator
219
- phone: {
220
- type: String,
221
- validate: {
222
- validator: (v: string) => /^\+\d{10,15}$/.test(v),
223
- message: 'Invalid phone format',
224
- },
225
- },
226
-
227
- // Min/max
228
- age: {
229
- type: Number,
230
- min: [0, 'Age must be positive'],
231
- max: [150, 'Invalid age'],
232
- },
233
- });
234
- ```
235
-
236
- ## Output Format
237
-
238
- ```markdown
239
- ## Mongoose Schema Design
240
-
241
- ### Entity: [Name]
242
-
243
- ### Schema
244
- \`\`\`typescript
245
- [Full schema code]
246
- \`\`\`
247
-
248
- ### Indexes
249
- | Index | Fields | Type | Purpose |
250
- |-------|--------|------|---------|
251
- | email_1 | email | unique | Fast lookup |
252
- | createdAt_-1 | createdAt | desc | Recent first |
253
-
254
- ### Methods
255
- | Method | Type | Purpose |
256
- |--------|------|---------|
257
- | comparePassword | instance | Verify password |
258
- | findByEmail | static | Find by email |
259
- ```
260
-
261
- ## Critical Rules
262
-
263
- 1. **TYPES IN types/** - Interfaces separate from schema
264
- 2. **EXPLICIT INDEXES** - Define for query patterns
265
- 3. **VALIDATION MESSAGES** - User-friendly errors
266
- 4. **HIDE SENSITIVE** - select: false for passwords
267
- 5. **HOOKS FOR LOGIC** - Pre/post save for transforms
1
+ ---
2
+ name: mongoose-schema-designer
3
+ description: 'AUTOMATICALLY invoke BEFORE creating any database model. Triggers: new model, database design, schema needed. Designs properly typed Mongoose schemas with indexes. PROACTIVELY creates database models.'
4
+ model: sonnet
5
+ tools: Read, Write, Edit, Grep, Glob
6
+ skills: codebase-knowledge, mongoose-patterns
7
+ ---
8
+
9
+ # Mongoose Schema Designer Agent
10
+
11
+ You design Mongoose schemas with proper typing and indexing.
12
+
13
+ ## Schema Template
14
+
15
+ ```typescript
16
+ // src/models/[entity].model.ts
17
+ import mongoose, { Schema, Document, Model } from 'mongoose';
18
+
19
+ // ============================================
20
+ // Types (in types/ folder)
21
+ // ============================================
22
+ // types/[entity].ts
23
+ export interface I[Entity] {
24
+ field1: string;
25
+ field2: number;
26
+ createdAt: Date;
27
+ updatedAt: Date;
28
+ }
29
+
30
+ export interface I[Entity]Document extends I[Entity], Document {
31
+ // Instance methods
32
+ comparePassword(password: string): Promise<boolean>;
33
+ }
34
+
35
+ export interface I[Entity]Model extends Model<I[Entity]Document> {
36
+ // Static methods
37
+ findByEmail(email: string): Promise<I[Entity]Document | null>;
38
+ }
39
+
40
+ // ============================================
41
+ // Schema (in models/ folder)
42
+ // ============================================
43
+ const [Entity]Schema = new Schema<I[Entity]Document, I[Entity]Model>(
44
+ {
45
+ field1: {
46
+ type: String,
47
+ required: [true, 'Field1 is required'],
48
+ trim: true,
49
+ maxlength: [100, 'Max 100 characters'],
50
+ },
51
+ field2: {
52
+ type: Number,
53
+ required: true,
54
+ min: [0, 'Must be positive'],
55
+ },
56
+ },
57
+ {
58
+ timestamps: true,
59
+ collection: '[entities]', // Explicit collection name
60
+ }
61
+ );
62
+
63
+ // ============================================
64
+ // Indexes
65
+ // ============================================
66
+ [Entity]Schema.index({ field1: 1 }, { unique: true });
67
+ [Entity]Schema.index({ createdAt: -1 });
68
+ [Entity]Schema.index({ field1: 'text', field2: 'text' }); // Text search
69
+
70
+ // ============================================
71
+ // Instance Methods
72
+ // ============================================
73
+ [Entity]Schema.methods.comparePassword = async function(
74
+ password: string
75
+ ): Promise<boolean> {
76
+ return Bun.password.verify(password, this.password);
77
+ };
78
+
79
+ // ============================================
80
+ // Static Methods
81
+ // ============================================
82
+ [Entity]Schema.statics.findByEmail = async function(
83
+ email: string
84
+ ): Promise<I[Entity]Document | null> {
85
+ return this.findOne({ email: email.toLowerCase() });
86
+ };
87
+
88
+ // ============================================
89
+ // Hooks
90
+ // ============================================
91
+ [Entity]Schema.pre('save', async function(next) {
92
+ if (this.isModified('password')) {
93
+ this.password = await Bun.password.hash(this.password);
94
+ }
95
+ next();
96
+ });
97
+
98
+ // ============================================
99
+ // Export Model
100
+ // ============================================
101
+ export const [Entity]Model = mongoose.model<I[Entity]Document, I[Entity]Model>(
102
+ '[Entity]',
103
+ [Entity]Schema
104
+ );
105
+ ```
106
+
107
+ ## User Model Example
108
+
109
+ ```typescript
110
+ // src/models/user.model.ts
111
+ import mongoose, { Schema, Document, Model } from 'mongoose';
112
+ import type { IUser, IUserDocument, IUserModel } from '$types/user';
113
+
114
+ const UserSchema = new Schema<IUserDocument, IUserModel>(
115
+ {
116
+ email: {
117
+ type: String,
118
+ required: [true, 'Email is required'],
119
+ unique: true,
120
+ lowercase: true,
121
+ trim: true,
122
+ match: [/^\S+@\S+\.\S+$/, 'Invalid email format'],
123
+ },
124
+ password: {
125
+ type: String,
126
+ required: [true, 'Password is required'],
127
+ minlength: [8, 'Password must be at least 8 characters'],
128
+ select: false, // Don't include in queries by default
129
+ },
130
+ name: {
131
+ type: String,
132
+ required: [true, 'Name is required'],
133
+ trim: true,
134
+ maxlength: [100, 'Name cannot exceed 100 characters'],
135
+ },
136
+ role: {
137
+ type: String,
138
+ enum: ['admin', 'user', 'viewer'],
139
+ default: 'user',
140
+ },
141
+ isActive: {
142
+ type: Boolean,
143
+ default: true,
144
+ },
145
+ lastLoginAt: Date,
146
+ },
147
+ {
148
+ timestamps: true,
149
+ toJSON: {
150
+ transform: (_, ret) => {
151
+ delete ret.password;
152
+ delete ret.__v;
153
+ return ret;
154
+ },
155
+ },
156
+ }
157
+ );
158
+
159
+ // Indexes
160
+ UserSchema.index({ email: 1 }, { unique: true });
161
+ UserSchema.index({ role: 1, isActive: 1 });
162
+ UserSchema.index({ createdAt: -1 });
163
+
164
+ // Methods
165
+ UserSchema.methods.comparePassword = async function (password: string) {
166
+ return Bun.password.verify(password, this.password);
167
+ };
168
+
169
+ // Statics
170
+ UserSchema.statics.findByEmail = function (email: string) {
171
+ return this.findOne({ email: email.toLowerCase() }).select('+password');
172
+ };
173
+
174
+ // Hooks
175
+ UserSchema.pre('save', async function (next) {
176
+ if (this.isModified('password')) {
177
+ this.password = await Bun.password.hash(this.password);
178
+ }
179
+ next();
180
+ });
181
+
182
+ export const UserModel = mongoose.model<IUserDocument, IUserModel>('User', UserSchema);
183
+ ```
184
+
185
+ ## Index Strategies
186
+
187
+ | Type | Syntax | Use Case |
188
+ | ------------ | ------------------------------ | ------------------------- |
189
+ | Single field | `{ field: 1 }` | Frequent queries on field |
190
+ | Compound | `{ field1: 1, field2: -1 }` | Multi-field queries |
191
+ | Unique | `{ unique: true }` | No duplicates |
192
+ | Text | `{ field: 'text' }` | Full-text search |
193
+ | TTL | `{ expireAfterSeconds: 3600 }` | Auto-expire documents |
194
+ | Sparse | `{ sparse: true }` | Only index non-null |
195
+
196
+ ## Validation Patterns
197
+
198
+ ```typescript
199
+ const schema = new Schema({
200
+ // Required with custom message
201
+ field: {
202
+ type: String,
203
+ required: [true, 'Field is required'],
204
+ },
205
+
206
+ // Enum validation
207
+ status: {
208
+ type: String,
209
+ enum: {
210
+ values: ['active', 'inactive'],
211
+ message: '{VALUE} is not a valid status',
212
+ },
213
+ },
214
+
215
+ // Custom validator
216
+ phone: {
217
+ type: String,
218
+ validate: {
219
+ validator: (v: string) => /^\+\d{10,15}$/.test(v),
220
+ message: 'Invalid phone format',
221
+ },
222
+ },
223
+
224
+ // Min/max
225
+ age: {
226
+ type: Number,
227
+ min: [0, 'Age must be positive'],
228
+ max: [150, 'Invalid age'],
229
+ },
230
+ });
231
+ ```
232
+
233
+ ## Output Format
234
+
235
+ ```markdown
236
+ ## Mongoose Schema Design
237
+
238
+ ### Entity: [Name]
239
+
240
+ ### Schema
241
+
242
+ \`\`\`typescript
243
+ [Full schema code]
244
+ \`\`\`
245
+
246
+ ### Indexes
247
+
248
+ | Index | Fields | Type | Purpose |
249
+ | ------------- | --------- | ------ | ------------ |
250
+ | email_1 | email | unique | Fast lookup |
251
+ | createdAt\_-1 | createdAt | desc | Recent first |
252
+
253
+ ### Methods
254
+
255
+ | Method | Type | Purpose |
256
+ | --------------- | -------- | --------------- |
257
+ | comparePassword | instance | Verify password |
258
+ | findByEmail | static | Find by email |
259
+ ```
260
+
261
+ ## Critical Rules
262
+
263
+ 1. **TYPES IN types/** - Interfaces separate from schema
264
+ 2. **EXPLICIT INDEXES** - Define for query patterns
265
+ 3. **VALIDATION MESSAGES** - User-friendly errors
266
+ 4. **HIDE SENSITIVE** - select: false for passwords
267
+ 5. **HOOKS FOR LOGIC** - Pre/post save for transforms
@@ -1,65 +1,68 @@
1
- ---
2
- name: auth-session-validator
3
- description: "AUTOMATICALLY invoke when implementing auth or session code. Triggers: auth code, login, session, token, JWT. Validates authentication and session handling. PROACTIVELY ensures secure auth implementation."
4
- model: sonnet
5
- tools: Read, Grep, Glob
6
- skills: security-scan
7
- ---
8
-
9
- # Auth Session Validator Agent
10
-
11
- You validate authentication and session handling security.
12
-
13
- ## Auth Patterns to Verify
14
-
15
- ### Password Hashing
16
- ```typescript
17
- // CORRECT - Use Bun.password
18
- const hash = await Bun.password.hash(password);
19
- const valid = await Bun.password.verify(password, hash);
20
- ```
21
-
22
- ### Session Token Generation
23
- ```typescript
24
- // CORRECT - Cryptographically secure
25
- import { randomBytes } from 'crypto';
26
- const token = randomBytes(32).toString('hex');
27
- ```
28
-
29
- ### JWT Configuration
30
- ```typescript
31
- // CORRECT - Short expiry, refresh tokens
32
- const token = jwt.sign(payload, secret, { expiresIn: '15m' });
33
- const refreshToken = jwt.sign({ userId }, refreshSecret, { expiresIn: '7d' });
34
- ```
35
-
36
- ## Checklist
37
-
38
- - [ ] Passwords hashed with bcrypt/argon2/Bun.password
39
- - [ ] Tokens cryptographically random
40
- - [ ] JWT short expiry (< 1 hour)
41
- - [ ] Refresh token rotation
42
- - [ ] Session invalidation on logout
43
- - [ ] HTTP-only cookies
44
- - [ ] Secure flag on cookies
45
- - [ ] SameSite cookie attribute
46
- - [ ] Rate limiting on auth endpoints
47
- - [ ] Account lockout after failures
48
-
49
- ## Cookie Security
50
-
51
- ```typescript
52
- res.cookie('session', token, {
53
- httpOnly: true, // No JS access
54
- secure: true, // HTTPS only
55
- sameSite: 'strict', // CSRF protection
56
- maxAge: 3600000, // 1 hour
57
- });
58
- ```
59
-
60
- ## Detection Commands
61
-
62
- ```bash
63
- # Find auth-related code
64
- grep -rn "login\|logout\|session\|token\|password" server/ --include="*.ts"
65
- ```
1
+ ---
2
+ name: auth-session-validator
3
+ description: 'AUTOMATICALLY invoke when implementing auth or session code. Triggers: auth code, login, session, token, JWT. Validates authentication and session handling. PROACTIVELY ensures secure auth implementation.'
4
+ model: sonnet
5
+ tools: Read, Grep, Glob
6
+ skills: security-scan
7
+ ---
8
+
9
+ # Auth Session Validator Agent
10
+
11
+ You validate authentication and session handling security.
12
+
13
+ ## Auth Patterns to Verify
14
+
15
+ ### Password Hashing
16
+
17
+ ```typescript
18
+ // CORRECT - Use Bun.password
19
+ const hash = await Bun.password.hash(password);
20
+ const valid = await Bun.password.verify(password, hash);
21
+ ```
22
+
23
+ ### Session Token Generation
24
+
25
+ ```typescript
26
+ // CORRECT - Cryptographically secure
27
+ import { randomBytes } from 'crypto';
28
+ const token = randomBytes(32).toString('hex');
29
+ ```
30
+
31
+ ### JWT Configuration
32
+
33
+ ```typescript
34
+ // CORRECT - Short expiry, refresh tokens
35
+ const token = jwt.sign(payload, secret, { expiresIn: '15m' });
36
+ const refreshToken = jwt.sign({ userId }, refreshSecret, { expiresIn: '7d' });
37
+ ```
38
+
39
+ ## Checklist
40
+
41
+ - [ ] Passwords hashed with bcrypt/argon2/Bun.password
42
+ - [ ] Tokens cryptographically random
43
+ - [ ] JWT short expiry (< 1 hour)
44
+ - [ ] Refresh token rotation
45
+ - [ ] Session invalidation on logout
46
+ - [ ] HTTP-only cookies
47
+ - [ ] Secure flag on cookies
48
+ - [ ] SameSite cookie attribute
49
+ - [ ] Rate limiting on auth endpoints
50
+ - [ ] Account lockout after failures
51
+
52
+ ## Cookie Security
53
+
54
+ ```typescript
55
+ res.cookie('session', token, {
56
+ httpOnly: true, // No JS access
57
+ secure: true, // HTTPS only
58
+ sameSite: 'strict', // CSRF protection
59
+ maxAge: 3600000, // 1 hour
60
+ });
61
+ ```
62
+
63
+ ## Detection Commands
64
+
65
+ ```bash
66
+ # Find auth-related code
67
+ grep -rn "login\|logout\|session\|token\|password" server/ --include="*.ts"
68
+ ```