cmp-standards 2.4.0 → 2.7.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 (97) hide show
  1. package/README.md +633 -611
  2. package/dist/cli/index.js +0 -0
  3. package/dist/db/drizzle-client.d.ts +3 -3
  4. package/dist/db/drizzle-client.d.ts.map +1 -1
  5. package/dist/db/drizzle-client.js +57 -58
  6. package/dist/db/drizzle-client.js.map +1 -1
  7. package/dist/db/turso-client.js +11 -11
  8. package/dist/eslint/rules/no-async-useeffect.js +6 -6
  9. package/dist/hooks/cloud-pre-tool-use.js +20 -20
  10. package/dist/hooks/cloud-session-start.d.ts +15 -3
  11. package/dist/hooks/cloud-session-start.d.ts.map +1 -1
  12. package/dist/hooks/cloud-session-start.js +135 -8
  13. package/dist/hooks/cloud-session-start.js.map +1 -1
  14. package/dist/hooks/session-start.d.ts +2 -1
  15. package/dist/hooks/session-start.d.ts.map +1 -1
  16. package/dist/hooks/session-start.js +99 -74
  17. package/dist/hooks/session-start.js.map +1 -1
  18. package/dist/index.d.ts +4 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +4 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/mcp/server.js +2 -2
  23. package/dist/mcp/server.js.map +1 -1
  24. package/dist/schema/plans.d.ts +194 -0
  25. package/dist/schema/plans.d.ts.map +1 -0
  26. package/dist/schema/plans.js +180 -0
  27. package/dist/schema/plans.js.map +1 -0
  28. package/dist/schema/tracking.d.ts +90 -90
  29. package/dist/services/ContextGenerator.d.ts +16 -0
  30. package/dist/services/ContextGenerator.d.ts.map +1 -0
  31. package/dist/services/ContextGenerator.js +62 -0
  32. package/dist/services/ContextGenerator.js.map +1 -0
  33. package/dist/services/PlanManager.d.ts +99 -0
  34. package/dist/services/PlanManager.d.ts.map +1 -0
  35. package/dist/services/PlanManager.js +372 -0
  36. package/dist/services/PlanManager.js.map +1 -0
  37. package/dist/services/ProjectScaffold.js +76 -76
  38. package/dist/services/context-injector.d.ts +111 -0
  39. package/dist/services/context-injector.d.ts.map +1 -0
  40. package/dist/services/context-injector.js +397 -0
  41. package/dist/services/context-injector.js.map +1 -0
  42. package/dist/services/index.d.ts +15 -15
  43. package/dist/services/index.d.ts.map +1 -1
  44. package/dist/services/index.js +18 -20
  45. package/dist/services/index.js.map +1 -1
  46. package/dist/services/memory-router.d.ts +122 -0
  47. package/dist/services/memory-router.d.ts.map +1 -0
  48. package/dist/services/memory-router.js +517 -0
  49. package/dist/services/memory-router.js.map +1 -0
  50. package/dist/services/pattern-tracker.d.ts +97 -0
  51. package/dist/services/pattern-tracker.d.ts.map +1 -0
  52. package/dist/services/pattern-tracker.js +425 -0
  53. package/dist/services/pattern-tracker.js.map +1 -0
  54. package/dist/services/semantic-search.d.ts +33 -35
  55. package/dist/services/semantic-search.d.ts.map +1 -1
  56. package/dist/services/semantic-search.js +207 -165
  57. package/dist/services/semantic-search.js.map +1 -1
  58. package/dist/types/index.d.ts +329 -4
  59. package/dist/types/index.d.ts.map +1 -1
  60. package/dist/types/index.js +186 -9
  61. package/dist/types/index.js.map +1 -1
  62. package/package.json +104 -100
  63. package/standards/README.md +50 -50
  64. package/standards/experts/expert-routing.md +215 -215
  65. package/standards/general/code-quality.md +86 -86
  66. package/standards/general/memory-usage.md +205 -205
  67. package/standards/general/sync-workflow.md +235 -235
  68. package/standards/general/workflow.md +82 -82
  69. package/standards/hooks/mandatory-tracking.md +446 -446
  70. package/standards/infrastructure/cloud-database.md +287 -287
  71. package/standards/mcp/server-design.md +243 -243
  72. package/standards/mcp/tool-patterns.md +354 -354
  73. package/standards/skills/skill-structure.md +286 -286
  74. package/standards/skills/workflow-design.md +323 -323
  75. package/standards/tools/tool-design.md +297 -297
  76. package/templates/agents/architecture-expert.md +61 -61
  77. package/templates/agents/database-expert.md +62 -62
  78. package/templates/agents/documentation-expert.md +57 -57
  79. package/templates/agents/memory-expert.md +88 -88
  80. package/templates/agents/performance-expert.md +61 -61
  81. package/templates/agents/security-expert.md +59 -59
  82. package/templates/agents/ux-expert.md +63 -63
  83. package/templates/agents/worker.md +75 -75
  84. package/templates/ai-skills/SKILL_TEMPLATE.md +55 -55
  85. package/templates/claude-settings.json +72 -72
  86. package/templates/commands/experts.md +138 -138
  87. package/templates/hooks/README.md +158 -158
  88. package/templates/hooks/project.config.json.template +77 -77
  89. package/templates/hooks/settings.local.json.template +57 -57
  90. package/templates/memory-config.json +56 -56
  91. package/templates/memory-config.schema.json +212 -212
  92. package/templates/settings.json +58 -58
  93. package/templates/skills/continue.md +205 -205
  94. package/templates/workflows/business-improvement.md +264 -264
  95. package/templates/workflows/expert-review.md +153 -153
  96. package/templates/workflows/internal-app.md +245 -245
  97. package/templates/workflows/sync-docs.md +187 -187
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-router.d.ts","sourceRoot":"","sources":["../../src/services/memory-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,517 @@
1
+ /**
2
+ * @file Memory Router Service
3
+ * @description Unified memory layer that routes queries across all backends
4
+ *
5
+ * Backends:
6
+ * - DEV_Items (Turso/SQLite) - Persistent structured storage
7
+ * - Upstash Vector - Semantic search with embeddings
8
+ * - Upstash Redis - Session cache and quick lookups
9
+ */
10
+ import { cloud } from '../db/cloud.js';
11
+ import { upstash } from '../db/upstash-client.js';
12
+ import { turso } from '../db/turso-client.js';
13
+ import { homedir } from 'os';
14
+ import { join } from 'path';
15
+ import { existsSync } from 'fs';
16
+ // =============================================================================
17
+ // Memory Router Implementation
18
+ // =============================================================================
19
+ class MemoryRouterService {
20
+ initialized = false;
21
+ /**
22
+ * Initialize all backends
23
+ */
24
+ async init() {
25
+ if (this.initialized)
26
+ return;
27
+ await cloud.ensure();
28
+ this.initialized = true;
29
+ }
30
+ /**
31
+ * Unified search across all memory backends
32
+ */
33
+ async search(options) {
34
+ await this.init();
35
+ const start = Date.now();
36
+ const { query, system, domain, limit = 10, minScore = 0.5 } = options;
37
+ const results = [];
38
+ const sources = { turso: 0, vector: 0, redis: 0 };
39
+ // 1. Search Turso (keyword-based)
40
+ try {
41
+ const tursoResults = await this.searchTurso(query, system, domain, limit);
42
+ results.push(...tursoResults);
43
+ sources.turso = tursoResults.length;
44
+ }
45
+ catch (error) {
46
+ console.error('[MemoryRouter] Turso search failed:', error);
47
+ }
48
+ // 2. Search Vector (semantic)
49
+ try {
50
+ const vectorResults = await this.searchVector(query, system, limit, minScore);
51
+ // Deduplicate by title
52
+ const existingTitles = new Set(results.map(r => r.title.toLowerCase()));
53
+ const newVectorResults = vectorResults.filter(r => !existingTitles.has(r.title.toLowerCase()));
54
+ results.push(...newVectorResults);
55
+ sources.vector = newVectorResults.length;
56
+ }
57
+ catch (error) {
58
+ console.error('[MemoryRouter] Vector search failed:', error);
59
+ }
60
+ // 3. Check Redis cache for recent memories
61
+ try {
62
+ const redisResults = await this.searchRedis(query, system, limit);
63
+ const existingIds = new Set(results.map(r => r.id));
64
+ const newRedisResults = redisResults.filter(r => !existingIds.has(r.id));
65
+ results.push(...newRedisResults);
66
+ sources.redis = newRedisResults.length;
67
+ }
68
+ catch (error) {
69
+ console.error('[MemoryRouter] Redis search failed:', error);
70
+ }
71
+ // Sort by score (if available) or recency
72
+ results.sort((a, b) => {
73
+ if (a.score !== undefined && b.score !== undefined) {
74
+ return b.score - a.score;
75
+ }
76
+ return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();
77
+ });
78
+ return {
79
+ memories: results.slice(0, limit),
80
+ sources,
81
+ took: Date.now() - start
82
+ };
83
+ }
84
+ /**
85
+ * Write memory to all backends atomically
86
+ */
87
+ async write(options) {
88
+ await this.init();
89
+ const { system, title, body, domain, tags = [], source = 'system', priority = 'medium', sessionId, relatedFiles = [] } = options;
90
+ const id = `mem_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
91
+ const createdAt = new Date().toISOString();
92
+ const content = {
93
+ title,
94
+ body,
95
+ domain,
96
+ source,
97
+ sessionId,
98
+ relatedFiles
99
+ };
100
+ // Write to all backends in parallel
101
+ await Promise.all([
102
+ // 1. Turso (primary)
103
+ this.writeToTurso(id, system, content, tags, priority),
104
+ // 2. Vector (for semantic search)
105
+ this.writeToVector(id, title, body, system, domain),
106
+ // 3. Redis (for quick access cache)
107
+ this.writeToRedis(id, system, { ...content, createdAt }, tags)
108
+ ]);
109
+ return id;
110
+ }
111
+ /**
112
+ * Get memories by domain for context loading
113
+ */
114
+ async getByDomain(system, domain, limit = 5) {
115
+ await this.init();
116
+ try {
117
+ const db = turso.getClient();
118
+ const result = await db.execute({
119
+ sql: `SELECT * FROM items
120
+ WHERE system = ? AND type = 'memory'
121
+ AND json_extract(content, '$.domain') = ?
122
+ AND status != 'archived'
123
+ ORDER BY updated_at DESC
124
+ LIMIT ?`,
125
+ args: [system, domain, limit]
126
+ });
127
+ return result.rows.map(row => this.rowToUnifiedMemory(row));
128
+ }
129
+ catch (error) {
130
+ console.error('[MemoryRouter] getByDomain failed:', error);
131
+ return [];
132
+ }
133
+ }
134
+ /**
135
+ * Get unresolved issues/gotchas for a domain
136
+ */
137
+ async getUnresolved(system, domain) {
138
+ await this.init();
139
+ try {
140
+ const db = turso.getClient();
141
+ let sql = `
142
+ SELECT * FROM items
143
+ WHERE system = ? AND type = 'memory'
144
+ AND status = 'active'
145
+ AND (
146
+ json_extract(content, '$.title') LIKE '%gotcha%'
147
+ OR json_extract(content, '$.title') LIKE '%bug%'
148
+ OR json_extract(content, '$.title') LIKE '%issue%'
149
+ OR json_extract(content, '$.title') LIKE '%warning%'
150
+ )
151
+ `;
152
+ const args = [system];
153
+ if (domain) {
154
+ sql += ` AND json_extract(content, '$.domain') = ?`;
155
+ args.push(domain);
156
+ }
157
+ sql += ` ORDER BY updated_at DESC LIMIT 10`;
158
+ const result = await db.execute({ sql, args });
159
+ return result.rows.map(row => this.rowToUnifiedMemory(row));
160
+ }
161
+ catch (error) {
162
+ console.error('[MemoryRouter] getUnresolved failed:', error);
163
+ return [];
164
+ }
165
+ }
166
+ /**
167
+ * Get recent memories across all domains
168
+ */
169
+ async getRecent(system, limit = 10) {
170
+ await this.init();
171
+ try {
172
+ const db = turso.getClient();
173
+ const result = await db.execute({
174
+ sql: `SELECT * FROM items
175
+ WHERE system = ? AND type = 'memory'
176
+ AND status != 'archived'
177
+ ORDER BY updated_at DESC
178
+ LIMIT ?`,
179
+ args: [system, limit]
180
+ });
181
+ return result.rows.map(row => this.rowToUnifiedMemory(row));
182
+ }
183
+ catch (error) {
184
+ console.error('[MemoryRouter] getRecent failed:', error);
185
+ return [];
186
+ }
187
+ }
188
+ /**
189
+ * Get patterns that have reached threshold
190
+ */
191
+ async getTriggeredPatterns(system) {
192
+ await this.init();
193
+ try {
194
+ const db = turso.getClient();
195
+ const result = await db.execute({
196
+ sql: `SELECT * FROM items
197
+ WHERE system = ? AND type = 'pattern'
198
+ AND status = 'triggered'
199
+ ORDER BY updated_at DESC`,
200
+ args: [system]
201
+ });
202
+ return result.rows
203
+ .map(row => {
204
+ try {
205
+ const content = typeof row.content === 'string'
206
+ ? JSON.parse(row.content)
207
+ : row.content;
208
+ return content;
209
+ }
210
+ catch {
211
+ return null;
212
+ }
213
+ })
214
+ .filter((p) => p !== null);
215
+ }
216
+ catch (error) {
217
+ console.error('[MemoryRouter] getTriggeredPatterns failed:', error);
218
+ return [];
219
+ }
220
+ }
221
+ /**
222
+ * Sync claude-mem observations to DEV_Items
223
+ * Call this periodically or on session start
224
+ *
225
+ * @param system - Target DevSystem for the memories
226
+ * @param options - Sync options
227
+ * @returns Number of observations synced
228
+ */
229
+ async syncFromClaudeMem(system, options) {
230
+ const result = { synced: 0, skipped: 0, errors: 0 };
231
+ // Find claude-mem database
232
+ const claudeMemDbPath = join(homedir(), '.claude-mem', 'claude-mem.db');
233
+ if (!existsSync(claudeMemDbPath)) {
234
+ console.warn('[MemoryRouter] claude-mem database not found at:', claudeMemDbPath);
235
+ return result;
236
+ }
237
+ try {
238
+ // Dynamic import of better-sqlite3 (may not be available)
239
+ const Database = await import('better-sqlite3').then(m => m.default).catch(() => null);
240
+ if (!Database) {
241
+ console.warn('[MemoryRouter] better-sqlite3 not available, cannot sync claude-mem');
242
+ return result;
243
+ }
244
+ const db = new Database(claudeMemDbPath, { readonly: true });
245
+ // Build query
246
+ const sinceEpoch = options?.sinceEpoch || (Date.now() - 7 * 24 * 60 * 60 * 1000); // Default: last 7 days
247
+ const limit = options?.limit || 100;
248
+ let sql = `
249
+ SELECT id, sdk_session_id, project, type, title, subtitle,
250
+ narrative, facts, concepts, files_read, files_modified,
251
+ created_at, created_at_epoch
252
+ FROM observations
253
+ WHERE created_at_epoch > ?
254
+ `;
255
+ const args = [sinceEpoch];
256
+ if (options?.project) {
257
+ sql += ` AND project = ?`;
258
+ args.push(options.project);
259
+ }
260
+ sql += ` ORDER BY created_at_epoch DESC LIMIT ?`;
261
+ args.push(limit);
262
+ const observations = db.prepare(sql).all(...args);
263
+ db.close();
264
+ // Get existing synced IDs to avoid duplicates
265
+ const existingIds = await this.getExistingClaudeMemIds(system);
266
+ // Sync each observation
267
+ for (const obs of observations) {
268
+ const syncId = `claudemem_${obs.id}`;
269
+ if (existingIds.has(syncId)) {
270
+ result.skipped++;
271
+ continue;
272
+ }
273
+ try {
274
+ // Map claude-mem type to our priority
275
+ const priority = this.mapObsTypeToPriority(obs.type);
276
+ // Build body from narrative + facts
277
+ const bodyParts = [];
278
+ if (obs.narrative)
279
+ bodyParts.push(obs.narrative);
280
+ if (obs.facts)
281
+ bodyParts.push(`\n\n**Facts:**\n${obs.facts}`);
282
+ if (obs.concepts)
283
+ bodyParts.push(`\n\n**Concepts:** ${obs.concepts}`);
284
+ const body = bodyParts.join('') || obs.subtitle || 'No details';
285
+ // Extract domain from files
286
+ const domain = this.detectDomainFromFiles(obs.files_modified || obs.files_read);
287
+ // Build related files array
288
+ const relatedFiles = [];
289
+ if (obs.files_modified) {
290
+ try {
291
+ const files = JSON.parse(obs.files_modified);
292
+ if (Array.isArray(files))
293
+ relatedFiles.push(...files);
294
+ }
295
+ catch {
296
+ relatedFiles.push(...obs.files_modified.split(',').map(f => f.trim()));
297
+ }
298
+ }
299
+ await this.write({
300
+ system,
301
+ title: obs.title || `[${obs.type}] ${obs.subtitle || 'Observation'}`,
302
+ body,
303
+ domain,
304
+ tags: ['claude-mem', obs.type, `session:${obs.sdk_session_id}`],
305
+ source: 'claude',
306
+ priority,
307
+ sessionId: obs.sdk_session_id,
308
+ relatedFiles
309
+ });
310
+ result.synced++;
311
+ }
312
+ catch (error) {
313
+ console.error(`[MemoryRouter] Failed to sync observation ${obs.id}:`, error);
314
+ result.errors++;
315
+ }
316
+ }
317
+ console.log(`[MemoryRouter] Claude-mem sync complete: ${result.synced} synced, ${result.skipped} skipped, ${result.errors} errors`);
318
+ return result;
319
+ }
320
+ catch (error) {
321
+ console.error('[MemoryRouter] Claude-mem sync failed:', error);
322
+ return result;
323
+ }
324
+ }
325
+ /**
326
+ * Get existing claude-mem synced IDs to avoid duplicates
327
+ */
328
+ async getExistingClaudeMemIds(system) {
329
+ try {
330
+ const db = turso.getClient();
331
+ const result = await db.execute({
332
+ sql: `SELECT id FROM items
333
+ WHERE system = ? AND type = 'memory'
334
+ AND id LIKE 'claudemem_%'`,
335
+ args: [system]
336
+ });
337
+ return new Set(result.rows.map(r => r.id));
338
+ }
339
+ catch {
340
+ return new Set();
341
+ }
342
+ }
343
+ /**
344
+ * Map observation type to priority
345
+ */
346
+ mapObsTypeToPriority(type) {
347
+ switch (type) {
348
+ case 'decision': return 'high';
349
+ case 'bugfix': return 'high';
350
+ case 'feature': return 'medium';
351
+ case 'refactor': return 'low';
352
+ case 'discovery': return 'medium';
353
+ case 'change': return 'low';
354
+ default: return 'medium';
355
+ }
356
+ }
357
+ /**
358
+ * Detect domain from file paths
359
+ */
360
+ detectDomainFromFiles(filesJson) {
361
+ if (!filesJson)
362
+ return undefined;
363
+ const domains = ['finances', 'reserves', 'crew', 'boats', 'marketing', 'dev', 'company'];
364
+ const filesLower = filesJson.toLowerCase();
365
+ for (const domain of domains) {
366
+ if (filesLower.includes(domain) || filesLower.includes(`/${domain}/`)) {
367
+ return domain;
368
+ }
369
+ }
370
+ return undefined;
371
+ }
372
+ // =============================================================================
373
+ // Private Backend Methods
374
+ // =============================================================================
375
+ async searchTurso(query, system, domain, limit) {
376
+ const searchTerms = query.toLowerCase().split(' ').filter(t => t.length > 2);
377
+ if (searchTerms.length === 0) {
378
+ return this.getRecent(system, limit);
379
+ }
380
+ // Build LIKE conditions for each term
381
+ const likeConditions = searchTerms.map(() => `(LOWER(json_extract(content, '$.title')) LIKE ? OR LOWER(json_extract(content, '$.body')) LIKE ?)`).join(' AND ');
382
+ const args = [system];
383
+ for (const term of searchTerms) {
384
+ args.push(`%${term}%`, `%${term}%`);
385
+ }
386
+ let sql = `
387
+ SELECT * FROM items
388
+ WHERE system = ? AND type = 'memory'
389
+ AND status != 'archived'
390
+ AND (${likeConditions})
391
+ `;
392
+ if (domain) {
393
+ sql += ` AND json_extract(content, '$.domain') = ?`;
394
+ args.push(domain);
395
+ }
396
+ sql += ` ORDER BY updated_at DESC LIMIT ?`;
397
+ args.push(limit);
398
+ try {
399
+ const db = turso.getClient();
400
+ const result = await db.execute({ sql, args });
401
+ return result.rows.map(row => this.rowToUnifiedMemory(row));
402
+ }
403
+ catch (error) {
404
+ console.error('[MemoryRouter] searchTurso failed:', error);
405
+ return [];
406
+ }
407
+ }
408
+ async searchVector(query, system, limit, minScore) {
409
+ try {
410
+ const results = await upstash.searchVectors(query, {
411
+ topK: limit,
412
+ filter: `system = "${system}"`,
413
+ includeMetadata: true
414
+ });
415
+ return results
416
+ .filter(r => r.score >= minScore)
417
+ .map(r => ({
418
+ id: r.id,
419
+ title: r.metadata?.title || 'Untitled',
420
+ body: r.metadata?.body || '',
421
+ domain: r.metadata?.domain,
422
+ source: 'vector',
423
+ score: r.score,
424
+ createdAt: r.metadata?.createdAt || new Date().toISOString(),
425
+ tags: r.metadata?.tags
426
+ }));
427
+ }
428
+ catch {
429
+ return [];
430
+ }
431
+ }
432
+ async searchRedis(_query, system, limit) {
433
+ try {
434
+ // Get recent memories from Redis cache
435
+ const cacheKey = `recent_memories:${system}`;
436
+ const cached = await upstash.getCache(cacheKey);
437
+ if (cached) {
438
+ return cached.slice(0, limit);
439
+ }
440
+ return [];
441
+ }
442
+ catch {
443
+ return [];
444
+ }
445
+ }
446
+ async writeToTurso(id, system, content, _tags, _priority) {
447
+ // Use the turso.create method which handles the insert properly
448
+ await turso.create('memory', system, content, 'active');
449
+ }
450
+ async writeToVector(id, title, body, system, domain) {
451
+ try {
452
+ await upstash.upsertVector(id, `${title}\n\n${body}`, {
453
+ title,
454
+ body: body.slice(0, 500), // Limit body size in metadata
455
+ system,
456
+ domain,
457
+ createdAt: new Date().toISOString()
458
+ });
459
+ }
460
+ catch (error) {
461
+ console.error('[MemoryRouter] Vector write failed:', error);
462
+ }
463
+ }
464
+ async writeToRedis(id, system, content, tags) {
465
+ try {
466
+ // Cache individual memory
467
+ await upstash.setCache(`memory:${id}`, { ...content, tags }, 3600 * 24); // 24h TTL
468
+ // Update recent memories list
469
+ const recentKey = `recent_memories:${system}`;
470
+ const existing = await upstash.getCache(recentKey) || [];
471
+ const newMemory = {
472
+ id,
473
+ title: content.title,
474
+ body: content.body,
475
+ domain: content.domain,
476
+ source: 'redis',
477
+ createdAt: content.createdAt,
478
+ tags
479
+ };
480
+ const updated = [newMemory, ...existing].slice(0, 20); // Keep last 20
481
+ await upstash.setCache(recentKey, updated, 3600); // 1h TTL
482
+ }
483
+ catch (error) {
484
+ console.error('[MemoryRouter] Redis write failed:', error);
485
+ }
486
+ }
487
+ /**
488
+ * Convert a raw database row to UnifiedMemory
489
+ */
490
+ rowToUnifiedMemory(row) {
491
+ let content;
492
+ try {
493
+ content = typeof row.content === 'string'
494
+ ? JSON.parse(row.content)
495
+ : row.content || { title: 'Untitled', body: '' };
496
+ }
497
+ catch {
498
+ content = { title: 'Untitled', body: '' };
499
+ }
500
+ return {
501
+ id: row.id || '',
502
+ title: content.title || 'Untitled',
503
+ body: content.body || '',
504
+ domain: content.domain,
505
+ source: 'turso',
506
+ createdAt: row.created_at || row.updated_at || new Date().toISOString(),
507
+ tags: undefined,
508
+ metadata: content
509
+ };
510
+ }
511
+ }
512
+ // =============================================================================
513
+ // Export Singleton
514
+ // =============================================================================
515
+ export const memoryRouter = new MemoryRouterService();
516
+ export default memoryRouter;
517
+ //# sourceMappingURL=memory-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-router.js","sourceRoot":"","sources":["../../src/services/memory-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * @file Pattern Tracker Service
3
+ * @description Tracks code patterns and triggers auto-improvement when threshold is reached
4
+ *
5
+ * Features:
6
+ * - Track pattern occurrences across sessions
7
+ * - Detect when patterns reach threshold (default: 3)
8
+ * - Generate ESLint rules automatically
9
+ * - Create memory entries for gotchas
10
+ */
11
+ import type { DevSystem } from '../types/index.js';
12
+ export interface PatternContext {
13
+ file: string;
14
+ line?: number;
15
+ code?: string;
16
+ sessionId?: string;
17
+ description: string;
18
+ }
19
+ export interface TrackedPattern {
20
+ id: string;
21
+ patternId: string;
22
+ description: string;
23
+ count: number;
24
+ severity: 'critical' | 'high' | 'medium' | 'low';
25
+ contexts: PatternContext[];
26
+ firstSeen: string;
27
+ lastSeen: string;
28
+ autoImproveTriggered: boolean;
29
+ }
30
+ export interface ESLintRuleSpec {
31
+ name: string;
32
+ description: string;
33
+ meta: {
34
+ type: 'problem' | 'suggestion' | 'layout';
35
+ docs: {
36
+ description: string;
37
+ };
38
+ fixable?: 'code' | 'whitespace';
39
+ messages: Record<string, string>;
40
+ };
41
+ pattern: RegExp | string;
42
+ fix?: string;
43
+ }
44
+ declare class PatternTrackerService {
45
+ private violationThreshold;
46
+ /**
47
+ * Track a pattern occurrence
48
+ */
49
+ track(patternId: string, context: PatternContext, system: DevSystem): Promise<{
50
+ count: number;
51
+ triggered: boolean;
52
+ rule?: ESLintRuleSpec;
53
+ }>;
54
+ /**
55
+ * Check current count for a pattern
56
+ */
57
+ getCount(patternId: string, system: DevSystem): Promise<number>;
58
+ /**
59
+ * Get all patterns near threshold
60
+ */
61
+ getPendingPatterns(system: DevSystem): Promise<TrackedPattern[]>;
62
+ /**
63
+ * Trigger auto-improvement for a pattern
64
+ */
65
+ triggerAutoImprovement(pattern: TrackedPattern, system: DevSystem): Promise<ESLintRuleSpec | undefined>;
66
+ /**
67
+ * Generate ESLint rule from pattern
68
+ */
69
+ private generateEslintRule;
70
+ /**
71
+ * Convert ESLint rule spec to code with pattern-specific implementation
72
+ */
73
+ private eslintRuleToCode;
74
+ /**
75
+ * Generate pattern-specific rule body based on rule name
76
+ */
77
+ private generateRuleBody;
78
+ /**
79
+ * Format gotcha memory body
80
+ */
81
+ private formatGotchaBody;
82
+ /**
83
+ * Convert pattern ID to regex
84
+ */
85
+ private patternToRegex;
86
+ /**
87
+ * Detect domain from contexts
88
+ */
89
+ private detectDomain;
90
+ private findPattern;
91
+ private createPattern;
92
+ private savePattern;
93
+ private saveAutoImprovement;
94
+ }
95
+ export declare const patternTracker: PatternTrackerService;
96
+ export default patternTracker;
97
+ //# sourceMappingURL=pattern-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-tracker.d.ts","sourceRoot":"","sources":["../../src/services/pattern-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,SAAS,EAA0C,MAAM,mBAAmB,CAAA;AAM1F,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAA;IAChD,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,oBAAoB,EAAE,OAAO,CAAA;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAA;QACzC,IAAI,EAAE;YAAE,WAAW,EAAE,MAAM,CAAA;SAAE,CAAA;QAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,CAAA;QAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KACjC,CAAA;IACD,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;IACxB,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAyDD,cAAM,qBAAqB;IACzB,OAAO,CAAC,kBAAkB,CAAI;IAE9B;;OAEG;IACG,KAAK,CACT,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC;QACT,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,EAAE,OAAO,CAAA;QAClB,IAAI,CAAC,EAAE,cAAc,CAAA;KACtB,CAAC;IA0CF;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAKrE;;OAEG;IACG,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA8BtE;;OAEG;IACG,sBAAsB,CAC1B,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IA+CtC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA4BxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqFxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyBxB;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;IACH,OAAO,CAAC,YAAY;YAkBN,WAAW;YA0BX,aAAa;YAab,WAAW;YAYX,mBAAmB;CAalC;AAMD,eAAO,MAAM,cAAc,uBAA8B,CAAA;AACzD,eAAe,cAAc,CAAA"}