@mirnoorata/codexa 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +46 -5
  2. package/dist/artifacts.js +4 -3
  3. package/dist/artifacts.js.map +1 -1
  4. package/dist/cli.js +65 -3
  5. package/dist/cli.js.map +1 -1
  6. package/dist/codex-contract.js +1 -1
  7. package/dist/eval/scoring.js +3 -0
  8. package/dist/eval/scoring.js.map +1 -1
  9. package/dist/eval/types.d.ts +1 -0
  10. package/dist/eval.js +13 -0
  11. package/dist/eval.js.map +1 -1
  12. package/dist/init.d.ts +3 -0
  13. package/dist/init.js +7 -1
  14. package/dist/init.js.map +1 -1
  15. package/dist/mcp/compaction.js +60 -0
  16. package/dist/mcp/compaction.js.map +1 -1
  17. package/dist/mcp/envelope.js +11 -4
  18. package/dist/mcp/envelope.js.map +1 -1
  19. package/dist/mcp/tool-registry.d.ts +19 -7
  20. package/dist/mcp/tool-registry.js +16 -3
  21. package/dist/mcp/tool-registry.js.map +1 -1
  22. package/dist/mcp/tools.d.ts +1 -1
  23. package/dist/mcp/tools.js +59 -30
  24. package/dist/mcp/tools.js.map +1 -1
  25. package/dist/mcp-repo-root.js +2 -7
  26. package/dist/mcp-repo-root.js.map +1 -1
  27. package/dist/mcp.js +1 -1
  28. package/dist/mcp.js.map +1 -1
  29. package/dist/policy-pack.d.ts +37 -0
  30. package/dist/policy-pack.js +274 -0
  31. package/dist/policy-pack.js.map +1 -0
  32. package/dist/prove.d.ts +78 -0
  33. package/dist/prove.js +395 -0
  34. package/dist/prove.js.map +1 -0
  35. package/dist/query/post-edit.js +2 -203
  36. package/dist/query/post-edit.js.map +1 -1
  37. package/dist/query/required-checks.d.ts +13 -0
  38. package/dist/query/required-checks.js +61 -0
  39. package/dist/query/required-checks.js.map +1 -0
  40. package/dist/query/test-plan.d.ts +1 -0
  41. package/dist/query/test-plan.js +111 -31
  42. package/dist/query/test-plan.js.map +1 -1
  43. package/dist/query/verification-display.d.ts +12 -0
  44. package/dist/query/verification-display.js +150 -0
  45. package/dist/query/verification-display.js.map +1 -0
  46. package/dist/query-data.js +6 -1
  47. package/dist/query-data.js.map +1 -1
  48. package/dist/session-memory/derivation.js +3 -0
  49. package/dist/session-memory/derivation.js.map +1 -1
  50. package/dist/types.d.ts +19 -2
  51. package/dist/types.js.map +1 -1
  52. package/integrations/.claude-plugin/marketplace.json +1 -1
  53. package/integrations/claude-code/.claude-plugin/plugin.json +1 -1
  54. package/integrations/claude-code/README.md +8 -1
  55. package/integrations/claude-code/commands/codexa-prove.md +12 -0
  56. package/integrations/claude-code/scripts/cmd/prove.sh +17 -0
  57. package/integrations/claude-code/tests/cmd-smoke.sh +21 -0
  58. package/package.json +1 -1
  59. package/plugins/codexa/.codex-plugin/plugin.json +1 -1
  60. package/plugins/codexa/skills/codexa/SKILL.md +2 -1
package/dist/prove.js ADDED
@@ -0,0 +1,395 @@
1
+ import path from "node:path";
2
+ import { focusBriefQuery, testPlanQuery } from "./queries.js";
3
+ import { loadPolicyPack } from "./policy-pack.js";
4
+ import { loadTaskSnapshot } from "./task-snapshots.js";
5
+ import { freshnessBanner } from "./query/runtime.js";
6
+ import { createQuerySession } from "./query/session.js";
7
+ import { evaluateRequiredChecks } from "./query/required-checks.js";
8
+ import { formatVerificationCoverage, formatVerificationLedger, verificationCommandPlan, verificationEvidenceForCommandReports, verificationLedgerForPostEdit } from "./query/verification.js";
9
+ import { sanitizeCommandEnvelopeForDisplay, sanitizeCommandReportForDisplay, sanitizeCommandText, sanitizeCoverageForDisplay, sanitizeLedgerForDisplay } from "./query/verification-display.js";
10
+ import { CURRENT_VERIFICATION_PROVENANCE as VERIFICATION_PROVENANCE } from "./types.js";
11
+ import { limitText, uniqueSorted } from "./util.js";
12
+ export async function proveQuery(repoRoot, options = {}) {
13
+ const repo = path.resolve(repoRoot);
14
+ const task = options.task?.trim() || "Codexa proof card";
15
+ const diff = options.diff ?? true;
16
+ const session = await createQuerySession(repo, options);
17
+ const [focus, testPlan, snapshotLoad, policies] = await Promise.all([
18
+ focusBriefQuery(session, { task, diff, tokenBudget: Math.min(options.tokenBudget ?? 1800, 3000), limit: 8 }, options),
19
+ testPlanQuery(session, diff, { ...options, files: options.files, changeType: options.changeType ?? "unknown" }),
20
+ loadTaskSnapshot(repo, options.taskId),
21
+ loadPolicyPack(repo)
22
+ ]);
23
+ const focusData = asRecord(focus.data);
24
+ const testData = asRecord(testPlan.data);
25
+ const actionability = typeof testData.actionability === "string" ? testData.actionability : "verify";
26
+ const changedFiles = stringArray(testData.changedFiles);
27
+ const worktree = worktreeFromData(focusData.worktree, changedFiles, stringArray(focusData.worktreeDegradationReasons));
28
+ const snapshot = snapshotSummary(snapshotLoad.snapshot, {
29
+ taskId: snapshotLoad.latestTaskId,
30
+ reason: snapshotLoad.error ?? snapshotLoad.missingReason ?? snapshotLoad.blockedSnapshot?.reason,
31
+ blocked: Boolean(snapshotLoad.blockedSnapshot)
32
+ });
33
+ const readFirst = readFirstFromFocus(focusData.focusFiles);
34
+ const recommendedCommands = stringArray(testData.verificationCommands);
35
+ const commandPlan = verificationCommandPlanFromData(testData.verificationCommandPlan);
36
+ const ledgerPreview = verificationLedgerFromData(testData.verificationLedgerPreview);
37
+ const tests = testRecommendationsFromData(testData.tests);
38
+ const reported = reportedVerificationData({
39
+ repoRoot: repo,
40
+ index: session.index,
41
+ snapshot: snapshotLoad.snapshot,
42
+ tests,
43
+ ranTests: options.ranTests ?? [],
44
+ ranCommands: options.ranCommands ?? [],
45
+ ranCommandReports: options.ranCommandReports ?? [],
46
+ waivedChecks: options.waivedChecks ?? [],
47
+ waivers: options.waivers ?? []
48
+ });
49
+ const gaps = proofGaps({
50
+ freshness: session.freshness,
51
+ worktree,
52
+ snapshot,
53
+ policies,
54
+ reported,
55
+ testPlanActionability: actionability,
56
+ focusGaps: stringArray(focusData.gaps),
57
+ testGaps: stringArray(testData.gaps)
58
+ });
59
+ const data = {
60
+ mode: "proof_card",
61
+ actionability,
62
+ task,
63
+ repoRoot: repo,
64
+ verificationProvenance: VERIFICATION_PROVENANCE,
65
+ freshness: freshnessData(session.freshness),
66
+ worktree,
67
+ readFirst,
68
+ snapshot,
69
+ verification: {
70
+ recommendedCommands,
71
+ commandPlan,
72
+ ledgerPreview,
73
+ tests,
74
+ reported
75
+ },
76
+ policies,
77
+ gaps,
78
+ trustPosture: trustPosture(),
79
+ nextCommands: nextCommands(repo, task, snapshot.status)
80
+ };
81
+ return {
82
+ freshness: session.freshness,
83
+ refresh: session.refresh,
84
+ text: renderProofCard(data, session.freshness, session.refresh),
85
+ data
86
+ };
87
+ }
88
+ function renderProofCard(data, freshness, refresh) {
89
+ const worktreeLine = data.worktree.degraded
90
+ ? `unknown (${data.worktree.degradedReasons.join("; ")})`
91
+ : data.worktree.knownClean
92
+ ? "clean"
93
+ : `${data.worktree.dirtyFileCount ?? data.worktree.changedFiles.length} changed file(s)`;
94
+ const lines = [
95
+ freshnessBanner(freshness, refresh),
96
+ "Codexa proof card",
97
+ `Task: ${data.task}`,
98
+ `Repo: ${data.repoRoot}`,
99
+ `Worktree: ${worktreeLine}`,
100
+ `Snapshot: ${formatSnapshot(data.snapshot)}`,
101
+ "",
102
+ "Read first:",
103
+ ...formatReadFirst(data.readFirst),
104
+ "",
105
+ "Verification preview (not proof until reported):",
106
+ ...formatCommands(data.verification.recommendedCommands),
107
+ "",
108
+ "Verification ledger preview:",
109
+ ...formatVerificationLedger(data.verification.ledgerPreview),
110
+ "",
111
+ "Reported verification evidence:",
112
+ ...formatReportedEvidence(data.verification.reported),
113
+ "",
114
+ "Reported verification coverage:",
115
+ ...formatVerificationCoverage(data.verification.reported.coverage),
116
+ "",
117
+ "Reported verification ledger:",
118
+ ...formatReportedLedger(data.verification.reported),
119
+ "",
120
+ "Local policies:",
121
+ ...formatPolicies(data.policies),
122
+ "",
123
+ "Trust posture:",
124
+ ...data.trustPosture.map((line) => `- ${line}`),
125
+ "",
126
+ "Remaining proof gaps:",
127
+ ...formatGaps(data.gaps),
128
+ "",
129
+ "Next commands:",
130
+ ...data.nextCommands.map((command) => `- ${command}`)
131
+ ];
132
+ return limitText(lines.join("\n"), 8000);
133
+ }
134
+ function freshnessData(freshness) {
135
+ return {
136
+ stale: freshness.stale,
137
+ reason: freshness.reason,
138
+ indexedAt: freshness.indexedAt,
139
+ headCommit: freshness.headCommit,
140
+ dirtyFileCount: freshness.dirtyFiles.length,
141
+ parserErrorCount: freshness.parserErrorCount
142
+ };
143
+ }
144
+ function readFirstFromFocus(value) {
145
+ if (!Array.isArray(value)) {
146
+ return [];
147
+ }
148
+ return value
149
+ .map((entry) => {
150
+ const record = entry;
151
+ return typeof record.path === "string"
152
+ ? {
153
+ path: record.path,
154
+ riskScore: typeof record.riskScore === "number" ? record.riskScore : undefined,
155
+ rank: typeof record.rank === "number" ? record.rank : undefined
156
+ }
157
+ : undefined;
158
+ })
159
+ .filter((entry) => Boolean(entry))
160
+ .slice(0, 8);
161
+ }
162
+ function snapshotSummary(snapshot, fallback) {
163
+ if (snapshot) {
164
+ return {
165
+ status: "loaded",
166
+ taskId: snapshot.taskId,
167
+ origin: snapshot.origin,
168
+ createdAt: snapshot.createdAt,
169
+ plannedEditTargets: snapshot.plannedEditTargets.slice(0, 20),
170
+ plannedTests: snapshot.plannedTests.map((test) => test.path).slice(0, 20)
171
+ };
172
+ }
173
+ return {
174
+ status: fallback.blocked ? "blocked" : "missing",
175
+ taskId: fallback.taskId,
176
+ plannedEditTargets: [],
177
+ plannedTests: [],
178
+ reason: fallback.reason
179
+ };
180
+ }
181
+ function worktreeFromData(value, changedFiles, fallbackDegradedReasons) {
182
+ const record = asRecord(value);
183
+ const degradedReasons = stringArray(record.degradedReasons).length > 0 ? stringArray(record.degradedReasons) : fallbackDegradedReasons;
184
+ return {
185
+ knownClean: typeof record.knownClean === "boolean" ? record.knownClean : changedFiles.length === 0 && degradedReasons.length === 0,
186
+ degraded: typeof record.degraded === "boolean" ? record.degraded : degradedReasons.length > 0,
187
+ dirtyFileCount: typeof record.dirtyFileCount === "number" ? record.dirtyFileCount : changedFiles.length,
188
+ changedFiles: changedFiles.slice(0, 120),
189
+ degradedReasons
190
+ };
191
+ }
192
+ function reportedVerificationData(input) {
193
+ const hasEvidence = input.ranTests.length > 0 || input.ranCommands.length > 0 || input.ranCommandReports.length > 0 || input.waivedChecks.length > 0 || input.waivers.length > 0;
194
+ const checkCoverage = verificationEvidenceForCommandReports(input.index, input.ranCommands, input.ranCommandReports, input.repoRoot).coverage;
195
+ const checkContext = {
196
+ editPaths: input.snapshot?.plannedEditTargets ?? [],
197
+ reviewTargets: input.snapshot?.plannedFiles ?? input.snapshot?.plannedEditTargets ?? [],
198
+ selectedFiles: [],
199
+ workflows: [],
200
+ affectedEdges: [],
201
+ affectedTests: [],
202
+ tests: input.tests,
203
+ ranTests: input.ranTests,
204
+ verificationCoverage: checkCoverage
205
+ };
206
+ const workflowChecks = evaluateRequiredChecks(input.snapshot?.requiredWorkflowChecks ?? [], checkContext);
207
+ const dependencyChecks = evaluateRequiredChecks(input.snapshot?.requiredDependencyChecks ?? [], checkContext);
208
+ const verification = verificationLedgerForPostEdit({
209
+ index: input.index,
210
+ tests: input.tests,
211
+ ranTests: input.ranTests,
212
+ ranCommands: input.ranCommands,
213
+ ranCommandReports: input.ranCommandReports,
214
+ waivedChecks: input.waivedChecks,
215
+ waivers: input.waivers,
216
+ repoRoot: input.repoRoot,
217
+ workflowChecks,
218
+ dependencyChecks
219
+ });
220
+ const coverage = verification.coverage.map((entry) => sanitizeCoverageForDisplay(entry, input.repoRoot));
221
+ const ledger = verification.ledger.map((entry) => sanitizeLedgerForDisplay(entry, input.repoRoot));
222
+ return {
223
+ hasEvidence,
224
+ ranTests: input.ranTests.map((test) => sanitizeCommandText(test, input.repoRoot)),
225
+ ranCommands: input.ranCommands.map((command) => sanitizeCommandText(command, input.repoRoot)),
226
+ ranCommandReports: input.ranCommandReports.map((report) => sanitizeCommandReportForDisplay(report, input.repoRoot)),
227
+ waivedChecks: input.waivedChecks.map((check) => sanitizeCommandText(check, input.repoRoot)),
228
+ waivers: input.waivers.map((waiver) => ({
229
+ kind: waiver.kind,
230
+ target: sanitizeCommandText(waiver.target, input.repoRoot),
231
+ reason: sanitizeCommandText(waiver.reason, input.repoRoot)
232
+ })),
233
+ coverage,
234
+ commandEnvelopes: verification.commandEnvelopes.map((envelope) => sanitizeCommandEnvelopeForDisplay(envelope, input.repoRoot)),
235
+ commandPlan: verificationCommandPlan(coverage),
236
+ ledger,
237
+ waivedVerification: ledger.filter((entry) => entry.status === "waived"),
238
+ testsNotRun: verification.testsNotRun,
239
+ verificationProvenance: VERIFICATION_PROVENANCE
240
+ };
241
+ }
242
+ function verificationCommandPlanFromData(value) {
243
+ if (!Array.isArray(value)) {
244
+ return [];
245
+ }
246
+ return value.filter(isVerificationCommandPlanEntry).slice(0, 30);
247
+ }
248
+ function verificationLedgerFromData(value) {
249
+ if (!Array.isArray(value)) {
250
+ return [];
251
+ }
252
+ return value.filter(isVerificationLedgerEntry).slice(0, 30);
253
+ }
254
+ function testRecommendationsFromData(value) {
255
+ if (!Array.isArray(value)) {
256
+ return [];
257
+ }
258
+ return value.filter(isTestRecommendation).slice(0, 30);
259
+ }
260
+ function isVerificationCommandPlanEntry(value) {
261
+ const record = asRecord(value);
262
+ return (typeof record.command === "string" &&
263
+ Array.isArray(record.covers) &&
264
+ Array.isArray(record.targetPaths) &&
265
+ Array.isArray(record.scopes) &&
266
+ Array.isArray(record.sources) &&
267
+ ["authoritative", "derived", "heuristic"].includes(String(record.confidence)));
268
+ }
269
+ function isVerificationLedgerEntry(value) {
270
+ const record = asRecord(value);
271
+ return (typeof record.kind === "string" &&
272
+ typeof record.recommended === "string" &&
273
+ typeof record.target === "string" &&
274
+ typeof record.status === "string" &&
275
+ Array.isArray(record.evidence) &&
276
+ Array.isArray(record.coverageKinds));
277
+ }
278
+ function isTestRecommendation(value) {
279
+ const record = asRecord(value);
280
+ return typeof record.path === "string" && typeof record.reason === "string" && typeof record.rank === "number";
281
+ }
282
+ function proofGaps(input) {
283
+ return uniqueSorted([
284
+ ...(input.freshness.stale ? [`index stale: ${input.freshness.reason}`] : []),
285
+ ...(input.worktree.degraded ? input.worktree.degradedReasons.map((reason) => `worktree state unavailable: ${reason}`) : []),
286
+ ...(input.snapshot.status === "missing" ? [`no saved change-plan snapshot${input.snapshot.reason ? `: ${input.snapshot.reason}` : ""}`] : []),
287
+ ...(input.snapshot.status === "blocked" ? [`latest change-plan snapshot blocked${input.snapshot.reason ? `: ${input.snapshot.reason}` : ""}`] : []),
288
+ ...(input.policies.missing.length > 0 ? [`policy pack missing: ${input.policies.missing.join(", ")}`] : []),
289
+ ...(input.testPlanActionability === "needs_target" ? ["test plan needs target files or a dirty diff"] : []),
290
+ ...(input.reported.hasEvidence && input.reported.coverage.length === 0 && (input.reported.ranCommands.length > 0 || input.reported.ranCommandReports.length > 0)
291
+ ? ["reported commands earned no classifier-backed verification coverage"]
292
+ : []),
293
+ ...(input.reported.hasEvidence ? input.reported.testsNotRun.map((test) => `reported verification missing: ${test.path}`) : []),
294
+ ...input.reported.ledger
295
+ .filter((entry) => entry.status === "missing" && entry.kind !== "test")
296
+ .map((entry) => `reported verification missing: ${entry.kind} ${entry.target}`),
297
+ ...input.policies.warnings,
298
+ ...input.focusGaps,
299
+ ...input.testGaps
300
+ ]);
301
+ }
302
+ function trustPosture() {
303
+ return [
304
+ "core proof paths are local and model-free; optional semantic lanes remain explicit opt-ins",
305
+ "Codexa MCP tools are context and review tools, not source-mutating edit tools",
306
+ "reported commands earn verification credit only through the shared command classifier",
307
+ "repository policy text is bounded local evidence, not executable code"
308
+ ];
309
+ }
310
+ function nextCommands(repo, task, snapshotStatus) {
311
+ const quotedTask = shellQuote(task);
312
+ return [
313
+ snapshotStatus === "loaded"
314
+ ? `codexa post-edit-review ${shellQuote(repo)} --task ${quotedTask} --ran-command "<command-you-ran>"`
315
+ : `codexa change-plan ${shellQuote(repo)} --task ${quotedTask} --save-snapshot`,
316
+ `codexa test-plan ${shellQuote(repo)} --diff`,
317
+ `codexa prove ${shellQuote(repo)} --task ${quotedTask} --diff`
318
+ ];
319
+ }
320
+ function formatSnapshot(snapshot) {
321
+ if (snapshot.status === "loaded") {
322
+ const origin = snapshot.origin ? `; ${snapshot.origin}` : "";
323
+ const created = snapshot.createdAt ? `; ${snapshot.createdAt}` : "";
324
+ return `loaded ${snapshot.taskId ?? "latest"}${origin}${created}`;
325
+ }
326
+ return `${snapshot.status}${snapshot.reason ? ` (${snapshot.reason})` : ""}`;
327
+ }
328
+ function formatReadFirst(files) {
329
+ if (files.length === 0) {
330
+ return ["- none selected"];
331
+ }
332
+ return files.map((file) => {
333
+ const rank = file.rank === undefined ? "" : `; rank ${file.rank.toFixed(2)}`;
334
+ const risk = file.riskScore === undefined ? "" : `; risk ${file.riskScore.toFixed(1)}`;
335
+ return `- ${file.path}${rank}${risk}`;
336
+ });
337
+ }
338
+ function formatCommands(commands) {
339
+ if (commands.length === 0) {
340
+ return ["- none inferred; run codexa test-plan after choosing an edit target"];
341
+ }
342
+ return commands.slice(0, 12).map((command) => `- ${command}`);
343
+ }
344
+ function formatReportedEvidence(reported) {
345
+ if (!reported.hasEvidence) {
346
+ return ["- none supplied; pass --ran-command, --ran-test, --ran-command-report, --waive-check, or --waiver after verification runs"];
347
+ }
348
+ const lines = [
349
+ ...reported.ranTests.slice(0, 12).map((test) => `- ran test: ${test}`),
350
+ ...reported.ranCommands.slice(0, 12).map((command) => `- ran command: ${command}`),
351
+ ...reported.ranCommandReports.slice(0, 12).map((report) => `- command report: ${formatCommandReport(report)}`),
352
+ ...reported.waivedChecks.slice(0, 12).map((target) => `- legacy waiver: ${target}`),
353
+ ...reported.waivers.slice(0, 12).map((waiver) => `- waiver: ${waiver.kind} ${waiver.target}; ${waiver.reason}`)
354
+ ];
355
+ return lines.length > 0 ? lines : ["- evidence supplied, but no displayable entries after sanitization"];
356
+ }
357
+ function formatReportedLedger(reported) {
358
+ if (!reported.hasEvidence && reported.ledger.length === 0) {
359
+ return ["- none; preview above shows what reported commands would need to cover"];
360
+ }
361
+ return formatVerificationLedger(reported.ledger);
362
+ }
363
+ function formatCommandReport(report) {
364
+ const status = report.exitCode === undefined ? "exit unknown" : `exit ${report.exitCode}`;
365
+ const cwd = report.cwd ? `; cwd ${report.cwd}` : "";
366
+ const duration = report.durationMs === undefined ? "" : `; ${report.durationMs}ms`;
367
+ const summary = report.outputSummary ?? report.stderrSummary ?? report.stdoutSummary;
368
+ return `${report.command} (${status}${cwd}${duration}${summary ? `; ${summary}` : ""})`;
369
+ }
370
+ function formatPolicies(policies) {
371
+ const lines = policies.policies.flatMap((policy) => [
372
+ `- ${policy.kind}: ${policy.purpose}`,
373
+ ...policy.rules.slice(0, 3).map((rule) => ` - ${rule}`)
374
+ ]);
375
+ if (policies.missing.length > 0) {
376
+ lines.push(`- missing policy files: ${policies.missing.map((kind) => `${kind}.json`).join(", ")}; run codexa policy-init <repo>`);
377
+ }
378
+ if (policies.warnings.length > 0) {
379
+ lines.push(...policies.warnings.map((warning) => `- warning: ${warning}`));
380
+ }
381
+ return lines.length > 0 ? lines : ["- no local policy pack present; run codexa policy-init <repo>"];
382
+ }
383
+ function formatGaps(gaps) {
384
+ return gaps.length > 0 ? gaps.slice(0, 20).map((gap) => `- ${gap}`) : ["- none detected in the proof card inputs"];
385
+ }
386
+ function asRecord(value) {
387
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
388
+ }
389
+ function stringArray(value) {
390
+ return Array.isArray(value) ? value.filter((entry) => typeof entry === "string") : [];
391
+ }
392
+ function shellQuote(value) {
393
+ return `'${value.replaceAll("'", "'\"'\"'")}'`;
394
+ }
395
+ //# sourceMappingURL=prove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prove.js","sourceRoot":"","sources":["../src/prove.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,8 @@ import { normalizeSearchText } from "./search.js";
13
13
  import { formatTestRecommendations, narrowTestRecommendationsByChangeType, recommendTests, uniqueTests } from "./tests.js";
14
14
  import { findFile, normalizeInputPaths, resolveSymbolTarget } from "./targets.js";
15
15
  import { formatVerificationCoverage, formatVerificationLedger, verificationEvidenceForCommandReports, verificationLedgerForPostEdit } from "./verification.js";
16
+ import { sanitizeCommandEnvelopeForDisplay, sanitizeCommandReportForDisplay, sanitizeCommandText, sanitizeCoverageForDisplay, sanitizeLedgerForDisplay, sanitizeSummary } from "./verification-display.js";
17
+ import { evaluateRequiredChecks } from "./required-checks.js";
16
18
  import { isCodexaControlPath, formatChangedEntry } from "./worktree.js";
17
19
  import { postEditDecision } from "./post-edit/decision.js";
18
20
  import { postEditDirtyScope } from "./post-edit/dirty-scope.js";
@@ -672,65 +674,6 @@ function formatModifiedSymbols(modifiedSymbols, modifiedPublicSymbols) {
672
674
  const publicSuffix = modifiedPublicSymbols.length > 0 ? `; public/runtime ${modifiedPublicSymbols.slice(0, 8).join(", ")}` : "";
673
675
  return [`- ${modifiedSymbols.slice(0, 12).join(", ")}${modifiedSymbols.length > 12 ? ", ..." : ""}${publicSuffix}`];
674
676
  }
675
- function evaluateRequiredChecks(checks, input) {
676
- if (checks.length === 0) {
677
- return [];
678
- }
679
- const editSet = new Set(input.editPaths);
680
- const reviewSet = new Set(input.reviewTargets);
681
- const selectedSet = new Set(input.selectedFiles);
682
- const affectedTestSet = new Set(input.affectedTests);
683
- const workflowTitles = new Set(input.workflows.map((workflow) => workflow.title));
684
- const edgePaths = new Set(input.affectedEdges.flatMap((edge) => [edge.fromPath, edge.toPath]).filter((filePath) => Boolean(filePath)));
685
- return checks.map((check) => {
686
- const relevant = input.editPaths.length === 0 || check.paths.some((filePath) => editSet.has(filePath) || reviewSet.has(filePath));
687
- const evidencePaths = check.paths.filter((filePath) => !editSet.has(filePath));
688
- const hasNonEditedEvidence = evidencePaths.some((filePath) => edgePaths.has(filePath) || selectedSet.has(filePath) || affectedTestSet.has(filePath));
689
- if (!relevant) {
690
- return { ...check, status: "not_applicable" };
691
- }
692
- const covered = check.kind === "workflow"
693
- ? workflowTitles.has(check.target) && hasNonEditedEvidence
694
- : hasNonEditedEvidence || dependencyCheckCoveredByVerification(check, input);
695
- return { ...check, status: covered ? "covered" : "missing" };
696
- });
697
- }
698
- function dependencyCheckCoveredByVerification(check, input) {
699
- const checkPaths = check.paths.map(normalizePathLike);
700
- const testPaths = check.paths.filter(isTestPath);
701
- if (testPaths.some((testPath) => input.ranTests.some((ranTest) => normalizePathLike(ranTest) === normalizePathLike(testPath)) ||
702
- input.verificationCoverage.some((coverage) => coverage.kind === (testPath.endsWith(".py") ? "python-tests" : "javascript-tests") && coverageCoversPath(coverage, testPath)))) {
703
- return true;
704
- }
705
- const sourcePaths = check.paths.filter((filePath) => !isTestPath(filePath));
706
- return input.verificationCoverage.some((coverage) => {
707
- if (coverage.targetPath) {
708
- return checkPaths.includes(normalizePathLike(coverage.targetPath)) && coverageKindCompatibleWithSourcePath(coverage.kind, coverage.targetPath);
709
- }
710
- return sourcePaths.some((filePath) => coverageKindCompatibleWithSourcePath(coverage.kind, filePath) && coverageCoversPath(coverage, filePath));
711
- });
712
- }
713
- function coverageKindCompatibleWithSourcePath(kind, filePath) {
714
- const normalized = normalizePathLike(filePath).toLowerCase();
715
- if (normalized.endsWith(".py")) {
716
- return kind === "python-tests";
717
- }
718
- if (/\.(?:cjs|cts|js|jsx|mjs|mts|ts|tsx)$/u.test(normalized)) {
719
- return kind === "build" || kind === "typescript-syntax" || kind === "javascript-tests";
720
- }
721
- return kind === "build";
722
- }
723
- function coverageCoversPath(coverage, filePath) {
724
- const normalizedPath = normalizePathLike(filePath);
725
- if (coverage.targetPath) {
726
- return normalizePathLike(coverage.targetPath) === normalizedPath;
727
- }
728
- const normalizedScope = normalizePathLike(coverage.scope ?? ".");
729
- return normalizedScope === "." || normalizedPath === normalizedScope || normalizedPath.startsWith(`${normalizedScope}/`);
730
- }
731
- function normalizePathLike(value) {
732
- return value.replace(/\\/gu, "/").replace(/^\.\//u, "").replace(/\/+/gu, "/");
733
- }
734
677
  function formatCheckResults(checks) {
735
678
  if (checks.length === 0) {
736
679
  return ["- none saved in the task snapshot"];
@@ -843,150 +786,6 @@ function absoluteSubpath(candidate, parent) {
843
786
  const relative = path.relative(path.resolve(parent), path.resolve(candidate));
844
787
  return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
845
788
  }
846
- function sanitizeCommandReportForDisplay(report, repoRoot) {
847
- return {
848
- ...report,
849
- command: sanitizeCommandText(report.command, repoRoot),
850
- cwd: sanitizePathField(report.cwd, repoRoot),
851
- packageManager: sanitizeSummary(report.packageManager, repoRoot),
852
- workspace: sanitizeSummary(report.workspace, repoRoot),
853
- packageRoot: sanitizePathField(report.packageRoot, repoRoot),
854
- packageName: sanitizeSummary(report.packageName, repoRoot),
855
- scriptName: sanitizeSummary(report.scriptName, repoRoot),
856
- stdoutSummary: sanitizeSummary(report.stdoutSummary, repoRoot),
857
- stderrSummary: sanitizeSummary(report.stderrSummary, repoRoot),
858
- outputSummary: sanitizeSummary(report.outputSummary, repoRoot),
859
- args: sanitizeCommandArgs(report.args, repoRoot),
860
- runner: sanitizeRunnerForDisplay(report.runner, repoRoot)
861
- };
862
- }
863
- function sanitizeRunnerForDisplay(runner, repoRoot) {
864
- if (!runner) {
865
- return undefined;
866
- }
867
- return {
868
- ...runner,
869
- cwdRealpath: sanitizePathField(runner.cwdRealpath, repoRoot) ?? runner.cwdRealpath,
870
- targetRealpaths: runner.targetRealpaths.map((target) => sanitizePathField(target, repoRoot) ?? target),
871
- allowedBy: runner.allowedBy.map((reason) => sanitizeSummary(reason, repoRoot) ?? reason),
872
- skippedReason: sanitizeSummary(runner.skippedReason, repoRoot)
873
- };
874
- }
875
- function sanitizeCommandEnvelopeForDisplay(envelope, repoRoot) {
876
- return {
877
- ...envelope,
878
- command: sanitizeCommandText(envelope.command, repoRoot),
879
- cwd: sanitizePathField(envelope.cwd, repoRoot),
880
- packageManager: sanitizeSummary(envelope.packageManager, repoRoot),
881
- workspace: sanitizeSummary(envelope.workspace, repoRoot),
882
- packageRoot: sanitizePathField(envelope.packageRoot, repoRoot),
883
- packageName: sanitizeSummary(envelope.packageName, repoRoot),
884
- scriptName: sanitizeSummary(envelope.scriptName, repoRoot),
885
- stdoutSummary: sanitizeSummary(envelope.stdoutSummary, repoRoot),
886
- stderrSummary: sanitizeSummary(envelope.stderrSummary, repoRoot),
887
- outputSummary: sanitizeSummary(envelope.outputSummary, repoRoot),
888
- args: sanitizeCommandArgs(envelope.args, repoRoot) ?? []
889
- };
890
- }
891
- function sanitizeCoverageForDisplay(entry, repoRoot) {
892
- return {
893
- ...entry,
894
- command: sanitizeCommandText(entry.command, repoRoot),
895
- source: sanitizeSummary(entry.source, repoRoot) ?? entry.source,
896
- scope: sanitizePathField(entry.scope, repoRoot),
897
- targetPath: sanitizePathField(entry.targetPath, repoRoot),
898
- details: entry.details.map((detail) => sanitizeSummary(detail, repoRoot) ?? "").filter(Boolean),
899
- outputSummary: sanitizeSummary(entry.outputSummary, repoRoot),
900
- commandEnvelope: entry.commandEnvelope ? sanitizeCommandEnvelopeForDisplay(entry.commandEnvelope, repoRoot) : undefined
901
- };
902
- }
903
- function sanitizeLedgerForDisplay(entry, repoRoot) {
904
- return {
905
- ...entry,
906
- command: entry.command ? sanitizeCommandText(entry.command, repoRoot) : undefined,
907
- evidence: entry.evidence.map((item) => sanitizeSummary(item, repoRoot) ?? "").filter(Boolean)
908
- };
909
- }
910
- function sanitizeCommandText(value, repoRoot) {
911
- return sanitizeSummary(value, repoRoot) ?? "";
912
- }
913
- function sanitizeSummary(value, repoRoot) {
914
- const clean = redactSecretText(value)
915
- ?.replaceAll(repoRoot, "<repo>")
916
- .replace(/__outside_repo__:[^\s;|)]+/gu, "__outside_repo__:<outside-repo>")
917
- .replace(/(^|[\s([,{])\/[^\s;|)\]'",]+/gu, "$1<abs-path>")
918
- .replace(/(^|[\s([,{])(?:\.\.?\/)[^\s;|)\]'",]+/gu, "$1<rel-path>")
919
- .replace(/\s+/gu, " ")
920
- .trim();
921
- if (!clean) {
922
- return undefined;
923
- }
924
- return clean.length > 500 ? `${clean.slice(0, 497)}...` : clean;
925
- }
926
- function sanitizeCommandArgs(args, repoRoot) {
927
- if (!args) {
928
- return undefined;
929
- }
930
- let redactNext = false;
931
- return args.map((arg) => {
932
- if (redactNext) {
933
- redactNext = false;
934
- return "<redacted>";
935
- }
936
- if (isSecretFlag(arg) && !arg.includes("=")) {
937
- redactNext = true;
938
- return sanitizeSummary(arg, repoRoot) ?? "";
939
- }
940
- return sanitizeSummary(redactSecretArg(arg), repoRoot) ?? "";
941
- });
942
- }
943
- function redactSecretText(value) {
944
- return value
945
- ?.replace(/(^|[\s([,{])((?:--?[a-z0-9-]*(?:token|secret|password|passwd|pwd|api[-_]?key|access[-_]?key|auth|credential|cookie)[a-z0-9-]*)(?:=|\s+))([^\s;|)\]'",]+)/giu, "$1$2<redacted>")
946
- .replace(/(\b[A-Z_]*(?:TOKEN|SECRET|PASSWORD|PASSWD|PWD|API_?KEY|ACCESS_?KEY|AUTH|CREDENTIAL|COOKIE)[A-Z0-9_]*=)([^\s;|)\]'",]+)/gu, "$1<redacted>")
947
- .replace(/\b(Bearer)\s+[A-Za-z0-9._~+/-]+=*/giu, "$1 <redacted>");
948
- }
949
- function redactSecretArg(value) {
950
- if (/^Bearer\s+/iu.test(value)) {
951
- return "Bearer <redacted>";
952
- }
953
- if (isSecretFlag(value) && value.includes("=")) {
954
- return value.replace(/=.*/u, "=<redacted>");
955
- }
956
- if (/^(?:[A-Z_]*(?:TOKEN|SECRET|PASSWORD|PASSWD|PWD|API_?KEY|ACCESS_?KEY|AUTH|CREDENTIAL|COOKIE)[A-Z0-9_]*)=/iu.test(value)) {
957
- return value.replace(/=.*/u, "=<redacted>");
958
- }
959
- return value;
960
- }
961
- function isSecretFlag(value) {
962
- return /^--?[a-z0-9-]*(?:token|secret|password|passwd|pwd|api-?key|access-?key|auth|credential|cookie)[a-z0-9-]*(?:=.*)?$/iu.test(value);
963
- }
964
- function sanitizePathField(value, repoRoot) {
965
- if (!value) {
966
- return undefined;
967
- }
968
- if (value.startsWith("__outside_repo__:")) {
969
- return "__outside_repo__:<outside-repo>";
970
- }
971
- if (value === "." || value === "./") {
972
- return ".";
973
- }
974
- if (value === ".." || value.startsWith("../")) {
975
- return "<outside-repo>";
976
- }
977
- if (value.startsWith("./")) {
978
- const relative = normalizePathLike(value);
979
- return relative === "." ? "." : `<repo>/${relative}`;
980
- }
981
- if (path.isAbsolute(value)) {
982
- const relative = path.relative(repoRoot, value);
983
- if (relative === "") {
984
- return "<repo>";
985
- }
986
- return !relative.startsWith("..") && !path.isAbsolute(relative) ? `<repo>/${relative.split(path.sep).join("/")}` : "<outside-repo>";
987
- }
988
- return sanitizeSummary(value, repoRoot);
989
- }
990
789
  function formatCommandReport(report) {
991
790
  const status = report.exitCode === undefined ? "exit unknown" : `exit ${report.exitCode}`;
992
791
  const cwd = report.cwd ? `; cwd ${report.cwd}` : "";