memgrid 0.5.4 → 0.6.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/CHANGELOG.md +15 -0
- package/dist/learn/index.js +4 -4
- package/dist/learn/index.js.map +1 -1
- package/dist/learn/nlp.d.ts +32 -0
- package/dist/learn/nlp.d.ts.map +1 -0
- package/dist/learn/nlp.js +214 -0
- package/dist/learn/nlp.js.map +1 -0
- package/dist/retrieve/index.js +1 -1
- package/dist/retrieve/index.js.map +1 -1
- package/dist/scanner/config.d.ts.map +1 -1
- package/dist/scanner/config.js +1 -0
- package/dist/scanner/config.js.map +1 -1
- package/dist/scanner/golang.js +1 -1
- package/dist/scanner/golang.js.map +1 -1
- package/dist/scanner/typescript.d.ts.map +1 -1
- package/dist/scanner/typescript.js +1 -0
- package/dist/scanner/typescript.js.map +1 -1
- package/dist/serve/cli.js +42 -2
- package/dist/serve/cli.js.map +1 -1
- package/dist/serve/mcp-server.d.ts.map +1 -1
- package/dist/serve/mcp-server.js +32 -57
- package/dist/serve/mcp-server.js.map +1 -1
- package/dist/shared/types.d.ts +23 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +23 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/phases/architecture.d.ts +12 -0
- package/dist/sync/phases/architecture.d.ts.map +1 -0
- package/dist/sync/phases/architecture.js +104 -0
- package/dist/sync/phases/architecture.js.map +1 -0
- package/dist/sync/phases/associations.d.ts +12 -0
- package/dist/sync/phases/associations.d.ts.map +1 -0
- package/dist/sync/phases/associations.js +202 -0
- package/dist/sync/phases/associations.js.map +1 -0
- package/dist/sync/phases/learning.d.ts +13 -0
- package/dist/sync/phases/learning.d.ts.map +1 -0
- package/dist/sync/phases/learning.js +73 -0
- package/dist/sync/phases/learning.js.map +1 -0
- package/dist/sync/phases/patterns.d.ts +13 -0
- package/dist/sync/phases/patterns.d.ts.map +1 -0
- package/dist/sync/phases/patterns.js +102 -0
- package/dist/sync/phases/patterns.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MemoryUnit } from '../../shared/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Phase 3: Rebuild associations for changed files.
|
|
4
|
+
*
|
|
5
|
+
* When code changes, existing associations (calls, imports, dependencies)
|
|
6
|
+
* may become stale. This phase re-analyzes changed files and updates
|
|
7
|
+
* method units with fresh associations.
|
|
8
|
+
*/
|
|
9
|
+
export declare function analyzeAssociations(projectRoot: string, changedFiles: string[], units: Map<string, MemoryUnit>): {
|
|
10
|
+
newAssociations: number;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=associations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"associations.d.ts","sourceRoot":"","sources":["../../../src/sync/phases/associations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAC7B;IAAE,eAAe,EAAE,MAAM,CAAA;CAAE,CA4F7B"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Phase 3: Rebuild associations for changed files.
|
|
5
|
+
*
|
|
6
|
+
* When code changes, existing associations (calls, imports, dependencies)
|
|
7
|
+
* may become stale. This phase re-analyzes changed files and updates
|
|
8
|
+
* method units with fresh associations.
|
|
9
|
+
*/
|
|
10
|
+
export function analyzeAssociations(projectRoot, changedFiles, units) {
|
|
11
|
+
let newAssociations = 0;
|
|
12
|
+
const unitByFile = new Map();
|
|
13
|
+
for (const unit of units.values()) {
|
|
14
|
+
if (!unit.source?.file)
|
|
15
|
+
continue;
|
|
16
|
+
const list = unitByFile.get(unit.source.file) || [];
|
|
17
|
+
list.push(unit);
|
|
18
|
+
unitByFile.set(unit.source.file, list);
|
|
19
|
+
}
|
|
20
|
+
for (const file of changedFiles) {
|
|
21
|
+
const abs = path.join(projectRoot, file);
|
|
22
|
+
if (!fs.existsSync(abs))
|
|
23
|
+
continue;
|
|
24
|
+
if (!file.endsWith('.ts') && !file.endsWith('.tsx'))
|
|
25
|
+
continue;
|
|
26
|
+
try {
|
|
27
|
+
const code = fs.readFileSync(abs, 'utf-8');
|
|
28
|
+
const importMap = buildImportMap(file, code, projectRoot);
|
|
29
|
+
const callMap = buildCallMap(code);
|
|
30
|
+
const fileUnits = unitByFile.get(file) || [];
|
|
31
|
+
for (const unit of fileUnits) {
|
|
32
|
+
if (unit.type !== 'method')
|
|
33
|
+
continue;
|
|
34
|
+
// Clear old associations (after task, rebuild fresh)
|
|
35
|
+
const oldCount = unit.associations.length;
|
|
36
|
+
unit.associations = [];
|
|
37
|
+
// Add dependencies from imports
|
|
38
|
+
for (const [importName, sourceFile] of importMap) {
|
|
39
|
+
if (!unit.signatures.some((s) => s.includes(importName)) &&
|
|
40
|
+
!unit.content.dependencies?.includes(importName))
|
|
41
|
+
continue;
|
|
42
|
+
const targetUnitId = findUnitByFile(units, sourceFile, importName);
|
|
43
|
+
if (targetUnitId) {
|
|
44
|
+
unit.associations.push({
|
|
45
|
+
to: targetUnitId,
|
|
46
|
+
relation: 'calls',
|
|
47
|
+
weight: 0.7,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Add calls from call graph
|
|
52
|
+
const calls = callMap.get(unit.id) || [];
|
|
53
|
+
for (const callee of calls) {
|
|
54
|
+
const targetId = findUnitBySignature(units, callee);
|
|
55
|
+
if (targetId && targetId !== unit.id) {
|
|
56
|
+
if (!unit.associations.some((a) => a.to === targetId)) {
|
|
57
|
+
unit.associations.push({
|
|
58
|
+
to: targetId,
|
|
59
|
+
relation: 'calls',
|
|
60
|
+
weight: 0.6,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Detect imports of architecture patterns
|
|
66
|
+
for (const [importName] of importMap) {
|
|
67
|
+
if (importName === 'Module' && code.includes('@Module(')) {
|
|
68
|
+
const moduleUnits = fileUnits.filter((u) => u.summary.includes('Module') || u.id.includes('_module'));
|
|
69
|
+
for (const moduleUnit of moduleUnits) {
|
|
70
|
+
if (moduleUnit.id !== unit.id) {
|
|
71
|
+
unit.associations.push({
|
|
72
|
+
to: moduleUnit.id,
|
|
73
|
+
relation: 'belongs_to_module',
|
|
74
|
+
weight: 0.5,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (unit.associations.length > oldCount) {
|
|
81
|
+
newAssociations += unit.associations.length - oldCount;
|
|
82
|
+
}
|
|
83
|
+
else if (oldCount > 0 && unit.associations.length === 0) {
|
|
84
|
+
// Associations were rebuilt but total count changed - track delta
|
|
85
|
+
newAssociations += unit.associations.length;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Skip unparseable files
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return { newAssociations };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Build a map of imported names → their source file paths.
|
|
97
|
+
*/
|
|
98
|
+
function buildImportMap(currentFile, code, projectRoot) {
|
|
99
|
+
const map = new Map();
|
|
100
|
+
// Match: import { X, Y } from './foo'
|
|
101
|
+
const namedImportRe = /import\s*\{([^}]*)\}\s*from\s*['"]([^'"]+)['"]/g;
|
|
102
|
+
let match;
|
|
103
|
+
while ((match = namedImportRe.exec(code)) !== null) {
|
|
104
|
+
const names = match[1]
|
|
105
|
+
.split(',')
|
|
106
|
+
.map((n) => n.trim())
|
|
107
|
+
.filter(Boolean);
|
|
108
|
+
const source = match[2];
|
|
109
|
+
if (source.startsWith('.')) {
|
|
110
|
+
const absSource = resolveRelativeImport(currentFile, source, projectRoot);
|
|
111
|
+
for (const name of names) {
|
|
112
|
+
map.set(name, absSource);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Match: import X from './foo'
|
|
117
|
+
const defaultImportRe = /import\s+(\w+)\s+from\s+['"]([^'"]+)['"]/g;
|
|
118
|
+
while ((match = defaultImportRe.exec(code)) !== null) {
|
|
119
|
+
const name = match[1];
|
|
120
|
+
const source = match[2];
|
|
121
|
+
if (source.startsWith('.')) {
|
|
122
|
+
map.set(name, resolveRelativeImport(currentFile, source, projectRoot));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return map;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Resolve a relative import path to an absolute file path.
|
|
129
|
+
* Handles barrel exports (./foo → ./foo/index.ts).
|
|
130
|
+
*/
|
|
131
|
+
function resolveRelativeImport(currentFile, importPath, projectRoot) {
|
|
132
|
+
const currentDir = path.dirname(path.join(projectRoot, currentFile));
|
|
133
|
+
const resolved = path.resolve(currentDir, importPath);
|
|
134
|
+
// Try exact path with .ts extension
|
|
135
|
+
if (fs.existsSync(resolved + '.ts'))
|
|
136
|
+
return resolved + '.ts';
|
|
137
|
+
if (fs.existsSync(resolved + '.tsx'))
|
|
138
|
+
return resolved + '.tsx';
|
|
139
|
+
// Try barrel export (directory → index.ts)
|
|
140
|
+
if (fs.existsSync(path.join(resolved, 'index.ts'))) {
|
|
141
|
+
return path.join(resolved, 'index.ts');
|
|
142
|
+
}
|
|
143
|
+
if (fs.existsSync(path.join(resolved, 'index.tsx'))) {
|
|
144
|
+
return path.join(resolved, 'index.tsx');
|
|
145
|
+
}
|
|
146
|
+
return resolved + '.ts'; // best guess
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Build a map of unit ID → called function names.
|
|
150
|
+
*/
|
|
151
|
+
function buildCallMap(code) {
|
|
152
|
+
const map = new Map();
|
|
153
|
+
// Match this.xxxService.yyy() calls
|
|
154
|
+
const thisCallRe = /this\.(\w+)\.(\w+)\s*\(/g;
|
|
155
|
+
let match;
|
|
156
|
+
while ((match = thisCallRe.exec(code)) !== null) {
|
|
157
|
+
const receiver = match[1];
|
|
158
|
+
const method = match[2];
|
|
159
|
+
const calls = map.get(receiver) || [];
|
|
160
|
+
calls.push(method);
|
|
161
|
+
map.set(receiver, calls);
|
|
162
|
+
}
|
|
163
|
+
return map;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Find a unit by its source file and exported name.
|
|
167
|
+
*/
|
|
168
|
+
function findUnitByFile(units, targetFile, importName) {
|
|
169
|
+
// Normalize: strip projectRoot prefix
|
|
170
|
+
const normalized = targetFile.replace(/\\/g, '/');
|
|
171
|
+
// Try exact file match + signature match
|
|
172
|
+
for (const unit of units.values()) {
|
|
173
|
+
if (!unit.source?.file)
|
|
174
|
+
continue;
|
|
175
|
+
const unitFile = unit.source.file.replace(/\\/g, '/');
|
|
176
|
+
if (normalized.endsWith(unitFile) || unitFile.endsWith(normalized)) {
|
|
177
|
+
if (unit.signatures.some((s) => s.includes(importName))) {
|
|
178
|
+
return unit.id;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Try signature-only match (for packages like @nestjs/common)
|
|
183
|
+
for (const unit of units.values()) {
|
|
184
|
+
if (unit.signatures.some((s) => s.toLowerCase().includes(importName.toLowerCase()))) {
|
|
185
|
+
return unit.id;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Find a unit by its signature (method name).
|
|
192
|
+
*/
|
|
193
|
+
function findUnitBySignature(units, name) {
|
|
194
|
+
const lower = name.toLowerCase();
|
|
195
|
+
for (const unit of units.values()) {
|
|
196
|
+
if (unit.signatures.some((s) => s.toLowerCase().includes(lower))) {
|
|
197
|
+
return unit.id;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=associations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"associations.js","sourceRoot":"","sources":["../../../src/sync/phases/associations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { FileStore } from '../../store/file-store.js';
|
|
2
|
+
import type { SyncPattern, SyncAlert } from '../../shared/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Phase 6: Learning engine integration.
|
|
5
|
+
*
|
|
6
|
+
* After sync detects code changes, patterns, and architecture alerts,
|
|
7
|
+
* this phase converts that raw data into learning suggestions and
|
|
8
|
+
* auto-applies them to the grid.
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateLearnings(store: FileStore, changedFiles: string[], patterns: SyncPattern[], alerts: SyncAlert[]): {
|
|
11
|
+
autoUnitsCreated: number;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=learning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning.d.ts","sourceRoot":"","sources":["../../../src/sync/phases/learning.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEpE;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,MAAM,EAAE,EACtB,QAAQ,EAAE,WAAW,EAAE,EACvB,MAAM,EAAE,SAAS,EAAE,GAClB;IAAE,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAsE9B"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 6: Learning engine integration.
|
|
3
|
+
*
|
|
4
|
+
* After sync detects code changes, patterns, and architecture alerts,
|
|
5
|
+
* this phase converts that raw data into learning suggestions and
|
|
6
|
+
* auto-applies them to the grid.
|
|
7
|
+
*/
|
|
8
|
+
export function generateLearnings(store, changedFiles, patterns, alerts) {
|
|
9
|
+
let autoUnitsCreated = 0;
|
|
10
|
+
// 1. Convert detected patterns into memory units
|
|
11
|
+
for (const pattern of patterns) {
|
|
12
|
+
if (pattern.confidence < 0.4)
|
|
13
|
+
continue;
|
|
14
|
+
const unit = {
|
|
15
|
+
id: `auto_${pattern.type}_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
|
|
16
|
+
type: pattern.type,
|
|
17
|
+
summary: pattern.summary,
|
|
18
|
+
source: { file: pattern.file },
|
|
19
|
+
signatures: [pattern.summary],
|
|
20
|
+
content: { description: pattern.summary },
|
|
21
|
+
associations: [],
|
|
22
|
+
meta: {
|
|
23
|
+
created: new Date().toISOString(),
|
|
24
|
+
updated: new Date().toISOString(),
|
|
25
|
+
confidence: pattern.confidence,
|
|
26
|
+
usage_count: 0,
|
|
27
|
+
status: pattern.confidence >= 0.6 ? 'active' : 'stale',
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
store.ensureDirs();
|
|
31
|
+
store.saveUnit(unit);
|
|
32
|
+
autoUnitsCreated++;
|
|
33
|
+
}
|
|
34
|
+
// 2. Convert architecture alerts into error_solution units
|
|
35
|
+
for (const alert of alerts) {
|
|
36
|
+
if (alert.level === 'error') {
|
|
37
|
+
const unit = {
|
|
38
|
+
id: `auto_error_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`,
|
|
39
|
+
type: 'error_solution',
|
|
40
|
+
summary: `Architecture violation: ${alert.message.slice(0, 80)}`,
|
|
41
|
+
source: { file: alert.file },
|
|
42
|
+
signatures: [alert.message],
|
|
43
|
+
content: {
|
|
44
|
+
description: `Architecture check triggered in ${alert.file}: ${alert.message}`,
|
|
45
|
+
},
|
|
46
|
+
associations: [],
|
|
47
|
+
meta: {
|
|
48
|
+
created: new Date().toISOString(),
|
|
49
|
+
updated: new Date().toISOString(),
|
|
50
|
+
confidence: 0.5,
|
|
51
|
+
usage_count: 0,
|
|
52
|
+
status: 'stale',
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
store.ensureDirs();
|
|
56
|
+
store.saveUnit(unit);
|
|
57
|
+
autoUnitsCreated++;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// 3. Boost confidence of existing units from changed files
|
|
61
|
+
if (changedFiles.length > 0) {
|
|
62
|
+
const existingUnits = store.listUnitsSync?.() || [];
|
|
63
|
+
for (const unit of existingUnits) {
|
|
64
|
+
if (unit.source?.file && changedFiles.includes(unit.source.file)) {
|
|
65
|
+
unit.meta.confidence = Math.min(1.0, unit.meta.confidence + 0.05);
|
|
66
|
+
unit.meta.usage_count++;
|
|
67
|
+
store.saveUnit(unit);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return { autoUnitsCreated };
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=learning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning.js","sourceRoot":"","sources":["../../../src/sync/phases/learning.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SyncPattern } from '../../shared/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Phase 4: Detect semantic patterns from code changes.
|
|
4
|
+
*
|
|
5
|
+
* Reads changed files and identifies:
|
|
6
|
+
* - New error handling patterns (try-catch, BusinessException)
|
|
7
|
+
* - New design patterns (Builder, decorator usage)
|
|
8
|
+
* - New architecture decisions (config changes, new dependencies)
|
|
9
|
+
*/
|
|
10
|
+
export declare function detectPatterns(projectRoot: string, changedFiles: string[]): {
|
|
11
|
+
patterns: SyncPattern[];
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../src/sync/phases/patterns.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EAAE,GACrB;IAAE,QAAQ,EAAE,WAAW,EAAE,CAAA;CAAE,CAkG7B"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Phase 4: Detect semantic patterns from code changes.
|
|
5
|
+
*
|
|
6
|
+
* Reads changed files and identifies:
|
|
7
|
+
* - New error handling patterns (try-catch, BusinessException)
|
|
8
|
+
* - New design patterns (Builder, decorator usage)
|
|
9
|
+
* - New architecture decisions (config changes, new dependencies)
|
|
10
|
+
*/
|
|
11
|
+
export function detectPatterns(projectRoot, changedFiles) {
|
|
12
|
+
const patterns = [];
|
|
13
|
+
for (const file of changedFiles) {
|
|
14
|
+
const abs = path.join(projectRoot, file);
|
|
15
|
+
if (!fs.existsSync(abs))
|
|
16
|
+
continue;
|
|
17
|
+
try {
|
|
18
|
+
const code = fs.readFileSync(abs, 'utf-8');
|
|
19
|
+
// Detect new try-catch blocks → error_solution
|
|
20
|
+
if (code.includes('try {') && code.includes('catch')) {
|
|
21
|
+
const match = code.match(/catch\s*\(([^)]*)\)\s*\{([^}]*)\}/);
|
|
22
|
+
if (match) {
|
|
23
|
+
patterns.push({
|
|
24
|
+
type: 'error_solution',
|
|
25
|
+
summary: `Error handling pattern in ${path.basename(file)}`,
|
|
26
|
+
file,
|
|
27
|
+
confidence: 0.4,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Detect throw new BusinessException → error_solution
|
|
32
|
+
const businessExRe = /throw new\s+(\w*[Ee]xception\w*)\s*\(/g;
|
|
33
|
+
let bMatch;
|
|
34
|
+
while ((bMatch = businessExRe.exec(code)) !== null) {
|
|
35
|
+
patterns.push({
|
|
36
|
+
type: 'error_solution',
|
|
37
|
+
summary: `${bMatch[1]} thrown in ${path.basename(file)}`,
|
|
38
|
+
file,
|
|
39
|
+
confidence: 0.5,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
// Detect @Injectable/@Module/@Controller → NestJS pattern
|
|
43
|
+
if (code.includes('@Injectable()')) {
|
|
44
|
+
patterns.push({
|
|
45
|
+
type: 'pattern',
|
|
46
|
+
summary: `Injectable service in ${path.basename(file)}`,
|
|
47
|
+
file,
|
|
48
|
+
confidence: 0.6,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (code.includes('@Module(')) {
|
|
52
|
+
patterns.push({
|
|
53
|
+
type: 'pattern',
|
|
54
|
+
summary: `NestJS Module: ${path.basename(file)}`,
|
|
55
|
+
file,
|
|
56
|
+
confidence: 0.7,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
// Detect Builder pattern
|
|
60
|
+
if (code.includes('extends') && code.includes('builder') && code.includes('return this')) {
|
|
61
|
+
patterns.push({
|
|
62
|
+
type: 'pattern',
|
|
63
|
+
summary: `Builder pattern in ${path.basename(file)}`,
|
|
64
|
+
file,
|
|
65
|
+
confidence: 0.5,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
// Detect new imports of infrastructure patterns
|
|
69
|
+
if (code.includes("from '@nestjs/common'") && code.includes('forwardRef')) {
|
|
70
|
+
patterns.push({
|
|
71
|
+
type: 'decision',
|
|
72
|
+
summary: `forwardRef() used in ${path.basename(file)} — may indicate circular dependency`,
|
|
73
|
+
file,
|
|
74
|
+
confidence: 0.3,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// Detect strategy/template method pattern via abstract classes
|
|
78
|
+
if (code.includes('abstract class') && code.includes('extends')) {
|
|
79
|
+
patterns.push({
|
|
80
|
+
type: 'pattern',
|
|
81
|
+
summary: `Strategy/Template pattern in ${path.basename(file)}`,
|
|
82
|
+
file,
|
|
83
|
+
confidence: 0.4,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// skip
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Deduplicate by summary
|
|
92
|
+
const seen = new Set();
|
|
93
|
+
const unique = patterns.filter((p) => {
|
|
94
|
+
const key = p.summary;
|
|
95
|
+
if (seen.has(key))
|
|
96
|
+
return false;
|
|
97
|
+
seen.add(key);
|
|
98
|
+
return true;
|
|
99
|
+
});
|
|
100
|
+
return { patterns: unique };
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../src/sync/phases/patterns.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "memgrid",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Project-level semantic memory system for AI coding agents. Replaces full-codebase context loading with a self-evolving knowledge-mesh.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|