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.
@@ -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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"}