cmp-standards 2.7.0 → 2.8.0

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 (162) hide show
  1. package/README.md +633 -633
  2. package/dist/cache/EmbeddingCache.d.ts +110 -0
  3. package/dist/cache/EmbeddingCache.d.ts.map +1 -0
  4. package/dist/cache/EmbeddingCache.js +239 -0
  5. package/dist/cache/EmbeddingCache.js.map +1 -0
  6. package/dist/cache/index.d.ts +6 -0
  7. package/dist/cache/index.d.ts.map +1 -0
  8. package/dist/cache/index.js +6 -0
  9. package/dist/cache/index.js.map +1 -0
  10. package/dist/cli/index.js +0 -0
  11. package/dist/db/cloud.d.ts +1 -0
  12. package/dist/db/cloud.d.ts.map +1 -1
  13. package/dist/db/drizzle-client.d.ts +10 -1
  14. package/dist/db/drizzle-client.d.ts.map +1 -1
  15. package/dist/db/drizzle-client.js +57 -3
  16. package/dist/db/drizzle-client.js.map +1 -1
  17. package/dist/db/errors.d.ts +13 -1
  18. package/dist/db/errors.d.ts.map +1 -1
  19. package/dist/db/errors.js +49 -5
  20. package/dist/db/errors.js.map +1 -1
  21. package/dist/db/migrations.d.ts +42 -0
  22. package/dist/db/migrations.d.ts.map +1 -0
  23. package/dist/db/migrations.js +173 -0
  24. package/dist/db/migrations.js.map +1 -0
  25. package/dist/db/turso-client.d.ts +15 -3
  26. package/dist/db/turso-client.d.ts.map +1 -1
  27. package/dist/db/turso-client.js +50 -39
  28. package/dist/db/turso-client.js.map +1 -1
  29. package/dist/eslint/rules/no-async-useeffect.js +6 -6
  30. package/dist/events/EventBus.d.ts +97 -0
  31. package/dist/events/EventBus.d.ts.map +1 -0
  32. package/dist/events/EventBus.js +256 -0
  33. package/dist/events/EventBus.js.map +1 -0
  34. package/dist/events/index.d.ts +7 -0
  35. package/dist/events/index.d.ts.map +1 -0
  36. package/dist/events/index.js +9 -0
  37. package/dist/events/index.js.map +1 -0
  38. package/dist/events/types.d.ts +989 -0
  39. package/dist/events/types.d.ts.map +1 -0
  40. package/dist/events/types.js +136 -0
  41. package/dist/events/types.js.map +1 -0
  42. package/dist/experts/ConsensusEngine.d.ts +57 -0
  43. package/dist/experts/ConsensusEngine.d.ts.map +1 -0
  44. package/dist/experts/ConsensusEngine.js +146 -0
  45. package/dist/experts/ConsensusEngine.js.map +1 -0
  46. package/dist/experts/ExpertPanelService.d.ts +84 -0
  47. package/dist/experts/ExpertPanelService.d.ts.map +1 -0
  48. package/dist/experts/ExpertPanelService.js +204 -0
  49. package/dist/experts/ExpertPanelService.js.map +1 -0
  50. package/dist/experts/ExpertRouter.d.ts +68 -0
  51. package/dist/experts/ExpertRouter.d.ts.map +1 -0
  52. package/dist/experts/ExpertRouter.js +374 -0
  53. package/dist/experts/ExpertRouter.js.map +1 -0
  54. package/dist/experts/VoteCollector.d.ts +58 -0
  55. package/dist/experts/VoteCollector.d.ts.map +1 -0
  56. package/dist/experts/VoteCollector.js +146 -0
  57. package/dist/experts/VoteCollector.js.map +1 -0
  58. package/dist/experts/index.d.ts +9 -0
  59. package/dist/experts/index.d.ts.map +1 -0
  60. package/dist/experts/index.js +13 -0
  61. package/dist/experts/index.js.map +1 -0
  62. package/dist/hooks/cloud-pre-tool-use.js +20 -20
  63. package/dist/hooks/expert-review.d.ts +74 -0
  64. package/dist/hooks/expert-review.d.ts.map +1 -0
  65. package/dist/hooks/expert-review.js +220 -0
  66. package/dist/hooks/expert-review.js.map +1 -0
  67. package/dist/hooks/index.d.ts +1 -0
  68. package/dist/hooks/index.d.ts.map +1 -1
  69. package/dist/hooks/index.js +2 -0
  70. package/dist/hooks/index.js.map +1 -1
  71. package/dist/index.d.ts +13 -0
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +22 -0
  74. package/dist/index.js.map +1 -1
  75. package/dist/interfaces/index.d.ts +450 -0
  76. package/dist/interfaces/index.d.ts.map +1 -0
  77. package/dist/interfaces/index.js +50 -0
  78. package/dist/interfaces/index.js.map +1 -0
  79. package/dist/mcp/schemas.d.ts +278 -0
  80. package/dist/mcp/schemas.d.ts.map +1 -0
  81. package/dist/mcp/schemas.js +166 -0
  82. package/dist/mcp/schemas.js.map +1 -0
  83. package/dist/mcp/server.d.ts.map +1 -1
  84. package/dist/mcp/server.js +14 -3
  85. package/dist/mcp/server.js.map +1 -1
  86. package/dist/patterns/feedback-loop.d.ts +264 -0
  87. package/dist/patterns/feedback-loop.d.ts.map +1 -0
  88. package/dist/patterns/feedback-loop.js +329 -0
  89. package/dist/patterns/feedback-loop.js.map +1 -0
  90. package/dist/patterns/index.d.ts +9 -0
  91. package/dist/patterns/index.d.ts.map +1 -0
  92. package/dist/patterns/index.js +9 -0
  93. package/dist/patterns/index.js.map +1 -0
  94. package/dist/patterns/lifecycle.d.ts +88 -0
  95. package/dist/patterns/lifecycle.d.ts.map +1 -0
  96. package/dist/patterns/lifecycle.js +284 -0
  97. package/dist/patterns/lifecycle.js.map +1 -0
  98. package/dist/patterns/registry.d.ts +142 -0
  99. package/dist/patterns/registry.d.ts.map +1 -0
  100. package/dist/patterns/registry.js +442 -0
  101. package/dist/patterns/registry.js.map +1 -0
  102. package/dist/performance/Debouncer.d.ts +91 -0
  103. package/dist/performance/Debouncer.d.ts.map +1 -0
  104. package/dist/performance/Debouncer.js +198 -0
  105. package/dist/performance/Debouncer.js.map +1 -0
  106. package/dist/performance/MemoryDecay.d.ts +82 -0
  107. package/dist/performance/MemoryDecay.d.ts.map +1 -0
  108. package/dist/performance/MemoryDecay.js +153 -0
  109. package/dist/performance/MemoryDecay.js.map +1 -0
  110. package/dist/performance/index.d.ts +7 -0
  111. package/dist/performance/index.d.ts.map +1 -0
  112. package/dist/performance/index.js +9 -0
  113. package/dist/performance/index.js.map +1 -0
  114. package/dist/schema/expert-types.d.ts +395 -0
  115. package/dist/schema/expert-types.d.ts.map +1 -0
  116. package/dist/schema/expert-types.js +250 -0
  117. package/dist/schema/expert-types.js.map +1 -0
  118. package/dist/services/ContextGenerator.js +7 -7
  119. package/dist/services/PlanManager.d.ts +1 -1
  120. package/dist/services/PlanManager.d.ts.map +1 -1
  121. package/dist/services/PlanManager.js +26 -6
  122. package/dist/services/PlanManager.js.map +1 -1
  123. package/dist/services/ProjectScaffold.js +76 -76
  124. package/dist/services/memory-router.js +35 -35
  125. package/dist/services/pattern-tracker.js +90 -90
  126. package/dist/services/semantic-search.js +2 -2
  127. package/package.json +105 -104
  128. package/standards/README.md +50 -50
  129. package/standards/experts/expert-routing.md +215 -215
  130. package/standards/general/code-quality.md +86 -86
  131. package/standards/general/memory-usage.md +205 -205
  132. package/standards/general/sync-workflow.md +235 -235
  133. package/standards/general/workflow.md +82 -82
  134. package/standards/hooks/mandatory-tracking.md +446 -446
  135. package/standards/infrastructure/cloud-database.md +287 -287
  136. package/standards/mcp/server-design.md +243 -243
  137. package/standards/mcp/tool-patterns.md +354 -354
  138. package/standards/skills/skill-structure.md +286 -286
  139. package/standards/skills/workflow-design.md +323 -323
  140. package/standards/tools/tool-design.md +297 -297
  141. package/templates/agents/architecture-expert.md +61 -61
  142. package/templates/agents/database-expert.md +62 -62
  143. package/templates/agents/documentation-expert.md +57 -57
  144. package/templates/agents/memory-expert.md +88 -88
  145. package/templates/agents/performance-expert.md +61 -61
  146. package/templates/agents/security-expert.md +59 -59
  147. package/templates/agents/ux-expert.md +63 -63
  148. package/templates/agents/worker.md +75 -75
  149. package/templates/ai-skills/SKILL_TEMPLATE.md +55 -55
  150. package/templates/claude-settings.json +72 -72
  151. package/templates/commands/experts.md +138 -138
  152. package/templates/hooks/README.md +158 -158
  153. package/templates/hooks/project.config.json.template +77 -77
  154. package/templates/hooks/settings.local.json.template +57 -57
  155. package/templates/memory-config.json +56 -56
  156. package/templates/memory-config.schema.json +212 -212
  157. package/templates/settings.json +58 -58
  158. package/templates/skills/continue.md +205 -205
  159. package/templates/workflows/business-improvement.md +264 -264
  160. package/templates/workflows/expert-review.md +153 -153
  161. package/templates/workflows/internal-app.md +245 -245
  162. package/templates/workflows/sync-docs.md +187 -187
@@ -0,0 +1,442 @@
1
+ /**
2
+ * @file Unified Pattern Registry
3
+ * @description Single source of truth for all pattern definitions
4
+ * @version 2.8.0
5
+ *
6
+ * Combines functionality from:
7
+ * - auto-improve/pattern-detector.ts
8
+ * - services/pattern-tracker.ts
9
+ */
10
+ import { z } from 'zod';
11
+ // =============================================================================
12
+ // Schema
13
+ // =============================================================================
14
+ export const PatternSeveritySchema = z.enum(['critical', 'high', 'medium', 'low']);
15
+ export const PatternStatusSchema = z.enum(['active', 'triggered', 'implemented', 'retired']);
16
+ export const UnifiedPatternSchema = z.object({
17
+ id: z.string(),
18
+ name: z.string(),
19
+ description: z.string(),
20
+ severity: PatternSeveritySchema,
21
+ // Detection
22
+ regex: z.string().optional(),
23
+ filePatterns: z.array(z.string()).optional(),
24
+ excludePatterns: z.array(z.string()).optional(),
25
+ // ESLint integration
26
+ eslintRuleName: z.string().optional(),
27
+ astVisitorTemplate: z.string().optional(),
28
+ // Lifecycle
29
+ status: PatternStatusSchema.default('active'),
30
+ triggeredAt: z.string().optional(),
31
+ implementedAt: z.string().optional(),
32
+ retiredAt: z.string().optional(),
33
+ retiredReason: z.string().optional(),
34
+ // Learning feedback
35
+ threshold: z.number().default(3),
36
+ falsePositives: z.number().default(0),
37
+ confirmedViolations: z.number().default(0),
38
+ adjustedThreshold: z.number().optional(),
39
+ // Metadata
40
+ createdAt: z.string().optional(),
41
+ updatedAt: z.string().optional(),
42
+ createdBy: z.string().optional(),
43
+ });
44
+ // =============================================================================
45
+ // Built-in Patterns
46
+ // =============================================================================
47
+ export const BUILTIN_PATTERNS = [
48
+ {
49
+ id: 'any-type',
50
+ name: 'Any Type Usage',
51
+ description: 'Using TypeScript any type instead of proper typing',
52
+ severity: 'high',
53
+ regex: ':\\s*any\\b|as\\s+any\\b',
54
+ filePatterns: ['*.ts', '*.tsx'],
55
+ excludePatterns: ['*.test.ts', '*.spec.ts'],
56
+ eslintRuleName: 'charter/no-any-type',
57
+ astVisitorTemplate: `return {
58
+ TSAnyKeyword(node) {
59
+ context.report({ node, messageId: 'violation' });
60
+ }
61
+ };`,
62
+ status: 'active',
63
+ threshold: 3,
64
+ falsePositives: 0,
65
+ confirmedViolations: 0,
66
+ },
67
+ {
68
+ id: 'console-log',
69
+ name: 'Console Log in Production',
70
+ description: 'Console.log statements left in production code',
71
+ severity: 'medium',
72
+ regex: 'console\\.log\\(',
73
+ filePatterns: ['*.ts', '*.tsx', '*.js', '*.jsx'],
74
+ excludePatterns: ['*.test.ts', '*.spec.ts', '*.test.js'],
75
+ eslintRuleName: 'no-console',
76
+ astVisitorTemplate: `return {
77
+ CallExpression(node) {
78
+ if (node.callee.type === 'MemberExpression' &&
79
+ node.callee.object.name === 'console' &&
80
+ node.callee.property.name === 'log') {
81
+ context.report({ node, messageId: 'violation' });
82
+ }
83
+ }
84
+ };`,
85
+ status: 'active',
86
+ threshold: 3,
87
+ falsePositives: 0,
88
+ confirmedViolations: 0,
89
+ },
90
+ {
91
+ id: 'eslint-disable',
92
+ name: 'ESLint Disable Comment',
93
+ description: 'ESLint disable comments hiding issues',
94
+ severity: 'high',
95
+ regex: 'eslint-disable',
96
+ filePatterns: ['*.ts', '*.tsx', '*.js', '*.jsx'],
97
+ eslintRuleName: 'charter/no-eslint-disable',
98
+ astVisitorTemplate: `const sourceCode = context.getSourceCode();
99
+ return {
100
+ Program() {
101
+ const comments = sourceCode.getAllComments();
102
+ for (const comment of comments) {
103
+ if (comment.value.includes('eslint-disable')) {
104
+ context.report({ loc: comment.loc, messageId: 'violation' });
105
+ }
106
+ }
107
+ }
108
+ };`,
109
+ status: 'active',
110
+ threshold: 3,
111
+ falsePositives: 0,
112
+ confirmedViolations: 0,
113
+ },
114
+ {
115
+ id: 'raw-sql',
116
+ name: 'Raw SQL Query',
117
+ description: 'Raw SQL query instead of query builder',
118
+ severity: 'critical',
119
+ regex: 'db\\.execute\\([\'"`]|\\$\\{.*\\}.*SELECT|\\$\\{.*\\}.*INSERT',
120
+ filePatterns: ['*.ts'],
121
+ excludePatterns: ['**/migrations/**', '**/db/**'],
122
+ eslintRuleName: 'charter/no-raw-sql',
123
+ astVisitorTemplate: `return {
124
+ CallExpression(node) {
125
+ if (node.callee.type === 'MemberExpression' &&
126
+ node.callee.property.name === 'execute' &&
127
+ node.arguments[0]?.type === 'TemplateLiteral') {
128
+ context.report({ node, messageId: 'violation' });
129
+ }
130
+ }
131
+ };`,
132
+ status: 'active',
133
+ threshold: 2,
134
+ falsePositives: 0,
135
+ confirmedViolations: 0,
136
+ },
137
+ {
138
+ id: 'missing-zod',
139
+ name: 'Missing Zod Validation',
140
+ description: 'TRPC endpoint without Zod input validation',
141
+ severity: 'high',
142
+ regex: 'publicProcedure\\.mutation\\(async\\s*\\(\\{\\s*input',
143
+ filePatterns: ['*.ts'],
144
+ excludePatterns: [],
145
+ eslintRuleName: 'charter/require-zod-validation',
146
+ astVisitorTemplate: `return {
147
+ CallExpression(node) {
148
+ // Check for publicProcedure.mutation without .input()
149
+ if (node.callee.type === 'MemberExpression' &&
150
+ node.callee.property.name === 'mutation') {
151
+ // Implementation details
152
+ context.report({ node, messageId: 'violation' });
153
+ }
154
+ }
155
+ };`,
156
+ status: 'active',
157
+ threshold: 3,
158
+ falsePositives: 0,
159
+ confirmedViolations: 0,
160
+ },
161
+ {
162
+ id: 'async-useeffect',
163
+ name: 'Async UseEffect',
164
+ description: 'Async function directly in useEffect',
165
+ severity: 'medium',
166
+ regex: 'useEffect\\(async',
167
+ filePatterns: ['*.tsx', '*.jsx'],
168
+ eslintRuleName: 'charter/no-async-useeffect',
169
+ astVisitorTemplate: `return {
170
+ CallExpression(node) {
171
+ if (node.callee.type === 'Identifier' &&
172
+ node.callee.name === 'useEffect' &&
173
+ node.arguments[0]?.async) {
174
+ context.report({ node, messageId: 'violation' });
175
+ }
176
+ }
177
+ };`,
178
+ status: 'active',
179
+ threshold: 3,
180
+ falsePositives: 0,
181
+ confirmedViolations: 0,
182
+ },
183
+ {
184
+ id: 'hardcoded-color',
185
+ name: 'Hardcoded Color',
186
+ description: 'Hardcoded color value instead of semantic token',
187
+ severity: 'low',
188
+ regex: '#[0-9a-fA-F]{3,8}',
189
+ filePatterns: ['*.tsx', '*.jsx', '*.css'],
190
+ excludePatterns: ['**/tailwind.config.*'],
191
+ eslintRuleName: 'charter/use-semantic-tokens',
192
+ astVisitorTemplate: `return {
193
+ Literal(node) {
194
+ if (typeof node.value === 'string' && /#[0-9a-fA-F]{3,8}/.test(node.value)) {
195
+ context.report({ node, messageId: 'violation' });
196
+ }
197
+ }
198
+ };`,
199
+ status: 'active',
200
+ threshold: 5,
201
+ falsePositives: 0,
202
+ confirmedViolations: 0,
203
+ },
204
+ {
205
+ id: 'finance-no-ledger',
206
+ name: 'Finance Without Ledger',
207
+ description: 'Finance table insert without LedgerService.createEntry()',
208
+ severity: 'critical',
209
+ regex: 'insert\\(finance\\)(?!.*LedgerService)',
210
+ filePatterns: ['*.ts'],
211
+ eslintRuleName: 'charter/finance-ledger-sync',
212
+ astVisitorTemplate: `let hasFinanceInsert = false;
213
+ let hasLedgerCall = false;
214
+ return {
215
+ CallExpression(node) {
216
+ const callee = node.callee;
217
+ if (callee.property?.name === 'insert') hasFinanceInsert = true;
218
+ if (callee.object?.name === 'LedgerService') hasLedgerCall = true;
219
+ },
220
+ 'Program:exit'(node) {
221
+ if (hasFinanceInsert && !hasLedgerCall) {
222
+ context.report({ node, messageId: 'violation' });
223
+ }
224
+ }
225
+ };`,
226
+ status: 'active',
227
+ threshold: 1,
228
+ falsePositives: 0,
229
+ confirmedViolations: 0,
230
+ },
231
+ {
232
+ id: 'sequential-api-calls',
233
+ name: 'Sequential API Calls',
234
+ description: 'Sequential API calls that could be parallelized',
235
+ severity: 'medium',
236
+ regex: 'await.*\\n\\s*await',
237
+ filePatterns: ['*.ts', '*.tsx'],
238
+ eslintRuleName: 'charter/no-sequential-api-calls',
239
+ status: 'active',
240
+ threshold: 3,
241
+ falsePositives: 0,
242
+ confirmedViolations: 0,
243
+ },
244
+ ];
245
+ // =============================================================================
246
+ // Registry Class
247
+ // =============================================================================
248
+ export class PatternRegistry {
249
+ patterns;
250
+ customPatterns = [];
251
+ constructor() {
252
+ this.patterns = new Map();
253
+ // Load builtin patterns
254
+ for (const pattern of BUILTIN_PATTERNS) {
255
+ this.patterns.set(pattern.id, { ...pattern });
256
+ }
257
+ }
258
+ /**
259
+ * Get pattern by ID
260
+ */
261
+ get(patternId) {
262
+ return this.patterns.get(patternId);
263
+ }
264
+ /**
265
+ * Get all patterns
266
+ */
267
+ getAll() {
268
+ return Array.from(this.patterns.values());
269
+ }
270
+ /**
271
+ * Get active patterns
272
+ */
273
+ getActive() {
274
+ return this.getAll().filter(p => p.status === 'active');
275
+ }
276
+ /**
277
+ * Get patterns by severity
278
+ */
279
+ getBySeverity(severity) {
280
+ return this.getAll().filter(p => p.severity === severity);
281
+ }
282
+ /**
283
+ * Register custom pattern
284
+ */
285
+ register(pattern) {
286
+ const validated = UnifiedPatternSchema.parse(pattern);
287
+ this.patterns.set(validated.id, validated);
288
+ this.customPatterns.push(validated);
289
+ }
290
+ /**
291
+ * Update pattern status
292
+ */
293
+ updateStatus(patternId, status, reason) {
294
+ const pattern = this.patterns.get(patternId);
295
+ if (!pattern)
296
+ return;
297
+ pattern.status = status;
298
+ pattern.updatedAt = new Date().toISOString();
299
+ if (status === 'triggered') {
300
+ pattern.triggeredAt = pattern.updatedAt;
301
+ }
302
+ else if (status === 'implemented') {
303
+ pattern.implementedAt = pattern.updatedAt;
304
+ }
305
+ else if (status === 'retired') {
306
+ pattern.retiredAt = pattern.updatedAt;
307
+ pattern.retiredReason = reason;
308
+ }
309
+ }
310
+ /**
311
+ * Record feedback (adjust learning)
312
+ */
313
+ recordFeedback(patternId, type) {
314
+ const pattern = this.patterns.get(patternId);
315
+ if (!pattern)
316
+ return;
317
+ if (type === 'confirmed') {
318
+ pattern.confirmedViolations++;
319
+ }
320
+ else {
321
+ pattern.falsePositives++;
322
+ // Adjust threshold if too many false positives
323
+ if (pattern.falsePositives >= 3 && !pattern.adjustedThreshold) {
324
+ pattern.adjustedThreshold = pattern.threshold + 2;
325
+ console.log(`[PatternRegistry] Adjusted threshold for ${patternId}: ${pattern.threshold} -> ${pattern.adjustedThreshold}`);
326
+ }
327
+ }
328
+ pattern.updatedAt = new Date().toISOString();
329
+ }
330
+ /**
331
+ * Get effective threshold for a pattern
332
+ */
333
+ getEffectiveThreshold(patternId) {
334
+ const pattern = this.patterns.get(patternId);
335
+ if (!pattern)
336
+ return 3;
337
+ return pattern.adjustedThreshold ?? pattern.threshold;
338
+ }
339
+ /**
340
+ * Detect pattern in content
341
+ */
342
+ detect(content, filePath) {
343
+ const results = [];
344
+ for (const pattern of this.getActive()) {
345
+ // Check file patterns
346
+ if (pattern.filePatterns) {
347
+ const matchesFile = pattern.filePatterns.some(fp => {
348
+ const regex = new RegExp(fp.replace('*', '.*'));
349
+ return regex.test(filePath);
350
+ });
351
+ if (!matchesFile)
352
+ continue;
353
+ }
354
+ // Check exclude patterns
355
+ if (pattern.excludePatterns) {
356
+ const excluded = pattern.excludePatterns.some(ep => {
357
+ const regex = new RegExp(ep.replace('*', '.*').replace('**/', '.*'));
358
+ return regex.test(filePath);
359
+ });
360
+ if (excluded)
361
+ continue;
362
+ }
363
+ // Detect with regex
364
+ if (pattern.regex) {
365
+ const regex = new RegExp(pattern.regex, 'gm');
366
+ const matches = [...content.matchAll(regex)];
367
+ if (matches.length > 0) {
368
+ results.push({ pattern, matches });
369
+ }
370
+ }
371
+ }
372
+ return results;
373
+ }
374
+ /**
375
+ * Generate ESLint rule code for a pattern
376
+ */
377
+ generateEslintRule(patternId) {
378
+ const pattern = this.patterns.get(patternId);
379
+ if (!pattern || !pattern.eslintRuleName || !pattern.astVisitorTemplate) {
380
+ return null;
381
+ }
382
+ return `/**
383
+ * @file ${pattern.eslintRuleName}
384
+ * @description ${pattern.description}
385
+ * Auto-generated by cmp-standards pattern detection
386
+ * @version 1.0.0
387
+ */
388
+
389
+ module.exports = {
390
+ meta: {
391
+ type: 'problem',
392
+ docs: {
393
+ description: '${pattern.description}',
394
+ category: 'Best Practices',
395
+ recommended: true
396
+ },
397
+ schema: [],
398
+ messages: {
399
+ violation: '${pattern.description}'
400
+ }
401
+ },
402
+ create(context) {
403
+ ${pattern.astVisitorTemplate}
404
+ }
405
+ }
406
+ `;
407
+ }
408
+ /**
409
+ * Export all patterns for persistence
410
+ */
411
+ export() {
412
+ return this.getAll();
413
+ }
414
+ /**
415
+ * Import patterns from persistence
416
+ */
417
+ import(patterns) {
418
+ for (const pattern of patterns) {
419
+ try {
420
+ const validated = UnifiedPatternSchema.parse(pattern);
421
+ this.patterns.set(validated.id, validated);
422
+ }
423
+ catch (error) {
424
+ console.warn(`[PatternRegistry] Invalid pattern skipped: ${pattern.id}`, error);
425
+ }
426
+ }
427
+ }
428
+ }
429
+ // =============================================================================
430
+ // Singleton
431
+ // =============================================================================
432
+ let registryInstance = null;
433
+ export function getPatternRegistry() {
434
+ if (!registryInstance) {
435
+ registryInstance = new PatternRegistry();
436
+ }
437
+ return registryInstance;
438
+ }
439
+ export function resetPatternRegistry() {
440
+ registryInstance = null;
441
+ }
442
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/patterns/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * @file Debouncer - Hook debouncing for performance optimization
3
+ * @description Prevents redundant operations by tracking recent calls
4
+ *
5
+ * Features:
6
+ * - Time-based debouncing (skip if same operation within window)
7
+ * - Hash-based key generation
8
+ * - Auto-cleanup of expired entries
9
+ * - Statistics tracking
10
+ */
11
+ export interface DebouncerConfig {
12
+ /** Debounce window in milliseconds */
13
+ windowMs: number;
14
+ /** Max entries to track (memory limit) */
15
+ maxEntries: number;
16
+ /** Enable debug logging */
17
+ debug: boolean;
18
+ }
19
+ export interface DebouncerStats {
20
+ totalCalls: number;
21
+ skipped: number;
22
+ executed: number;
23
+ skipRate: number;
24
+ activeEntries: number;
25
+ }
26
+ export declare class Debouncer {
27
+ private config;
28
+ private entries;
29
+ private stats;
30
+ constructor(config?: Partial<DebouncerConfig>);
31
+ /**
32
+ * Check if operation should be skipped
33
+ * Returns true if same operation was called within debounce window
34
+ */
35
+ shouldSkip(key: string): boolean;
36
+ /**
37
+ * Generate hash key from tool name and params
38
+ */
39
+ createKey(toolName: string, params: Record<string, unknown>): string;
40
+ /**
41
+ * Check if tool call should skip embedding lookup
42
+ */
43
+ shouldSkipEmbedding(toolName: string, params: Record<string, unknown>): boolean;
44
+ /**
45
+ * Check if expert review should be skipped
46
+ */
47
+ shouldSkipReview(files: string[]): boolean;
48
+ /**
49
+ * Mark operation as complete (update timestamp)
50
+ */
51
+ markComplete(key: string): void;
52
+ /**
53
+ * Remove expired entries
54
+ */
55
+ cleanup(): number;
56
+ /**
57
+ * Get statistics
58
+ */
59
+ getStats(): DebouncerStats;
60
+ /**
61
+ * Reset all state
62
+ */
63
+ reset(): void;
64
+ /**
65
+ * Get config
66
+ */
67
+ getConfig(): DebouncerConfig;
68
+ /**
69
+ * Update config
70
+ */
71
+ setConfig(config: Partial<DebouncerConfig>): void;
72
+ }
73
+ /**
74
+ * Debouncer for embedding lookups
75
+ */
76
+ export declare class EmbeddingDebouncer extends Debouncer {
77
+ constructor(config?: Partial<DebouncerConfig>);
78
+ shouldSkipLookup(text: string): boolean;
79
+ }
80
+ /**
81
+ * Debouncer for hook operations
82
+ */
83
+ export declare class HookDebouncer extends Debouncer {
84
+ constructor(config?: Partial<DebouncerConfig>);
85
+ shouldSkipHook(hookName: string, context: Record<string, unknown>): boolean;
86
+ }
87
+ export declare function getDebouncer(config?: Partial<DebouncerConfig>): Debouncer;
88
+ export declare function getEmbeddingDebouncer(config?: Partial<DebouncerConfig>): EmbeddingDebouncer;
89
+ export declare function getHookDebouncer(config?: Partial<DebouncerConfig>): HookDebouncer;
90
+ export declare function resetDebouncers(): void;
91
+ //# sourceMappingURL=Debouncer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Debouncer.d.ts","sourceRoot":"","sources":["../../src/performance/Debouncer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,2BAA2B;IAC3B,KAAK,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;CACtB;AAiBD,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,KAAK,CAGZ;gBAEW,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAIjD;;;OAGG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IA4BhC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAMpE;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAK/E;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;IAM1C;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,OAAO,IAAI,MAAM;IAkBjB;;OAEG;IACH,QAAQ,IAAI,cAAc;IAY1B;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,SAAS,IAAI,eAAe;IAI5B;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;CAGlD;AAMD;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;gBACnC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAQjD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAIxC;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAQjD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;CAI5E;AAUD,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,CAKzE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,kBAAkB,CAK3F;AAED,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,aAAa,CAKjF;AAED,wBAAgB,eAAe,IAAI,IAAI,CAItC"}