codeloop-mcp-server 0.1.51 → 0.1.53

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 (50) hide show
  1. package/dist/auth/critical_floors.d.ts.map +1 -1
  2. package/dist/auth/critical_floors.js +8 -0
  3. package/dist/auth/critical_floors.js.map +1 -1
  4. package/dist/auth/update_check.d.ts.map +1 -1
  5. package/dist/auth/update_check.js +19 -1
  6. package/dist/auth/update_check.js.map +1 -1
  7. package/dist/evidence/anti_rationalisation.d.ts +34 -0
  8. package/dist/evidence/anti_rationalisation.d.ts.map +1 -0
  9. package/dist/evidence/anti_rationalisation.js +85 -0
  10. package/dist/evidence/anti_rationalisation.js.map +1 -0
  11. package/dist/evidence/change_coverage.d.ts +59 -0
  12. package/dist/evidence/change_coverage.d.ts.map +1 -0
  13. package/dist/evidence/change_coverage.js +422 -0
  14. package/dist/evidence/change_coverage.js.map +1 -0
  15. package/dist/evidence/change_manifest.d.ts +94 -0
  16. package/dist/evidence/change_manifest.d.ts.map +1 -0
  17. package/dist/evidence/change_manifest.js +830 -0
  18. package/dist/evidence/change_manifest.js.map +1 -0
  19. package/dist/evidence/evidence_freshness.d.ts +39 -0
  20. package/dist/evidence/evidence_freshness.d.ts.map +1 -0
  21. package/dist/evidence/evidence_freshness.js +231 -0
  22. package/dist/evidence/evidence_freshness.js.map +1 -0
  23. package/dist/evidence/screenshot_diff.d.ts.map +1 -1
  24. package/dist/evidence/screenshot_diff.js +30 -12
  25. package/dist/evidence/screenshot_diff.js.map +1 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +123 -3
  28. package/dist/index.js.map +1 -1
  29. package/dist/runners/empty_state_detector.d.ts +33 -0
  30. package/dist/runners/empty_state_detector.d.ts.map +1 -0
  31. package/dist/runners/empty_state_detector.js +304 -0
  32. package/dist/runners/empty_state_detector.js.map +1 -0
  33. package/dist/tools/c7_slug.d.ts +14 -0
  34. package/dist/tools/c7_slug.d.ts.map +1 -0
  35. package/dist/tools/c7_slug.js +21 -0
  36. package/dist/tools/c7_slug.js.map +1 -0
  37. package/dist/tools/design_compare.d.ts.map +1 -1
  38. package/dist/tools/design_compare.js +22 -3
  39. package/dist/tools/design_compare.js.map +1 -1
  40. package/dist/tools/gate_check.d.ts.map +1 -1
  41. package/dist/tools/gate_check.js +159 -14
  42. package/dist/tools/gate_check.js.map +1 -1
  43. package/dist/tools/plan_change_journey.d.ts +41 -0
  44. package/dist/tools/plan_change_journey.d.ts.map +1 -0
  45. package/dist/tools/plan_change_journey.js +131 -0
  46. package/dist/tools/plan_change_journey.js.map +1 -0
  47. package/dist/tools/verify.d.ts.map +1 -1
  48. package/dist/tools/verify.js +113 -1
  49. package/dist/tools/verify.js.map +1 -1
  50. package/package.json +2 -2
@@ -0,0 +1,422 @@
1
+ import { existsSync, readFileSync, readdirSync } from "fs";
2
+ import { join } from "path";
3
+ import { getArtifactsBaseDir, getRunDir, listRuns } from "./artifacts.js";
4
+ import { loadMostRecentChangeManifest, manifestEntryDisplayName, } from "./change_manifest.js";
5
+ import { slugForTargetChangeEntry } from "../tools/c7_slug.js";
6
+ export const DEFAULT_CHANGE_COVERAGE_CONFIG = {
7
+ enabled: true,
8
+ threshold: 1.0,
9
+ skip_kinds: [],
10
+ };
11
+ function readJsonlSafe(path) {
12
+ try {
13
+ const raw = readFileSync(path, "utf-8");
14
+ const out = [];
15
+ for (const line of raw.split("\n")) {
16
+ const t = line.trim();
17
+ if (!t)
18
+ continue;
19
+ try {
20
+ out.push(JSON.parse(t));
21
+ }
22
+ catch {
23
+ /* skip malformed */
24
+ }
25
+ }
26
+ return out;
27
+ }
28
+ catch {
29
+ return [];
30
+ }
31
+ }
32
+ function flatten(entries) {
33
+ const out = [];
34
+ for (const e of entries) {
35
+ const action = (e.action ?? "").toLowerCase();
36
+ const args = (e.input_args ?? {});
37
+ if (action === "sequence" && Array.isArray(args.steps)) {
38
+ for (const c of args.steps) {
39
+ out.push({ ...c, timestamp: c.timestamp ?? e.timestamp, success: c.success ?? e.success });
40
+ }
41
+ continue;
42
+ }
43
+ if (action === "maestro_flow" && Array.isArray(args.maestro_steps)) {
44
+ for (const c of args.maestro_steps) {
45
+ out.push({ ...c, timestamp: c.timestamp ?? e.timestamp, success: c.success ?? e.success });
46
+ }
47
+ continue;
48
+ }
49
+ out.push(e);
50
+ }
51
+ return out;
52
+ }
53
+ function entryHaystack(e) {
54
+ const args = e.input_args ?? {};
55
+ const parts = [];
56
+ for (const k of [
57
+ "selector",
58
+ "text",
59
+ "aria_label",
60
+ "label",
61
+ "target",
62
+ "automationId",
63
+ "name",
64
+ "intent",
65
+ "description",
66
+ "purpose",
67
+ "step",
68
+ "screen_name",
69
+ "url",
70
+ "value",
71
+ "target_change_entry",
72
+ "automation_action",
73
+ ]) {
74
+ const v = args[k];
75
+ if (typeof v === "string")
76
+ parts.push(v);
77
+ }
78
+ if (typeof e.detail === "string")
79
+ parts.push(e.detail);
80
+ if (typeof e.action === "string")
81
+ parts.push(e.action);
82
+ return parts.join(" ").toLowerCase();
83
+ }
84
+ function tokenizeEntryName(name) {
85
+ // Split CamelCase + snake_case + kebab-case into discrete tokens so
86
+ // a manifest "ProductCode" matches an interaction text "Product Code"
87
+ // and vice versa. Tokens are lowercased and >= 2 chars.
88
+ const expanded = name
89
+ .replace(/([a-z])([A-Z])/g, "$1 $2")
90
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2")
91
+ .replace(/[_\-./]/g, " ");
92
+ return expanded
93
+ .toLowerCase()
94
+ .split(/\s+/)
95
+ .filter((t) => t.length >= 2);
96
+ }
97
+ function collectExercisingEvents(cwd, runId) {
98
+ const baseDir = getArtifactsBaseDir(cwd);
99
+ const allLog = [];
100
+ const screenshotNames = [];
101
+ const replayAnalysisChunks = [];
102
+ const shellOutputs = [];
103
+ // Pull from this run + every sibling run in the project. The journey
104
+ // runs typically live in a separate run from the verify (matches how
105
+ // gate_check video / replay scoping works today).
106
+ const runIds = Array.from(new Set([runId, ...listRuns(baseDir)]));
107
+ for (const rid of runIds) {
108
+ const runDir = getRunDir(rid, baseDir);
109
+ if (!existsSync(runDir))
110
+ continue;
111
+ const logsDir = join(runDir, "logs");
112
+ if (existsSync(logsDir)) {
113
+ try {
114
+ for (const f of readdirSync(logsDir)) {
115
+ if (f === "interaction_log.jsonl" || (f.startsWith("interaction_log") && f.endsWith(".jsonl"))) {
116
+ allLog.push(...readJsonlSafe(join(logsDir, f)));
117
+ }
118
+ }
119
+ }
120
+ catch {
121
+ /* skip */
122
+ }
123
+ // Build / dotnet / generic test logs may mention migration columns
124
+ // by name (the EF runtime prints "Applying migration X / new column
125
+ // Y" for example). We treat these as shell-style outputs the
126
+ // migration_column_added / migration_table_added classifier scans.
127
+ try {
128
+ for (const f of readdirSync(logsDir)) {
129
+ if (!f.endsWith(".log"))
130
+ continue;
131
+ try {
132
+ const txt = readFileSync(join(logsDir, f), "utf-8");
133
+ shellOutputs.push(txt);
134
+ }
135
+ catch {
136
+ /* skip */
137
+ }
138
+ }
139
+ }
140
+ catch {
141
+ /* skip */
142
+ }
143
+ }
144
+ const ssDir = join(runDir, "screenshots");
145
+ if (existsSync(ssDir)) {
146
+ try {
147
+ for (const f of readdirSync(ssDir)) {
148
+ if (f.endsWith(".png") || f.endsWith(".jpg"))
149
+ screenshotNames.push(f);
150
+ }
151
+ }
152
+ catch {
153
+ /* skip */
154
+ }
155
+ }
156
+ // interaction_replay produces per-frame JSON / a summary file —
157
+ // pick up anything in replay/ or replay_frames/ for token search.
158
+ for (const sub of ["replay", "replay_frames"]) {
159
+ const d = join(runDir, sub);
160
+ if (!existsSync(d))
161
+ continue;
162
+ try {
163
+ for (const f of readdirSync(d)) {
164
+ if (f.endsWith(".json") || f.endsWith(".txt") || f.endsWith(".md")) {
165
+ try {
166
+ replayAnalysisChunks.push(readFileSync(join(d, f), "utf-8"));
167
+ }
168
+ catch {
169
+ /* skip */
170
+ }
171
+ }
172
+ }
173
+ }
174
+ catch {
175
+ /* skip */
176
+ }
177
+ }
178
+ }
179
+ const flat = flatten(allLog);
180
+ const resizeWindowEvents = flat.filter((e) => {
181
+ const action = (e.action ?? "").toLowerCase();
182
+ return (action === "resize_window" ||
183
+ action === "resize" ||
184
+ action === "set_window_size" ||
185
+ action === "rotate_device");
186
+ });
187
+ return {
188
+ log: flat,
189
+ screenshotNames,
190
+ replayAnalysisText: replayAnalysisChunks.join("\n").toLowerCase(),
191
+ resizeWindowEvents,
192
+ shellOutputs,
193
+ };
194
+ }
195
+ /** Check whether a manifest entry's name appears in the haystack (interaction log + replay analysis + screenshots). */
196
+ function nameAppearsIn(haystack, name) {
197
+ const tokens = tokenizeEntryName(name);
198
+ if (tokens.length === 0)
199
+ return false;
200
+ // Require ALL tokens to appear (in any order) for multi-token names —
201
+ // this prevents "Product" alone matching unrelated screens.
202
+ // For single-token names, presence of that token is enough.
203
+ return tokens.every((t) => haystack.includes(t));
204
+ }
205
+ function evaluateEntry(entry, ctx) {
206
+ const evidence = [];
207
+ const logHaystack = ctx.log.map(entryHaystack).join(" | ");
208
+ const ssHaystack = ctx.screenshotNames.join(" | ").toLowerCase();
209
+ const replayHaystack = ctx.replayAnalysisText;
210
+ const shellHaystack = ctx.shellOutputs.join("\n").toLowerCase();
211
+ const fullUiHaystack = `${logHaystack} ${ssHaystack} ${replayHaystack}`;
212
+ switch (entry.kind) {
213
+ case "ui_element_added": {
214
+ if (nameAppearsIn(fullUiHaystack, entry.name)) {
215
+ evidence.push(`Name "${entry.name}" referenced by an interaction / screenshot / replay event`);
216
+ }
217
+ // Also accept a screenshot whose `target_change_entry` arg pinned
218
+ // this entry directly (C7 anchored screenshots) — either via the
219
+ // interaction-log arg OR via a filename suffix produced by the
220
+ // codeloop_capture_screenshot anchoring path.
221
+ const display = manifestEntryDisplayName(entry);
222
+ const anchored = ctx.log.some((e) => {
223
+ const arg = e.input_args?.target_change_entry;
224
+ return typeof arg === "string" && arg === display;
225
+ });
226
+ if (anchored)
227
+ evidence.push("C7 target_change_entry anchor present in interaction args");
228
+ const slug = slugForTargetChangeEntry(display);
229
+ const anchoredFilename = ctx.screenshotNames.some((n) => n.toLowerCase().includes(`--c7-${slug}`));
230
+ if (anchoredFilename)
231
+ evidence.push(`C7 anchored screenshot filename matched (slug "${slug}")`);
232
+ return { exercised: evidence.length > 0, evidence };
233
+ }
234
+ case "property_added": {
235
+ if (nameAppearsIn(fullUiHaystack, entry.name) || nameAppearsIn(fullUiHaystack, entry.class)) {
236
+ evidence.push(`Property "${entry.class}.${entry.name}" referenced by an interaction / screenshot / replay event`);
237
+ }
238
+ return { exercised: evidence.length > 0, evidence };
239
+ }
240
+ case "method_added": {
241
+ // Implicit — see header. We pass when the file or class shows up
242
+ // in the haystack, but the gate's main accounting treats this as
243
+ // implicit so the unexercised list never lists it directly.
244
+ if (nameAppearsIn(fullUiHaystack, entry.class) || nameAppearsIn(fullUiHaystack, entry.name)) {
245
+ evidence.push(`Method "${entry.class}.${entry.name}" referenced indirectly`);
246
+ }
247
+ return { exercised: evidence.length > 0, evidence };
248
+ }
249
+ case "migration_column_added": {
250
+ // Build / runtime logs typically print "Applying migration … add
251
+ // column ProductCode on Configurations". A direct sqlite-shell
252
+ // schema verify (action: "shell" or selector containing the
253
+ // column name) also counts.
254
+ if (nameAppearsIn(shellHaystack, entry.column) ||
255
+ nameAppearsIn(shellHaystack, entry.table) ||
256
+ nameAppearsIn(fullUiHaystack, entry.column)) {
257
+ evidence.push(`Migration column "${entry.table}.${entry.column}" referenced by build / interaction logs`);
258
+ }
259
+ return { exercised: evidence.length > 0, evidence };
260
+ }
261
+ case "migration_table_added": {
262
+ if (nameAppearsIn(shellHaystack, entry.table) || nameAppearsIn(fullUiHaystack, entry.table)) {
263
+ evidence.push(`Migration table "${entry.table}" referenced by build / interaction logs`);
264
+ }
265
+ return { exercised: evidence.length > 0, evidence };
266
+ }
267
+ case "layout_restructure": {
268
+ // Layout changes need a real test of the new layout. We require
269
+ // either a window resize / rotate event AND a follow-up
270
+ // screenshot, OR an explicit C7 anchor on a screenshot tied to
271
+ // this restructure file.
272
+ const fileToken = entry.file.split("/").pop()?.toLowerCase() ?? entry.file.toLowerCase();
273
+ const anchored = ctx.log.some((e) => {
274
+ const arg = e.input_args?.target_change_entry;
275
+ return typeof arg === "string" && arg === manifestEntryDisplayName(entry);
276
+ });
277
+ const resized = ctx.resizeWindowEvents.length > 0;
278
+ const screenshotMentionsFile = ctx.screenshotNames.some((n) => n.toLowerCase().includes(fileToken.replace(".xaml", "").replace(".html", "")));
279
+ if (anchored)
280
+ evidence.push("C7 target_change_entry anchor present");
281
+ if (resized && screenshotMentionsFile) {
282
+ evidence.push("Window resize event followed by a screenshot whose name references the changed file");
283
+ }
284
+ return { exercised: evidence.length > 0, evidence };
285
+ }
286
+ }
287
+ }
288
+ function nextStepFor(entry) {
289
+ const display = manifestEntryDisplayName(entry);
290
+ switch (entry.kind) {
291
+ case "ui_element_added":
292
+ if (entry.element === "datagrid_column") {
293
+ return `${display} (in ${entry.file}) — drive a codeloop_interact action="click" against a row's "${entry.name}" cell, then action="type" with realistic data, then capture_screenshot with target_change_entry="${display}". If the grid is empty, see the C4 empty-state directive.`;
294
+ }
295
+ if (entry.element === "button") {
296
+ return `${display} (in ${entry.file}) — drive codeloop_interact action="click" with text="${entry.name}", then capture_screenshot with target_change_entry="${display}". If a confirmation modal opens, call codeloop_handle_modal first.`;
297
+ }
298
+ if (entry.element === "menu_item") {
299
+ return `${display} (in ${entry.file}) — drive codeloop_interact action="click" against the menu opener, then click again against text="${entry.name}", then capture_screenshot with target_change_entry="${display}".`;
300
+ }
301
+ return `${display} (in ${entry.file}) — drive codeloop_interact action="click"/"type" against an element with this label, then capture_screenshot with target_change_entry="${display}".`;
302
+ case "property_added":
303
+ return `${display} (in ${entry.file}) — exercise via the UI control bound to this property (typically a textbox / column / toggle whose label resembles "${entry.name}"). Pass description="${display}" on codeloop_interact so the cross-check matches.`;
304
+ case "method_added":
305
+ return `${display} (in ${entry.file}) — implicit. Will be credited when the property/column it operates on is exercised. No direct interaction required.`;
306
+ case "migration_column_added":
307
+ return `${display} (in ${entry.file}) — verify by running codeloop_interact action="shell" with command "sqlite3 <db> '.schema ${entry.table}'" (or psql / dotnet ef migrations script equivalent). The schema dump must contain the column name.`;
308
+ case "migration_table_added":
309
+ return `${display} (in ${entry.file}) — verify by running a schema-dump shell command that references the table, or open a UI screen that loads/persists records of this table.`;
310
+ case "layout_restructure":
311
+ return `${display} — drive codeloop_interact action="resize_window" to a narrow size (e.g. 1024x600), then capture_screenshot with target_change_entry="${display}" so the C3 gate credits the restructure as exercised. If resize_window isn't available on your target platform, capture two screenshots at different window widths and reference this entry by name in the description arg.`;
312
+ }
313
+ }
314
+ export function evaluateChangeCoverage(cwd, runId, config = DEFAULT_CHANGE_COVERAGE_CONFIG) {
315
+ if (!config.enabled) {
316
+ return {
317
+ passed: true,
318
+ threshold: config.threshold,
319
+ manifest_run_id: null,
320
+ total_entries: 0,
321
+ considered_entries: 0,
322
+ exercised_entries: 0,
323
+ unexercised: [],
324
+ per_entry: [],
325
+ reason: "change_coverage_evidence is disabled in .codeloop/config.json (gates.change_coverage_evidence.enabled=false).",
326
+ next_step: "",
327
+ };
328
+ }
329
+ const { manifest, runId: manifestRunId } = loadMostRecentChangeManifest(cwd, runId);
330
+ if (!manifest || manifest.entries.length === 0) {
331
+ return {
332
+ passed: true,
333
+ threshold: config.threshold,
334
+ manifest_run_id: manifestRunId,
335
+ total_entries: 0,
336
+ considered_entries: 0,
337
+ exercised_entries: 0,
338
+ unexercised: [],
339
+ per_entry: [],
340
+ reason: manifest
341
+ ? "Change manifest contains no feature-shaped entries — gate trivially satisfied (this is a pure refactor / docs / dependency bump)."
342
+ : "No change manifest available. Gate trivially satisfied — call codeloop_verify to produce one.",
343
+ next_step: "",
344
+ };
345
+ }
346
+ const ctx = collectExercisingEvents(cwd, runId);
347
+ const skipKinds = new Set(config.skip_kinds);
348
+ const perEntry = [];
349
+ for (const entry of manifest.entries) {
350
+ if (skipKinds.has(entry.kind))
351
+ continue;
352
+ const display = manifestEntryDisplayName(entry);
353
+ const implicit = entry.kind === "method_added";
354
+ const { exercised, evidence } = evaluateEntry(entry, ctx);
355
+ perEntry.push({
356
+ entry,
357
+ display_name: display,
358
+ exercised,
359
+ evidence,
360
+ implicit,
361
+ });
362
+ }
363
+ const considered = perEntry.filter((p) => !p.implicit);
364
+ const exercised = considered.filter((p) => p.exercised);
365
+ const unexercised = considered.filter((p) => !p.exercised);
366
+ const fraction = considered.length === 0 ? 1 : exercised.length / considered.length;
367
+ const passed = fraction >= config.threshold;
368
+ let reason;
369
+ let nextStep = "";
370
+ if (passed) {
371
+ reason = `Change coverage met: ${exercised.length}/${considered.length} manifest entries exercised (>= ${(config.threshold * 100).toFixed(0)}% threshold).`;
372
+ }
373
+ else {
374
+ reason =
375
+ `Change coverage NOT met: ${exercised.length}/${considered.length} manifest entries exercised ` +
376
+ `(${(fraction * 100).toFixed(1)}% — required ${(config.threshold * 100).toFixed(0)}%). ` +
377
+ `Unexercised entries:\n` +
378
+ unexercised
379
+ .slice(0, 10)
380
+ .map((u) => ` - ${u.display_name}`)
381
+ .join("\n") +
382
+ (unexercised.length > 10 ? `\n …and ${unexercised.length - 10} more.` : "");
383
+ nextStep =
384
+ "Per-entry next steps — drive each one via codeloop_interact (NOT raw osascript / PowerShell / xdotool) before re-gating:\n" +
385
+ unexercised
386
+ .slice(0, 8)
387
+ .map((u, i) => ` ${i + 1}. ${nextStepFor(u.entry)}`)
388
+ .join("\n");
389
+ }
390
+ return {
391
+ passed,
392
+ threshold: config.threshold,
393
+ manifest_run_id: manifestRunId,
394
+ total_entries: manifest.entries.length,
395
+ considered_entries: considered.length,
396
+ exercised_entries: exercised.length,
397
+ unexercised,
398
+ per_entry: perEntry,
399
+ reason,
400
+ next_step: nextStep,
401
+ };
402
+ }
403
+ /**
404
+ * Resolve the change-coverage config block out of the project config,
405
+ * falling back to defaults. Tolerates missing fields and unknown keys.
406
+ */
407
+ export function resolveChangeCoverageConfig(raw) {
408
+ if (!raw || typeof raw !== "object")
409
+ return { ...DEFAULT_CHANGE_COVERAGE_CONFIG };
410
+ const r = raw;
411
+ const out = { ...DEFAULT_CHANGE_COVERAGE_CONFIG };
412
+ if (typeof r.enabled === "boolean")
413
+ out.enabled = r.enabled;
414
+ if (typeof r.threshold === "number" && r.threshold >= 0 && r.threshold <= 1) {
415
+ out.threshold = r.threshold;
416
+ }
417
+ if (Array.isArray(r.skip_kinds)) {
418
+ out.skip_kinds = r.skip_kinds.filter((k) => ["ui_element_added", "property_added", "method_added", "migration_column_added", "migration_table_added", "layout_restructure"].includes(String(k)));
419
+ }
420
+ return out;
421
+ }
422
+ //# sourceMappingURL=change_coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change_coverage.js","sourceRoot":"","sources":["../../src/evidence/change_coverage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * 0.1.52 C1 — Change manifest builder.
3
+ *
4
+ * The Photometry-DB E2E run #9 shipped at 100% confidence with all 11 gates
5
+ * green having NEVER exercised the two features the user just added (a new
6
+ * Product Code DataGrid column with cross-sibling auto-fill, plus a buttons-
7
+ * below-title layout fix). The agent ran a generic 5-click navigation tour
8
+ * on an empty database and the gate had no machinery to ask the question
9
+ * "did the interactions actually touch the code that just changed?".
10
+ *
11
+ * The change manifest closes that gap. Every codeloop_verify run computes
12
+ * a feature-shaped diff between HEAD (or the last verified SHA) and the
13
+ * working tree, plus uncommitted/untracked files, and emits a JSON listing
14
+ * the manifest entries the agent MUST exercise before ready_for_review.
15
+ *
16
+ * Hybrid baseline:
17
+ * - Prefer git: `git diff <verified_sha> HEAD --name-status` plus
18
+ * `git status --porcelain` so we count uncommitted and untracked
19
+ * files. If the agent never commits, every uncommitted file shows up.
20
+ * - Fallback to mtime: when there's no .git, files newer than the
21
+ * project's last verify timestamp count.
22
+ *
23
+ * Feature-shape, not line-shape:
24
+ * We don't enumerate every changed line. We enumerate things a human
25
+ * user would point at: a new DataGrid column, a new public property on
26
+ * an entity class, a new EF migration column, a structural layout
27
+ * restructure. This keeps the 100% threshold the user opted into
28
+ * tractable — refactors and renames don't blow it up.
29
+ */
30
+ export type ChangeEntry = {
31
+ kind: "ui_element_added";
32
+ element: "datagrid_column" | "button" | "menu_item" | "input";
33
+ name: string;
34
+ file: string;
35
+ } | {
36
+ kind: "property_added";
37
+ class: string;
38
+ name: string;
39
+ file: string;
40
+ } | {
41
+ kind: "method_added";
42
+ class: string;
43
+ name: string;
44
+ file: string;
45
+ } | {
46
+ kind: "migration_column_added";
47
+ table: string;
48
+ column: string;
49
+ file: string;
50
+ } | {
51
+ kind: "migration_table_added";
52
+ table: string;
53
+ file: string;
54
+ } | {
55
+ kind: "layout_restructure";
56
+ file: string;
57
+ from: string;
58
+ to: string;
59
+ };
60
+ export interface ChangeManifest {
61
+ schema_version: 1;
62
+ baseline: "git" | "git+uncommitted" | "mtime";
63
+ verified_sha: string | null;
64
+ generated_at: string;
65
+ /** Files contributing to entries — useful for diagnostics. */
66
+ changed_files: string[];
67
+ excluded_files: string[];
68
+ entries: ChangeEntry[];
69
+ }
70
+ /**
71
+ * Build a ChangeManifest for the project at `cwd`. The result is also
72
+ * written to `<runDir>/change_manifest.json` when `runDir` is provided.
73
+ */
74
+ export declare function buildChangeManifest(cwd: string, runDir?: string): ChangeManifest;
75
+ export declare function readVerifiedSha(cwd: string): string | null;
76
+ export declare function writeVerifiedSha(cwd: string, sha: string | null): void;
77
+ /**
78
+ * Convenience helper used by gate_check / capture_screenshot to load the
79
+ * latest manifest for a run. Returns null when the file is missing.
80
+ */
81
+ export declare function loadChangeManifest(runDir: string): ChangeManifest | null;
82
+ /**
83
+ * Returns the most recent change manifest across all runs in the project,
84
+ * preferring the one tied to `preferredRunId` when present. Used by
85
+ * gate_check / change-coverage to score against the same manifest the
86
+ * verify run produced even when the user re-runs gate_check standalone.
87
+ */
88
+ export declare function loadMostRecentChangeManifest(cwd: string, preferredRunId?: string): {
89
+ manifest: ChangeManifest | null;
90
+ runId: string | null;
91
+ };
92
+ /** Used by C5 + C7 to enumerate the entries an agent must exercise. */
93
+ export declare function manifestEntryDisplayName(e: ChangeEntry): string;
94
+ //# sourceMappingURL=change_manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change_manifest.d.ts","sourceRoot":"","sources":["../../src/evidence/change_manifest.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,MAAM,MAAM,WAAW,GACnB;IACE,IAAI,EAAE,kBAAkB,CAAC;IACzB,OAAO,EAAE,iBAAiB,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,IAAI,EAAE,wBAAwB,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,IAAI,EAAE,uBAAuB,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,IAAI,EAAE,oBAAoB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEN,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,CAAC,CAAC;IAClB,QAAQ,EAAE,KAAK,GAAG,iBAAiB,GAAG,OAAO,CAAC;IAC9C,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAuqBD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,CA0FhF;AA8CD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS1D;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAYtE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAQxE;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,MAAM,EACX,cAAc,CAAC,EAAE,MAAM,GACtB;IAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAW3D;AAED,uEAAuE;AACvE,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAe/D"}