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.
- package/AGENT_INSTRUCTIONS.md +18 -10
- package/AGENT_REFERENCE.md +684 -561
- package/CHANGELOG.md +567 -445
- package/CODE-HISTORY.md +29 -1
- package/FRAMEWORK-ADAPTERS.md +368 -351
- package/FULL-INSTALLATION-GUIDE.md +351 -341
- package/README.md +411 -339
- package/REFACTORING-SAFELY.md +338 -279
- package/SAFE-CHANGES.md +208 -156
- package/USER-GUIDE.md +3 -1
- package/WHY-PURECONTEXT.md +103 -73
- package/WORKFLOW-PR-REVIEW.md +245 -199
- package/dist/adapters/astro-preprocessor.d.ts +25 -0
- package/dist/adapters/astro-preprocessor.d.ts.map +1 -0
- package/dist/adapters/astro-preprocessor.js +50 -0
- package/dist/adapters/astro-preprocessor.js.map +1 -0
- package/dist/adapters/astro.d.ts +13 -0
- package/dist/adapters/astro.d.ts.map +1 -0
- package/dist/adapters/astro.js +83 -0
- package/dist/adapters/astro.js.map +1 -0
- package/dist/adapters/detect-utils.d.ts +38 -0
- package/dist/adapters/detect-utils.d.ts.map +1 -0
- package/dist/adapters/detect-utils.js +95 -0
- package/dist/adapters/detect-utils.js.map +1 -0
- package/dist/adapters/nuxt.d.ts +20 -0
- package/dist/adapters/nuxt.d.ts.map +1 -1
- package/dist/adapters/nuxt.js +128 -13
- package/dist/adapters/nuxt.js.map +1 -1
- package/dist/adapters/svelte-preprocessor.d.ts +29 -0
- package/dist/adapters/svelte-preprocessor.d.ts.map +1 -0
- package/dist/adapters/svelte-preprocessor.js +83 -0
- package/dist/adapters/svelte-preprocessor.js.map +1 -0
- package/dist/adapters/svelte.d.ts +13 -0
- package/dist/adapters/svelte.d.ts.map +1 -0
- package/dist/adapters/svelte.js +96 -0
- package/dist/adapters/svelte.js.map +1 -0
- package/dist/adapters/vue.d.ts.map +1 -1
- package/dist/adapters/vue.js +87 -20
- package/dist/adapters/vue.js.map +1 -1
- package/dist/bin.d.ts +16 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +21 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/hooks.d.ts +2 -2
- package/dist/cli/hooks.d.ts.map +1 -1
- package/dist/cli/hooks.js +123 -135
- package/dist/cli/hooks.js.map +1 -1
- package/dist/cli/install-writers.d.ts.map +1 -1
- package/dist/cli/install-writers.js +281 -36
- package/dist/cli/install-writers.js.map +1 -1
- package/dist/cli/resolve-node.d.ts +53 -0
- package/dist/cli/resolve-node.d.ts.map +1 -0
- package/dist/cli/resolve-node.js +84 -0
- package/dist/cli/resolve-node.js.map +1 -0
- package/dist/config/config-loader.js +24 -0
- package/dist/config/config-loader.js.map +1 -1
- package/dist/config/config-schema.d.ts +71 -0
- package/dist/config/config-schema.d.ts.map +1 -1
- package/dist/config/config-schema.js +102 -0
- package/dist/config/config-schema.js.map +1 -1
- package/dist/core/db/api-keys.d.ts +1 -1
- package/dist/core/db/api-keys.d.ts.map +1 -1
- package/dist/core/db/api-keys.js +39 -39
- package/dist/core/db/api-keys.js.map +1 -1
- package/dist/core/db/co-change-store.d.ts +34 -0
- package/dist/core/db/co-change-store.d.ts.map +1 -0
- package/dist/core/db/co-change-store.js +78 -0
- package/dist/core/db/co-change-store.js.map +1 -0
- package/dist/core/db/schema.d.ts +3 -3
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.js +12 -30
- package/dist/core/db/schema.js.map +1 -1
- package/dist/core/db/sqlite-loader.d.ts +51 -0
- package/dist/core/db/sqlite-loader.d.ts.map +1 -0
- package/dist/core/db/sqlite-loader.js +94 -0
- package/dist/core/db/sqlite-loader.js.map +1 -0
- package/dist/core/db/wasm-sqlite.d.ts +4 -0
- package/dist/core/db/wasm-sqlite.d.ts.map +1 -0
- package/dist/core/db/wasm-sqlite.js +270 -0
- package/dist/core/db/wasm-sqlite.js.map +1 -0
- package/dist/core/diff-parser.d.ts.map +1 -1
- package/dist/core/diff-parser.js +6 -1
- package/dist/core/diff-parser.js.map +1 -1
- package/dist/core/git-log-reader.d.ts +28 -0
- package/dist/core/git-log-reader.d.ts.map +1 -1
- package/dist/core/git-log-reader.js +74 -3
- package/dist/core/git-log-reader.js.map +1 -1
- package/dist/core/index-manager.d.ts.map +1 -1
- package/dist/core/index-manager.js +29 -3
- package/dist/core/index-manager.js.map +1 -1
- package/dist/core/indexing-worker.d.ts +2 -0
- package/dist/core/indexing-worker.d.ts.map +1 -1
- package/dist/core/indexing-worker.js +2 -0
- package/dist/core/indexing-worker.js.map +1 -1
- package/dist/core/watcher/file-watcher.d.ts +6 -0
- package/dist/core/watcher/file-watcher.d.ts.map +1 -1
- package/dist/core/watcher/file-watcher.js +11 -1
- package/dist/core/watcher/file-watcher.js.map +1 -1
- package/dist/graph/path-resolver.js +86 -17
- package/dist/graph/path-resolver.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/node-guard.d.ts +15 -0
- package/dist/node-guard.d.ts.map +1 -0
- package/dist/node-guard.js +33 -0
- package/dist/node-guard.js.map +1 -0
- package/dist/server/admin-api.d.ts +1 -1
- package/dist/server/admin-api.d.ts.map +1 -1
- package/dist/server/admin-api.js +2 -2
- package/dist/server/admin-api.js.map +1 -1
- package/dist/server/auth/api-key.d.ts +1 -1
- package/dist/server/auth/api-key.d.ts.map +1 -1
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/mcp-server.js +25 -0
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/server/tools/analyze-diff.d.ts +8 -0
- package/dist/server/tools/analyze-diff.d.ts.map +1 -1
- package/dist/server/tools/analyze-diff.js +80 -16
- package/dist/server/tools/analyze-diff.js.map +1 -1
- package/dist/server/tools/change-synthesis.d.ts +90 -0
- package/dist/server/tools/change-synthesis.d.ts.map +1 -0
- package/dist/server/tools/change-synthesis.js +236 -0
- package/dist/server/tools/change-synthesis.js.map +1 -0
- package/dist/server/tools/co-change.d.ts +65 -0
- package/dist/server/tools/co-change.d.ts.map +1 -0
- package/dist/server/tools/co-change.js +146 -0
- package/dist/server/tools/co-change.js.map +1 -0
- package/dist/server/tools/compare-change-impact.d.ts +58 -0
- package/dist/server/tools/compare-change-impact.d.ts.map +1 -0
- package/dist/server/tools/compare-change-impact.js +0 -0
- package/dist/server/tools/compare-change-impact.js.map +1 -0
- package/dist/server/tools/find-refactoring-opportunities.d.ts +1 -1
- package/dist/server/tools/get-architecture-snapshot.d.ts.map +1 -1
- package/dist/server/tools/get-architecture-snapshot.js +28 -14
- package/dist/server/tools/get-architecture-snapshot.js.map +1 -1
- package/dist/server/tools/get-churn-metrics.d.ts.map +1 -1
- package/dist/server/tools/get-churn-metrics.js +1 -12
- package/dist/server/tools/get-churn-metrics.js.map +1 -1
- package/dist/server/tools/get-co-change.d.ts +37 -0
- package/dist/server/tools/get-co-change.d.ts.map +1 -0
- package/dist/server/tools/get-co-change.js +120 -0
- package/dist/server/tools/get-co-change.js.map +1 -0
- package/dist/server/tools/get-context-bundle.d.ts.map +1 -1
- package/dist/server/tools/get-context-bundle.js +56 -3
- package/dist/server/tools/get-context-bundle.js.map +1 -1
- package/dist/server/tools/get-entry-points.d.ts +1 -1
- package/dist/server/tools/get-symbol-risk.d.ts +25 -0
- package/dist/server/tools/get-symbol-risk.d.ts.map +1 -0
- package/dist/server/tools/get-symbol-risk.js +60 -0
- package/dist/server/tools/get-symbol-risk.js.map +1 -0
- package/dist/server/tools/get-symbol-source.d.ts +2 -0
- package/dist/server/tools/get-symbol-source.d.ts.map +1 -1
- package/dist/server/tools/get-symbol-source.js +18 -1
- package/dist/server/tools/get-symbol-source.js.map +1 -1
- package/dist/server/tools/index-repo.d.ts.map +1 -1
- package/dist/server/tools/index-repo.js +8 -2
- package/dist/server/tools/index-repo.js.map +1 -1
- package/dist/server/tools/prepare-change.d.ts +61 -0
- package/dist/server/tools/prepare-change.d.ts.map +1 -0
- package/dist/server/tools/prepare-change.js +262 -0
- package/dist/server/tools/prepare-change.js.map +1 -0
- package/dist/server/tools/search-symbols.d.ts +2 -0
- package/dist/server/tools/search-symbols.d.ts.map +1 -1
- package/dist/server/tools/search-symbols.js +33 -0
- package/dist/server/tools/search-symbols.js.map +1 -1
- package/dist/server/tools/symbol-lines.d.ts +25 -0
- package/dist/server/tools/symbol-lines.d.ts.map +1 -0
- package/dist/server/tools/symbol-lines.js +40 -0
- package/dist/server/tools/symbol-lines.js.map +1 -0
- package/dist/server/tools/symbol-risk.d.ts +109 -0
- package/dist/server/tools/symbol-risk.d.ts.map +1 -0
- package/dist/server/tools/symbol-risk.js +251 -0
- package/dist/server/tools/symbol-risk.js.map +1 -0
- package/dist/server/tools/verify-change.d.ts +40 -0
- package/dist/server/tools/verify-change.d.ts.map +1 -0
- package/dist/server/tools/verify-change.js +149 -0
- package/dist/server/tools/verify-change.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/docs/01-introduction.md +2 -2
- package/docs/02-installation.md +97 -89
- package/docs/03-quick-start.md +138 -135
- package/docs/04-configuration.md +247 -214
- package/docs/05-cli-reference.md +236 -219
- package/docs/06-tools-reference.md +902 -499
- package/docs/14-transport-modes.md +170 -167
- package/docs/18-git-history.md +43 -0
- package/docs/23-performance.md +123 -121
- package/docs/26-troubleshooting.md +249 -234
- package/grammars/README.md +88 -0
- package/package.json +7 -25
- 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
|
|
21
|
-
'signature-changed, or deleted,
|
|
22
|
-
'
|
|
23
|
-
'the
|
|
24
|
-
'
|
|
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
|
|
111
|
-
* high ≥1 signature break OR blast
|
|
112
|
-
* medium
|
|
113
|
-
* low
|
|
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
|
-
|
|
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
|
-
// ──
|
|
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
|
|
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"}
|