@blamechris/repo-memory 0.12.0 → 0.14.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.
Files changed (76) hide show
  1. package/README.md +2 -2
  2. package/dist/cache/generation.d.ts +50 -0
  3. package/dist/cache/generation.d.ts.map +1 -0
  4. package/dist/cache/generation.js +62 -0
  5. package/dist/cache/generation.js.map +1 -0
  6. package/dist/cache/invalidation.d.ts +3 -1
  7. package/dist/cache/invalidation.d.ts.map +1 -1
  8. package/dist/cache/invalidation.js +4 -5
  9. package/dist/cache/invalidation.js.map +1 -1
  10. package/dist/cache/ranking.d.ts +51 -6
  11. package/dist/cache/ranking.d.ts.map +1 -1
  12. package/dist/cache/ranking.js +92 -18
  13. package/dist/cache/ranking.js.map +1 -1
  14. package/dist/cache/store.d.ts +32 -0
  15. package/dist/cache/store.d.ts.map +1 -1
  16. package/dist/cache/store.js +110 -19
  17. package/dist/cache/store.js.map +1 -1
  18. package/dist/graph/dependency-graph.d.ts +14 -0
  19. package/dist/graph/dependency-graph.d.ts.map +1 -1
  20. package/dist/graph/dependency-graph.js +70 -5
  21. package/dist/graph/dependency-graph.js.map +1 -1
  22. package/dist/graph/refresh.d.ts +21 -0
  23. package/dist/graph/refresh.d.ts.map +1 -0
  24. package/dist/graph/refresh.js +101 -0
  25. package/dist/graph/refresh.js.map +1 -0
  26. package/dist/indexer/imports.d.ts.map +1 -1
  27. package/dist/indexer/imports.js +152 -86
  28. package/dist/indexer/imports.js.map +1 -1
  29. package/dist/indexer/project-map.d.ts +0 -2
  30. package/dist/indexer/project-map.d.ts.map +1 -1
  31. package/dist/indexer/project-map.js +0 -3
  32. package/dist/indexer/project-map.js.map +1 -1
  33. package/dist/indexer/source-extensions.d.ts +10 -0
  34. package/dist/indexer/source-extensions.d.ts.map +1 -0
  35. package/dist/indexer/source-extensions.js +28 -0
  36. package/dist/indexer/source-extensions.js.map +1 -0
  37. package/dist/indexer/summarize.d.ts +16 -1
  38. package/dist/indexer/summarize.d.ts.map +1 -1
  39. package/dist/indexer/summarize.js +38 -23
  40. package/dist/indexer/summarize.js.map +1 -1
  41. package/dist/persistence/db.d.ts.map +1 -1
  42. package/dist/persistence/db.js +78 -13
  43. package/dist/persistence/db.js.map +1 -1
  44. package/dist/server.js +18 -11
  45. package/dist/server.js.map +1 -1
  46. package/dist/tools/batch-file-summaries.d.ts +0 -1
  47. package/dist/tools/batch-file-summaries.d.ts.map +1 -1
  48. package/dist/tools/batch-file-summaries.js +1 -1
  49. package/dist/tools/batch-file-summaries.js.map +1 -1
  50. package/dist/tools/force-reread.d.ts.map +1 -1
  51. package/dist/tools/force-reread.js +7 -0
  52. package/dist/tools/force-reread.js.map +1 -1
  53. package/dist/tools/get-changed-files.d.ts.map +1 -1
  54. package/dist/tools/get-changed-files.js +23 -5
  55. package/dist/tools/get-changed-files.js.map +1 -1
  56. package/dist/tools/get-dependency-graph.d.ts +9 -7
  57. package/dist/tools/get-dependency-graph.d.ts.map +1 -1
  58. package/dist/tools/get-dependency-graph.js +51 -74
  59. package/dist/tools/get-dependency-graph.js.map +1 -1
  60. package/dist/tools/get-file-summary.d.ts +2 -3
  61. package/dist/tools/get-file-summary.d.ts.map +1 -1
  62. package/dist/tools/get-file-summary.js +11 -19
  63. package/dist/tools/get-file-summary.js.map +1 -1
  64. package/dist/tools/get-project-map.d.ts.map +1 -1
  65. package/dist/tools/get-project-map.js +9 -1
  66. package/dist/tools/get-project-map.js.map +1 -1
  67. package/dist/tools/get-related-files.d.ts.map +1 -1
  68. package/dist/tools/get-related-files.js +19 -71
  69. package/dist/tools/get-related-files.js.map +1 -1
  70. package/dist/tools/search-by-purpose.d.ts +2 -3
  71. package/dist/tools/search-by-purpose.d.ts.map +1 -1
  72. package/dist/tools/search-by-purpose.js +162 -44
  73. package/dist/tools/search-by-purpose.js.map +1 -1
  74. package/dist/types.d.ts +6 -0
  75. package/dist/types.d.ts.map +1 -1
  76. package/package.json +1 -1
@@ -1,7 +1,124 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { hashContents } from '../cache/hash.js';
1
4
  import { CacheStore } from '../cache/store.js';
5
+ import { ensureSummaryGeneration, summarizeForProject } from '../indexer/summarize.js';
2
6
  import { TelemetryTracker } from '../telemetry/tracker.js';
3
7
  import { toPosix } from '../utils/posix-path.js';
4
- export function searchByPurpose(projectRoot, query, limit, pathPrefix) {
8
+ /** Max exports listed per result; the rest collapse into `exportsTruncated`. */
9
+ const MAX_EXPORTS_PER_RESULT = 5;
10
+ /**
11
+ * Lowercase word tokens of an identifier or free-text field: splits camelCase
12
+ * and PascalCase boundaries, snake_case, kebab-case, dots, and path
13
+ * separators. "CacheStore" -> ["cache","store"]; "get_file_summary" ->
14
+ * ["get","file","summary"].
15
+ */
16
+ function tokenize(text) {
17
+ return text
18
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
19
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
20
+ .toLowerCase()
21
+ .split(/[^a-z0-9]+/)
22
+ .filter(Boolean);
23
+ }
24
+ /** Terms shorter than this only count on a whole-token match. */
25
+ const MIN_SUBSTRING_TERM = 3;
26
+ /**
27
+ * Match quality of one query term against one field, tiered by specificity:
28
+ * whole token (1.0) > token prefix (0.75) > bare substring (0.5). Short terms
29
+ * must match a whole token — "id" landing inside "validation" is noise, but
30
+ * "id" as an identifier word (findUserById) is a real hit.
31
+ */
32
+ function termQuality(term, tokens, raw) {
33
+ if (tokens.includes(term))
34
+ return 1;
35
+ if (term.length < MIN_SUBSTRING_TERM)
36
+ return 0;
37
+ if (tokens.some((t) => t.startsWith(term)))
38
+ return 0.75;
39
+ if (raw.includes(term))
40
+ return 0.5;
41
+ return 0;
42
+ }
43
+ /**
44
+ * Score a cached entry against the query terms; null when nothing matched.
45
+ * Field weights: purpose 3 > exports 2 > declarations 1 = path 1. Each term
46
+ * contributes its match quality x the field weight, so a whole-word purpose
47
+ * hit outranks any pile of incidental substrings. Path segments count as a
48
+ * field of their own (sans extension) so directory and file names carry the
49
+ * concept signal they naturally encode — src/telemetry/tracker.ts should
50
+ * match "telemetry" even when its summary text doesn't say the word.
51
+ */
52
+ function scoreEntry(path, summary, queryTerms) {
53
+ const fields = [
54
+ {
55
+ name: 'purpose',
56
+ weight: 3,
57
+ tokens: tokenize(summary.purpose),
58
+ raw: summary.purpose.toLowerCase(),
59
+ },
60
+ {
61
+ name: 'exports',
62
+ weight: 2,
63
+ tokens: summary.exports.flatMap(tokenize),
64
+ raw: summary.exports.join(' ').toLowerCase(),
65
+ },
66
+ {
67
+ name: 'declarations',
68
+ weight: 1,
69
+ tokens: summary.topLevelDeclarations.flatMap(tokenize),
70
+ raw: summary.topLevelDeclarations.join(' ').toLowerCase(),
71
+ },
72
+ {
73
+ name: 'path',
74
+ weight: 1,
75
+ tokens: tokenize(path.replace(/\.[a-z0-9]+$/i, '')),
76
+ raw: path.toLowerCase(),
77
+ },
78
+ ];
79
+ const matchedOn = [];
80
+ let score = 0;
81
+ for (const field of fields) {
82
+ let fieldScore = 0;
83
+ for (const term of queryTerms) {
84
+ fieldScore += termQuality(term, field.tokens, field.raw) * field.weight;
85
+ }
86
+ if (fieldScore > 0) {
87
+ matchedOn.push(field.name);
88
+ score += fieldScore;
89
+ }
90
+ }
91
+ return matchedOn.length > 0 ? { matchedOn, score } : null;
92
+ }
93
+ /**
94
+ * Re-hash a matched candidate before serving it (never return stale data).
95
+ * - Missing/unreadable file: evict the dead cache entry and drop the result.
96
+ * - Hash mismatch: regenerate the summary through the standard path (same
97
+ * semantics as get_file_summary's cache-miss branch), re-score it against
98
+ * the query, and keep it only if it still matches.
99
+ */
100
+ async function validateCandidate(projectRoot, store, candidate, queryTerms) {
101
+ let contents;
102
+ try {
103
+ contents = await readFile(join(projectRoot, candidate.entry.path), 'utf-8');
104
+ }
105
+ catch {
106
+ store.deleteEntry(candidate.entry.path);
107
+ return null;
108
+ }
109
+ const currentHash = hashContents(contents);
110
+ if (currentHash === candidate.entry.hash)
111
+ return candidate;
112
+ const summary = await summarizeForProject(projectRoot, candidate.entry.path, contents);
113
+ store.setEntry(candidate.entry.path, currentHash, summary);
114
+ const match = scoreEntry(candidate.entry.path, summary, queryTerms);
115
+ if (!match)
116
+ return null;
117
+ return { entry: candidate.entry, summary, matchedOn: match.matchedOn, score: match.score };
118
+ }
119
+ export async function searchByPurpose(projectRoot, query, limit, pathPrefix) {
120
+ // Never serve summaries from an invalidated generation (audit invariant I5).
121
+ ensureSummaryGeneration(projectRoot);
5
122
  const store = new CacheStore(projectRoot);
6
123
  const effectiveLimit = limit ?? 20;
7
124
  // Optional scope: restrict the search to files at or under a directory/prefix.
@@ -23,57 +140,58 @@ export function searchByPurpose(projectRoot, query, limit, pathPrefix) {
23
140
  })
24
141
  : allEntries;
25
142
  const queryTerms = query.toLowerCase().split(/\s+/).filter(Boolean);
26
- const results = [];
143
+ const candidates = [];
27
144
  for (const entry of entries) {
28
145
  if (!entry.summary)
29
146
  continue;
30
- const matchedOn = [];
31
- let score = 0;
32
- const purpose = entry.summary.purpose.toLowerCase();
33
- const purposeMatches = queryTerms.filter(term => purpose.includes(term));
34
- if (purposeMatches.length > 0) {
35
- matchedOn.push('purpose');
36
- score += purposeMatches.length * 3; // purpose matches weighted highest
37
- }
38
- const exportsLower = entry.summary.exports.map(e => e.toLowerCase());
39
- const exportMatches = queryTerms.filter(term => exportsLower.some(exp => exp.includes(term)));
40
- if (exportMatches.length > 0) {
41
- matchedOn.push('exports');
42
- score += exportMatches.length * 2;
43
- }
44
- const declsLower = entry.summary.topLevelDeclarations.map(d => d.toLowerCase());
45
- const declMatches = queryTerms.filter(term => declsLower.some(decl => decl.includes(term)));
46
- if (declMatches.length > 0) {
47
- matchedOn.push('declarations');
48
- score += declMatches.length;
49
- }
50
- if (matchedOn.length > 0) {
51
- results.push({
52
- path: entry.path,
53
- purpose: entry.summary.purpose,
54
- matchedOn,
55
- exports: entry.summary.exports,
56
- confidence: entry.summary.confidence,
57
- score,
58
- });
147
+ const match = scoreEntry(entry.path, entry.summary, queryTerms);
148
+ if (match) {
149
+ candidates.push({ entry, summary: entry.summary, ...match });
59
150
  }
60
151
  }
61
152
  // Sort by score descending
62
- results.sort((a, b) => b.score - a.score);
63
- const matched = results.slice(0, effectiveLimit);
64
- // Track each matched file as a summary_served event.
65
- // Token estimate: approximate raw file tokens from lineCount (avg ~40 chars/line).
66
- const tracker = new TelemetryTracker(projectRoot);
67
- for (const result of matched) {
68
- const entry = entries.find(e => e.path === result.path);
69
- // Approximate raw file tokens from lineCount (avg ~40 chars/line, ~4 chars/token)
70
- const estimatedRawTokens = entry?.summary ? entry.summary.lineCount * 10 : 0;
71
- tracker.trackEvent('summary_served', result.path, estimatedRawTokens);
153
+ candidates.sort((a, b) => b.score - a.score);
154
+ // Validate before serving: walk the sorted candidates in score order until
155
+ // `limit` survive, so slots freed by dropped (deleted or no-longer-matching)
156
+ // files are backfilled from the remaining candidates in one pass.
157
+ const served = [];
158
+ for (const candidate of candidates) {
159
+ if (served.length >= effectiveLimit)
160
+ break;
161
+ const validated = await validateCandidate(projectRoot, store, candidate, queryTerms);
162
+ if (validated)
163
+ served.push(validated);
164
+ }
165
+ // Telemetry: ONE summary_served event per query, not per hit. Per-hit
166
+ // tracking booked every matched file as a full read avoided, inflating
167
+ // "tokens saved" by up to `limit`x. The realistic counterfactual for one
168
+ // search is the agent grepping and then reading roughly ONE candidate file
169
+ // in full, so we book the estimated raw-content tokens of one average
170
+ // served file (lineCount x ~40 chars/line / ~4 chars/token = lineCount x 10).
171
+ // Best-effort: a telemetry write failure (e.g. locked DB) must never fail
172
+ // the read path.
173
+ if (served.length > 0) {
174
+ try {
175
+ const avgLineCount = served.reduce((sum, c) => sum + c.summary.lineCount, 0) / served.length;
176
+ new TelemetryTracker(projectRoot).trackEvent('summary_served', served[0].entry.path, Math.round(avgLineCount * 10), { query, resultCount: served.length });
177
+ }
178
+ catch {
179
+ // Telemetry is best-effort on read paths (audit invariant I8).
180
+ }
72
181
  }
73
182
  return {
74
- query,
75
- results: matched.map(({ score: _score, ...rest }) => rest),
76
- totalCached: entries.filter(e => e.summary).length,
183
+ results: served.map((c) => {
184
+ const exports = c.summary.exports;
185
+ const capped = exports.length > MAX_EXPORTS_PER_RESULT;
186
+ return {
187
+ path: c.entry.path,
188
+ purpose: c.summary.purpose,
189
+ exports: capped ? exports.slice(0, MAX_EXPORTS_PER_RESULT) : exports,
190
+ ...(capped ? { exportsTruncated: exports.length } : {}),
191
+ confidence: c.summary.confidence,
192
+ };
193
+ }),
194
+ totalCached: entries.filter((e) => e.summary).length,
77
195
  ...(normalizedPrefix ? { scope: normalizedPrefix } : {}),
78
196
  };
79
197
  }
@@ -1 +1 @@
1
- {"version":3,"file":"search-by-purpose.js","sourceRoot":"","sources":["../../src/tools/search-by-purpose.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search-by-purpose.js","sourceRoot":"","sources":["../../src/tools/search-by-purpose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,gFAAgF;AAChF,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAqBjC;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI;SACR,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC;SACzC,WAAW,EAAE;SACb,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,iEAAiE;AACjE,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B;;;;;GAKG;AACH,SAAS,WAAW,CAAC,IAAY,EAAE,MAAgB,EAAE,GAAW;IAC9D,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,IAAI,CAAC,MAAM,GAAG,kBAAkB;QAAE,OAAO,CAAC,CAAC;IAC/C,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IACnC,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,UAAU,CAAC,IAAY,EAAE,OAAoB,EAAE,UAAoB;IAC1E,MAAM,MAAM,GAAG;QACb;YACE,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;YACjC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE;SACnC;QACD;YACE,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YACzC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;SAC7C;QACD;YACE,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC;YACtD,GAAG,EAAE,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;SAC1D;QACD;YACE,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;YACnD,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE;SACxB;KACF,CAAC;IAEF,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,UAAU,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;QAC1E,CAAC;QACD,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,KAAK,IAAI,UAAU,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC;AASD;;;;;;GAMG;AACH,KAAK,UAAU,iBAAiB,CAC9B,WAAmB,EACnB,KAAiB,EACjB,SAAoB,EACpB,UAAoB;IAEpB,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,WAAW,KAAK,SAAS,CAAC,KAAK,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAE3D,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACvF,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACpE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;AAC7F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,WAAmB,EACnB,KAAa,EACb,KAAc,EACd,UAAmB;IAEnB,6EAA6E;IAC7E,uBAAuB,CAAC,WAAW,CAAC,CAAC;IAErC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE,CAAC;IAEnC,+EAA+E;IAC/E,gFAAgF;IAChF,8EAA8E;IAC9E,+EAA+E;IAC/E,qBAAqB;IACrB,MAAM,gBAAgB,GAAG,UAAU;QACjC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3E,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;IACzC,8EAA8E;IAC9E,gFAAgF;IAChF,oCAAoC;IACpC,MAAM,OAAO,GAAG,gBAAgB;QAC9B,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACtB,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1B,OAAO,CAAC,KAAK,gBAAgB,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,gBAAgB,GAAG,CAAC,CAAC;QACxE,CAAC,CAAC;QACJ,CAAC,CAAC,UAAU,CAAC;IAEf,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpE,MAAM,UAAU,GAAgB,EAAE,CAAC;IAEnC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,SAAS;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAChE,IAAI,KAAK,EAAE,CAAC;YACV,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAE7C,2EAA2E;IAC3E,6EAA6E;IAC7E,kEAAkE;IAClE,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,MAAM,IAAI,cAAc;YAAE,MAAM;QAC3C,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QACrF,IAAI,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,sEAAsE;IACtE,uEAAuE;IACvE,yEAAyE;IACzE,2EAA2E;IAC3E,sEAAsE;IACtE,8EAA8E;IAC9E,0EAA0E;IAC1E,iBAAiB;IACjB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,YAAY,GAChB,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;YAC1E,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAC,UAAU,CAC1C,gBAAgB,EAChB,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EACpB,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,EAC7B,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CACtC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,+DAA+D;QACjE,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACxB,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;YAClC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,sBAAsB,CAAC;YACvD,OAAO;gBACL,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;gBAClB,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO;gBAC1B,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC,OAAO;gBACpE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU;aACjC,CAAC;QACJ,CAAC,CAAC;QACF,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM;QACpD,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC;AACJ,CAAC"}
package/dist/types.d.ts CHANGED
@@ -17,5 +17,11 @@ export interface ImportRef {
17
17
  target: string;
18
18
  specifiers: string[];
19
19
  type: 'static' | 'dynamic' | 're-export';
20
+ /**
21
+ * True when the target does not resolve to a file inside the project
22
+ * (bare module specifiers, builtins, unresolvable relative paths).
23
+ * External refs are excluded from the dependency graph.
24
+ */
25
+ external?: boolean;
20
26
  }
21
27
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;CAC1C"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IACzC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blamechris/repo-memory",
3
- "version": "0.12.0",
3
+ "version": "0.14.0",
4
4
  "description": "MCP server that gives AI coding agents persistent memory about your codebase",
5
5
  "type": "module",
6
6
  "main": "dist/server.js",