memgrid 0.5.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 +80 -0
- package/LICENSE +21 -0
- package/README.md +251 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/learn/index.d.ts +44 -0
- package/dist/learn/index.d.ts.map +1 -0
- package/dist/learn/index.js +234 -0
- package/dist/learn/index.js.map +1 -0
- package/dist/memgrid.d.ts +50 -0
- package/dist/memgrid.d.ts.map +1 -0
- package/dist/memgrid.js +175 -0
- package/dist/memgrid.js.map +1 -0
- package/dist/retrieve/index.d.ts +27 -0
- package/dist/retrieve/index.d.ts.map +1 -0
- package/dist/retrieve/index.js +209 -0
- package/dist/retrieve/index.js.map +1 -0
- package/dist/retrieve/semantic.d.ts +67 -0
- package/dist/retrieve/semantic.d.ts.map +1 -0
- package/dist/retrieve/semantic.js +240 -0
- package/dist/retrieve/semantic.js.map +1 -0
- package/dist/scanner/composite.d.ts +27 -0
- package/dist/scanner/composite.d.ts.map +1 -0
- package/dist/scanner/composite.js +58 -0
- package/dist/scanner/composite.js.map +1 -0
- package/dist/scanner/config.d.ts +15 -0
- package/dist/scanner/config.d.ts.map +1 -0
- package/dist/scanner/config.js +167 -0
- package/dist/scanner/config.js.map +1 -0
- package/dist/scanner/golang.d.ts +19 -0
- package/dist/scanner/golang.d.ts.map +1 -0
- package/dist/scanner/golang.js +190 -0
- package/dist/scanner/golang.js.map +1 -0
- package/dist/scanner/index.d.ts +11 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +10 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/javascript.d.ts +20 -0
- package/dist/scanner/javascript.d.ts.map +1 -0
- package/dist/scanner/javascript.js +167 -0
- package/dist/scanner/javascript.js.map +1 -0
- package/dist/scanner/markdown.d.ts +17 -0
- package/dist/scanner/markdown.d.ts.map +1 -0
- package/dist/scanner/markdown.js +106 -0
- package/dist/scanner/markdown.js.map +1 -0
- package/dist/scanner/python.d.ts +19 -0
- package/dist/scanner/python.d.ts.map +1 -0
- package/dist/scanner/python.js +177 -0
- package/dist/scanner/python.js.map +1 -0
- package/dist/scanner/rules.d.ts +15 -0
- package/dist/scanner/rules.d.ts.map +1 -0
- package/dist/scanner/rules.js +86 -0
- package/dist/scanner/rules.js.map +1 -0
- package/dist/scanner/rust.d.ts +18 -0
- package/dist/scanner/rust.d.ts.map +1 -0
- package/dist/scanner/rust.js +178 -0
- package/dist/scanner/rust.js.map +1 -0
- package/dist/scanner/scanner.d.ts +33 -0
- package/dist/scanner/scanner.d.ts.map +1 -0
- package/dist/scanner/scanner.js +2 -0
- package/dist/scanner/scanner.js.map +1 -0
- package/dist/scanner/typescript.d.ts +28 -0
- package/dist/scanner/typescript.d.ts.map +1 -0
- package/dist/scanner/typescript.js +522 -0
- package/dist/scanner/typescript.js.map +1 -0
- package/dist/serve/cli.d.ts +3 -0
- package/dist/serve/cli.d.ts.map +1 -0
- package/dist/serve/cli.js +145 -0
- package/dist/serve/cli.js.map +1 -0
- package/dist/serve/mcp-server.d.ts +11 -0
- package/dist/serve/mcp-server.d.ts.map +1 -0
- package/dist/serve/mcp-server.js +276 -0
- package/dist/serve/mcp-server.js.map +1 -0
- package/dist/shared/constants.d.ts +2 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +2 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/types.d.ts +99 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +3 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/store/file-store.d.ts +62 -0
- package/dist/store/file-store.d.ts.map +1 -0
- package/dist/store/file-store.js +241 -0
- package/dist/store/file-store.js.map +1 -0
- package/dist/store/index.d.ts +3 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +2 -0
- package/dist/store/index.js.map +1 -0
- package/dist/sync/index.d.ts +56 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +580 -0
- package/dist/sync/index.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic search layer for MemGrid.
|
|
3
|
+
* v0.4: Pluggable embedding providers + cosine similarity ranking.
|
|
4
|
+
* No native dependencies (pure JS). Embedding API calls are optional —
|
|
5
|
+
* falls back gracefully to keyword-only search if no embedding provider configured.
|
|
6
|
+
*/
|
|
7
|
+
import { RetrieveEngine } from './index.js';
|
|
8
|
+
/** Simple LRU cache */
|
|
9
|
+
class LRUCache {
|
|
10
|
+
max;
|
|
11
|
+
map = new Map();
|
|
12
|
+
constructor(max = 100) {
|
|
13
|
+
this.max = max;
|
|
14
|
+
}
|
|
15
|
+
get(key) { return this.map.get(key); }
|
|
16
|
+
set(key, value) {
|
|
17
|
+
if (this.map.size >= this.max)
|
|
18
|
+
this.map.delete(this.map.keys().next().value);
|
|
19
|
+
this.map.set(key, value);
|
|
20
|
+
}
|
|
21
|
+
clear() { this.map.clear(); }
|
|
22
|
+
}
|
|
23
|
+
export class SemanticRetriever {
|
|
24
|
+
baseEngine;
|
|
25
|
+
store;
|
|
26
|
+
provider = null;
|
|
27
|
+
vectorCache = new Map();
|
|
28
|
+
resultCache = new LRUCache(100);
|
|
29
|
+
constructor(store, provider) {
|
|
30
|
+
this.store = store;
|
|
31
|
+
this.baseEngine = new RetrieveEngine(store);
|
|
32
|
+
if (provider) {
|
|
33
|
+
this.provider = provider;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
setProvider(provider) {
|
|
37
|
+
this.provider = provider;
|
|
38
|
+
this.vectorCache.clear(); // Invalidate cache on provider change
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build embedding vectors for all units in the grid.
|
|
42
|
+
* Called after memgrid init to pre-compute embeddings.
|
|
43
|
+
*/
|
|
44
|
+
async buildIndex() {
|
|
45
|
+
if (!this.provider)
|
|
46
|
+
return { indexed: 0, errors: 0 };
|
|
47
|
+
const units = await this.store.listUnits();
|
|
48
|
+
if (units.length === 0)
|
|
49
|
+
return { indexed: 0, errors: 0 };
|
|
50
|
+
const batchSize = 20;
|
|
51
|
+
let indexed = 0;
|
|
52
|
+
let errors = 0;
|
|
53
|
+
for (let i = 0; i < units.length; i += batchSize) {
|
|
54
|
+
const batch = units.slice(i, i + batchSize);
|
|
55
|
+
const texts = batch.map((u) => `${u.summary}. ${u.content.description}. ${u.signatures.join(' ')}`.slice(0, 500));
|
|
56
|
+
try {
|
|
57
|
+
const vectors = await this.provider.embed(texts);
|
|
58
|
+
for (let j = 0; j < batch.length; j++) {
|
|
59
|
+
this.vectorCache.set(batch[j].id, vectors[j]);
|
|
60
|
+
indexed++;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
errors += batch.length;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return { indexed, errors };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Hybrid search: semantic (cosine) + keyword (minisearch) → merged & reranked.
|
|
71
|
+
*/
|
|
72
|
+
async search(query, options) {
|
|
73
|
+
const maxResults = options?.maxResults ?? 10;
|
|
74
|
+
const maxHops = options?.maxHops ?? 2;
|
|
75
|
+
const semanticWeight = options?.semanticWeight ?? 0.4;
|
|
76
|
+
// Check result cache
|
|
77
|
+
const cacheKey = `${query}::${maxResults}::${maxHops}::${semanticWeight}`;
|
|
78
|
+
const cached = this.resultCache.get(cacheKey);
|
|
79
|
+
if (cached)
|
|
80
|
+
return { ...cached, elapsedMs: 0 };
|
|
81
|
+
// Step 1: Keyword search (always works)
|
|
82
|
+
const keywordResult = await this.baseEngine.search(query, maxResults * 2, maxHops);
|
|
83
|
+
const keywordScores = new Map();
|
|
84
|
+
const allKeywordUnits = new Map();
|
|
85
|
+
for (const unit of keywordResult.units) {
|
|
86
|
+
const idx = keywordResult.units.indexOf(unit);
|
|
87
|
+
const normalizedScore = 1 - idx / keywordResult.units.length;
|
|
88
|
+
keywordScores.set(unit.id, normalizedScore);
|
|
89
|
+
allKeywordUnits.set(unit.id, unit);
|
|
90
|
+
}
|
|
91
|
+
// Step 2: Semantic search (if provider available)
|
|
92
|
+
const semanticScores = new Map();
|
|
93
|
+
if (this.provider && this.vectorCache.size > 0) {
|
|
94
|
+
try {
|
|
95
|
+
const queryVector = (await this.provider.embed([query]))[0];
|
|
96
|
+
for (const [id, vec] of this.vectorCache) {
|
|
97
|
+
const similarity = this.cosine(queryVector, vec);
|
|
98
|
+
if (!isNaN(similarity)) {
|
|
99
|
+
semanticScores.set(id, similarity);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Also add units from semantic results to allKeywordUnits
|
|
103
|
+
const allUnits = await this.store.listUnits();
|
|
104
|
+
for (const [id] of semanticScores) {
|
|
105
|
+
if (!allKeywordUnits.has(id)) {
|
|
106
|
+
const unit = allUnits.find((u) => u.id === id);
|
|
107
|
+
if (unit)
|
|
108
|
+
allKeywordUnits.set(id, unit);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Semantic failed, fall through to keyword-only
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Step 3: Merge and rerank
|
|
117
|
+
const merged = new Map();
|
|
118
|
+
for (const id of new Set([...keywordScores.keys(), ...semanticScores.keys()])) {
|
|
119
|
+
const kw = keywordScores.get(id) || 0;
|
|
120
|
+
const sem = normaliseScore(semanticScores.get(id)) || 0;
|
|
121
|
+
const score = kw * (1 - semanticWeight) + sem * semanticWeight;
|
|
122
|
+
if (score > 0) {
|
|
123
|
+
merged.set(id, score);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Sort and take top N
|
|
127
|
+
const ranked = [...merged.entries()]
|
|
128
|
+
.sort((a, b) => b[1] - a[1])
|
|
129
|
+
.slice(0, maxResults);
|
|
130
|
+
const resultUnits = ranked
|
|
131
|
+
.map(([id]) => allKeywordUnits.get(id))
|
|
132
|
+
.filter(Boolean);
|
|
133
|
+
const result = {
|
|
134
|
+
query,
|
|
135
|
+
units: resultUnits,
|
|
136
|
+
totalHops: maxHops,
|
|
137
|
+
elapsedMs: 0,
|
|
138
|
+
};
|
|
139
|
+
// Cache result
|
|
140
|
+
this.resultCache.set(cacheKey, result);
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
toContext(result) {
|
|
144
|
+
return this.baseEngine.toContext(result);
|
|
145
|
+
}
|
|
146
|
+
cosine(a, b) {
|
|
147
|
+
if (a.length !== b.length)
|
|
148
|
+
return 0;
|
|
149
|
+
let dot = 0;
|
|
150
|
+
let normA = 0;
|
|
151
|
+
let normB = 0;
|
|
152
|
+
for (let i = 0; i < a.length; i++) {
|
|
153
|
+
dot += a[i] * b[i];
|
|
154
|
+
normA += a[i] * a[i];
|
|
155
|
+
normB += b[i] * b[i];
|
|
156
|
+
}
|
|
157
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
158
|
+
return denom === 0 ? 0 : dot / denom;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function normaliseScore(score) {
|
|
162
|
+
if (score === undefined)
|
|
163
|
+
return 0;
|
|
164
|
+
return Math.max(0, Math.min(1, score));
|
|
165
|
+
}
|
|
166
|
+
// ===== Built-in Embedding Providers =====
|
|
167
|
+
/**
|
|
168
|
+
* No-external-dependency provider: uses keyword overlap as pseudo-embedding.
|
|
169
|
+
* Not real semantic search but provides scoring diversity without API calls.
|
|
170
|
+
*/
|
|
171
|
+
export class KeywordEmbeddingProvider {
|
|
172
|
+
name = 'keyword';
|
|
173
|
+
dimensions = 0;
|
|
174
|
+
async embed(texts) {
|
|
175
|
+
// Build vocabulary from all texts
|
|
176
|
+
const vocab = new Map();
|
|
177
|
+
for (const text of texts) {
|
|
178
|
+
const words = text.toLowerCase().split(/\W+/).filter(Boolean);
|
|
179
|
+
for (const w of words) {
|
|
180
|
+
if (w.length > 2)
|
|
181
|
+
vocab.set(w, (vocab.get(w) || 0) + 1);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Keep top 500 tokens
|
|
185
|
+
const topTokens = [...vocab.entries()]
|
|
186
|
+
.sort((a, b) => b[1] - a[1])
|
|
187
|
+
.slice(0, 500)
|
|
188
|
+
.map(([token], i) => ({ token, idx: i }));
|
|
189
|
+
const tokenIndex = new Map(topTokens.map((t) => [t.token, t.idx]));
|
|
190
|
+
const dims = topTokens.length;
|
|
191
|
+
return texts.map((text) => {
|
|
192
|
+
const vec = new Array(dims).fill(0);
|
|
193
|
+
const words = text.toLowerCase().split(/\W+/).filter(Boolean);
|
|
194
|
+
for (const w of words) {
|
|
195
|
+
const idx = tokenIndex.get(w);
|
|
196
|
+
if (idx !== undefined)
|
|
197
|
+
vec[idx] = 1;
|
|
198
|
+
}
|
|
199
|
+
return vec;
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Provider that calls an external embedding API (OpenAI-compatible format).
|
|
205
|
+
*
|
|
206
|
+
* Usage:
|
|
207
|
+
* const provider = new APIEmbeddingProvider('https://api.deepseek.com/v1/embeddings', 'sk-...');
|
|
208
|
+
*/
|
|
209
|
+
export class APIEmbeddingProvider {
|
|
210
|
+
name = 'api';
|
|
211
|
+
dimensions;
|
|
212
|
+
baseUrl;
|
|
213
|
+
apiKey;
|
|
214
|
+
model;
|
|
215
|
+
constructor(baseUrl, apiKey, model = 'text-embedding-3-small', dimensions = 1536) {
|
|
216
|
+
this.baseUrl = baseUrl;
|
|
217
|
+
this.apiKey = apiKey;
|
|
218
|
+
this.model = model;
|
|
219
|
+
this.dimensions = dimensions;
|
|
220
|
+
}
|
|
221
|
+
async embed(texts) {
|
|
222
|
+
const response = await fetch(this.baseUrl, {
|
|
223
|
+
method: 'POST',
|
|
224
|
+
headers: {
|
|
225
|
+
'Content-Type': 'application/json',
|
|
226
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
227
|
+
},
|
|
228
|
+
body: JSON.stringify({
|
|
229
|
+
model: this.model,
|
|
230
|
+
input: texts,
|
|
231
|
+
}),
|
|
232
|
+
});
|
|
233
|
+
if (!response.ok) {
|
|
234
|
+
throw new Error(`Embedding API error: ${response.status} ${response.statusText}`);
|
|
235
|
+
}
|
|
236
|
+
const data = await response.json();
|
|
237
|
+
return data.data.map((item) => item.embedding);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=semantic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic.js","sourceRoot":"","sources":["../../src/retrieve/semantic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { MemoryUnit, ScanOptions } from '../shared/types.js';
|
|
2
|
+
import type { Scanner } from './scanner.js';
|
|
3
|
+
/**
|
|
4
|
+
* CompositeScanner composes multiple language-specific scanners.
|
|
5
|
+
* Detects which scanners apply to a project and runs them in parallel.
|
|
6
|
+
*/
|
|
7
|
+
export declare class CompositeScanner implements Scanner {
|
|
8
|
+
readonly name = "composite";
|
|
9
|
+
private scanners;
|
|
10
|
+
private projectRoot;
|
|
11
|
+
constructor(projectRoot: string, scanners?: Scanner[]);
|
|
12
|
+
/** Register a scanner (call before scan) */
|
|
13
|
+
register(scanner: Scanner): void;
|
|
14
|
+
/** Auto-detect applicable scanners from a candidate list */
|
|
15
|
+
autoDetect(candidates: Scanner[]): void;
|
|
16
|
+
/** Return list of registered scanner names */
|
|
17
|
+
get activeScanners(): string[];
|
|
18
|
+
scan(options: ScanOptions): Promise<MemoryUnit[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Partial scan — delegate to scanners that support scanFiles.
|
|
21
|
+
* For scanners without scanFiles support, skip (full re-scan on changed files
|
|
22
|
+
* handled by SyncEngine separately).
|
|
23
|
+
*/
|
|
24
|
+
scanFiles(files: string[], options: ScanOptions): Promise<MemoryUnit[]>;
|
|
25
|
+
detect(): boolean;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=composite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composite.d.ts","sourceRoot":"","sources":["../../src/scanner/composite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,OAAO;IAC9C,QAAQ,CAAC,IAAI,eAAe;IAC5B,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE;IAKrD,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIhC,4DAA4D;IAC5D,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,IAAI;IAQvC,8CAA8C;IAC9C,IAAI,cAAc,IAAI,MAAM,EAAE,CAE7B;IAEK,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAevD;;;;OAIG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAiB7E,MAAM,IAAI,OAAO;CAGlB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CompositeScanner composes multiple language-specific scanners.
|
|
3
|
+
* Detects which scanners apply to a project and runs them in parallel.
|
|
4
|
+
*/
|
|
5
|
+
export class CompositeScanner {
|
|
6
|
+
name = 'composite';
|
|
7
|
+
scanners;
|
|
8
|
+
projectRoot;
|
|
9
|
+
constructor(projectRoot, scanners) {
|
|
10
|
+
this.projectRoot = projectRoot;
|
|
11
|
+
this.scanners = scanners ?? [];
|
|
12
|
+
}
|
|
13
|
+
/** Register a scanner (call before scan) */
|
|
14
|
+
register(scanner) {
|
|
15
|
+
this.scanners.push(scanner);
|
|
16
|
+
}
|
|
17
|
+
/** Auto-detect applicable scanners from a candidate list */
|
|
18
|
+
autoDetect(candidates) {
|
|
19
|
+
for (const scanner of candidates) {
|
|
20
|
+
if (scanner.detect(this.projectRoot)) {
|
|
21
|
+
this.scanners.push(scanner);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Return list of registered scanner names */
|
|
26
|
+
get activeScanners() {
|
|
27
|
+
return this.scanners.map((s) => s.name);
|
|
28
|
+
}
|
|
29
|
+
async scan(options) {
|
|
30
|
+
const units = [];
|
|
31
|
+
// Run all scanners in parallel
|
|
32
|
+
const results = await Promise.all(this.scanners.map((s) => s.scan(options)));
|
|
33
|
+
for (const result of results) {
|
|
34
|
+
units.push(...result);
|
|
35
|
+
}
|
|
36
|
+
return units;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Partial scan — delegate to scanners that support scanFiles.
|
|
40
|
+
* For scanners without scanFiles support, skip (full re-scan on changed files
|
|
41
|
+
* handled by SyncEngine separately).
|
|
42
|
+
*/
|
|
43
|
+
async scanFiles(files, options) {
|
|
44
|
+
const units = [];
|
|
45
|
+
// Only scanners that support incremental scan
|
|
46
|
+
const results = await Promise.all(this.scanners
|
|
47
|
+
.filter((s) => s.scanFiles)
|
|
48
|
+
.map((s) => s.scanFiles(files, options)));
|
|
49
|
+
for (const result of results) {
|
|
50
|
+
units.push(...result);
|
|
51
|
+
}
|
|
52
|
+
return units;
|
|
53
|
+
}
|
|
54
|
+
detect() {
|
|
55
|
+
return this.scanners.length > 0;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=composite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composite.js","sourceRoot":"","sources":["../../src/scanner/composite.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAG,WAAW,CAAC;IACpB,QAAQ,CAAY;IACpB,WAAW,CAAS;IAE5B,YAAY,WAAmB,EAAE,QAAoB;QACnD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAC;IACjC,CAAC;IAED,4CAA4C;IAC5C,QAAQ,CAAC,OAAgB;QACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,4DAA4D;IAC5D,UAAU,CAAC,UAAqB;QAC9B,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;YACjC,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC7B,MAAM,KAAK,GAAiB,EAAE,CAAC;QAE/B,+BAA+B;QAC/B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAC1C,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAS,CAAC,KAAe,EAAE,OAAoB;QACnD,MAAM,KAAK,GAAiB,EAAE,CAAC;QAE/B,8CAA8C;QAC9C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,IAAI,CAAC,QAAQ;aACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;aAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAC5C,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { MemoryUnit, ScanOptions } from '../shared/types.js';
|
|
2
|
+
import type { Scanner } from './scanner.js';
|
|
3
|
+
/**
|
|
4
|
+
* Shared scanner for project config files (package.json, docker-compose.yml, etc.).
|
|
5
|
+
* Applies to any project regardless of language.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ConfigScanner implements Scanner {
|
|
8
|
+
readonly name = "config";
|
|
9
|
+
private projectRoot;
|
|
10
|
+
constructor(projectRoot: string);
|
|
11
|
+
detect(projectRoot: string): boolean;
|
|
12
|
+
scan(_options: ScanOptions): Promise<MemoryUnit[]>;
|
|
13
|
+
scanFiles(_files: string[], _options: ScanOptions): Promise<MemoryUnit[]>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/scanner/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C;;;GAGG;AACH,qBAAa,aAAc,YAAW,OAAO;IAC3C,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAI/B,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAU9B,IAAI,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA2JlD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAGhF"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
/**
|
|
4
|
+
* Shared scanner for project config files (package.json, docker-compose.yml, etc.).
|
|
5
|
+
* Applies to any project regardless of language.
|
|
6
|
+
*/
|
|
7
|
+
export class ConfigScanner {
|
|
8
|
+
name = 'config';
|
|
9
|
+
projectRoot;
|
|
10
|
+
constructor(projectRoot) {
|
|
11
|
+
this.projectRoot = projectRoot;
|
|
12
|
+
}
|
|
13
|
+
detect(projectRoot) {
|
|
14
|
+
return (fs.existsSync(path.join(projectRoot, 'package.json')) ||
|
|
15
|
+
fs.existsSync(path.join(projectRoot, 'docker-compose.yml')) ||
|
|
16
|
+
fs.existsSync(path.join(projectRoot, 'pyproject.toml')) ||
|
|
17
|
+
fs.existsSync(path.join(projectRoot, 'go.mod')) ||
|
|
18
|
+
fs.existsSync(path.join(projectRoot, 'Cargo.toml')));
|
|
19
|
+
}
|
|
20
|
+
async scan(_options) {
|
|
21
|
+
const units = [];
|
|
22
|
+
// package.json (Node.js)
|
|
23
|
+
const pkgPath = path.join(this.projectRoot, 'package.json');
|
|
24
|
+
if (fs.existsSync(pkgPath)) {
|
|
25
|
+
try {
|
|
26
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
27
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
28
|
+
const keyDeps = Object.entries(deps)
|
|
29
|
+
.filter(([name]) => ['next', 'react', 'nestjs', 'typeorm', 'chakra', 'zustand',
|
|
30
|
+
'swr', 'pnpm', 'typescript', 'express', 'fastify', 'prisma',
|
|
31
|
+
].some((k) => name.includes(k)))
|
|
32
|
+
.map(([name, ver]) => `${name}@${ver}`);
|
|
33
|
+
if (keyDeps.length > 0) {
|
|
34
|
+
units.push({
|
|
35
|
+
id: 'config_tech_stack_js',
|
|
36
|
+
type: 'config',
|
|
37
|
+
summary: `JS tech stack: ${keyDeps.slice(0, 8).join(', ')}`,
|
|
38
|
+
source: { file: 'package.json' },
|
|
39
|
+
signatures: ['tech stack', 'dependencies', 'npm', 'node', '技术栈'],
|
|
40
|
+
content: { description: `Key dependencies: ${keyDeps.join(', ')}` },
|
|
41
|
+
associations: [],
|
|
42
|
+
meta: {
|
|
43
|
+
created: new Date().toISOString(),
|
|
44
|
+
updated: new Date().toISOString(),
|
|
45
|
+
confidence: 0.95,
|
|
46
|
+
usage_count: 0,
|
|
47
|
+
status: 'active',
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch { /* JSON parse error, skip */ }
|
|
53
|
+
}
|
|
54
|
+
// pyproject.toml (Python)
|
|
55
|
+
const pyProjectPath = path.join(this.projectRoot, 'pyproject.toml');
|
|
56
|
+
if (fs.existsSync(pyProjectPath)) {
|
|
57
|
+
try {
|
|
58
|
+
const content = fs.readFileSync(pyProjectPath, 'utf-8');
|
|
59
|
+
const depsMatch = content.match(/dependencies\s*=\s*\[([\s\S]*?)\]/);
|
|
60
|
+
const optDeps = content.match(/optional-dependencies\s*=\s*\{/);
|
|
61
|
+
const deps = depsMatch ? depsMatch[1].match(/"([^"]+)"/g)?.map((d) => d.replace(/"/g, '')) || [] : [];
|
|
62
|
+
units.push({
|
|
63
|
+
id: 'config_tech_stack_python',
|
|
64
|
+
type: 'config',
|
|
65
|
+
summary: `Python project${deps.length ? ': ' + deps.slice(0, 5).join(', ') : ''}`,
|
|
66
|
+
source: { file: 'pyproject.toml' },
|
|
67
|
+
signatures: ['tech stack', 'dependencies', 'python', 'pyproject'],
|
|
68
|
+
content: { description: `Python project. Dependencies: ${deps.join(', ') || 'unknown'}` },
|
|
69
|
+
associations: [],
|
|
70
|
+
meta: {
|
|
71
|
+
created: new Date().toISOString(),
|
|
72
|
+
updated: new Date().toISOString(),
|
|
73
|
+
confidence: 0.9,
|
|
74
|
+
usage_count: 0,
|
|
75
|
+
status: 'active',
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch { /* parse error, skip */ }
|
|
80
|
+
}
|
|
81
|
+
// go.mod (Go)
|
|
82
|
+
const goModPath = path.join(this.projectRoot, 'go.mod');
|
|
83
|
+
if (fs.existsSync(goModPath)) {
|
|
84
|
+
const content = fs.readFileSync(goModPath, 'utf-8');
|
|
85
|
+
const moduleMatch = content.match(/^module\s+(\S+)/m);
|
|
86
|
+
const goMatch = content.match(/^go\s+(\S+)/m);
|
|
87
|
+
const deps = content.match(/^\s+(\S+)\s+v[\d.]+/gm)?.map((l) => l.trim().split(/\s+/)[0]).slice(0, 10) || [];
|
|
88
|
+
units.push({
|
|
89
|
+
id: 'config_tech_stack_go',
|
|
90
|
+
type: 'config',
|
|
91
|
+
summary: `Go module: ${moduleMatch?.[1] || 'unknown'} (go ${goMatch?.[1] || '?'})`,
|
|
92
|
+
source: { file: 'go.mod' },
|
|
93
|
+
signatures: ['tech stack', 'dependencies', 'go', 'golang'],
|
|
94
|
+
content: {
|
|
95
|
+
description: `Go module ${moduleMatch?.[1] || 'unknown'}. Dependencies: ${deps.join(', ') || 'none'}`,
|
|
96
|
+
},
|
|
97
|
+
associations: [],
|
|
98
|
+
meta: {
|
|
99
|
+
created: new Date().toISOString(),
|
|
100
|
+
updated: new Date().toISOString(),
|
|
101
|
+
confidence: 0.9,
|
|
102
|
+
usage_count: 0,
|
|
103
|
+
status: 'active',
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
// Cargo.toml (Rust)
|
|
108
|
+
const cargoPath = path.join(this.projectRoot, 'Cargo.toml');
|
|
109
|
+
if (fs.existsSync(cargoPath)) {
|
|
110
|
+
const content = fs.readFileSync(cargoPath, 'utf-8');
|
|
111
|
+
const nameMatch = content.match(/^name\s*=\s*"([^"]+)"/m);
|
|
112
|
+
const deps = content.match(/(\[dependencies.*?\n)([\s\S]*?)(?=\n\[|$)/)?.[2]
|
|
113
|
+
?.match(/^(\w+)\s*=/gm)?.map((d) => d.replace(' =', '').trim()) || [];
|
|
114
|
+
units.push({
|
|
115
|
+
id: 'config_tech_stack_rust',
|
|
116
|
+
type: 'config',
|
|
117
|
+
summary: `Rust crate: ${nameMatch?.[1] || 'unknown'}`,
|
|
118
|
+
source: { file: 'Cargo.toml' },
|
|
119
|
+
signatures: ['tech stack', 'dependencies', 'rust', 'cargo'],
|
|
120
|
+
content: {
|
|
121
|
+
description: `Rust crate ${nameMatch?.[1] || 'unknown'}. Dependencies: ${deps.join(', ') || 'unknown'}`,
|
|
122
|
+
},
|
|
123
|
+
associations: [],
|
|
124
|
+
meta: {
|
|
125
|
+
created: new Date().toISOString(),
|
|
126
|
+
updated: new Date().toISOString(),
|
|
127
|
+
confidence: 0.9,
|
|
128
|
+
usage_count: 0,
|
|
129
|
+
status: 'active',
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
// docker-compose.yml
|
|
134
|
+
const composePath = path.join(this.projectRoot, 'docker-compose.yml');
|
|
135
|
+
if (fs.existsSync(composePath)) {
|
|
136
|
+
const compose = fs.readFileSync(composePath, 'utf-8');
|
|
137
|
+
const serviceMatches = compose.match(/container_name:\s*(\S+)/g) || [];
|
|
138
|
+
const services = serviceMatches.map((m) => m.replace('container_name:', '').trim());
|
|
139
|
+
const dbMatch = compose.match(/image:\s*(mysql|postgres|mongo|redis|elasticsearch)/gi) || [];
|
|
140
|
+
if (services.length > 0) {
|
|
141
|
+
units.push({
|
|
142
|
+
id: 'config_docker_services',
|
|
143
|
+
type: 'config',
|
|
144
|
+
summary: `Docker services: ${services.join(', ')}`,
|
|
145
|
+
source: { file: 'docker-compose.yml' },
|
|
146
|
+
signatures: ['docker', 'infrastructure', 'services', '容器'],
|
|
147
|
+
content: {
|
|
148
|
+
description: `Services: ${services.join(', ')}. Databases: ${dbMatch.join(', ') || 'none'}`,
|
|
149
|
+
},
|
|
150
|
+
associations: [],
|
|
151
|
+
meta: {
|
|
152
|
+
created: new Date().toISOString(),
|
|
153
|
+
updated: new Date().toISOString(),
|
|
154
|
+
confidence: 0.9,
|
|
155
|
+
usage_count: 0,
|
|
156
|
+
status: 'active',
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return units;
|
|
162
|
+
}
|
|
163
|
+
async scanFiles(_files, _options) {
|
|
164
|
+
return this.scan(_options);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/scanner/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { MemoryUnit, ScanOptions } from '../shared/types.js';
|
|
2
|
+
import type { Scanner } from './scanner.js';
|
|
3
|
+
/**
|
|
4
|
+
* Go project scanner.
|
|
5
|
+
* Regex-based: extracts func, type, method declarations.
|
|
6
|
+
*/
|
|
7
|
+
export declare class GoScanner implements Scanner {
|
|
8
|
+
readonly name = "golang";
|
|
9
|
+
private projectRoot;
|
|
10
|
+
constructor(_store: any, projectRoot: string);
|
|
11
|
+
detect(projectRoot: string): boolean;
|
|
12
|
+
scan(_options: ScanOptions): Promise<MemoryUnit[]>;
|
|
13
|
+
private scanDir;
|
|
14
|
+
private parseGoFile;
|
|
15
|
+
private isStructMethod;
|
|
16
|
+
private findSourceDirs;
|
|
17
|
+
private sanitizeId;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=golang.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"golang.d.ts","sourceRoot":"","sources":["../../src/scanner/golang.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C;;;GAGG;AACH,qBAAa,SAAU,YAAW,OAAO;IACvC,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM;IAI5C,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAI9B,IAAI,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;YA0B1C,OAAO;IAmBrB,OAAO,CAAC,WAAW;IAqHnB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,UAAU;CASnB"}
|