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.
- package/README.md +633 -611
- package/dist/cli/index.js +0 -0
- package/dist/db/drizzle-client.d.ts +3 -3
- package/dist/db/drizzle-client.d.ts.map +1 -1
- package/dist/db/drizzle-client.js +57 -58
- package/dist/db/drizzle-client.js.map +1 -1
- package/dist/db/turso-client.js +11 -11
- package/dist/eslint/rules/no-async-useeffect.js +6 -6
- package/dist/hooks/cloud-pre-tool-use.js +20 -20
- package/dist/hooks/cloud-session-start.d.ts +15 -3
- package/dist/hooks/cloud-session-start.d.ts.map +1 -1
- package/dist/hooks/cloud-session-start.js +135 -8
- package/dist/hooks/cloud-session-start.js.map +1 -1
- package/dist/hooks/session-start.d.ts +2 -1
- package/dist/hooks/session-start.d.ts.map +1 -1
- package/dist/hooks/session-start.js +99 -74
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.js +2 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/schema/plans.d.ts +194 -0
- package/dist/schema/plans.d.ts.map +1 -0
- package/dist/schema/plans.js +180 -0
- package/dist/schema/plans.js.map +1 -0
- package/dist/schema/tracking.d.ts +90 -90
- package/dist/services/ContextGenerator.d.ts +16 -0
- package/dist/services/ContextGenerator.d.ts.map +1 -0
- package/dist/services/ContextGenerator.js +62 -0
- package/dist/services/ContextGenerator.js.map +1 -0
- package/dist/services/PlanManager.d.ts +99 -0
- package/dist/services/PlanManager.d.ts.map +1 -0
- package/dist/services/PlanManager.js +372 -0
- package/dist/services/PlanManager.js.map +1 -0
- package/dist/services/ProjectScaffold.js +76 -76
- package/dist/services/context-injector.d.ts +111 -0
- package/dist/services/context-injector.d.ts.map +1 -0
- package/dist/services/context-injector.js +397 -0
- package/dist/services/context-injector.js.map +1 -0
- package/dist/services/index.d.ts +15 -15
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +18 -20
- package/dist/services/index.js.map +1 -1
- package/dist/services/memory-router.d.ts +122 -0
- package/dist/services/memory-router.d.ts.map +1 -0
- package/dist/services/memory-router.js +517 -0
- package/dist/services/memory-router.js.map +1 -0
- package/dist/services/pattern-tracker.d.ts +97 -0
- package/dist/services/pattern-tracker.d.ts.map +1 -0
- package/dist/services/pattern-tracker.js +425 -0
- package/dist/services/pattern-tracker.js.map +1 -0
- package/dist/services/semantic-search.d.ts +33 -35
- package/dist/services/semantic-search.d.ts.map +1 -1
- package/dist/services/semantic-search.js +207 -165
- package/dist/services/semantic-search.js.map +1 -1
- package/dist/types/index.d.ts +329 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +186 -9
- package/dist/types/index.js.map +1 -1
- package/package.json +104 -100
- package/standards/README.md +50 -50
- package/standards/experts/expert-routing.md +215 -215
- package/standards/general/code-quality.md +86 -86
- package/standards/general/memory-usage.md +205 -205
- package/standards/general/sync-workflow.md +235 -235
- package/standards/general/workflow.md +82 -82
- package/standards/hooks/mandatory-tracking.md +446 -446
- package/standards/infrastructure/cloud-database.md +287 -287
- package/standards/mcp/server-design.md +243 -243
- package/standards/mcp/tool-patterns.md +354 -354
- package/standards/skills/skill-structure.md +286 -286
- package/standards/skills/workflow-design.md +323 -323
- package/standards/tools/tool-design.md +297 -297
- package/templates/agents/architecture-expert.md +61 -61
- package/templates/agents/database-expert.md +62 -62
- package/templates/agents/documentation-expert.md +57 -57
- package/templates/agents/memory-expert.md +88 -88
- package/templates/agents/performance-expert.md +61 -61
- package/templates/agents/security-expert.md +59 -59
- package/templates/agents/ux-expert.md +63 -63
- package/templates/agents/worker.md +75 -75
- package/templates/ai-skills/SKILL_TEMPLATE.md +55 -55
- package/templates/claude-settings.json +72 -72
- package/templates/commands/experts.md +138 -138
- package/templates/hooks/README.md +158 -158
- package/templates/hooks/project.config.json.template +77 -77
- package/templates/hooks/settings.local.json.template +57 -57
- package/templates/memory-config.json +56 -56
- package/templates/memory-config.schema.json +212 -212
- package/templates/settings.json +58 -58
- package/templates/skills/continue.md +205 -205
- package/templates/workflows/business-improvement.md +264 -264
- package/templates/workflows/expert-review.md +153 -153
- package/templates/workflows/internal-app.md +245 -245
- 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"}
|