pmem-ai 0.6.2 → 0.6.3
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 +34 -0
- package/README.md +12 -3
- package/dist/commands/graph.d.ts +3 -0
- package/dist/commands/graph.d.ts.map +1 -1
- package/dist/commands/graph.js +66 -23
- package/dist/commands/graph.js.map +1 -1
- package/dist/commands/rebuild.js +2 -2
- package/dist/commands/rebuild.js.map +1 -1
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +117 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/core/db.d.ts +8 -0
- package/dist/core/db.d.ts.map +1 -1
- package/dist/core/db.js +47 -0
- package/dist/core/db.js.map +1 -1
- package/dist/core/discover/detect.d.ts +12 -0
- package/dist/core/discover/detect.d.ts.map +1 -0
- package/dist/core/discover/detect.js +68 -0
- package/dist/core/discover/detect.js.map +1 -0
- package/dist/core/discover/index.d.ts +12 -0
- package/dist/core/discover/index.d.ts.map +1 -0
- package/dist/core/discover/index.js +630 -0
- package/dist/core/discover/index.js.map +1 -0
- package/dist/core/discover/patterns.d.ts +29 -0
- package/dist/core/discover/patterns.d.ts.map +1 -0
- package/dist/core/discover/patterns.js +322 -0
- package/dist/core/discover/patterns.js.map +1 -0
- package/dist/index.js +29 -2
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +76 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -2
- package/skills/pmem/SKILL.md +32 -0
|
@@ -0,0 +1,630 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.discoverCommand = discoverCommand;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const fs_1 = require("../fs");
|
|
39
|
+
const db_1 = require("../db");
|
|
40
|
+
const patterns_1 = require("./patterns");
|
|
41
|
+
const detect_1 = require("./detect");
|
|
42
|
+
const PMEM_DIR = '.pmem';
|
|
43
|
+
/**
|
|
44
|
+
* Main discover command: detect languages, scan files, resolve to cards, produce edges.
|
|
45
|
+
*/
|
|
46
|
+
function discoverCommand(options) {
|
|
47
|
+
const cwd = process.cwd();
|
|
48
|
+
const pmemPath = path.join(cwd, PMEM_DIR);
|
|
49
|
+
const minConfidence = options.minConfidence ?? 0.5;
|
|
50
|
+
if (!(0, fs_1.fileExists)(pmemPath)) {
|
|
51
|
+
console.log('No .pmem directory found. Run `pmem init` first.');
|
|
52
|
+
process.exit(2);
|
|
53
|
+
}
|
|
54
|
+
const dbPath = path.join(pmemPath, 'pmem.db');
|
|
55
|
+
if (!(0, fs_1.fileExists)(dbPath)) {
|
|
56
|
+
console.log('No SQLite database found. Run `pmem rebuild` first.');
|
|
57
|
+
process.exit(2);
|
|
58
|
+
}
|
|
59
|
+
// 1. Load patterns
|
|
60
|
+
let extraPatterns;
|
|
61
|
+
if (options.patternFile) {
|
|
62
|
+
try {
|
|
63
|
+
const raw = (0, fs_1.readFile)(path.resolve(cwd, options.patternFile));
|
|
64
|
+
if (raw) {
|
|
65
|
+
const parsed = JSON.parse(raw);
|
|
66
|
+
extraPatterns = parsed.languages || parsed;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
console.error(`Failed to parse pattern file: ${options.patternFile}`);
|
|
71
|
+
process.exit(2);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const allPatterns = (0, patterns_1.loadPatternRegistry)(extraPatterns);
|
|
75
|
+
// 2. Detect or filter languages
|
|
76
|
+
let activePatterns;
|
|
77
|
+
if (options.lang && options.lang !== 'auto') {
|
|
78
|
+
const langs = options.lang.split(',').map(l => l.trim().toLowerCase());
|
|
79
|
+
activePatterns = (0, detect_1.filterPatterns)(allPatterns, langs);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
const detected = (0, detect_1.detectLanguages)(cwd, allPatterns);
|
|
83
|
+
activePatterns = allPatterns.filter(p => detected.includes(p.language));
|
|
84
|
+
}
|
|
85
|
+
if (activePatterns.length === 0) {
|
|
86
|
+
const msg = options.lang
|
|
87
|
+
? `No matching language patterns found for: ${options.lang}`
|
|
88
|
+
: 'No supported languages detected in this project.';
|
|
89
|
+
if (options.format === 'json') {
|
|
90
|
+
console.log(JSON.stringify({
|
|
91
|
+
project_languages: [],
|
|
92
|
+
discovered_edges: [],
|
|
93
|
+
ambiguous: [],
|
|
94
|
+
summary: { total_discovered: 0, high_confidence: 0, low_confidence: 0, unmatched_refs: 0 },
|
|
95
|
+
}, null, 2));
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
console.log(msg);
|
|
99
|
+
}
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const db = (0, db_1.openDatabase)(pmemPath);
|
|
103
|
+
(0, db_1.createSchema)(db);
|
|
104
|
+
// 3. Get all registered source files from the paths table
|
|
105
|
+
const sourceFileRows = db.prepare("SELECT DISTINCT path, card_id FROM paths WHERE relation = 'source_file'").all();
|
|
106
|
+
// Build: absolutePath → cardId map; also track scanned files to avoid duplicates
|
|
107
|
+
const fileCardMap = new Map();
|
|
108
|
+
const seenFiles = new Set();
|
|
109
|
+
for (const row of sourceFileRows) {
|
|
110
|
+
const absPath = path.resolve(cwd, row.path);
|
|
111
|
+
if (!seenFiles.has(absPath)) {
|
|
112
|
+
seenFiles.add(absPath);
|
|
113
|
+
fileCardMap.set(absPath, row.card_id);
|
|
114
|
+
}
|
|
115
|
+
// Also index relative path for lookup only
|
|
116
|
+
if (!fileCardMap.has(row.path)) {
|
|
117
|
+
fileCardMap.set(row.path, row.card_id);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Also detect languages from source file extensions (not just indicator files)
|
|
121
|
+
if (!options.lang || options.lang === 'auto') {
|
|
122
|
+
const extLangMap = {
|
|
123
|
+
'.ts': 'nodejs', '.tsx': 'nodejs', '.js': 'nodejs', '.jsx': 'nodejs',
|
|
124
|
+
'.py': 'python', '.rs': 'rust', '.go': 'go',
|
|
125
|
+
'.c': 'cpp', '.cpp': 'cpp', '.h': 'cpp', '.hpp': 'cpp',
|
|
126
|
+
'.java': 'java', '.kt': 'java',
|
|
127
|
+
};
|
|
128
|
+
const extDetected = new Set(activePatterns.map(p => p.language));
|
|
129
|
+
for (const absPath of seenFiles) {
|
|
130
|
+
const ext = path.extname(absPath).toLowerCase();
|
|
131
|
+
const lang = extLangMap[ext];
|
|
132
|
+
if (lang)
|
|
133
|
+
extDetected.add(lang);
|
|
134
|
+
}
|
|
135
|
+
// Filter active patterns to include extension-detected languages
|
|
136
|
+
activePatterns = allPatterns.filter(p => extDetected.has(p.language));
|
|
137
|
+
}
|
|
138
|
+
// 4. Scan for references
|
|
139
|
+
const allRefs = [];
|
|
140
|
+
for (const langPattern of activePatterns) {
|
|
141
|
+
// 4a. Scan source files registered in DB (only those matching language extensions)
|
|
142
|
+
const extSet = new Set(langPattern.extensions);
|
|
143
|
+
const scannedFiles = new Set();
|
|
144
|
+
for (const [filePath, cardId] of fileCardMap) {
|
|
145
|
+
const absPath = path.isAbsolute(filePath) ? filePath : path.resolve(cwd, filePath);
|
|
146
|
+
const ext = path.extname(absPath).toLowerCase();
|
|
147
|
+
if (!extSet.has(ext))
|
|
148
|
+
continue;
|
|
149
|
+
if (!(0, fs_1.fileExists)(absPath))
|
|
150
|
+
continue;
|
|
151
|
+
if (scannedFiles.has(absPath))
|
|
152
|
+
continue;
|
|
153
|
+
scannedFiles.add(absPath);
|
|
154
|
+
const content = (0, fs_1.readFile)(absPath);
|
|
155
|
+
if (!content)
|
|
156
|
+
continue;
|
|
157
|
+
for (const pattern of langPattern.source_patterns) {
|
|
158
|
+
if (pattern.confidence < minConfidence)
|
|
159
|
+
continue;
|
|
160
|
+
try {
|
|
161
|
+
const re = new RegExp(pattern.regex, 'gm');
|
|
162
|
+
let match;
|
|
163
|
+
while ((match = re.exec(content)) !== null) {
|
|
164
|
+
const target = match[1] || match[2] || match[3];
|
|
165
|
+
if (!target)
|
|
166
|
+
continue;
|
|
167
|
+
const cleanTarget = target.trim();
|
|
168
|
+
// Skip language builtins / stdlib (e.g. `fs`, `path`, `os`) entirely.
|
|
169
|
+
// They are never project-internal references and would only create noise.
|
|
170
|
+
if ((0, patterns_1.isBuiltinModule)(cleanTarget, langPattern.language))
|
|
171
|
+
continue;
|
|
172
|
+
if (pattern.scope !== 'external' && (cleanTarget.startsWith('.') || cleanTarget.startsWith('/'))) {
|
|
173
|
+
// Local import: try to resolve as file path
|
|
174
|
+
const resolvedFile = resolveImportPath(absPath, cleanTarget, langPattern.extensions);
|
|
175
|
+
allRefs.push({
|
|
176
|
+
from_file: absPath,
|
|
177
|
+
from_card_id: cardId,
|
|
178
|
+
target_name: resolvedFile || cleanTarget,
|
|
179
|
+
language: langPattern.language,
|
|
180
|
+
strategy: 'source_import',
|
|
181
|
+
confidence: pattern.confidence,
|
|
182
|
+
matched_pattern: match[0].trim().substring(0, 80),
|
|
183
|
+
target_kind: 'local_file',
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
else if (pattern.scope !== 'local') {
|
|
187
|
+
allRefs.push({
|
|
188
|
+
from_file: absPath,
|
|
189
|
+
from_card_id: cardId,
|
|
190
|
+
target_name: cleanTarget,
|
|
191
|
+
language: langPattern.language,
|
|
192
|
+
strategy: 'source_import',
|
|
193
|
+
confidence: pattern.confidence,
|
|
194
|
+
matched_pattern: match[0].trim().substring(0, 80),
|
|
195
|
+
target_kind: 'external_bare',
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
// skip invalid regex
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// 4b. Scan dependency files
|
|
206
|
+
for (const depFile of langPattern.dep_files) {
|
|
207
|
+
if (depFile.confidence < minConfidence)
|
|
208
|
+
continue;
|
|
209
|
+
const depPath = path.join(cwd, depFile.filename);
|
|
210
|
+
if (!(0, fs_1.fileExists)(depPath))
|
|
211
|
+
continue;
|
|
212
|
+
const content = (0, fs_1.readFile)(depPath);
|
|
213
|
+
if (!content)
|
|
214
|
+
continue;
|
|
215
|
+
const deps = extractDeps(content, depFile);
|
|
216
|
+
// Find which card owns this dep file
|
|
217
|
+
const ownerCardId = fileCardMap.get(depPath);
|
|
218
|
+
for (const dep of deps) {
|
|
219
|
+
// Skip stdlib / well-known framework packages (e.g. @types/*).
|
|
220
|
+
// Bare dep names won't match project cards, and treating them as
|
|
221
|
+
// "unmatched" would only pollute the ambiguous list.
|
|
222
|
+
if ((0, patterns_1.isBuiltinModule)(dep, langPattern.language))
|
|
223
|
+
continue;
|
|
224
|
+
allRefs.push({
|
|
225
|
+
from_file: depPath,
|
|
226
|
+
from_card_id: ownerCardId,
|
|
227
|
+
target_name: dep,
|
|
228
|
+
language: langPattern.language,
|
|
229
|
+
strategy: 'dependency_file',
|
|
230
|
+
confidence: depFile.confidence,
|
|
231
|
+
matched_pattern: `${depFile.filename}: ${dep}`,
|
|
232
|
+
target_kind: 'external_bare',
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// 5. Resolve references to card IDs
|
|
238
|
+
const { edges, ambiguous } = resolveToCards(allRefs, fileCardMap, db, minConfidence);
|
|
239
|
+
// Deduplicate ambiguous entries
|
|
240
|
+
const dedupedAmbiguous = dedupAmbiguous(ambiguous);
|
|
241
|
+
// 6. Output
|
|
242
|
+
const highConf = edges.filter(e => e.confidence >= 0.7).length;
|
|
243
|
+
const lowConf = edges.filter(e => e.confidence < 0.7).length;
|
|
244
|
+
const externalRefs = dedupedAmbiguous.filter(a => a.kind === 'external_unmatched').length;
|
|
245
|
+
const actionable = dedupedAmbiguous.filter(a => a.severity === 'actionable').length;
|
|
246
|
+
const result = {
|
|
247
|
+
project_languages: activePatterns.map(p => p.language),
|
|
248
|
+
discovered_edges: edges,
|
|
249
|
+
ambiguous: dedupedAmbiguous,
|
|
250
|
+
summary: {
|
|
251
|
+
total_discovered: edges.length,
|
|
252
|
+
high_confidence: highConf,
|
|
253
|
+
low_confidence: lowConf,
|
|
254
|
+
unmatched_refs: dedupedAmbiguous.filter(a => a.kind === 'unmatched_target').length,
|
|
255
|
+
external_refs: externalRefs,
|
|
256
|
+
actionable,
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
if (options.format === 'json') {
|
|
260
|
+
console.log(JSON.stringify(result, null, 2));
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
printCompact(result);
|
|
264
|
+
}
|
|
265
|
+
// 7. Write to DB if not dry-run
|
|
266
|
+
if (!options.dryRun) {
|
|
267
|
+
const now = new Date().toISOString();
|
|
268
|
+
const activeSession = (0, db_1.getActiveSession)(db);
|
|
269
|
+
// Remove old inferred edges
|
|
270
|
+
(0, db_1.deleteInferredEdges)(db);
|
|
271
|
+
// Insert new edges
|
|
272
|
+
for (const de of edges) {
|
|
273
|
+
(0, db_1.insertEdge)(db, {
|
|
274
|
+
from_id: de.from_id,
|
|
275
|
+
to_id: de.to_id,
|
|
276
|
+
type: de.type,
|
|
277
|
+
source: 'inferred',
|
|
278
|
+
confidence: de.confidence,
|
|
279
|
+
created_at: now,
|
|
280
|
+
updated_at: now,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
// Mark cards with new inferred edges as dirty
|
|
284
|
+
const dirtyCardIds = new Set(edges.map(e => e.from_id));
|
|
285
|
+
for (const cardId of dirtyCardIds) {
|
|
286
|
+
(0, db_1.insertDirtyFlag)(db, 'card', cardId, 'discover:inferred_edges_added', activeSession?.id);
|
|
287
|
+
}
|
|
288
|
+
(0, db_1.closeDatabase)();
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Resolve collected references to card IDs.
|
|
293
|
+
*/
|
|
294
|
+
function resolveToCards(refs, fileCardMap, db, minConfidence) {
|
|
295
|
+
const edges = [];
|
|
296
|
+
const ambiguous = [];
|
|
297
|
+
const seenEdges = new Set();
|
|
298
|
+
const now = new Date().toISOString();
|
|
299
|
+
for (const ref of refs) {
|
|
300
|
+
// Try to find target card
|
|
301
|
+
const targetIds = findTargetCards(ref.target_name, fileCardMap, db);
|
|
302
|
+
if (targetIds.length === 0) {
|
|
303
|
+
// Classify: a 'local_file' that didn't resolve is an internal project
|
|
304
|
+
// file with no card — actionable. An 'external_bare' is an external
|
|
305
|
+
// package or full path dep — informational, no action needed.
|
|
306
|
+
const isExternal = ref.target_kind === 'external_bare';
|
|
307
|
+
ambiguous.push({
|
|
308
|
+
kind: isExternal ? 'external_unmatched' : 'unmatched_target',
|
|
309
|
+
severity: isExternal ? 'informational' : 'actionable',
|
|
310
|
+
from_file: ref.from_file,
|
|
311
|
+
from_card_id: ref.from_card_id,
|
|
312
|
+
reference: ref.target_name,
|
|
313
|
+
language: ref.language,
|
|
314
|
+
confidence: ref.confidence,
|
|
315
|
+
});
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
if (targetIds.length > 1) {
|
|
319
|
+
ambiguous.push({
|
|
320
|
+
kind: 'multiple_targets',
|
|
321
|
+
from_file: ref.from_file,
|
|
322
|
+
from_card_id: ref.from_card_id,
|
|
323
|
+
reference: ref.target_name,
|
|
324
|
+
suggested_targets: targetIds,
|
|
325
|
+
language: ref.language,
|
|
326
|
+
confidence: ref.confidence,
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
// Use the best match (first)
|
|
330
|
+
const toId = targetIds[0];
|
|
331
|
+
const fromId = ref.from_card_id;
|
|
332
|
+
if (!fromId)
|
|
333
|
+
continue;
|
|
334
|
+
if (fromId === toId)
|
|
335
|
+
continue; // self-reference
|
|
336
|
+
const edgeKey = `${fromId}→${toId}:${ref.strategy}`;
|
|
337
|
+
if (seenEdges.has(edgeKey))
|
|
338
|
+
continue;
|
|
339
|
+
seenEdges.add(edgeKey);
|
|
340
|
+
if (ref.confidence < minConfidence) {
|
|
341
|
+
ambiguous.push({
|
|
342
|
+
kind: 'low_confidence',
|
|
343
|
+
from_file: ref.from_file,
|
|
344
|
+
from_card_id: fromId,
|
|
345
|
+
reference: `${fromId} → ${toId}`,
|
|
346
|
+
language: ref.language,
|
|
347
|
+
confidence: ref.confidence,
|
|
348
|
+
});
|
|
349
|
+
continue;
|
|
350
|
+
}
|
|
351
|
+
edges.push({
|
|
352
|
+
from_id: fromId,
|
|
353
|
+
to_id: toId,
|
|
354
|
+
type: ref.strategy === 'dependency_file' ? 'depends_on' : 'depends_on',
|
|
355
|
+
source: 'inferred',
|
|
356
|
+
confidence: ref.confidence,
|
|
357
|
+
evidence: {
|
|
358
|
+
language: ref.language,
|
|
359
|
+
strategy: ref.strategy,
|
|
360
|
+
matched_file: ref.from_file,
|
|
361
|
+
matched_pattern: ref.matched_pattern,
|
|
362
|
+
},
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
return { edges, ambiguous };
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Find card IDs that match a reference target.
|
|
369
|
+
* Tries: exact path match, filename match, alias match, tag match.
|
|
370
|
+
*/
|
|
371
|
+
function findTargetCards(target, fileCardMap, db) {
|
|
372
|
+
const results = [];
|
|
373
|
+
// 1. Direct file path match
|
|
374
|
+
if (fileCardMap.has(target)) {
|
|
375
|
+
const cid = fileCardMap.get(target);
|
|
376
|
+
if (!results.includes(cid))
|
|
377
|
+
results.push(cid);
|
|
378
|
+
}
|
|
379
|
+
// 2. Filename-only match — only for file paths (contain / or \) or relative refs,
|
|
380
|
+
// NOT for bare package names like 'fs', 'path', 'express'
|
|
381
|
+
const looksLikePath = target.includes('/') || target.includes('\\') || target.startsWith('.');
|
|
382
|
+
if (looksLikePath) {
|
|
383
|
+
const targetBasename = path.basename(target).replace(/\.[^.]+$/, '');
|
|
384
|
+
for (const [fpath, cid] of fileCardMap) {
|
|
385
|
+
if (results.includes(cid))
|
|
386
|
+
continue;
|
|
387
|
+
const basename = path.basename(fpath).replace(/\.[^.]+$/, '');
|
|
388
|
+
if (basename === targetBasename) {
|
|
389
|
+
results.push(cid);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
// 3. Card alias match
|
|
394
|
+
try {
|
|
395
|
+
const aliasRows = db.prepare('SELECT card_id FROM aliases WHERE normalized_alias = ?').all(target.toLowerCase().trim());
|
|
396
|
+
for (const row of aliasRows) {
|
|
397
|
+
if (!results.includes(row.card_id)) {
|
|
398
|
+
results.push(row.card_id);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
// ignore
|
|
404
|
+
}
|
|
405
|
+
// 4. Card ID substring match
|
|
406
|
+
try {
|
|
407
|
+
const normalizedTarget = target.toLowerCase().replace(/[^a-z0-9]/g, '-');
|
|
408
|
+
const cardRows = db.prepare('SELECT id FROM cards WHERE id = ? AND is_deleted = 0').all(normalizedTarget);
|
|
409
|
+
for (const row of cardRows) {
|
|
410
|
+
if (!results.includes(row.id)) {
|
|
411
|
+
results.push(row.id);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
catch {
|
|
416
|
+
// ignore
|
|
417
|
+
}
|
|
418
|
+
return results;
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Resolve a local import path (./xxx or ../xxx) to an absolute file path.
|
|
422
|
+
*/
|
|
423
|
+
function resolveImportPath(fromFile, importPath, extensions) {
|
|
424
|
+
const dir = path.dirname(fromFile);
|
|
425
|
+
const resolved = path.resolve(dir, importPath);
|
|
426
|
+
// Try exact match first
|
|
427
|
+
if ((0, fs_1.fileExists)(resolved))
|
|
428
|
+
return resolved;
|
|
429
|
+
// Try with extensions
|
|
430
|
+
for (const ext of extensions) {
|
|
431
|
+
const withExt = resolved + ext;
|
|
432
|
+
if ((0, fs_1.fileExists)(withExt))
|
|
433
|
+
return withExt;
|
|
434
|
+
}
|
|
435
|
+
// Try /index.ext
|
|
436
|
+
for (const ext of extensions) {
|
|
437
|
+
const indexFile = path.join(resolved, 'index' + ext);
|
|
438
|
+
if ((0, fs_1.fileExists)(indexFile))
|
|
439
|
+
return indexFile;
|
|
440
|
+
}
|
|
441
|
+
return null;
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Extract dependencies from a dependency file based on parser type.
|
|
445
|
+
*/
|
|
446
|
+
function extractDeps(content, depFilePattern) {
|
|
447
|
+
const deps = [];
|
|
448
|
+
switch (depFilePattern.parser) {
|
|
449
|
+
case 'json': {
|
|
450
|
+
try {
|
|
451
|
+
const obj = JSON.parse(content);
|
|
452
|
+
const keys = depFilePattern.extractDeps.split(',');
|
|
453
|
+
for (const key of keys) {
|
|
454
|
+
const section = obj[key.trim()];
|
|
455
|
+
if (section && typeof section === 'object') {
|
|
456
|
+
deps.push(...Object.keys(section));
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
catch {
|
|
461
|
+
// invalid JSON
|
|
462
|
+
}
|
|
463
|
+
break;
|
|
464
|
+
}
|
|
465
|
+
case 'text': {
|
|
466
|
+
const extractKey = depFilePattern.extractDeps;
|
|
467
|
+
if (extractKey === 'line') {
|
|
468
|
+
// requirements.txt style: each line is "pkg==version" or "pkg>=version"
|
|
469
|
+
for (const line of content.split('\n')) {
|
|
470
|
+
const trimmed = line.trim();
|
|
471
|
+
if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('-'))
|
|
472
|
+
continue;
|
|
473
|
+
const pkgName = trimmed.split(/[=<>~!]/)[0].trim();
|
|
474
|
+
if (pkgName)
|
|
475
|
+
deps.push(pkgName);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
else if (extractKey === 'require') {
|
|
479
|
+
// go.mod style: "require (...)" block or "require pkg version"
|
|
480
|
+
const blockMatch = content.match(/require\s*\(([\s\S]*?)\)/);
|
|
481
|
+
if (blockMatch) {
|
|
482
|
+
for (const line of blockMatch[1].split('\n')) {
|
|
483
|
+
const parts = line.trim().split(/\s+/);
|
|
484
|
+
if (parts.length >= 1 && parts[0])
|
|
485
|
+
deps.push(parts[0]);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
// Single-line require
|
|
489
|
+
const singleRe = /require\s+(\S+)\s+\S+/g;
|
|
490
|
+
let m;
|
|
491
|
+
while ((m = singleRe.exec(content)) !== null) {
|
|
492
|
+
deps.push(m[1]);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
else if (extractKey === 'target_link_libraries,find_package' || extractKey === 'find_package,target_link_libraries') {
|
|
496
|
+
// CMakeLists.txt style
|
|
497
|
+
const findPkgRe = /find_package\s*\(\s*(\w+)/g;
|
|
498
|
+
let fm;
|
|
499
|
+
while ((fm = findPkgRe.exec(content)) !== null) {
|
|
500
|
+
deps.push(fm[1]);
|
|
501
|
+
}
|
|
502
|
+
const tllRe = /target_link_libraries\s*\(\s*\w+\s+(?:PUBLIC|PRIVATE|INTERFACE)\s+(\w+)/g;
|
|
503
|
+
let tm;
|
|
504
|
+
while ((tm = tllRe.exec(content)) !== null) {
|
|
505
|
+
deps.push(tm[1]);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
break;
|
|
509
|
+
}
|
|
510
|
+
case 'toml': {
|
|
511
|
+
const extractKey = depFilePattern.extractDeps;
|
|
512
|
+
// Simple TOML section parser for [dependencies] style
|
|
513
|
+
const sectionNames = extractKey.split(',');
|
|
514
|
+
for (const sectionName of sectionNames) {
|
|
515
|
+
const section = sectionName.trim();
|
|
516
|
+
// Match [section] or [section.sub]
|
|
517
|
+
const sectionRe = new RegExp(`\\[${section.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\]\\s*\\n([\\s\\S]*?)(?:\\n\\[|$)`, 'm');
|
|
518
|
+
const m = content.match(sectionRe);
|
|
519
|
+
if (m) {
|
|
520
|
+
for (const line of m[1].split('\n')) {
|
|
521
|
+
const kvMatch = line.match(/^\s*(\w[\w.-]*)\s*=/);
|
|
522
|
+
if (kvMatch) {
|
|
523
|
+
deps.push(kvMatch[1]);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
// Also try: section.sub.key style (e.g. project.dependencies)
|
|
528
|
+
if (section.includes('.')) {
|
|
529
|
+
// handled by the section match above with simple bracket matching
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
break;
|
|
533
|
+
}
|
|
534
|
+
case 'xml': {
|
|
535
|
+
// Extract <dependency> blocks from pom.xml
|
|
536
|
+
const depRe = /<dependency>\s*<groupId>([^<]+)<\/groupId>\s*<artifactId>([^<]+)<\/artifactId>/g;
|
|
537
|
+
let dm;
|
|
538
|
+
while ((dm = depRe.exec(content)) !== null) {
|
|
539
|
+
deps.push(`${dm[1]}:${dm[2]}`);
|
|
540
|
+
}
|
|
541
|
+
break;
|
|
542
|
+
}
|
|
543
|
+
case 'groovy': {
|
|
544
|
+
// Extract implementation/api lines from build.gradle
|
|
545
|
+
const extractKey = depFilePattern.extractDeps;
|
|
546
|
+
const keys = extractKey.split(',').map(k => k.trim()).join('|');
|
|
547
|
+
const gradleRe = new RegExp(`(?:${keys})\\s+['"]([^'"]+)['"]`, 'g');
|
|
548
|
+
let gm;
|
|
549
|
+
while ((gm = gradleRe.exec(content)) !== null) {
|
|
550
|
+
// Format: group:artifact:version
|
|
551
|
+
deps.push(gm[1]);
|
|
552
|
+
}
|
|
553
|
+
break;
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
return [...new Set(deps)];
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* Deduplicate ambiguous relations by (kind, from_file, reference).
|
|
560
|
+
*/
|
|
561
|
+
function dedupAmbiguous(items) {
|
|
562
|
+
const seen = new Set();
|
|
563
|
+
const result = [];
|
|
564
|
+
for (const item of items) {
|
|
565
|
+
const key = `${item.kind}|${item.severity ?? ''}|${item.from_file}|${item.reference}`;
|
|
566
|
+
if (!seen.has(key)) {
|
|
567
|
+
seen.add(key);
|
|
568
|
+
result.push(item);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
return result;
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* Print compact text output
|
|
575
|
+
*/
|
|
576
|
+
function printCompact(result) {
|
|
577
|
+
console.log(`Project languages: ${result.project_languages.join(', ') || '(none detected)'}`);
|
|
578
|
+
console.log(`Discovered edges: ${result.summary.total_discovered}`);
|
|
579
|
+
console.log(` High confidence (>=0.7): ${result.summary.high_confidence}`);
|
|
580
|
+
console.log(` Low confidence (<0.7): ${result.summary.low_confidence}`);
|
|
581
|
+
console.log(`Ambiguous references: ${result.ambiguous.length}`);
|
|
582
|
+
console.log(` Actionable (project files with no card): ${result.summary.actionable}`);
|
|
583
|
+
console.log(` Informational (external packages): ${result.summary.external_refs}`);
|
|
584
|
+
if (result.discovered_edges.length > 0) {
|
|
585
|
+
console.log('\nInferred Edges:');
|
|
586
|
+
for (const edge of result.discovered_edges) {
|
|
587
|
+
const icon = edge.confidence >= 0.8 ? '●' : edge.confidence >= 0.7 ? '○' : '◌';
|
|
588
|
+
console.log(` ${icon} ${edge.from_id} → ${edge.to_id} (${edge.type}, conf ${edge.confidence.toFixed(1)}, ${edge.evidence.language})`);
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
if (result.ambiguous.length > 0) {
|
|
592
|
+
// Show actionable items first so the agent's review is signal-first
|
|
593
|
+
const actionable = result.ambiguous.filter(a => a.severity === 'actionable');
|
|
594
|
+
const informational = result.ambiguous.filter(a => a.severity === 'informational');
|
|
595
|
+
const other = result.ambiguous.filter(a => !a.severity);
|
|
596
|
+
if (actionable.length > 0) {
|
|
597
|
+
console.log('\n⚠ Actionable (consider creating a card):');
|
|
598
|
+
for (const amb of actionable) {
|
|
599
|
+
const tag = `[${amb.kind}]`;
|
|
600
|
+
if (amb.kind === 'unmatched_target') {
|
|
601
|
+
console.log(` ${tag} ${amb.from_file}: "${amb.reference}" → no matching card (${amb.language})`);
|
|
602
|
+
}
|
|
603
|
+
else if (amb.kind === 'multiple_targets') {
|
|
604
|
+
console.log(` ${tag} ${amb.from_file}: "${amb.reference}" → ${amb.suggested_targets?.join(', ')} (${amb.language})`);
|
|
605
|
+
}
|
|
606
|
+
else if (amb.kind === 'low_confidence') {
|
|
607
|
+
console.log(` ${tag} ${amb.reference} (conf ${amb.confidence?.toFixed(1)})`);
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
if (informational.length > 0) {
|
|
612
|
+
console.log(`\n· Informational (external/builtin, no action): ${informational.length} item(s)`);
|
|
613
|
+
// Show up to 5, then a count
|
|
614
|
+
for (const amb of informational.slice(0, 5)) {
|
|
615
|
+
console.log(` [external] "${amb.reference}" from ${path.basename(amb.from_file)}`);
|
|
616
|
+
}
|
|
617
|
+
if (informational.length > 5) {
|
|
618
|
+
console.log(` ... and ${informational.length - 5} more (use --format json to see all)`);
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
if (other.length > 0) {
|
|
622
|
+
console.log('\nOther:');
|
|
623
|
+
for (const amb of other) {
|
|
624
|
+
const tag = `[${amb.kind}]`;
|
|
625
|
+
console.log(` ${tag} ${amb.reference} (${amb.language})`);
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/discover/index.ts"],"names":[],"mappings":"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"}
|