purecontext-mcp 1.5.2 → 1.11.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 (196) hide show
  1. package/AGENT_INSTRUCTIONS.md +18 -10
  2. package/AGENT_REFERENCE.md +684 -561
  3. package/CHANGELOG.md +567 -445
  4. package/CODE-HISTORY.md +29 -1
  5. package/FRAMEWORK-ADAPTERS.md +368 -351
  6. package/FULL-INSTALLATION-GUIDE.md +351 -341
  7. package/README.md +411 -339
  8. package/REFACTORING-SAFELY.md +338 -279
  9. package/SAFE-CHANGES.md +208 -156
  10. package/USER-GUIDE.md +3 -1
  11. package/WHY-PURECONTEXT.md +103 -73
  12. package/WORKFLOW-PR-REVIEW.md +245 -199
  13. package/dist/adapters/astro-preprocessor.d.ts +25 -0
  14. package/dist/adapters/astro-preprocessor.d.ts.map +1 -0
  15. package/dist/adapters/astro-preprocessor.js +50 -0
  16. package/dist/adapters/astro-preprocessor.js.map +1 -0
  17. package/dist/adapters/astro.d.ts +13 -0
  18. package/dist/adapters/astro.d.ts.map +1 -0
  19. package/dist/adapters/astro.js +83 -0
  20. package/dist/adapters/astro.js.map +1 -0
  21. package/dist/adapters/detect-utils.d.ts +38 -0
  22. package/dist/adapters/detect-utils.d.ts.map +1 -0
  23. package/dist/adapters/detect-utils.js +95 -0
  24. package/dist/adapters/detect-utils.js.map +1 -0
  25. package/dist/adapters/nuxt.d.ts +20 -0
  26. package/dist/adapters/nuxt.d.ts.map +1 -1
  27. package/dist/adapters/nuxt.js +128 -13
  28. package/dist/adapters/nuxt.js.map +1 -1
  29. package/dist/adapters/svelte-preprocessor.d.ts +29 -0
  30. package/dist/adapters/svelte-preprocessor.d.ts.map +1 -0
  31. package/dist/adapters/svelte-preprocessor.js +83 -0
  32. package/dist/adapters/svelte-preprocessor.js.map +1 -0
  33. package/dist/adapters/svelte.d.ts +13 -0
  34. package/dist/adapters/svelte.d.ts.map +1 -0
  35. package/dist/adapters/svelte.js +96 -0
  36. package/dist/adapters/svelte.js.map +1 -0
  37. package/dist/adapters/vue.d.ts.map +1 -1
  38. package/dist/adapters/vue.js +87 -20
  39. package/dist/adapters/vue.js.map +1 -1
  40. package/dist/bin.d.ts +16 -0
  41. package/dist/bin.d.ts.map +1 -0
  42. package/dist/bin.js +21 -0
  43. package/dist/bin.js.map +1 -0
  44. package/dist/cli/hooks.d.ts +2 -2
  45. package/dist/cli/hooks.d.ts.map +1 -1
  46. package/dist/cli/hooks.js +123 -135
  47. package/dist/cli/hooks.js.map +1 -1
  48. package/dist/cli/install-writers.d.ts.map +1 -1
  49. package/dist/cli/install-writers.js +281 -36
  50. package/dist/cli/install-writers.js.map +1 -1
  51. package/dist/cli/resolve-node.d.ts +53 -0
  52. package/dist/cli/resolve-node.d.ts.map +1 -0
  53. package/dist/cli/resolve-node.js +84 -0
  54. package/dist/cli/resolve-node.js.map +1 -0
  55. package/dist/config/config-loader.js +24 -0
  56. package/dist/config/config-loader.js.map +1 -1
  57. package/dist/config/config-schema.d.ts +71 -0
  58. package/dist/config/config-schema.d.ts.map +1 -1
  59. package/dist/config/config-schema.js +102 -0
  60. package/dist/config/config-schema.js.map +1 -1
  61. package/dist/core/db/api-keys.d.ts +1 -1
  62. package/dist/core/db/api-keys.d.ts.map +1 -1
  63. package/dist/core/db/api-keys.js +39 -39
  64. package/dist/core/db/api-keys.js.map +1 -1
  65. package/dist/core/db/co-change-store.d.ts +34 -0
  66. package/dist/core/db/co-change-store.d.ts.map +1 -0
  67. package/dist/core/db/co-change-store.js +78 -0
  68. package/dist/core/db/co-change-store.js.map +1 -0
  69. package/dist/core/db/schema.d.ts +3 -3
  70. package/dist/core/db/schema.d.ts.map +1 -1
  71. package/dist/core/db/schema.js +12 -30
  72. package/dist/core/db/schema.js.map +1 -1
  73. package/dist/core/db/sqlite-loader.d.ts +51 -0
  74. package/dist/core/db/sqlite-loader.d.ts.map +1 -0
  75. package/dist/core/db/sqlite-loader.js +94 -0
  76. package/dist/core/db/sqlite-loader.js.map +1 -0
  77. package/dist/core/db/wasm-sqlite.d.ts +4 -0
  78. package/dist/core/db/wasm-sqlite.d.ts.map +1 -0
  79. package/dist/core/db/wasm-sqlite.js +270 -0
  80. package/dist/core/db/wasm-sqlite.js.map +1 -0
  81. package/dist/core/diff-parser.d.ts.map +1 -1
  82. package/dist/core/diff-parser.js +6 -1
  83. package/dist/core/diff-parser.js.map +1 -1
  84. package/dist/core/git-log-reader.d.ts +28 -0
  85. package/dist/core/git-log-reader.d.ts.map +1 -1
  86. package/dist/core/git-log-reader.js +74 -3
  87. package/dist/core/git-log-reader.js.map +1 -1
  88. package/dist/core/index-manager.d.ts.map +1 -1
  89. package/dist/core/index-manager.js +29 -3
  90. package/dist/core/index-manager.js.map +1 -1
  91. package/dist/core/indexing-worker.d.ts +2 -0
  92. package/dist/core/indexing-worker.d.ts.map +1 -1
  93. package/dist/core/indexing-worker.js +2 -0
  94. package/dist/core/indexing-worker.js.map +1 -1
  95. package/dist/core/watcher/file-watcher.d.ts +6 -0
  96. package/dist/core/watcher/file-watcher.d.ts.map +1 -1
  97. package/dist/core/watcher/file-watcher.js +11 -1
  98. package/dist/core/watcher/file-watcher.js.map +1 -1
  99. package/dist/graph/path-resolver.js +86 -17
  100. package/dist/graph/path-resolver.js.map +1 -1
  101. package/dist/index.d.ts +3 -0
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.js +11 -1
  104. package/dist/index.js.map +1 -1
  105. package/dist/node-guard.d.ts +15 -0
  106. package/dist/node-guard.d.ts.map +1 -0
  107. package/dist/node-guard.js +33 -0
  108. package/dist/node-guard.js.map +1 -0
  109. package/dist/server/admin-api.d.ts +1 -1
  110. package/dist/server/admin-api.d.ts.map +1 -1
  111. package/dist/server/admin-api.js +2 -2
  112. package/dist/server/admin-api.js.map +1 -1
  113. package/dist/server/auth/api-key.d.ts +1 -1
  114. package/dist/server/auth/api-key.d.ts.map +1 -1
  115. package/dist/server/mcp-server.d.ts.map +1 -1
  116. package/dist/server/mcp-server.js +25 -0
  117. package/dist/server/mcp-server.js.map +1 -1
  118. package/dist/server/tools/analyze-diff.d.ts +8 -0
  119. package/dist/server/tools/analyze-diff.d.ts.map +1 -1
  120. package/dist/server/tools/analyze-diff.js +80 -16
  121. package/dist/server/tools/analyze-diff.js.map +1 -1
  122. package/dist/server/tools/change-synthesis.d.ts +90 -0
  123. package/dist/server/tools/change-synthesis.d.ts.map +1 -0
  124. package/dist/server/tools/change-synthesis.js +236 -0
  125. package/dist/server/tools/change-synthesis.js.map +1 -0
  126. package/dist/server/tools/co-change.d.ts +65 -0
  127. package/dist/server/tools/co-change.d.ts.map +1 -0
  128. package/dist/server/tools/co-change.js +146 -0
  129. package/dist/server/tools/co-change.js.map +1 -0
  130. package/dist/server/tools/compare-change-impact.d.ts +58 -0
  131. package/dist/server/tools/compare-change-impact.d.ts.map +1 -0
  132. package/dist/server/tools/compare-change-impact.js +0 -0
  133. package/dist/server/tools/compare-change-impact.js.map +1 -0
  134. package/dist/server/tools/find-refactoring-opportunities.d.ts +1 -1
  135. package/dist/server/tools/get-architecture-snapshot.d.ts.map +1 -1
  136. package/dist/server/tools/get-architecture-snapshot.js +28 -14
  137. package/dist/server/tools/get-architecture-snapshot.js.map +1 -1
  138. package/dist/server/tools/get-churn-metrics.d.ts.map +1 -1
  139. package/dist/server/tools/get-churn-metrics.js +1 -12
  140. package/dist/server/tools/get-churn-metrics.js.map +1 -1
  141. package/dist/server/tools/get-co-change.d.ts +37 -0
  142. package/dist/server/tools/get-co-change.d.ts.map +1 -0
  143. package/dist/server/tools/get-co-change.js +120 -0
  144. package/dist/server/tools/get-co-change.js.map +1 -0
  145. package/dist/server/tools/get-context-bundle.d.ts.map +1 -1
  146. package/dist/server/tools/get-context-bundle.js +56 -3
  147. package/dist/server/tools/get-context-bundle.js.map +1 -1
  148. package/dist/server/tools/get-entry-points.d.ts +1 -1
  149. package/dist/server/tools/get-symbol-risk.d.ts +25 -0
  150. package/dist/server/tools/get-symbol-risk.d.ts.map +1 -0
  151. package/dist/server/tools/get-symbol-risk.js +60 -0
  152. package/dist/server/tools/get-symbol-risk.js.map +1 -0
  153. package/dist/server/tools/get-symbol-source.d.ts +2 -0
  154. package/dist/server/tools/get-symbol-source.d.ts.map +1 -1
  155. package/dist/server/tools/get-symbol-source.js +18 -1
  156. package/dist/server/tools/get-symbol-source.js.map +1 -1
  157. package/dist/server/tools/index-repo.d.ts.map +1 -1
  158. package/dist/server/tools/index-repo.js +8 -2
  159. package/dist/server/tools/index-repo.js.map +1 -1
  160. package/dist/server/tools/prepare-change.d.ts +61 -0
  161. package/dist/server/tools/prepare-change.d.ts.map +1 -0
  162. package/dist/server/tools/prepare-change.js +262 -0
  163. package/dist/server/tools/prepare-change.js.map +1 -0
  164. package/dist/server/tools/search-symbols.d.ts +2 -0
  165. package/dist/server/tools/search-symbols.d.ts.map +1 -1
  166. package/dist/server/tools/search-symbols.js +33 -0
  167. package/dist/server/tools/search-symbols.js.map +1 -1
  168. package/dist/server/tools/symbol-lines.d.ts +25 -0
  169. package/dist/server/tools/symbol-lines.d.ts.map +1 -0
  170. package/dist/server/tools/symbol-lines.js +40 -0
  171. package/dist/server/tools/symbol-lines.js.map +1 -0
  172. package/dist/server/tools/symbol-risk.d.ts +109 -0
  173. package/dist/server/tools/symbol-risk.d.ts.map +1 -0
  174. package/dist/server/tools/symbol-risk.js +251 -0
  175. package/dist/server/tools/symbol-risk.js.map +1 -0
  176. package/dist/server/tools/verify-change.d.ts +40 -0
  177. package/dist/server/tools/verify-change.d.ts.map +1 -0
  178. package/dist/server/tools/verify-change.js +149 -0
  179. package/dist/server/tools/verify-change.js.map +1 -0
  180. package/dist/version.d.ts +1 -1
  181. package/dist/version.d.ts.map +1 -1
  182. package/dist/version.js +1 -1
  183. package/dist/version.js.map +1 -1
  184. package/docs/01-introduction.md +2 -2
  185. package/docs/02-installation.md +97 -89
  186. package/docs/03-quick-start.md +138 -135
  187. package/docs/04-configuration.md +247 -214
  188. package/docs/05-cli-reference.md +236 -219
  189. package/docs/06-tools-reference.md +902 -499
  190. package/docs/14-transport-modes.md +170 -167
  191. package/docs/18-git-history.md +43 -0
  192. package/docs/23-performance.md +123 -121
  193. package/docs/26-troubleshooting.md +249 -234
  194. package/grammars/README.md +88 -0
  195. package/package.json +7 -25
  196. package/AGENT_INSTRUCTIONS_SHORT.md +0 -150
@@ -16,12 +16,16 @@ import { getFileContent } from '../../core/db/file-store.js';
16
16
  import { getBlastRadius } from '../../graph/graph-traversal.js';
17
17
  import { parseDiff, getChangedNewRanges, getAddedNewLines, parseDeletedSymbolNames, } from '../../core/diff-parser.js';
18
18
  import { buildMeta } from './_meta.js';
19
+ import { synthesizeChange } from './change-synthesis.js';
19
20
  export const name = 'analyze_diff';
20
- export const description = 'Parse a unified git diff and identify all symbols that are added, modified, ' +
21
- 'signature-changed, or deleted, then calculate the downstream blast radius. ' +
22
- 'Returns a reviewPriority rating (low / medium / high / critical) derived from ' +
23
- 'the number of public API surface changes and the size of the impacted dependency ' +
24
- 'graph. Most useful in CI pipelines and AI-assisted PR review workflows.';
21
+ export const description = 'Parse a unified git diff and produce an impact-aware change report: which ' +
22
+ 'symbols are added, modified, signature-changed, or deleted, the downstream ' +
23
+ 'blast radius, composite symbol risk, historically co-changing files MISSING ' +
24
+ 'from the diff (the senior-reviewer "you forgot to touch X" signal), ' +
25
+ 'recommended tests, coverage gaps, and architectural flags (cycles / layer ' +
26
+ 'crossings the change sits on). Returns a reviewPriority rating ' +
27
+ '(low / medium / high / critical). Impact-aware sections default ON and are ' +
28
+ 'individually switchable for cheap runs. Most useful in CI and AI-assisted PR review.';
25
29
  export const inputSchema = {
26
30
  repoId: z.string().describe('Repo ID from index_folder or resolve_repo'),
27
31
  diff: z
@@ -38,6 +42,22 @@ export const inputSchema = {
38
42
  .max(5)
39
43
  .optional()
40
44
  .describe('Max dependency hops for blast-radius walk (default 2)'),
45
+ includeRisk: z
46
+ .boolean()
47
+ .optional()
48
+ .describe('Score composite symbol risk for changed symbols (default true)'),
49
+ includeCoChangeGaps: z
50
+ .boolean()
51
+ .optional()
52
+ .describe('Flag historically co-changing files missing from the diff (default true)'),
53
+ includeTests: z
54
+ .boolean()
55
+ .optional()
56
+ .describe('Recommend tests + report coverage gaps for changed symbols (default true)'),
57
+ includeArchitectureFlags: z
58
+ .boolean()
59
+ .optional()
60
+ .describe('Flag cycles / layer crossings the changed files sit on (default true)'),
41
61
  };
42
62
  // ─── Helpers ──────────────────────────────────────────────────────────────────
43
63
  /**
@@ -105,27 +125,33 @@ function detectOldSignature(removedContentLines, currentSignature) {
105
125
  /**
106
126
  * Derive the review priority from the analysis results.
107
127
  *
128
+ * Folds the Phase 77 impact signals (composite risk band + coverage gaps) into
129
+ * the original signature-break/blast heuristic. The enum is unchanged
130
+ * (low/medium/high/critical) so existing CI consumers keep working; when risk
131
+ * is not computed (riskBand undefined) the derivation reduces to the original.
132
+ *
108
133
  * priority condition
109
134
  * ──────── ─────────────────────────────────────────────────────────
110
- * critical ≥1 signature break AND blast radius > 10 files
111
- * high ≥1 signature break OR blast radius > 5 files
112
- * medium implementation changes with blast radius 1–5 files
113
- * low changes to files with no importers (blast radius 0)
135
+ * critical ≥1 signature break AND (blast > 10 files OR risk band high)
136
+ * high ≥1 signature break OR blast > 5 files OR risk band high
137
+ * medium blast 1–5 files OR risk band review OR ≥1 coverage gap
138
+ * low none of the above
114
139
  */
115
- function computeReviewPriority(signatureBreaks, blastFilesImpacted) {
140
+ function computeReviewPriority(signatureBreaks, blastFilesImpacted, riskBand, coverageGapCount) {
116
141
  const blast = blastFilesImpacted ?? 0;
117
- if (signatureBreaks > 0 && blast > 10)
142
+ const highRisk = riskBand === 'high';
143
+ if (signatureBreaks > 0 && (blast > 10 || highRisk))
118
144
  return 'critical';
119
- if (signatureBreaks > 0 || blast > 5)
145
+ if (signatureBreaks > 0 || blast > 5 || highRisk)
120
146
  return 'high';
121
- if (blast >= 1 && blast <= 5)
147
+ if ((blast >= 1 && blast <= 5) || riskBand === 'review' || coverageGapCount > 0)
122
148
  return 'medium';
123
149
  return 'low';
124
150
  }
125
151
  // ─── Handler ──────────────────────────────────────────────────────────────────
126
152
  export async function handler(args) {
127
153
  const t0 = Date.now();
128
- const { repoId, diff, includeBlastRadius = true, blastRadiusDepth = 2, } = args;
154
+ const { repoId, diff, includeBlastRadius = true, blastRadiusDepth = 2, includeRisk = true, includeCoChangeGaps = true, includeTests = true, includeArchitectureFlags = true, } = args;
129
155
  // ── 1. Parse the diff ──────────────────────────────────────────────────────
130
156
  const fileDiffs = parseDiff(diff);
131
157
  if (fileDiffs.length === 0) {
@@ -285,8 +311,30 @@ export async function handler(args) {
285
311
  impactedFiles: [...impactedFileSet].sort(),
286
312
  };
287
313
  }
314
+ // ── 4. Change-impact synthesis (Phase 77) ──────────────────────────────────
315
+ // Built on top of the already-correct symbol-change list. Each section is
316
+ // individually switchable; when all are off we skip synthesis entirely so the
317
+ // output reduces to the original shape.
318
+ const anySynthesis = includeRisk || includeCoChangeGaps || includeTests || includeArchitectureFlags;
319
+ let synthesis;
320
+ if (anySynthesis) {
321
+ const changedSymbolIds = changedSymbols
322
+ .filter((s) => s.symbolId && s.changeType !== 'deleted')
323
+ .map((s) => s.symbolId);
324
+ const changedFilePaths = [
325
+ ...new Set(changedSymbols.map((s) => s.filePath).filter((p) => !!p)),
326
+ ];
327
+ synthesis = synthesizeChange(db, repoId, {
328
+ changedSymbolIds,
329
+ changedFilePaths,
330
+ includeRisk,
331
+ includeCoChangeGaps,
332
+ includeTests,
333
+ includeArchitectureFlags,
334
+ });
335
+ }
288
336
  db.close();
289
- // ── 4. Build summary ───────────────────────────────────────────────────────
337
+ // ── 5. Build summary ───────────────────────────────────────────────────────
290
338
  const summary = {
291
339
  filesChanged: new Set(fileDiffs.map((f) => f.newPath ?? f.oldPath)).size,
292
340
  symbolsAdded: changedSymbols.filter((s) => s.changeType === 'added').length,
@@ -294,7 +342,9 @@ export async function handler(args) {
294
342
  symbolsDeleted: changedSymbols.filter((s) => s.changeType === 'deleted').length,
295
343
  signatureBreaks: changedSymbols.filter((s) => s.changeType === 'signature_changed').length,
296
344
  };
297
- const reviewPriority = computeReviewPriority(summary.signatureBreaks, blastRadiusResult?.filesImpacted);
345
+ const riskBand = includeRisk ? synthesis?.aggregateRisk.band : undefined;
346
+ const coverageGapCount = includeTests ? (synthesis?.coverageGaps.length ?? 0) : 0;
347
+ const reviewPriority = computeReviewPriority(summary.signatureBreaks, blastRadiusResult?.filesImpacted, riskBand, coverageGapCount);
298
348
  const output = {
299
349
  summary,
300
350
  changedSymbols,
@@ -304,6 +354,20 @@ export async function handler(args) {
304
354
  if (blastRadiusResult !== undefined) {
305
355
  output.blastRadius = blastRadiusResult;
306
356
  }
357
+ // Attach only the synthesis sections whose toggle is on (additive output).
358
+ if (synthesis) {
359
+ if (includeRisk)
360
+ output.risk = synthesis.aggregateRisk;
361
+ if (includeCoChangeGaps)
362
+ output.missingCoChange = synthesis.missingCoChange;
363
+ if (includeTests) {
364
+ output.recommendedTests = synthesis.recommendedTests;
365
+ output.coverageGaps = synthesis.coverageGaps;
366
+ }
367
+ if (includeArchitectureFlags)
368
+ output.architecturalFlags = synthesis.architecturalFlags;
369
+ output.signalQuality = synthesis.signalQuality;
370
+ }
307
371
  return { content: [{ type: 'text', text: JSON.stringify(output, null, 2) }] };
308
372
  }
309
373
  //# sourceMappingURL=analyze-diff.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-diff.js","sourceRoot":"","sources":["../../../src/server/tools/analyze-diff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyze-diff.js","sourceRoot":"","sources":["../../../src/server/tools/analyze-diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * change-synthesis.ts
3
+ *
4
+ * The shared "change-impact synthesis" core (Phase 77). Pure, MCP-free, and
5
+ * unit-testable: given the set of symbols + files a change touches, it fuses
6
+ * PureContext's existing risk primitives into one impact-aware report —
7
+ *
8
+ * aggregateRisk — composite per-symbol risk (Phase 76) over the changed
9
+ * symbols, with the max band + the top offenders.
10
+ * missingCoChange — the senior-reviewer instinct: files that *historically*
11
+ * move with the edited files but are NOT in this change
12
+ * ("you touched refundService but ledgerService usually
13
+ * moves with it — and it's not here"). Suppressed entirely
14
+ * on thin/squashed history (never invents warnings).
15
+ * recommendedTests — test files that exercise the changed symbols, plus
16
+ * co-changing test files.
17
+ * coverageGaps — changed symbols with no detected test coverage.
18
+ * architecturalFlags — does the change currently sit on an import cycle / cross
19
+ * a layer boundary. These are CURRENT-STATE flags, not
20
+ * "regressions introduced by the diff" (a before/after
21
+ * graph delta is deferred to compare_change_impact).
22
+ *
23
+ * This is the engine that both `analyze_diff` (post-edit) and Phase B's
24
+ * `prepare_change` (pre-edit) consume — keep it free of tool/transport concerns.
25
+ *
26
+ * Everything is bounded by caps (token discipline) and built against a single
27
+ * shared RiskContext (perf — score N symbols against one set of repo
28
+ * distributions instead of recomputing per symbol).
29
+ */
30
+ import type Database from 'better-sqlite3';
31
+ export interface ChangeSynthesisInput {
32
+ /** Resolved symbol ids that the change touches (deleted/unresolved excluded). */
33
+ changedSymbolIds: string[];
34
+ /** Normalized (forward-slash) file paths in the change. */
35
+ changedFilePaths: string[];
36
+ /** Per-section caps (fall back to config.changeSynthesis defaults). */
37
+ caps?: {
38
+ maxSymbolsScored?: number;
39
+ maxCoChangeGaps?: number;
40
+ maxRecommendedTests?: number;
41
+ };
42
+ /** Min directional co-change confidence for "missing" detection (default config). */
43
+ coChangeConfidenceThreshold?: number;
44
+ /** Section toggles — all default ON; switch off for cheaper runs. */
45
+ includeRisk?: boolean;
46
+ includeCoChangeGaps?: boolean;
47
+ includeTests?: boolean;
48
+ includeArchitectureFlags?: boolean;
49
+ }
50
+ export interface ChangeSynthesis {
51
+ aggregateRisk: {
52
+ band: 'low' | 'review' | 'high';
53
+ topRiskSymbols: {
54
+ symbolId: string;
55
+ name: string;
56
+ band: 'low' | 'review' | 'high';
57
+ riskScore: number;
58
+ }[];
59
+ };
60
+ missingCoChange: {
61
+ filePath: string;
62
+ confidence: number;
63
+ support: number;
64
+ }[];
65
+ recommendedTests: {
66
+ testFilePath: string;
67
+ reason: string;
68
+ }[];
69
+ coverageGaps: {
70
+ symbolId: string;
71
+ name: string;
72
+ }[];
73
+ architecturalFlags: {
74
+ cyclesTouched: string[][];
75
+ layerViolations: {
76
+ from: string;
77
+ to: string;
78
+ }[];
79
+ };
80
+ signalQuality: 'ok' | 'low';
81
+ }
82
+ /**
83
+ * Synthesize the impact report for a set of changed symbols + files.
84
+ *
85
+ * Pure with respect to the DB (reads only). Builds ONE {@link RiskContext} and
86
+ * scores up to `maxSymbolsScored` symbols against it. Never throws on missing
87
+ * data — sparse repos degrade to empty sections + `signalQuality: 'low'`.
88
+ */
89
+ export declare function synthesizeChange(db: Database.Database, repoId: string, input: ChangeSynthesisInput): ChangeSynthesis;
90
+ //# sourceMappingURL=change-synthesis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-synthesis.d.ts","sourceRoot":"","sources":["../../../src/server/tools/change-synthesis.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAgB3C,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,2DAA2D;IAC3D,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,uEAAuE;IACvE,IAAI,CAAC,EAAE;QACL,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,qFAAqF;IACrF,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE;QACb,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;QAChC,cAAc,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KAC1G,CAAC;IACF,eAAe,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7E,gBAAgB,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7D,YAAY,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACnD,kBAAkB,EAAE;QAClB,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC;QAC1B,eAAe,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KACjD,CAAC;IACF,aAAa,EAAE,IAAI,GAAG,KAAK,CAAC;CAC7B;AA8BD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,oBAAoB,GAC1B,eAAe,CA8KjB"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * change-synthesis.ts
3
+ *
4
+ * The shared "change-impact synthesis" core (Phase 77). Pure, MCP-free, and
5
+ * unit-testable: given the set of symbols + files a change touches, it fuses
6
+ * PureContext's existing risk primitives into one impact-aware report —
7
+ *
8
+ * aggregateRisk — composite per-symbol risk (Phase 76) over the changed
9
+ * symbols, with the max band + the top offenders.
10
+ * missingCoChange — the senior-reviewer instinct: files that *historically*
11
+ * move with the edited files but are NOT in this change
12
+ * ("you touched refundService but ledgerService usually
13
+ * moves with it — and it's not here"). Suppressed entirely
14
+ * on thin/squashed history (never invents warnings).
15
+ * recommendedTests — test files that exercise the changed symbols, plus
16
+ * co-changing test files.
17
+ * coverageGaps — changed symbols with no detected test coverage.
18
+ * architecturalFlags — does the change currently sit on an import cycle / cross
19
+ * a layer boundary. These are CURRENT-STATE flags, not
20
+ * "regressions introduced by the diff" (a before/after
21
+ * graph delta is deferred to compare_change_impact).
22
+ *
23
+ * This is the engine that both `analyze_diff` (post-edit) and Phase B's
24
+ * `prepare_change` (pre-edit) consume — keep it free of tool/transport concerns.
25
+ *
26
+ * Everything is bounded by caps (token discipline) and built against a single
27
+ * shared RiskContext (perf — score N symbols against one set of repo
28
+ * distributions instead of recomputing per symbol).
29
+ */
30
+ import { buildRiskContext, computeSymbolRiskWithContext, } from './symbol-risk.js';
31
+ import { getCoChange } from './co-change.js';
32
+ import { getSymbolCoverage } from '../../core/test-mapper.js';
33
+ import { getAllDepEdges } from '../../core/db/dep-store.js';
34
+ import { buildAdjacencyList, findCycles } from './detect-antipatterns.js';
35
+ import { assignLayer, isAllowed } from './get-layer-violations.js';
36
+ import { getConfig } from '../../config/config-loader.js';
37
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
38
+ /** Mirror of symbol-risk's test-file heuristic (kept local to stay MCP-free). */
39
+ function isTestFile(filePath) {
40
+ const norm = filePath.replace(/\\/g, '/');
41
+ if (/(?:^|\/)(?:tests?|specs?|__tests__)\//.test(norm))
42
+ return true;
43
+ if (/[._](?:test|spec)\.[a-z]+$/.test(norm))
44
+ return true;
45
+ const filename = norm.split('/').pop() ?? '';
46
+ if (/^(?:test|spec)_/.test(filename))
47
+ return true;
48
+ return false;
49
+ }
50
+ const BAND_RANK = { low: 0, review: 1, high: 2 };
51
+ function maxBand(bands) {
52
+ let best = 'low';
53
+ for (const b of bands)
54
+ if (BAND_RANK[b] > BAND_RANK[best])
55
+ best = b;
56
+ return best;
57
+ }
58
+ // ─── Core ───────────────────────────────────────────────────────────────────
59
+ /**
60
+ * Synthesize the impact report for a set of changed symbols + files.
61
+ *
62
+ * Pure with respect to the DB (reads only). Builds ONE {@link RiskContext} and
63
+ * scores up to `maxSymbolsScored` symbols against it. Never throws on missing
64
+ * data — sparse repos degrade to empty sections + `signalQuality: 'low'`.
65
+ */
66
+ export function synthesizeChange(db, repoId, input) {
67
+ const cfg = getConfig().changeSynthesis;
68
+ const threshold = input.coChangeConfidenceThreshold ?? cfg.coChangeConfidenceThreshold;
69
+ const maxSymbolsScored = input.caps?.maxSymbolsScored ?? cfg.maxSymbolsScored;
70
+ const maxCoChangeGaps = input.caps?.maxCoChangeGaps ?? cfg.maxCoChangeGaps;
71
+ const maxRecommendedTests = input.caps?.maxRecommendedTests ?? cfg.maxRecommendedTests;
72
+ const includeRisk = input.includeRisk ?? true;
73
+ const includeCoChangeGaps = input.includeCoChangeGaps ?? true;
74
+ const includeTests = input.includeTests ?? true;
75
+ const includeArchitectureFlags = input.includeArchitectureFlags ?? true;
76
+ const ctx = buildRiskContext(db, repoId);
77
+ const signalQuality = ctx.windowCommits < 20 ? 'low' : 'ok';
78
+ const changedFilePaths = input.changedFilePaths.map((p) => p.replace(/\\/g, '/'));
79
+ const inDiff = new Set(changedFilePaths);
80
+ const uniqueChangedFiles = [...new Set(changedFilePaths)];
81
+ // ── Look up name + file for each changed symbol (one batch). ────────────────
82
+ const idToName = new Map();
83
+ const idToFile = new Map();
84
+ const symbolIds = [...new Set(input.changedSymbolIds.filter((s) => s))];
85
+ if (symbolIds.length > 0) {
86
+ const ph = symbolIds.map(() => '?').join(', ');
87
+ const rows = db
88
+ .prepare(`SELECT id, name, file_path FROM symbols WHERE repo_id = ? AND id IN (${ph})`)
89
+ .all([repoId, ...symbolIds]);
90
+ for (const r of rows) {
91
+ idToName.set(r.id, r.name);
92
+ idToFile.set(r.id, r.file_path);
93
+ }
94
+ }
95
+ // ── Co-change results per changed file (memoized + shared with risk). ───────
96
+ const coChangeByFile = new Map();
97
+ if ((includeCoChangeGaps || includeTests) && ctx.windowCommits > 0) {
98
+ for (const fp of uniqueChangedFiles) {
99
+ const res = getCoChange(db, repoId, fp, {
100
+ megaCommitThreshold: ctx.megaCommitThreshold,
101
+ topN: 50,
102
+ });
103
+ coChangeByFile.set(fp, res);
104
+ ctx.coChangeCache.set(fp, res); // risk scoring reuses this
105
+ }
106
+ }
107
+ // ── 1. Aggregate risk ──────────────────────────────────────────────────────
108
+ let aggregateRisk = { band: 'low', topRiskSymbols: [] };
109
+ if (includeRisk && symbolIds.length > 0) {
110
+ // Rank by afferent coupling (cheap reverse-dependency proxy for blast radius)
111
+ // so the most-connected symbols are always scored when over the cap.
112
+ const ranked = [...symbolIds].sort((a, b) => (ctx.afferentByFile.get(idToFile.get(b) ?? '') ?? 0) -
113
+ (ctx.afferentByFile.get(idToFile.get(a) ?? '') ?? 0));
114
+ const toScore = ranked.slice(0, maxSymbolsScored);
115
+ const scored = [];
116
+ for (const id of toScore) {
117
+ const r = computeSymbolRiskWithContext(db, repoId, id, ctx);
118
+ if (r)
119
+ scored.push(r);
120
+ }
121
+ const band = maxBand(scored.map((s) => s.band));
122
+ const topRiskSymbols = scored
123
+ .slice()
124
+ .sort((a, b) => b.riskScore - a.riskScore)
125
+ .slice(0, 10)
126
+ .map((s) => ({ symbolId: s.symbolId, name: s.name, band: s.band, riskScore: s.riskScore }));
127
+ aggregateRisk = { band, topRiskSymbols };
128
+ }
129
+ // ── 2. Missing co-change (absence detection) ───────────────────────────────
130
+ const missingCoChange = [];
131
+ if (includeCoChangeGaps && signalQuality === 'ok') {
132
+ const best = new Map();
133
+ for (const [, res] of coChangeByFile) {
134
+ if (res.signalQuality === 'low')
135
+ continue;
136
+ for (const p of res.partners) {
137
+ if (p.confidence < threshold)
138
+ continue;
139
+ if (inDiff.has(p.filePath))
140
+ continue;
141
+ if (isTestFile(p.filePath))
142
+ continue; // tests go to recommendedTests
143
+ const existing = best.get(p.filePath);
144
+ if (!existing || p.confidence > existing.confidence) {
145
+ best.set(p.filePath, { filePath: p.filePath, confidence: p.confidence, support: p.support });
146
+ }
147
+ }
148
+ }
149
+ const sorted = [...best.values()].sort((a, b) => b.confidence - a.confidence || b.support - a.support);
150
+ missingCoChange.push(...sorted.slice(0, maxCoChangeGaps));
151
+ }
152
+ // ── 3. Recommended tests + 4. Coverage gaps ────────────────────────────────
153
+ const recommendedTests = [];
154
+ const coverageGaps = [];
155
+ if (includeTests) {
156
+ const testReasons = new Map();
157
+ for (const id of symbolIds) {
158
+ const cov = getSymbolCoverage(repoId, id, db);
159
+ const name = idToName.get(id) ?? id;
160
+ if (cov) {
161
+ for (const tf of cov.testFilePaths) {
162
+ if (!testReasons.has(tf))
163
+ testReasons.set(tf, `exercises changed symbol ${name}`);
164
+ }
165
+ if (cov.coverageStatus === 'untested')
166
+ coverageGaps.push({ symbolId: id, name });
167
+ }
168
+ }
169
+ // Co-change partners that are themselves test files.
170
+ for (const [, res] of coChangeByFile) {
171
+ for (const p of res.partners) {
172
+ if (!isTestFile(p.filePath) || inDiff.has(p.filePath))
173
+ continue;
174
+ if (!testReasons.has(p.filePath)) {
175
+ testReasons.set(p.filePath, `historically co-changes with edited files (conf ${p.confidence})`);
176
+ }
177
+ }
178
+ }
179
+ for (const [testFilePath, reason] of testReasons) {
180
+ recommendedTests.push({ testFilePath, reason });
181
+ }
182
+ recommendedTests.splice(maxRecommendedTests);
183
+ coverageGaps.splice(maxSymbolsScored);
184
+ }
185
+ // ── 5. Architectural flags (current-state, NOT regressions introduced) ─────
186
+ const architecturalFlags = {
187
+ cyclesTouched: [],
188
+ layerViolations: [],
189
+ };
190
+ if (includeArchitectureFlags && uniqueChangedFiles.length > 0) {
191
+ const edges = getAllDepEdges(db, repoId);
192
+ // Cycles currently containing at least one changed file.
193
+ const adj = buildAdjacencyList(edges);
194
+ const cycles = findCycles(adj);
195
+ for (const cycle of cycles) {
196
+ if (cycle.some((f) => inDiff.has(f))) {
197
+ architecturalFlags.cyclesTouched.push(cycle);
198
+ if (architecturalFlags.cyclesTouched.length >= maxCoChangeGaps)
199
+ break;
200
+ }
201
+ }
202
+ // Layer-boundary crossings on edges touching a changed file.
203
+ const layers = getConfig().layers;
204
+ if (layers) {
205
+ const seenPairs = new Set();
206
+ for (const edge of edges) {
207
+ const src = edge.sourceFile.replace(/\\/g, '/');
208
+ const tgt = edge.targetFile.replace(/\\/g, '/');
209
+ if (!inDiff.has(src) && !inDiff.has(tgt))
210
+ continue;
211
+ const from = assignLayer(edge.sourceFile, layers.definitions);
212
+ const to = assignLayer(edge.targetFile, layers.definitions);
213
+ if (from === 'unclassified' || to === 'unclassified' || from === to)
214
+ continue;
215
+ if (isAllowed(from, to, layers.rules))
216
+ continue;
217
+ const key = `${from}→${to}`;
218
+ if (seenPairs.has(key))
219
+ continue;
220
+ seenPairs.add(key);
221
+ architecturalFlags.layerViolations.push({ from, to });
222
+ if (architecturalFlags.layerViolations.length >= maxCoChangeGaps)
223
+ break;
224
+ }
225
+ }
226
+ }
227
+ return {
228
+ aggregateRisk,
229
+ missingCoChange,
230
+ recommendedTests,
231
+ coverageGaps,
232
+ architecturalFlags,
233
+ signalQuality,
234
+ };
235
+ }
236
+ //# sourceMappingURL=change-synthesis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-synthesis.js","sourceRoot":"","sources":["../../../src/server/tools/change-synthesis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * co-change.ts
3
+ *
4
+ * Pure query/scoring functions for temporal coupling (co-change) — files that
5
+ * historically change together in the same commits. Unit-testable without MCP.
6
+ *
7
+ * Data source: the `commit_files` table (repo-level commit→files capture, see
8
+ * co-change-store.ts). Co-change of two files is a self-join on `commit_sha`.
9
+ *
10
+ * Explainable association metrics (not raw counts):
11
+ * support — number of shared commits (after noise filtering)
12
+ * confidence — support / commits(target) (directional A→B; the signal agents want)
13
+ * lift — support × N / (commits(A) × commits(B))
14
+ *
15
+ * Noise handling (the part generic "churn dashboards" skip):
16
+ * - Mega-commit filter: commits touching > megaCommitThreshold files are
17
+ * excluded entirely (reformats, lockfile sweeps, codemods).
18
+ * - Mega-commit down-weighting: each retained shared commit contributes
19
+ * 1/(k−1) (k = files in commit), so a 25-file commit counts far less than a
20
+ * focused 2-file commit. `weightedSupport` ranks partners.
21
+ * - Min-support floor drops one-off coincidences.
22
+ * - signalQuality:"low" flags sparse/shallow histories rather than presenting
23
+ * weak ratios as strong.
24
+ */
25
+ import type Database from 'better-sqlite3';
26
+ export interface CoChangeOptions {
27
+ /** Drop partners with fewer than this many shared commits (default 2). */
28
+ minSupport?: number;
29
+ /** Commits touching more than this many files are excluded (default 30). */
30
+ megaCommitThreshold?: number;
31
+ /** Look back N days (optional; default: entire captured window). */
32
+ dayWindow?: number;
33
+ /** Maximum partners to return (default 20). */
34
+ topN?: number;
35
+ }
36
+ export interface CoChangePartner {
37
+ filePath: string;
38
+ /** Shared commit count (after mega-commit exclusion). */
39
+ support: number;
40
+ /** Sum of 1/(k−1) over shared commits — the down-weighted ranking score. */
41
+ weightedSupport: number;
42
+ /** support / commits(target) — directional, in [0,1]. */
43
+ confidence: number;
44
+ /** support × N / (commits(target) × commits(partner)). >1 ⇒ positive coupling. */
45
+ lift: number;
46
+ /** Most recent shared commit date (ISO string), or null. */
47
+ coChangeDate: string | null;
48
+ }
49
+ export interface CoChangeResult {
50
+ targetFilePath: string;
51
+ /** Distinct commits touching the target (the confidence denominator). */
52
+ targetCommits: number;
53
+ /** Total distinct commits in the analysis window. */
54
+ windowCommits: number;
55
+ signalQuality: 'ok' | 'low';
56
+ partners: CoChangePartner[];
57
+ }
58
+ /**
59
+ * Compute ranked co-change partners for a target file.
60
+ *
61
+ * Returns an empty partner list (never throws) when the repo has no co-change
62
+ * data or the target file has no recorded commits.
63
+ */
64
+ export declare function getCoChange(db: Database.Database, repoId: string, targetFilePath: string, opts?: CoChangeOptions): CoChangeResult;
65
+ //# sourceMappingURL=co-change.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"co-change.d.ts","sourceRoot":"","sources":["../../../src/server/tools/co-change.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,eAAe,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,aAAa,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,IAAI,GAAG,KAAK,CAAC;IAC5B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAkBD;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,IAAI,GAAE,eAAoB,GACzB,cAAc,CA2HhB"}