@mirnoorata/codexa 0.3.0 → 0.5.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/README.md +23 -5
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/eval/scoring.js +17 -0
- package/dist/eval/scoring.js.map +1 -1
- package/dist/indexer/external-facts.d.ts +2 -1
- package/dist/indexer/external-facts.js +16 -0
- package/dist/indexer/external-facts.js.map +1 -1
- package/dist/indexer/freshness.d.ts +6 -1
- package/dist/indexer/freshness.js +13 -3
- package/dist/indexer/freshness.js.map +1 -1
- package/dist/indexer.js +46 -15
- package/dist/indexer.js.map +1 -1
- package/dist/init.js +9 -4
- package/dist/init.js.map +1 -1
- package/dist/mcp/compaction.js +5 -0
- package/dist/mcp/compaction.js.map +1 -1
- package/dist/mcp/tool-registry.d.ts +19 -19
- package/dist/mcp/tool-registry.js +19 -19
- package/dist/mcp/tool-registry.js.map +1 -1
- package/dist/mcp/tools.js +5 -2
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp-repo-root.js +37 -9
- package/dist/mcp-repo-root.js.map +1 -1
- package/dist/query/change-plan.js +11 -0
- package/dist/query/change-plan.js.map +1 -1
- package/dist/query/complexity.d.ts +27 -0
- package/dist/query/complexity.js +226 -0
- package/dist/query/complexity.js.map +1 -0
- package/dist/query/post-edit/decision.js +17 -6
- package/dist/query/post-edit/decision.js.map +1 -1
- package/dist/query/post-edit.js +49 -15
- package/dist/query/post-edit.js.map +1 -1
- package/dist/risk-ingest.d.ts +2 -2
- package/dist/risk-ingest.js +152 -63
- package/dist/risk-ingest.js.map +1 -1
- package/dist/scip-import.d.ts +3 -0
- package/dist/scip-import.js +569 -0
- package/dist/scip-import.js.map +1 -0
- package/dist/static-analysis.d.ts +2 -1
- package/dist/static-analysis.js +353 -37
- package/dist/static-analysis.js.map +1 -1
- package/dist/symbol-report-ingest.d.ts +10 -1
- package/dist/symbol-report-ingest.js +256 -23
- package/dist/symbol-report-ingest.js.map +1 -1
- package/dist/types.d.ts +33 -1
- package/dist/types.js.map +1 -1
- package/integrations/.claude-plugin/marketplace.json +1 -1
- package/integrations/claude-code/.claude-plugin/plugin.json +1 -1
- package/package.json +4 -3
- package/plugins/codexa/.codex-plugin/plugin.json +1 -1
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { uniqueSorted } from "../util.js";
|
|
2
|
+
const DEFAULT_INVARIANTS = [
|
|
3
|
+
"Do not cut trust-boundary validation, data-loss handling, security, accessibility, or explicit user requirements.",
|
|
4
|
+
"Prefer deletion or a narrow local edit before adding a new abstraction.",
|
|
5
|
+
"Prefer standard library, native platform features, and already-installed dependencies before adding code.",
|
|
6
|
+
"Non-trivial logic still needs the smallest runnable check that would fail if it breaks."
|
|
7
|
+
];
|
|
8
|
+
const MANIFEST_PATH_RE = /(^|\/)(package\.json|package-lock\.json|pnpm-lock\.yaml|yarn\.lock|bun\.lockb|pyproject\.toml|requirements(?:-[^/]+)?\.txt|poetry\.lock|uv\.lock|go\.mod|go\.sum|Cargo\.toml|Cargo\.lock)$/u;
|
|
9
|
+
const ABSTRACTION_PATH_RE = /(^|[-_/])(abstract|adapter|factory|manager|registry|interface)([-_.\/]|$)/iu;
|
|
10
|
+
export function buildPlanComplexityReview(input) {
|
|
11
|
+
const items = [];
|
|
12
|
+
if (!input.editReadiness.editable) {
|
|
13
|
+
items.push({
|
|
14
|
+
kind: "yagni",
|
|
15
|
+
severity: "review",
|
|
16
|
+
message: "Do not edit from this orientation-only packet; narrow to an explicit file or symbol first.",
|
|
17
|
+
rationale: input.editReadiness.reason
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
const manifestTargets = manifestPaths(input.plannedEditTargets);
|
|
21
|
+
if (manifestTargets.length > 0) {
|
|
22
|
+
items.push({
|
|
23
|
+
kind: "existing-dependency",
|
|
24
|
+
severity: "review",
|
|
25
|
+
message: "Package or dependency manifests are in scope; justify the change against stdlib, native, or already-installed alternatives.",
|
|
26
|
+
paths: manifestTargets,
|
|
27
|
+
rationale: "Manifest edits are a common source of avoidable dependency and maintenance cost."
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
if (input.plannedEditTargets.length > 6) {
|
|
31
|
+
items.push({
|
|
32
|
+
kind: "scope",
|
|
33
|
+
severity: "watch",
|
|
34
|
+
message: `Planned edit scope spans ${input.plannedEditTargets.length} files; split it unless the task truly crosses that boundary.`,
|
|
35
|
+
paths: input.plannedEditTargets.slice(0, 8),
|
|
36
|
+
rationale: "Broad planned scopes make speculative scaffolding and unrelated edits more likely."
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
const plannedVerificationCount = input.plannedTests.length + input.requiredWorkflowChecks.length + input.requiredDependencyChecks.length;
|
|
40
|
+
if (input.editReadiness.editable && plannedVerificationCount === 0) {
|
|
41
|
+
items.push({
|
|
42
|
+
kind: "verification",
|
|
43
|
+
severity: "review",
|
|
44
|
+
message: "No runnable check is planned; non-trivial logic needs one smallest relevant check.",
|
|
45
|
+
rationale: "Minimal code without proof is unfinished, not lean."
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return review("plan", items);
|
|
49
|
+
}
|
|
50
|
+
export function buildPostEditComplexityReview(input) {
|
|
51
|
+
const items = [];
|
|
52
|
+
const changedPaths = input.changedSinceSnapshot.map((entry) => entry.path);
|
|
53
|
+
const manifestChanges = manifestPaths(changedPaths);
|
|
54
|
+
if (manifestChanges.length > 0) {
|
|
55
|
+
items.push({
|
|
56
|
+
kind: "existing-dependency",
|
|
57
|
+
severity: "review",
|
|
58
|
+
message: "Package or dependency manifests changed; verify this was necessary instead of using existing platform or dependency surface.",
|
|
59
|
+
paths: manifestChanges,
|
|
60
|
+
rationale: "The dirty tree proves only that manifests changed, so this remains a dependency/change review signal."
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
const unplannedNewFiles = input.changedSinceSnapshot
|
|
64
|
+
.filter((entry) => input.unplannedEditedFiles.includes(entry.path))
|
|
65
|
+
.filter((entry) => entry.kind === "added" || entry.kind === "untracked")
|
|
66
|
+
.map((entry) => entry.path);
|
|
67
|
+
if (unplannedNewFiles.length > 0) {
|
|
68
|
+
items.push({
|
|
69
|
+
kind: "scope",
|
|
70
|
+
severity: "review",
|
|
71
|
+
message: "New files appeared outside the saved planned scope; confirm they are required before keeping them.",
|
|
72
|
+
paths: unplannedNewFiles,
|
|
73
|
+
rationale: "Unplanned new files are where speculative scaffolding usually enters."
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const abstractionFiles = input.changedSinceSnapshot
|
|
77
|
+
.filter((entry) => entry.kind === "added" || entry.kind === "untracked")
|
|
78
|
+
.map((entry) => entry.path)
|
|
79
|
+
.filter((filePath) => ABSTRACTION_PATH_RE.test(filePath));
|
|
80
|
+
if (abstractionFiles.length > 0) {
|
|
81
|
+
items.push({
|
|
82
|
+
kind: "abstraction",
|
|
83
|
+
severity: "watch",
|
|
84
|
+
message: "New abstraction-shaped files appeared; keep them only if there is more than one real caller or implementation.",
|
|
85
|
+
paths: abstractionFiles,
|
|
86
|
+
rationale: "One-implementation interfaces, managers, registries, and adapters often add ownership without reducing complexity."
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
const broadThreshold = input.plannedScope.length > 0 ? Math.max(8, input.plannedScope.length + 3) : 8;
|
|
90
|
+
if (input.changedSinceSnapshot.length > broadThreshold) {
|
|
91
|
+
items.push({
|
|
92
|
+
kind: "scope",
|
|
93
|
+
severity: "watch",
|
|
94
|
+
message: `Dirty scope spans ${input.changedSinceSnapshot.length} files since the snapshot; check for unrelated edits before finalizing.`,
|
|
95
|
+
paths: changedPaths.slice(0, 8),
|
|
96
|
+
rationale: "Large dirty fanout is a practical over-build signal even when every file is individually plausible."
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
if (input.hasActualEditedFiles && input.noVerificationProofForEditedFiles) {
|
|
100
|
+
items.push({
|
|
101
|
+
kind: "verification",
|
|
102
|
+
severity: "review",
|
|
103
|
+
message: "Edited files have no credible verification evidence; smaller code still needs one runnable check.",
|
|
104
|
+
rationale: "This mirrors the post-edit verification gate as a minimality invariant."
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
else if (input.testsNotRun.length > 0) {
|
|
108
|
+
items.push({
|
|
109
|
+
kind: "verification",
|
|
110
|
+
severity: "watch",
|
|
111
|
+
message: "Recommended tests are still unaccounted for; do not use minimality as a reason to skip them.",
|
|
112
|
+
paths: input.testsNotRun.map((test) => test.path).slice(0, 8),
|
|
113
|
+
rationale: "The leanest acceptable proof is the smallest relevant check, not no check."
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return review("post-edit", items);
|
|
117
|
+
}
|
|
118
|
+
export function formatComplexityReview(reviewData) {
|
|
119
|
+
const lines = ["Complexity review:", `- ${reviewData.summary}`];
|
|
120
|
+
if (reviewData.items.length === 0) {
|
|
121
|
+
lines.push("- Lean already: no dependency, abstraction, scope, or verification complexity signal fired.");
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
for (const item of reviewData.items.slice(0, 8)) {
|
|
125
|
+
const paths = item.paths && item.paths.length > 0 ? ` [${item.paths.slice(0, 4).join(", ")}${item.paths.length > 4 ? "; ..." : ""}]` : "";
|
|
126
|
+
const replacement = item.replacement ? ` Replace with: ${item.replacement}.` : "";
|
|
127
|
+
lines.push(`- ${item.kind}/${item.severity}: ${item.message}${paths} ${item.rationale}.${replacement}`.trim());
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
lines.push("Invariants:");
|
|
131
|
+
lines.push(...reviewData.invariants.slice(0, 4).map((invariant) => `- ${invariant}`));
|
|
132
|
+
return lines;
|
|
133
|
+
}
|
|
134
|
+
export function compactComplexityReview(value, itemLimit = 8) {
|
|
135
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
136
|
+
return value;
|
|
137
|
+
}
|
|
138
|
+
const record = value;
|
|
139
|
+
const priorTruncation = complexityTruncation(record);
|
|
140
|
+
const items = Array.isArray(record.items) ? record.items.slice(0, itemLimit).map(compactComplexityItem) : [];
|
|
141
|
+
const invariants = Array.isArray(record.invariants) ? record.invariants.filter((entry) => typeof entry === "string").slice(0, 6) : [];
|
|
142
|
+
const truncation = { ...priorTruncation };
|
|
143
|
+
if (Array.isArray(record.items) && record.items.length > itemLimit) {
|
|
144
|
+
truncation.items = { total: priorTruncation.items?.total ?? record.items.length, returned: itemLimit };
|
|
145
|
+
}
|
|
146
|
+
if (Array.isArray(record.invariants) && record.invariants.length > 6) {
|
|
147
|
+
truncation.invariants = { total: priorTruncation.invariants?.total ?? record.invariants.length, returned: 6 };
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
schemaVersion: record.schemaVersion,
|
|
151
|
+
phase: record.phase,
|
|
152
|
+
status: record.status,
|
|
153
|
+
blocking: record.blocking,
|
|
154
|
+
summary: record.summary,
|
|
155
|
+
items,
|
|
156
|
+
invariants,
|
|
157
|
+
truncation: Object.keys(truncation).length > 0 ? truncation : undefined
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function review(phase, rawItems) {
|
|
161
|
+
const items = dedupeItems(rawItems).slice(0, 8);
|
|
162
|
+
const status = items.some((item) => item.severity === "review" || item.severity === "watch") ? "review" : "lean";
|
|
163
|
+
const summary = status === "lean"
|
|
164
|
+
? "Lean already: no deterministic over-build signal fired; still prefer deletion, reuse, and native surface before adding code."
|
|
165
|
+
: `${items.length} complexity signal(s) need review; keep this advisory and preserve safety and verification.`;
|
|
166
|
+
return {
|
|
167
|
+
schemaVersion: 1,
|
|
168
|
+
phase,
|
|
169
|
+
status,
|
|
170
|
+
blocking: false,
|
|
171
|
+
summary,
|
|
172
|
+
items,
|
|
173
|
+
invariants: DEFAULT_INVARIANTS
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
function manifestPaths(paths) {
|
|
177
|
+
return uniqueSorted(paths.filter((filePath) => MANIFEST_PATH_RE.test(filePath)));
|
|
178
|
+
}
|
|
179
|
+
function dedupeItems(items) {
|
|
180
|
+
const seen = new Set();
|
|
181
|
+
const result = [];
|
|
182
|
+
for (const item of items) {
|
|
183
|
+
const key = [item.kind, item.severity, item.message, item.paths?.join("\0") ?? ""].join("\0");
|
|
184
|
+
if (seen.has(key)) {
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
seen.add(key);
|
|
188
|
+
result.push({
|
|
189
|
+
...item,
|
|
190
|
+
paths: item.paths ? uniqueSorted(item.paths).slice(0, 12) : undefined
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
return result;
|
|
194
|
+
}
|
|
195
|
+
function compactComplexityItem(item) {
|
|
196
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) {
|
|
197
|
+
return item;
|
|
198
|
+
}
|
|
199
|
+
const record = item;
|
|
200
|
+
return {
|
|
201
|
+
kind: record.kind,
|
|
202
|
+
severity: record.severity,
|
|
203
|
+
message: record.message,
|
|
204
|
+
paths: Array.isArray(record.paths) ? record.paths.slice(0, 8) : undefined,
|
|
205
|
+
replacement: record.replacement,
|
|
206
|
+
rationale: record.rationale
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
function complexityTruncation(record) {
|
|
210
|
+
const truncation = record.truncation;
|
|
211
|
+
if (!truncation || typeof truncation !== "object" || Array.isArray(truncation)) {
|
|
212
|
+
return {};
|
|
213
|
+
}
|
|
214
|
+
const result = {};
|
|
215
|
+
for (const [key, value] of Object.entries(truncation)) {
|
|
216
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
const maybeEntry = value;
|
|
220
|
+
if (typeof maybeEntry.total === "number" && typeof maybeEntry.returned === "number") {
|
|
221
|
+
result[key] = { total: maybeEntry.total, returned: maybeEntry.returned };
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return result;
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=complexity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity.js","sourceRoot":"","sources":["../../src/query/complexity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
const ADVISORY_UNINDEXED_FILE_PATTERN = /\.(?:avif|bmp|css|gif|ico|ini|jpe?g|jsonc?|less|lock|mdx?|otf|pcss|png|postcss|rst|sass|scss|svg|toml|ttf|txt|webp|woff2?|ya?ml)$/iu;
|
|
2
|
+
const ADVISORY_UNINDEXED_BASENAME_PATTERN = /(^|\/)(?:dockerfile|package-lock\.json|pnpm-lock\.yaml|yarn\.lock|bun\.lockb)$/iu;
|
|
1
3
|
export function postEditDecision(input) {
|
|
2
4
|
const missingWorkflowCheckCount = input.workflowChecks.filter((check) => check.status === "missing").length;
|
|
3
5
|
const missingDependencyCheckCount = input.dependencyChecks.filter((check) => check.status === "missing").length;
|
|
6
|
+
const blockingUnindexedEditedFiles = input.unindexedEditedFiles.filter((filePath) => !isAdvisoryUnindexedEditedFile(filePath));
|
|
7
|
+
const advisoryUnindexedEditedFiles = input.unindexedEditedFiles.filter((filePath) => isAdvisoryUnindexedEditedFile(filePath));
|
|
4
8
|
const riskEscalationsCoveredByVerification = input.riskEscalations.length > 0 &&
|
|
5
9
|
input.unplannedEditedFiles.length === 0 &&
|
|
6
10
|
input.testsNotRun.length === 0 &&
|
|
@@ -24,7 +28,7 @@ export function postEditDecision(input) {
|
|
|
24
28
|
: undefined,
|
|
25
29
|
input.unplannedEditedFiles.length > 0 ? `${input.unplannedEditedFiles.length} edited file(s) outside planned scope` : undefined,
|
|
26
30
|
input.unplannedChangedSymbols.length > 0 ? `${input.unplannedChangedSymbols.length} changed symbol(s) outside requested symbol target` : undefined,
|
|
27
|
-
input.unindexedEditedFiles.length > 0 ? `${input.unindexedEditedFiles.length} changed-since-snapshot file(s)
|
|
31
|
+
input.unindexedEditedFiles.length > 0 ? `${input.unindexedEditedFiles.length} changed-since-snapshot file(s) lack indexed source/symbol context` : undefined,
|
|
28
32
|
input.symbolDeltas.some((delta) => delta.newSymbols.length > 0 || delta.removedSymbols.length > 0)
|
|
29
33
|
? `${input.symbolDeltas.reduce((sum, delta) => sum + delta.newSymbols.length + delta.removedSymbols.length, 0)} symbol delta(s) detected`
|
|
30
34
|
: undefined,
|
|
@@ -71,7 +75,8 @@ export function postEditDecision(input) {
|
|
|
71
75
|
headChanged: headChangedBlocking,
|
|
72
76
|
unplannedEditedFiles: input.unplannedEditedFiles,
|
|
73
77
|
unplannedChangedSymbols: input.unplannedChangedSymbols,
|
|
74
|
-
|
|
78
|
+
blockingUnindexedEditedFiles,
|
|
79
|
+
advisoryUnindexedEditedFiles,
|
|
75
80
|
symbolDeltas: input.symbolDeltas,
|
|
76
81
|
riskDeltas: input.riskDeltas,
|
|
77
82
|
missingWorkflowCheckCount,
|
|
@@ -95,32 +100,38 @@ export function postEditDecision(input) {
|
|
|
95
100
|
hasDegradedSnapshotTests
|
|
96
101
|
};
|
|
97
102
|
}
|
|
103
|
+
function isAdvisoryUnindexedEditedFile(filePath) {
|
|
104
|
+
return ADVISORY_UNINDEXED_FILE_PATTERN.test(filePath) || ADVISORY_UNINDEXED_BASENAME_PATTERN.test(filePath);
|
|
105
|
+
}
|
|
98
106
|
function inspectClassification(verdict, input) {
|
|
99
107
|
if (verdict !== "inspect") {
|
|
100
108
|
return { mode: "none", reasons: [] };
|
|
101
109
|
}
|
|
102
|
-
const
|
|
110
|
+
const blockingReasonsWithoutQuality = [
|
|
103
111
|
input.headChanged ? "snapshot commit changed" : undefined,
|
|
104
112
|
input.worktreeDegradationReasons.length > 0 ? "worktree state unavailable" : undefined,
|
|
105
113
|
input.unplannedEditedFiles.length > 0 ? "edited files outside planned scope" : undefined,
|
|
106
114
|
input.unplannedChangedSymbols.length > 0 ? "changed symbols outside requested symbol target" : undefined,
|
|
107
|
-
input.
|
|
115
|
+
input.blockingUnindexedEditedFiles.length > 0 ? "source-like edited files are not indexed" : undefined,
|
|
108
116
|
input.missingWorkflowCheckCount > 0 ? "required workflow checks missing" : undefined,
|
|
109
117
|
input.missingDependencyCheckCount > 0 ? "required dependency checks missing" : undefined,
|
|
110
|
-
input.quality?.level === "medium" || input.quality?.level === "low" ? "context quality is not high" : undefined,
|
|
111
118
|
input.riskEscalationsNeedInspection ? "high-risk target lacks complete verification accounting" : undefined,
|
|
112
119
|
input.waivedVerification.length > 0 ? "verification was waived" : undefined,
|
|
113
120
|
input.noVerificationProofForEditedFiles ? "edited files have no credible verification evidence" : undefined
|
|
114
121
|
].filter((reason) => Boolean(reason));
|
|
122
|
+
const qualityBlockingReason = input.quality?.level === "low" ? "context quality is low" : input.quality?.level === "medium" && blockingReasonsWithoutQuality.length > 0 ? "context quality is not high" : undefined;
|
|
123
|
+
const blockingReasons = [...blockingReasonsWithoutQuality, qualityBlockingReason].filter((reason) => Boolean(reason));
|
|
115
124
|
if (blockingReasons.length > 0) {
|
|
116
125
|
return { mode: "blocking", reasons: blockingReasons };
|
|
117
126
|
}
|
|
118
127
|
const advisoryReasons = [
|
|
119
128
|
!input.snapshot ? "no saved task snapshot" : undefined,
|
|
120
129
|
input.snapshotAmbiguity ? "latest snapshot was ambiguous" : undefined,
|
|
130
|
+
input.advisoryUnindexedEditedFiles.length > 0 ? "edited non-source files lack symbol ranges" : undefined,
|
|
121
131
|
input.hasDegradedSnapshotTests ? "planned snapshot tests have degraded provenance" : undefined,
|
|
122
132
|
input.symbolDeltas.some((delta) => delta.newSymbols.length > 0 || delta.removedSymbols.length > 0) ? "symbol inventory changed" : undefined,
|
|
123
|
-
input.riskDeltas.some((delta) => delta.delta > 0) ? "risk score changed but blocking risk checks are covered" : undefined
|
|
133
|
+
input.riskDeltas.some((delta) => delta.delta > 0) ? "risk score changed but blocking risk checks are covered" : undefined,
|
|
134
|
+
input.quality?.level === "medium" ? "context quality is medium" : undefined
|
|
124
135
|
].filter((reason) => Boolean(reason));
|
|
125
136
|
return { mode: "advisory", reasons: advisoryReasons.length > 0 ? advisoryReasons : ["inspect is advisory; no blocking drift signal was found"] };
|
|
126
137
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decision.js","sourceRoot":"","sources":["../../../src/query/post-edit/decision.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"decision.js","sourceRoot":"","sources":["../../../src/query/post-edit/decision.ts"],"names":[],"mappings":"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"}
|
package/dist/query/post-edit.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { promises as fs } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { isTestPath } from "../language.js";
|
|
4
|
+
import { buildPostEditComplexityReview, formatComplexityReview } from "./complexity.js";
|
|
4
5
|
import { groupDiffImpact, formatDiffGroups, formatGaps, indexGaps } from "./diff.js";
|
|
5
6
|
import { clampInt, fitLinesToTokenBudget } from "./formatting.js";
|
|
6
7
|
import { affectedWorkflowGraphEdges, testsFromGraphEdges } from "./graph.js";
|
|
@@ -74,12 +75,25 @@ async function postEditReviewQueryInternal(sessionInput, input, options, interna
|
|
|
74
75
|
const task = input.task ?? snapshot?.task ?? "Post-edit review";
|
|
75
76
|
const effectiveTaskId = snapshot?.taskId ?? loadedSnapshot.latestTaskId ?? input.taskId;
|
|
76
77
|
const changeType = input.changeType ?? snapshot?.changeType ?? "unknown";
|
|
77
|
-
|
|
78
|
-
|
|
78
|
+
// Priority order, then cap: actually-edited files must never be dropped
|
|
79
|
+
// in favor of alphabetically-earlier explicit inputs (uniqueSorted+slice
|
|
80
|
+
// did exactly that, silently shrinking verdict-relevant test accounting).
|
|
81
|
+
const reviewTargetPool = [
|
|
82
|
+
...editPaths,
|
|
79
83
|
...explicitFiles,
|
|
80
84
|
...explicitSymbolFiles,
|
|
81
85
|
...(editPaths.length === 0 && explicitFiles.length === 0 && explicitSymbolFiles.length === 0 && snapshot ? snapshot.plannedFiles.slice(0, limit) : [])
|
|
82
|
-
]
|
|
86
|
+
];
|
|
87
|
+
const seenReviewTargets = new Set();
|
|
88
|
+
const orderedReviewTargets = [];
|
|
89
|
+
for (const target of reviewTargetPool) {
|
|
90
|
+
if (!seenReviewTargets.has(target)) {
|
|
91
|
+
seenReviewTargets.add(target);
|
|
92
|
+
orderedReviewTargets.push(target);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const reviewTargets = orderedReviewTargets.slice(0, Math.max(limit, 3));
|
|
96
|
+
const droppedReviewTargets = orderedReviewTargets.length - reviewTargets.length;
|
|
83
97
|
const context = await contextPackQuery(session, {
|
|
84
98
|
task,
|
|
85
99
|
files: reviewTargets,
|
|
@@ -263,6 +277,14 @@ async function postEditReviewQueryInternal(sessionInput, input, options, interna
|
|
|
263
277
|
riskEscalationsNeedInspection,
|
|
264
278
|
riskEscalations
|
|
265
279
|
});
|
|
280
|
+
const complexityReview = buildPostEditComplexityReview({
|
|
281
|
+
changedSinceSnapshot,
|
|
282
|
+
unplannedEditedFiles,
|
|
283
|
+
plannedScope,
|
|
284
|
+
testsNotRun,
|
|
285
|
+
noVerificationProofForEditedFiles,
|
|
286
|
+
hasActualEditedFiles
|
|
287
|
+
});
|
|
266
288
|
const quality = contextData.quality;
|
|
267
289
|
const sessionMemoryPointer = priorSessionMemory
|
|
268
290
|
? {
|
|
@@ -333,6 +355,25 @@ async function postEditReviewQueryInternal(sessionInput, input, options, interna
|
|
|
333
355
|
`Inspect classification: ${inspectMode}; authority ${completionAuthority}`,
|
|
334
356
|
semanticReviewContext ? formatPostEditSemanticReviewContext(semanticReviewContext) : undefined,
|
|
335
357
|
`Outcome record: ${outcomePath ?? "not persisted"}`,
|
|
358
|
+
droppedReviewTargets > 0
|
|
359
|
+
? `Review scope: first ${reviewTargets.length} of ${orderedReviewTargets.length} candidate targets (edited files prioritized); ${droppedReviewTargets} not analyzed — raise limit to widen.`
|
|
360
|
+
: undefined,
|
|
361
|
+
// Verdict-relevant summaries render BEFORE the bulk sections: small
|
|
362
|
+
// token budgets truncate from the end, and a hook consuming this text
|
|
363
|
+
// needs the drift reasons and next actions to survive, not the
|
|
364
|
+
// thirtieth changed-file entry.
|
|
365
|
+
"",
|
|
366
|
+
"Drift reasons:",
|
|
367
|
+
...(driftReasons.length > 0 ? driftReasons.map((reason) => `- ${reason}`) : ["- none"]),
|
|
368
|
+
inspectReasons.length > 0 ? "" : undefined,
|
|
369
|
+
inspectReasons.length > 0 ? "Inspect reasons:" : undefined,
|
|
370
|
+
...inspectReasons.map((reason) => `- ${reason}`),
|
|
371
|
+
"",
|
|
372
|
+
"Next actions:",
|
|
373
|
+
...nextActions.map((action) => `- ${action}`),
|
|
374
|
+
missedLikelyTests.length > 0 ? `Tests still unaccounted for: ${missedLikelyTests.slice(0, 8).map((test) => test.path).join(", ")}` : "Tests still unaccounted for: none",
|
|
375
|
+
"",
|
|
376
|
+
...formatComplexityReview(complexityReview),
|
|
336
377
|
"",
|
|
337
378
|
"Changed since snapshot:",
|
|
338
379
|
...(changedSinceSnapshot.length > 0 ? changedSinceSnapshot.slice(0, 30).map(formatChangedEntry) : ["- none detected"]),
|
|
@@ -347,7 +388,7 @@ async function postEditReviewQueryInternal(sessionInput, input, options, interna
|
|
|
347
388
|
snapshot
|
|
348
389
|
? snapshot.origin === "hook-implicit"
|
|
349
390
|
? "- Planned edit targets: none declared (implicit baseline); call change_plan with saveSnapshot=true to declare scope and tests"
|
|
350
|
-
: `- Planned edit targets: ${plannedScope.slice(0, 20).join(", ") || "none"}`
|
|
391
|
+
: `- Planned edit targets: ${plannedScope.slice(0, 20).join(", ") || "none"}${plannedScope.length > 20 ? `; +${plannedScope.length - 20} more` : ""}`
|
|
351
392
|
: "- Planned edit targets: unavailable",
|
|
352
393
|
`- Actual edited files since snapshot: ${editPaths.slice(0, 30).join(", ") || "none"}`,
|
|
353
394
|
unplannedEditedFiles.length > 0 ? `- Unplanned edited files: ${unplannedEditedFiles.join(", ")}` : "- No unplanned edits detected against the saved planned scope.",
|
|
@@ -357,7 +398,9 @@ async function postEditReviewQueryInternal(sessionInput, input, options, interna
|
|
|
357
398
|
: requestedSymbolNames.size > 0
|
|
358
399
|
? "- No changed symbols outside the requested symbol target detected."
|
|
359
400
|
: undefined,
|
|
360
|
-
snapshot && plannedButUntouchedFiles.length > 0
|
|
401
|
+
snapshot && plannedButUntouchedFiles.length > 0
|
|
402
|
+
? `- Planned targets not touched yet: ${plannedButUntouchedFiles.slice(0, 12).join(", ")}${plannedButUntouchedFiles.length > 12 ? `; +${plannedButUntouchedFiles.length - 12} more` : ""}`
|
|
403
|
+
: undefined,
|
|
361
404
|
headChanged ? `- Snapshot commit ${snapshot?.dirtyBaseline.headCommit ?? "none"} differs from current ${freshness.headCommit ?? "none"}` : undefined,
|
|
362
405
|
"",
|
|
363
406
|
"Symbol delta:",
|
|
@@ -401,16 +444,6 @@ async function postEditReviewQueryInternal(sessionInput, input, options, interna
|
|
|
401
444
|
"",
|
|
402
445
|
"Verification ledger:",
|
|
403
446
|
...formatVerificationLedger(dataVerificationLedger),
|
|
404
|
-
missedLikelyTests.length > 0 ? `Tests still unaccounted for: ${missedLikelyTests.slice(0, 8).map((test) => test.path).join(", ")}` : "Tests still unaccounted for: none",
|
|
405
|
-
"",
|
|
406
|
-
"Drift reasons:",
|
|
407
|
-
...(driftReasons.length > 0 ? driftReasons.map((reason) => `- ${reason}`) : ["- none"]),
|
|
408
|
-
inspectReasons.length > 0 ? "" : undefined,
|
|
409
|
-
inspectReasons.length > 0 ? "Inspect reasons:" : undefined,
|
|
410
|
-
...inspectReasons.map((reason) => `- ${reason}`),
|
|
411
|
-
"",
|
|
412
|
-
"Next actions:",
|
|
413
|
-
...nextActions.map((action) => `- ${action}`),
|
|
414
447
|
"",
|
|
415
448
|
"Known gaps:",
|
|
416
449
|
...formatGaps(uniqueSorted([...(contextData.gaps ?? []), ...indexGaps(index, freshness, unindexedEditedFiles)]))
|
|
@@ -502,6 +535,7 @@ async function postEditReviewQueryInternal(sessionInput, input, options, interna
|
|
|
502
535
|
workflows: limitArray(workflows, 12),
|
|
503
536
|
workflowChecks: limitArray(workflowChecks, 20),
|
|
504
537
|
dependencyChecks: limitArray(dependencyChecks, 30),
|
|
538
|
+
complexityReview,
|
|
505
539
|
context: compactContextData(context.data),
|
|
506
540
|
quality,
|
|
507
541
|
semanticReviewContext,
|