aperta-cli 1.0.0-beta.1
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/LICENSE +21 -0
- package/README.md +386 -0
- package/bin/aperta.js +3 -0
- package/dashboard/dist/assets/index-CWL1aA6j.js +11 -0
- package/dashboard/dist/assets/index-D0Ru46BW.css +1 -0
- package/dashboard/dist/index.html +15 -0
- package/dist-cli/src/adapters/git-only.js +7 -0
- package/dist-cli/src/adapters/git-only.js.map +1 -0
- package/dist-cli/src/adapters/opencode.js +47 -0
- package/dist-cli/src/adapters/opencode.js.map +1 -0
- package/dist-cli/src/agent-harness.js +1292 -0
- package/dist-cli/src/agent-harness.js.map +1 -0
- package/dist-cli/src/capture.js +17 -0
- package/dist-cli/src/capture.js.map +1 -0
- package/dist-cli/src/cli.js +283 -0
- package/dist-cli/src/cli.js.map +1 -0
- package/dist-cli/src/coach.js +315 -0
- package/dist-cli/src/coach.js.map +1 -0
- package/dist-cli/src/dashboard-data.js +254 -0
- package/dist-cli/src/dashboard-data.js.map +1 -0
- package/dist-cli/src/dashboard-server.js +379 -0
- package/dist-cli/src/dashboard-server.js.map +1 -0
- package/dist-cli/src/engine.js +85 -0
- package/dist-cli/src/engine.js.map +1 -0
- package/dist-cli/src/execution.js +20 -0
- package/dist-cli/src/execution.js.map +1 -0
- package/dist-cli/src/git.js +131 -0
- package/dist-cli/src/git.js.map +1 -0
- package/dist-cli/src/harness-intelligence.js +110 -0
- package/dist-cli/src/harness-intelligence.js.map +1 -0
- package/dist-cli/src/hook.js +39 -0
- package/dist-cli/src/hook.js.map +1 -0
- package/dist-cli/src/impact.js +224 -0
- package/dist-cli/src/impact.js.map +1 -0
- package/dist-cli/src/jobs.js +27 -0
- package/dist-cli/src/jobs.js.map +1 -0
- package/dist-cli/src/ledger.js +211 -0
- package/dist-cli/src/ledger.js.map +1 -0
- package/dist-cli/src/map.js +73 -0
- package/dist-cli/src/map.js.map +1 -0
- package/dist-cli/src/observer.js +127 -0
- package/dist-cli/src/observer.js.map +1 -0
- package/dist-cli/src/probes.js +195 -0
- package/dist-cli/src/probes.js.map +1 -0
- package/dist-cli/src/prompt.js +44 -0
- package/dist-cli/src/prompt.js.map +1 -0
- package/dist-cli/src/proof-graph.js +123 -0
- package/dist-cli/src/proof-graph.js.map +1 -0
- package/dist-cli/src/proof.js +99 -0
- package/dist-cli/src/proof.js.map +1 -0
- package/dist-cli/src/registry.js +60 -0
- package/dist-cli/src/registry.js.map +1 -0
- package/dist-cli/src/repository.js +39 -0
- package/dist-cli/src/repository.js.map +1 -0
- package/dist-cli/src/semantic.js +183 -0
- package/dist-cli/src/semantic.js.map +1 -0
- package/dist-cli/src/service.js +60 -0
- package/dist-cli/src/service.js.map +1 -0
- package/dist-cli/src/session.js +41 -0
- package/dist-cli/src/session.js.map +1 -0
- package/dist-cli/src/settings.js +305 -0
- package/dist-cli/src/settings.js.map +1 -0
- package/dist-cli/src/skills.js +104 -0
- package/dist-cli/src/skills.js.map +1 -0
- package/dist-cli/src/storage.js +163 -0
- package/dist-cli/src/storage.js.map +1 -0
- package/dist-cli/src/types.js +2 -0
- package/dist-cli/src/types.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { resolve, join } from "node:path";
|
|
4
|
+
import { mkdtemp, rm } from "node:fs/promises";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { createHash } from "node:crypto";
|
|
7
|
+
const execFileAsync = promisify(execFile);
|
|
8
|
+
async function git(cwd, args, env) {
|
|
9
|
+
try {
|
|
10
|
+
const { stdout } = await execFileAsync("git", args, { cwd, env: env ? { ...process.env, ...env } : process.env, maxBuffer: 20 * 1024 * 1024 });
|
|
11
|
+
return stdout.trimEnd();
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
const message = error.stderr?.trim() || error.message;
|
|
15
|
+
throw new Error(`Git error: ${message}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function findRepoRoot(cwd) {
|
|
19
|
+
return resolve(await git(cwd, ["rev-parse", "--show-toplevel"]));
|
|
20
|
+
}
|
|
21
|
+
export async function currentBranch(root) {
|
|
22
|
+
const branch = await git(root, ["branch", "--show-current"]);
|
|
23
|
+
return branch || "HEAD";
|
|
24
|
+
}
|
|
25
|
+
export async function listTrackedFiles(root) {
|
|
26
|
+
const output = await git(root, ["ls-files", "-co", "--exclude-standard", "--", ".", ":(exclude).comprehension"]);
|
|
27
|
+
return [...new Set(output.split("\n").filter(Boolean))].sort();
|
|
28
|
+
}
|
|
29
|
+
function gitStatusLabel(code) {
|
|
30
|
+
return { M: "Modified", A: "Added", D: "Deleted", R: "Renamed", C: "Copied", U: "Unmerged", T: "Type changed", "?": "Untracked" }[code] ?? "Changed";
|
|
31
|
+
}
|
|
32
|
+
export async function readGitWorkingStatus(root) {
|
|
33
|
+
const output = await git(root, ["status", "--porcelain=v1", "-z", "--untracked-files=all", "--", ".", ":(exclude).comprehension"]);
|
|
34
|
+
const staged = [], unstaged = [], untracked = [];
|
|
35
|
+
const records = output.split("\0").filter(Boolean);
|
|
36
|
+
for (let index = 0; index < records.length; index++) {
|
|
37
|
+
const record = records[index];
|
|
38
|
+
const x = record[0] ?? " ", y = record[1] ?? " ";
|
|
39
|
+
let path = record.slice(3);
|
|
40
|
+
if (x === "R" || x === "C" || y === "R" || y === "C")
|
|
41
|
+
path = records[++index] ?? path;
|
|
42
|
+
if (x === "?" && y === "?") {
|
|
43
|
+
untracked.push({ path, status: "Untracked", code: "?" });
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (x !== " " && x !== "?")
|
|
47
|
+
staged.push({ path, status: gitStatusLabel(x), code: x });
|
|
48
|
+
if (y !== " " && y !== "?")
|
|
49
|
+
unstaged.push({ path, status: gitStatusLabel(y), code: y });
|
|
50
|
+
}
|
|
51
|
+
const byPath = (a, b) => a.path.localeCompare(b.path);
|
|
52
|
+
return { branch: await currentBranch(root), staged: staged.sort(byPath), unstaged: unstaged.sort(byPath), untracked: untracked.sort(byPath) };
|
|
53
|
+
}
|
|
54
|
+
async function hasHead(root) {
|
|
55
|
+
try {
|
|
56
|
+
await git(root, ["rev-parse", "--verify", "HEAD"]);
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export async function createRepositorySnapshot(root) {
|
|
64
|
+
const temp = await mkdtemp(join(tmpdir(), "aperta-index-"));
|
|
65
|
+
const index = join(temp, "index");
|
|
66
|
+
const env = { GIT_INDEX_FILE: index };
|
|
67
|
+
try {
|
|
68
|
+
await git(root, (await hasHead(root)) ? ["read-tree", "HEAD"] : ["read-tree", "--empty"], env);
|
|
69
|
+
await git(root, ["add", "-A", "--", ".", ":(exclude).comprehension", ":(exclude).git"], env);
|
|
70
|
+
return { tree: await git(root, ["write-tree"], env) };
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
await rm(temp, { recursive: true, force: true });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export async function headSnapshot(root) {
|
|
77
|
+
if (!(await hasHead(root)))
|
|
78
|
+
return emptySnapshot(root);
|
|
79
|
+
return { tree: await git(root, ["rev-parse", "HEAD^{tree}"]) };
|
|
80
|
+
}
|
|
81
|
+
async function emptySnapshot(root) {
|
|
82
|
+
const temp = await mkdtemp(join(tmpdir(), "aperta-empty-index-"));
|
|
83
|
+
const env = { GIT_INDEX_FILE: join(temp, "index") };
|
|
84
|
+
try {
|
|
85
|
+
await git(root, ["read-tree", "--empty"], env);
|
|
86
|
+
return { tree: await git(root, ["write-tree"], env) };
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
await rm(temp, { recursive: true, force: true });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function parseNumstat(output) {
|
|
93
|
+
return output.split("\n").filter(Boolean).map((line) => {
|
|
94
|
+
const [addedRaw, removedRaw, ...pathParts] = line.split("\t");
|
|
95
|
+
return { path: pathParts.join("\t"), added: addedRaw === "-" ? 0 : Number(addedRaw), removed: removedRaw === "-" ? 0 : Number(removedRaw), hunks: 0 };
|
|
96
|
+
}).filter((file) => file.path);
|
|
97
|
+
}
|
|
98
|
+
function countHunks(patch) {
|
|
99
|
+
const counts = new Map();
|
|
100
|
+
let current;
|
|
101
|
+
for (const line of patch.split("\n")) {
|
|
102
|
+
if (line.startsWith("diff --git a/")) {
|
|
103
|
+
const match = line.match(/^diff --git a\/(.+) b\/(.+)$/);
|
|
104
|
+
current = match?.[2];
|
|
105
|
+
if (current && !counts.has(current))
|
|
106
|
+
counts.set(current, 0);
|
|
107
|
+
}
|
|
108
|
+
else if (current && line.startsWith("@@"))
|
|
109
|
+
counts.set(current, (counts.get(current) ?? 0) + 1);
|
|
110
|
+
}
|
|
111
|
+
return counts;
|
|
112
|
+
}
|
|
113
|
+
export async function diffSnapshots(root, before, after) {
|
|
114
|
+
const [numstat, patch] = await Promise.all([
|
|
115
|
+
git(root, ["diff-tree", "--no-commit-id", "--numstat", "-r", before.tree, after.tree]),
|
|
116
|
+
git(root, ["diff-tree", "--no-commit-id", "--no-ext-diff", "--unified=3", "-r", before.tree, after.tree]),
|
|
117
|
+
]);
|
|
118
|
+
const files = parseNumstat(numstat);
|
|
119
|
+
const hunks = countHunks(patch);
|
|
120
|
+
for (const file of files)
|
|
121
|
+
file.hunks = hunks.get(file.path) ?? (file.added + file.removed > 0 ? 1 : 0);
|
|
122
|
+
return {
|
|
123
|
+
files: files.sort((a, b) => a.path.localeCompare(b.path)), patch,
|
|
124
|
+
fingerprint: createHash("sha256").update(`${before.tree}:${after.tree}`).digest("hex"),
|
|
125
|
+
baseTree: before.tree, resultTree: after.tree,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
export async function captureWorkingDiff(root) {
|
|
129
|
+
return diffSnapshots(root, await headSnapshot(root), await createRepositorySnapshot(root));
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { classifyAgentError, listAgentRuns } from "./agent-harness.js";
|
|
4
|
+
function rate(numerator, denominator) { return denominator ? numerator / denominator : null; }
|
|
5
|
+
function average(values) { return values.length ? values.reduce((sum, value) => sum + value, 0) / values.length : null; }
|
|
6
|
+
function completed(run) { return ["ready", "verification-failed", "no-changes", "applied"].includes(run.status); }
|
|
7
|
+
function firstPass(run) { return run.verification.status === "passed" && run.verification.attempts.length === 1; }
|
|
8
|
+
function repaired(run) { return run.verification.status === "passed" && run.verification.attempts.length > 1 && run.verification.attempts[0]?.status === "failed"; }
|
|
9
|
+
function addedLinesByPath(patch) {
|
|
10
|
+
const result = new Map();
|
|
11
|
+
let path = "";
|
|
12
|
+
for (const line of patch.split("\n")) {
|
|
13
|
+
const header = line.match(/^diff --git a\/(.+) b\/(.+)$/);
|
|
14
|
+
if (header) {
|
|
15
|
+
path = header[2];
|
|
16
|
+
if (!result.has(path))
|
|
17
|
+
result.set(path, []);
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (path && line.startsWith("+") && !line.startsWith("+++")) {
|
|
21
|
+
const value = line.slice(1).trim();
|
|
22
|
+
if (value && value.length >= 3)
|
|
23
|
+
result.get(path).push(value);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
async function approximateKeepRate(root, runs) {
|
|
29
|
+
let keptLines = 0, sampledLines = 0;
|
|
30
|
+
for (const run of runs.filter((candidate) => candidate.status === "applied" && candidate.patch)) {
|
|
31
|
+
for (const [path, additions] of addedLinesByPath(run.patch)) {
|
|
32
|
+
let content = "";
|
|
33
|
+
try {
|
|
34
|
+
content = await readFile(join(root, path), "utf8");
|
|
35
|
+
}
|
|
36
|
+
catch { }
|
|
37
|
+
for (const line of additions) {
|
|
38
|
+
sampledLines++;
|
|
39
|
+
if (content.includes(line))
|
|
40
|
+
keptLines++;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { keptLines, sampledLines, keepRate: rate(keptLines, sampledLines) };
|
|
45
|
+
}
|
|
46
|
+
function toolRows(runs) {
|
|
47
|
+
const groups = new Map();
|
|
48
|
+
for (const run of runs)
|
|
49
|
+
for (const action of run.actions.filter((item) => item.action !== "finish")) {
|
|
50
|
+
const group = groups.get(action.action) ?? { calls: 0, errors: 0, durations: [] };
|
|
51
|
+
group.calls++;
|
|
52
|
+
if (action.status === "error")
|
|
53
|
+
group.errors++;
|
|
54
|
+
if (typeof action.durationMs === "number")
|
|
55
|
+
group.durations.push(action.durationMs);
|
|
56
|
+
groups.set(action.action, group);
|
|
57
|
+
}
|
|
58
|
+
return [...groups.entries()].map(([action, group]) => ({ action, calls: group.calls, errors: group.errors, reliability: group.calls ? (group.calls - group.errors) / group.calls : 1, averageLatencyMs: average(group.durations) })).sort((a, b) => b.calls - a.calls || a.action.localeCompare(b.action));
|
|
59
|
+
}
|
|
60
|
+
function errorRows(runs) {
|
|
61
|
+
const counts = new Map();
|
|
62
|
+
for (const run of runs) {
|
|
63
|
+
const errors = run.telemetry?.errors?.length ? run.telemetry.errors : run.error ? [{ class: classifyAgentError(run.error) }] : [];
|
|
64
|
+
for (const error of errors)
|
|
65
|
+
counts.set(error.class, (counts.get(error.class) ?? 0) + 1);
|
|
66
|
+
}
|
|
67
|
+
const total = [...counts.values()].reduce((sum, count) => sum + count, 0);
|
|
68
|
+
return [...counts.entries()].map(([errorClass, count]) => ({ class: errorClass, count, share: total ? count / total : 0 })).sort((a, b) => b.count - a.count);
|
|
69
|
+
}
|
|
70
|
+
function modelRows(runs) {
|
|
71
|
+
const groups = new Map();
|
|
72
|
+
for (const run of runs) {
|
|
73
|
+
const key = `${run.provider} · ${run.model}`;
|
|
74
|
+
groups.set(key, [...(groups.get(key) ?? []), run]);
|
|
75
|
+
}
|
|
76
|
+
return [...groups.entries()].map(([key, records]) => {
|
|
77
|
+
const verified = records.filter((run) => run.verification.attempts.length), repairable = records.filter((run) => run.verification.attempts[0]?.status === "failed");
|
|
78
|
+
const calls = records.flatMap((run) => run.actions.filter((action) => action.action !== "finish"));
|
|
79
|
+
const providerLatencies = records.filter((run) => run.telemetry?.providerCalls).map((run) => run.telemetry.providerLatencyMs / run.telemetry.providerCalls);
|
|
80
|
+
return { key, provider: records[0].provider, model: records[0].model, runs: records.length, completionRate: rate(records.filter(completed).length, records.length) ?? 0, firstPassRate: rate(verified.filter(firstPass).length, verified.length), repairRate: rate(repairable.filter(repaired).length, repairable.length), toolReliability: rate(calls.filter((action) => action.status !== "error").length, calls.length), averageProviderLatencyMs: average(providerLatencies) };
|
|
81
|
+
}).sort((a, b) => b.runs - a.runs);
|
|
82
|
+
}
|
|
83
|
+
export async function buildHarnessHealth(root) {
|
|
84
|
+
const runs = await listAgentRuns(root), verified = runs.filter((run) => run.verification.attempts.length), repairable = runs.filter((run) => run.verification.attempts[0]?.status === "failed"), promotable = runs.filter((run) => run.files.length && completed(run));
|
|
85
|
+
const tools = toolRows(runs), errors = errorRows(runs), keep = await approximateKeepRate(root, runs);
|
|
86
|
+
const providerLatencies = runs.filter((run) => run.telemetry?.providerCalls).map((run) => run.telemetry.providerLatencyMs / run.telemetry.providerCalls);
|
|
87
|
+
const totalToolCalls = tools.reduce((sum, tool) => sum + tool.calls, 0), totalToolErrors = tools.reduce((sum, tool) => sum + tool.errors, 0);
|
|
88
|
+
const unknownErrors = errors.find((error) => error.class === "HarnessBug")?.count ?? 0;
|
|
89
|
+
const stateConflicts = errors.find((error) => error.class === "StateConflict")?.count ?? 0;
|
|
90
|
+
const signals = [];
|
|
91
|
+
if (unknownErrors)
|
|
92
|
+
signals.push({ level: "critical", title: "Unknown harness errors detected", detail: `${unknownErrors} error${unknownErrors === 1 ? "" : "s"} could not be assigned to an expected failure class and should be treated as a harness defect.` });
|
|
93
|
+
if (stateConflicts)
|
|
94
|
+
signals.push({ level: "warning", title: "Conversation state conflicts", detail: `${stateConflicts} run${stateConflicts === 1 ? "" : "s"} encountered repository changes while carrying work across turns. New runs now carry prior patches forward when they still apply cleanly.` });
|
|
95
|
+
const reliability = rate(totalToolCalls - totalToolErrors, totalToolCalls);
|
|
96
|
+
if (reliability !== null && reliability < .99)
|
|
97
|
+
signals.push({ level: "warning", title: "Tool reliability below target", detail: `${(reliability * 100).toFixed(1)}% successful across ${totalToolCalls} recorded tool actions; the initial target is 99%.` });
|
|
98
|
+
const firstPassRate = rate(verified.filter(firstPass).length, verified.length);
|
|
99
|
+
if (firstPassRate !== null && firstPassRate < .6)
|
|
100
|
+
signals.push({ level: "warning", title: "Low first-pass verification", detail: `${(firstPassRate * 100).toFixed(0)}% of verified runs passed without a repair cycle.` });
|
|
101
|
+
if (!signals.length)
|
|
102
|
+
signals.push({ level: "healthy", title: "No active harness regressions", detail: runs.length ? "Recorded reliability and verification signals are within their current local thresholds." : "Run the agent to begin building a local reliability baseline." });
|
|
103
|
+
return {
|
|
104
|
+
generatedAt: new Date().toISOString(), privacy: "Computed locally from private per-user run memory and current repository files. Raw prompts, source code, and credentials are not exported or stored in Git.",
|
|
105
|
+
summary: { runs: runs.length, completed: runs.filter(completed).length, firstPassRate, repairRate: rate(repairable.filter(repaired).length, repairable.length), promotionRate: rate(runs.filter((run) => run.status === "applied").length, promotable.length), keepRate: keep.keepRate, keptLines: keep.keptLines, sampledLines: keep.sampledLines, toolReliability: reliability, averageProviderLatencyMs: average(providerLatencies) },
|
|
106
|
+
models: modelRows(runs), tools, errors, signals,
|
|
107
|
+
recent: runs.slice(0, 12).map((run) => ({ id: run.id, ts: run.createdAt, provider: run.provider, model: run.model, intent: run.intent, status: run.status, firstPass: firstPass(run), repaired: repaired(run), promoted: run.status === "applied", errors: [...new Set((run.telemetry?.errors ?? []).map((error) => error.class))] })),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=harness-intelligence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness-intelligence.js","sourceRoot":"","sources":["../../src/harness-intelligence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { recordSnapshotDiff } from "./capture.js";
|
|
4
|
+
import { createRepositorySnapshot, diffSnapshots } from "./git.js";
|
|
5
|
+
import { appendEvent, eventBase, initializeStore } from "./ledger.js";
|
|
6
|
+
import { privateCachePath } from "./storage.js";
|
|
7
|
+
function statePath(root, sessionId) {
|
|
8
|
+
const safe = createHash("sha256").update(sessionId).digest("hex");
|
|
9
|
+
return privateCachePath(root, "sessions", `${safe}.json`);
|
|
10
|
+
}
|
|
11
|
+
export async function handleHarnessHook(root, action, sessionId) {
|
|
12
|
+
await initializeStore(root);
|
|
13
|
+
const path = statePath(root, sessionId);
|
|
14
|
+
await mkdir(privateCachePath(root, "sessions"), { recursive: true });
|
|
15
|
+
if (action === "begin") {
|
|
16
|
+
await writeFile(path, JSON.stringify(await createRepositorySnapshot(root)), "utf8");
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
let before;
|
|
20
|
+
try {
|
|
21
|
+
before = JSON.parse(await readFile(path, "utf8"));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
before = await createRepositorySnapshot(root);
|
|
25
|
+
}
|
|
26
|
+
const after = await createRepositorySnapshot(root);
|
|
27
|
+
const snapshot = await diffSnapshots(root, before, after);
|
|
28
|
+
if (snapshot.files.length) {
|
|
29
|
+
const { diff, duplicate } = await recordSnapshotDiff(root, snapshot, { authorship: "ai", model: "opencode" });
|
|
30
|
+
if (!duplicate)
|
|
31
|
+
await appendEvent(root, { ...eventBase(root, diff.branch), kind: "confidence", diffId: diff.id, score: null });
|
|
32
|
+
}
|
|
33
|
+
// Session idle can occur after every turn. The result becomes the next turn's baseline.
|
|
34
|
+
await writeFile(path, JSON.stringify(after), "utf8");
|
|
35
|
+
}
|
|
36
|
+
export async function removeHarnessHookState(root, sessionId) {
|
|
37
|
+
await rm(statePath(root, sessionId), { force: true });
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,SAAS,SAAS,CAAC,IAAY,EAAE,SAAiB;IAChD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClE,OAAO,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,MAAuB,EAAE,SAAiB;IAC9F,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACxC,MAAM,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,wBAAwB,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IACD,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAChE,MAAM,GAAG,MAAM,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1D,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QAC9G,IAAI,CAAC,SAAS;YAAE,MAAM,WAAW,CAAC,IAAI,EAAE,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjI,CAAC;IACD,wFAAwF;IACxF,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAY,EAAE,SAAiB;IAC1E,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { listTrackedFiles } from "./git.js";
|
|
4
|
+
import { analyzeProjectSemantics } from "./semantic.js";
|
|
5
|
+
const testPath = (path) => /(^|\/)(test|tests|__tests__)(\/|$)|\.(test|spec)\.[^.]+$/i.test(path) || /Test\.java$/.test(path);
|
|
6
|
+
const idFor = (kind, value) => `${kind}:${value}`.replace(/\s+/g, "-");
|
|
7
|
+
const observed = (detail) => ({ level: "observed", source: "git", detail });
|
|
8
|
+
const inferred = (detail) => ({ level: "inferred", source: "structural", detail });
|
|
9
|
+
const compilerEvidence = (detail) => ({ level: "inferred", source: "compiler", detail });
|
|
10
|
+
const languageByExtension = {
|
|
11
|
+
java: "Java", kt: "Kotlin", kts: "Kotlin", ts: "TypeScript", tsx: "TypeScript", js: "JavaScript", jsx: "JavaScript", mjs: "JavaScript", cjs: "JavaScript", vue: "Vue",
|
|
12
|
+
py: "Python", go: "Go", rs: "Rust", cs: "C#", rb: "Ruby", php: "PHP", swift: "Swift", c: "C", h: "C/C++", cc: "C++", cpp: "C++", hpp: "C++", sh: "Shell",
|
|
13
|
+
};
|
|
14
|
+
function detectedLanguage(path) {
|
|
15
|
+
return languageByExtension[path.split(".").at(-1)?.toLowerCase() ?? ""];
|
|
16
|
+
}
|
|
17
|
+
function splitPatch(patch) {
|
|
18
|
+
const files = [];
|
|
19
|
+
let current;
|
|
20
|
+
for (const line of patch.split("\n")) {
|
|
21
|
+
const header = line.match(/^diff --git a\/(.+) b\/(.+)$/);
|
|
22
|
+
if (header) {
|
|
23
|
+
current = { path: header[2], added: "", removed: "" };
|
|
24
|
+
files.push(current);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (!current || line.startsWith("+++") || line.startsWith("---"))
|
|
28
|
+
continue;
|
|
29
|
+
if (line.startsWith("+"))
|
|
30
|
+
current.added += `${line.slice(1)}\n`;
|
|
31
|
+
if (line.startsWith("-"))
|
|
32
|
+
current.removed += `${line.slice(1)}\n`;
|
|
33
|
+
}
|
|
34
|
+
return files;
|
|
35
|
+
}
|
|
36
|
+
function symbols(source, language) {
|
|
37
|
+
const found = [];
|
|
38
|
+
const push = (name, kind) => {
|
|
39
|
+
if (name && !found.some((item) => item.name === name && item.kind === kind))
|
|
40
|
+
found.push({ name, kind });
|
|
41
|
+
};
|
|
42
|
+
if (language === "java") {
|
|
43
|
+
for (const match of source.matchAll(/\b(?:class|interface|record|enum)\s+([A-Za-z_$][\w$]*)/g))
|
|
44
|
+
push(match[1], "class");
|
|
45
|
+
for (const match of source.matchAll(/^\s*(?:(?:public|protected|private)\s+)?(?:static\s+)?(?:final\s+)?[\w<>?,.\[\]]+\s+([a-zA-Z_$][\w$]*)\s*\([^;{}]*\)\s*(?:throws\s+[\w.,\s]+)?\{/gm)) {
|
|
46
|
+
if (!["if", "for", "while", "switch", "catch"].includes(match[1]))
|
|
47
|
+
push(match[1], "method");
|
|
48
|
+
}
|
|
49
|
+
if (/@(?:RestController|Controller)|@(Get|Post|Put|Patch|Delete|Request)Mapping/.test(source))
|
|
50
|
+
push("HTTP API", "entrypoint");
|
|
51
|
+
if (/@(?:Configuration|Bean|EnableWebSecurity)/.test(source))
|
|
52
|
+
push("Spring security runtime", "config");
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
for (const match of source.matchAll(/\b(?:class|interface|type|enum)\s+([A-Za-z_$][\w$]*)/g))
|
|
56
|
+
push(match[1], "class");
|
|
57
|
+
for (const match of source.matchAll(/\b(?:export\s+)?(?:async\s+)?function\s+([A-Za-z_$][\w$]*)|\b(?:export\s+)?const\s+([A-Za-z_$][\w$]*)\s*=\s*(?:async\s*)?\(/g))
|
|
58
|
+
push(match[1] ?? match[2], "method");
|
|
59
|
+
if (/\b(?:app|router)\.(?:get|post|put|patch|delete)\s*\(/.test(source))
|
|
60
|
+
push("HTTP API", "entrypoint");
|
|
61
|
+
}
|
|
62
|
+
return found;
|
|
63
|
+
}
|
|
64
|
+
function dependencies(source, language) {
|
|
65
|
+
const values = language === "java"
|
|
66
|
+
? [...source.matchAll(/^import\s+(?:static\s+)?([\w.]+);/gm)].map((match) => match[1].split(".").at(-1) ?? match[1])
|
|
67
|
+
: [...source.matchAll(/^import(?:[\s\S]*?from\s*)?["']([^"']+)["']/gm)].map((match) => match[1]);
|
|
68
|
+
return [...new Set(values)].filter((value) => !/^(java|javax)$/.test(value)).slice(0, 16);
|
|
69
|
+
}
|
|
70
|
+
export async function analyzeImpact(root, diff, patch, history = []) {
|
|
71
|
+
const patchFiles = splitPatch(patch);
|
|
72
|
+
const nodes = [];
|
|
73
|
+
const edges = [];
|
|
74
|
+
const nodeIds = new Set();
|
|
75
|
+
const addNode = (node) => { if (!nodeIds.has(node.id)) {
|
|
76
|
+
nodeIds.add(node.id);
|
|
77
|
+
nodes.push(node);
|
|
78
|
+
} return node.id; };
|
|
79
|
+
const addEdge = (edge) => {
|
|
80
|
+
const existing = edges.find((item) => item.from === edge.from && item.to === edge.to && item.kind === edge.kind);
|
|
81
|
+
if (!existing)
|
|
82
|
+
edges.push(edge);
|
|
83
|
+
else if (edge.evidence.source === "compiler" && existing.evidence.source === "structural")
|
|
84
|
+
existing.evidence = edge.evidence;
|
|
85
|
+
};
|
|
86
|
+
const languages = new Set();
|
|
87
|
+
const changedSymbolNames = new Set();
|
|
88
|
+
const sourceByPath = new Map();
|
|
89
|
+
for (const file of diff.files) {
|
|
90
|
+
const language = file.path.endsWith(".java") ? "java" : /\.[cm]?[jt]sx?$/.test(file.path) ? "typescript" : null;
|
|
91
|
+
const detected = detectedLanguage(file.path);
|
|
92
|
+
if (detected)
|
|
93
|
+
languages.add(detected);
|
|
94
|
+
const filePatch = patchFiles.find((item) => item.path === file.path);
|
|
95
|
+
let current = "";
|
|
96
|
+
try {
|
|
97
|
+
current = await readFile(join(root, file.path), "utf8");
|
|
98
|
+
}
|
|
99
|
+
catch { }
|
|
100
|
+
sourceByPath.set(file.path, current || filePatch?.added || "");
|
|
101
|
+
const removedFile = file.removed > 0 && file.added === 0 && !current;
|
|
102
|
+
const status = removedFile ? "removed" : file.removed === 0 ? "added" : "modified";
|
|
103
|
+
const kind = testPath(file.path) ? "test" : /(?:pom\.xml|package\.json|\.ya?ml$|\.properties$)/.test(file.path) ? "config" : "file";
|
|
104
|
+
const fileId = addNode({ id: idFor("file", file.path), label: file.path.split("/").at(-1) ?? file.path, path: file.path, kind, status, detail: `${file.added} additions · ${file.removed} deletions`, evidence: observed("Changed path and line counts reported by Git") });
|
|
105
|
+
if (!language)
|
|
106
|
+
continue;
|
|
107
|
+
const addedSymbols = symbols(filePatch?.added ?? current, language);
|
|
108
|
+
const removedSymbols = symbols(filePatch?.removed ?? "", language);
|
|
109
|
+
const currentSymbols = symbols(current, language);
|
|
110
|
+
for (const symbol of [...removedSymbols, ...addedSymbols]) {
|
|
111
|
+
const isRemoved = removedSymbols.some((item) => item.name === symbol.name && item.kind === symbol.kind) && !currentSymbols.some((item) => item.name === symbol.name && item.kind === symbol.kind);
|
|
112
|
+
const nodeKind = symbol.kind === "config" ? "config" : symbol.kind;
|
|
113
|
+
const symbolId = addNode({ id: idFor(nodeKind, `${file.path}:${symbol.name}`), label: symbol.name, path: file.path, kind: nodeKind, status: isRemoved ? "removed" : status === "added" ? "added" : "modified", detail: symbol.kind === "method" ? "Changed executable behavior" : "Changed structural surface", evidence: inferred(`${language === "java" ? "Java" : "TypeScript"} source pattern match; compiler not consulted`) });
|
|
114
|
+
addEdge({ from: fileId, to: symbolId, kind: "defines", evidence: inferred("Definition relationship detected from source structure") });
|
|
115
|
+
changedSymbolNames.add(symbol.name);
|
|
116
|
+
}
|
|
117
|
+
for (const dependency of dependencies(`${filePatch?.added ?? ""}\n${current}`, language)) {
|
|
118
|
+
const dependencyId = addNode({ id: idFor("dependency", dependency), label: dependency, kind: "dependency", status: "related", detail: "Imported by changed code", evidence: inferred("Import statement detected; dependency resolution not verified") });
|
|
119
|
+
addEdge({ from: fileId, to: dependencyId, kind: "depends-on", evidence: inferred("Import relationship detected from source text") });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const tracked = (await listTrackedFiles(root)).filter((path) => /\.(java|[cm]?[jt]sx?)$/.test(path) && !diff.files.some((file) => file.path === path)).slice(0, 1500);
|
|
123
|
+
for (const path of tracked) {
|
|
124
|
+
let source = "";
|
|
125
|
+
try {
|
|
126
|
+
source = await readFile(join(root, path), "utf8");
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
const references = [...changedSymbolNames].filter((name) => name.length > 2 && new RegExp(`\\b${name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`).test(source));
|
|
132
|
+
if (!references.length)
|
|
133
|
+
continue;
|
|
134
|
+
const relatedId = addNode({ id: idFor("related", path), label: path.split("/").at(-1) ?? path, path, kind: testPath(path) ? "test" : "file", status: "related", detail: `References ${references.slice(0, 3).join(", ")}`, evidence: inferred("Name reference found in tracked source; symbol resolution not verified") });
|
|
135
|
+
for (const changed of nodes.filter((node) => node.path && changedSymbolNames.has(node.label) && references.includes(node.label)))
|
|
136
|
+
addEdge({ from: relatedId, to: changed.id, kind: testPath(path) ? "covers" : "calls", evidence: inferred("Name reference suggests this relationship; compiler and coverage not consulted") });
|
|
137
|
+
}
|
|
138
|
+
const semanticAnalyses = await analyzeProjectSemantics(root, diff);
|
|
139
|
+
const shortName = (name) => name?.split("#").at(-1)?.split(".").at(-1) ?? "";
|
|
140
|
+
for (const analysis of semanticAnalyses.filter((item) => item.status !== "unavailable")) {
|
|
141
|
+
const evidence = compilerEvidence(analysis.detail);
|
|
142
|
+
for (const symbol of analysis.symbols) {
|
|
143
|
+
const label = shortName(symbol.name);
|
|
144
|
+
const existing = nodes.find((node) => node.path === symbol.path && node.label === label && node.kind === symbol.kind);
|
|
145
|
+
if (existing)
|
|
146
|
+
existing.evidence = evidence;
|
|
147
|
+
else {
|
|
148
|
+
const fileNode = nodes.find((node) => node.path === symbol.path && (node.kind === "file" || node.kind === "test"));
|
|
149
|
+
if (!fileNode)
|
|
150
|
+
continue;
|
|
151
|
+
const symbolId = addNode({ id: idFor(symbol.kind, `${symbol.path}:${label}`), label, path: symbol.path, kind: symbol.kind, status: "related", detail: "Compiler-resolved surface in a changed file", evidence });
|
|
152
|
+
addEdge({ from: fileNode.id, to: symbolId, kind: "defines", evidence });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
for (const relation of analysis.relations) {
|
|
156
|
+
const ensureFile = (path) => {
|
|
157
|
+
const existing = nodes.find((node) => node.path === path && (node.kind === "file" || node.kind === "test"));
|
|
158
|
+
if (existing)
|
|
159
|
+
return existing;
|
|
160
|
+
const related = { id: idFor("related", path), label: path.split("/").at(-1) ?? path, path, kind: testPath(path) ? "test" : "file", status: "related", detail: "Compiler-resolved repository relationship", evidence };
|
|
161
|
+
addNode(related);
|
|
162
|
+
return related;
|
|
163
|
+
};
|
|
164
|
+
const from = ensureFile(relation.fromPath);
|
|
165
|
+
const targetLabel = shortName(relation.toName);
|
|
166
|
+
const to = nodes.find((node) => node.path === relation.toPath && targetLabel && node.label === targetLabel) ?? ensureFile(relation.toPath);
|
|
167
|
+
addEdge({ from: from.id, to: to.id, kind: relation.kind === "imports" ? "depends-on" : "calls", evidence });
|
|
168
|
+
if (from.status === "related")
|
|
169
|
+
from.evidence = evidence;
|
|
170
|
+
if (to.status === "related")
|
|
171
|
+
to.evidence = evidence;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
const allText = `${patch}\n${nodes.map((node) => node.label).join(" ")}`;
|
|
175
|
+
const jwtMigration = /JwtAuthenticationFilter/.test(allText) && /oauth2ResourceServer|JwtDecoder|JwtEncoder/.test(allText);
|
|
176
|
+
if (jwtMigration) {
|
|
177
|
+
const filter = nodes.find((node) => node.label === "JwtAuthenticationFilter");
|
|
178
|
+
const runtime = addNode({ id: "config:spring-resource-server", label: "OAuth2 resource server", kind: "config", status: "added", detail: "Spring Security now owns bearer-token authentication", evidence: inferred("Spring Security configuration patterns detected in the diff") });
|
|
179
|
+
if (filter)
|
|
180
|
+
addEdge({ from: filter.id, to: runtime, kind: "replaces", evidence: inferred("Removal and replacement configuration co-occur in this change") });
|
|
181
|
+
}
|
|
182
|
+
for (const test of nodes.filter((node) => node.kind === "test")) {
|
|
183
|
+
const testSource = sourceByPath.get(test.path ?? "") ?? "";
|
|
184
|
+
const targets = nodes.filter((node) => node.status !== "removed" && (node.kind === "class" || node.kind === "method" || node.kind === "dependency" || node.kind === "config") && node.label.length > 3 && new RegExp(`\\b${node.label.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}`, "i").test(testSource));
|
|
185
|
+
for (const target of targets.slice(0, 10))
|
|
186
|
+
addEdge({ from: test.id, to: target.id, kind: "covers", evidence: inferred("Test source references this surface; executed coverage not collected") });
|
|
187
|
+
if (jwtMigration && /decode|validat|token/i.test(testSource))
|
|
188
|
+
addEdge({ from: test.id, to: "config:spring-resource-server", kind: "covers", evidence: inferred("Test vocabulary matches the changed authentication behavior") });
|
|
189
|
+
}
|
|
190
|
+
const changedPaths = new Set(diff.files.map((file) => file.path));
|
|
191
|
+
const staleNotes = history.flatMap(({ diff: priorDiff, notes }) => {
|
|
192
|
+
const paths = priorDiff.files.map((file) => file.path).filter((path) => changedPaths.has(path));
|
|
193
|
+
return paths.length ? notes.map((note) => ({ diffId: priorDiff.id, text: note.text, paths })) : [];
|
|
194
|
+
});
|
|
195
|
+
const testCount = nodes.filter((node) => node.kind === "test").length;
|
|
196
|
+
const sensitive = /auth|security|token|permission|payment/i.test(allText);
|
|
197
|
+
const risk = sensitive || !testCount ? "high" : diff.files.length > 3 ? "medium" : "low";
|
|
198
|
+
const unproven = jwtMigration
|
|
199
|
+
? ["Expired token rejection", "Incorrect issuer rejection", "Invalid signature rejection", "Endpoint authorization boundaries"]
|
|
200
|
+
: [!testCount ? "No changed or connected test proves this behavior" : "Failure paths not named by connected tests", "Runtime integration beyond the changed files"];
|
|
201
|
+
const structurallySupported = [...languages].some((language) => language === "Java" || language === "TypeScript" || language === "JavaScript" || language === "Vue");
|
|
202
|
+
const languageLabel = languages.size ? [...languages].join(" + ") : "Unknown language";
|
|
203
|
+
const activeSemantics = semanticAnalyses.filter((analysis) => analysis.status !== "unavailable");
|
|
204
|
+
const semanticStatus = !activeSemantics.length ? "unavailable" : activeSemantics.every((analysis) => analysis.status === "resolved") ? "available" : "partial";
|
|
205
|
+
const semanticDetail = activeSemantics.length ? activeSemantics.map((analysis) => analysis.detail).join(" ") : "No compiler adapter could resolve this capture.";
|
|
206
|
+
const capabilities = [
|
|
207
|
+
{ id: "capture", label: "Change capture", status: "available", detail: "Git paths, hunks, additions, and deletions are observed directly." },
|
|
208
|
+
{ id: "structure", label: "Code structure", status: structurallySupported ? (languages.size > 1 && [...languages].some((language) => !["Java", "TypeScript", "JavaScript", "Vue"].includes(language)) ? "partial" : "available") : "unavailable", detail: structurallySupported ? "Java, JavaScript/TypeScript, and Vue script surfaces are structurally inspected." : `${languageLabel} has file-level analysis only in this version.` },
|
|
209
|
+
{ id: "semantics", label: "Resolved semantics", status: semanticStatus, detail: semanticDetail },
|
|
210
|
+
{ id: "runtime", label: "Runtime proof", status: "unavailable", detail: "Run a proof or generated probe to attach executed evidence." },
|
|
211
|
+
];
|
|
212
|
+
const headline = jwtMigration ? "Authentication moved into Spring Security’s resource-server pipeline" : structurallySupported ? `${diff.files.length} changed file${diff.files.length === 1 ? "" : "s"} alter ${nodes.filter((node) => node.kind === "method" || node.kind === "class").length} detected code surfaces` : `${diff.files.length} ${languageLabel} file${diff.files.length === 1 ? "" : "s"} changed; semantic impact still needs an adapter`;
|
|
213
|
+
const narrative = jwtMigration
|
|
214
|
+
? "JWT authentication moved from a custom servlet filter to Spring Security’s OAuth2 resource-server pipeline. Token creation now uses JwtEncoder; validation depends on JwtDecoder, issuer matching, UUID subjects, HS256, and the configured signing key. Happy-path issuance and invalid-subject validation are connected to tests; expiry, issuer, signature, and endpoint authorization remain unproven."
|
|
215
|
+
: structurallySupported ? `Aperta connected ${nodes.filter((node) => node.status !== "related").length} changed surfaces to ${nodes.filter((node) => node.status === "related").length} repository relationships. Treat inferred relationships as leads, then verify behavior in the ownership session.` : `Aperta observed this change through Git and can drive a file-level ownership session. It will not claim symbol, call-graph, or test-coverage knowledge for ${languageLabel} until a structural or compiler adapter supplies evidence.`;
|
|
216
|
+
const insights = [
|
|
217
|
+
`${nodes.filter((node) => node.status === "removed").length} removed · ${nodes.filter((node) => node.status === "added").length} added · ${nodes.filter((node) => node.status === "modified").length} modified surfaces`,
|
|
218
|
+
`${nodes.filter((node) => node.status === "related").length} callers, dependencies, tests, or configuration surfaces connected`,
|
|
219
|
+
testCount ? `${testCount} test surface${testCount === 1 ? "" : "s"} connected to the change` : "No test surface connected to the change",
|
|
220
|
+
];
|
|
221
|
+
const compilerNames = activeSemantics.map((analysis) => analysis.provider === "java-compiler" ? "JDK compiler" : "TypeScript compiler");
|
|
222
|
+
return { analyzer: compilerNames.length ? `${compilerNames.join(" + ")} semantic analyzer v1` : structurallySupported ? `${languageLabel} structural analyzer v1` : `${languageLabel} universal Git analyzer v1`, languages: [...languages], capabilities, headline, narrative, risk, nodes, edges, insights, unproven, staleNotes };
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=impact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact.js","sourceRoot":"","sources":["../../src/impact.ts"],"names":[],"mappings":"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"}
|