@anselmdk/feature-spec-md 0.6.2 → 0.7.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.
@@ -9,9 +9,11 @@ export type SpecEvidenceStep = {
9
9
  export type SpecEvidenceScreenshot = {
10
10
  specPath: string;
11
11
  line: number;
12
- path: string;
12
+ changed: boolean;
13
+ path?: string;
13
14
  title: string;
14
15
  testPath: string;
16
+ comparedWithLine?: number;
15
17
  };
16
18
  export type PlaywrightSpecEvidenceOptions = {
17
19
  specs: string[];
@@ -36,10 +38,8 @@ export type PlaywrightTestInfoLike = {
36
38
  export type PlaywrightTestLike = {
37
39
  step<T>(title: string, body: () => Promise<T>): Promise<T>;
38
40
  };
39
- /** Create a Playwright helper that captures screenshot evidence for spec step lines. */
40
41
  export declare function createPlaywrightSpecEvidence(test: PlaywrightTestLike, options: PlaywrightSpecEvidenceOptions): {
41
42
  specStep(page: PlaywrightPageLike, testInfo: PlaywrightTestInfoLike, scenarioId: string, stepText: string, body: () => Promise<void>): Promise<void>;
42
43
  };
43
- /** Parse spec files and return all scenario step lines addressable by Playwright tests. */
44
44
  export declare function loadSpecSteps(patterns: string[], cwd?: string): Promise<SpecEvidenceStep[]>;
45
45
  //# sourceMappingURL=playwright.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7E,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAC7C,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC5D,CAAC;AAEF,wFAAwF;AACxF,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,kBAAkB,EACxB,OAAO,EAAE,6BAA6B;mBAc5B,kBAAkB,YACd,sBAAsB,cACpB,MAAM,YACR,MAAM,QACV,MAAM,OAAO,CAAC,IAAI,CAAC;EAiB9B;AAED,2FAA2F;AAC3F,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,SAAgB,+BA2B1E"}
1
+ {"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7E,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAC7C,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC5D,CAAC;AAOF,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,kBAAkB,EACxB,OAAO,EAAE,6BAA6B;mBAe5B,kBAAkB,YACd,sBAAsB,cACpB,MAAM,YACR,MAAM,QACV,MAAM,OAAO,CAAC,IAAI,CAAC;EA0B9B;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,SAAgB,+BA2B1E"}
@@ -1,12 +1,8 @@
1
- /**
2
- * Playwright integration helpers for mapping spec scenario steps to test steps
3
- * and capturing screenshot evidence tied to exact spec lines.
4
- */
5
- import { mkdir, readFile, writeFile } from "node:fs/promises";
1
+ import { createHash } from "node:crypto";
2
+ import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
6
3
  import path from "node:path";
7
4
  import { parseFeatureSpec } from "./featureSpecs.js";
8
5
  import { expandFilePatterns } from "./filePatterns.js";
9
- /** Create a Playwright helper that captures screenshot evidence for spec step lines. */
10
6
  export function createPlaywrightSpecEvidence(test, options) {
11
7
  const cwd = options.cwd ?? process.cwd();
12
8
  const reportDir = path.resolve(cwd, options.reportDir ?? "test-results/spec-report");
@@ -14,17 +10,25 @@ export function createPlaywrightSpecEvidence(test, options) {
14
10
  const screenshotDir = path.join(reportDir, screenshotsDirName);
15
11
  const stepsPromise = loadSpecSteps(options.specs, cwd);
16
12
  const entriesByWorker = new Map();
13
+ const screenStateByScenario = new Map();
17
14
  return {
18
15
  async specStep(page, testInfo, scenarioId, stepText, body) {
19
16
  const step = await findSpecStep(stepsPromise, scenarioId, stepText);
20
17
  await test.step(`${step.keyword} ${step.text}`, async () => {
18
+ const stateKey = screenStateKey(testInfo, scenarioId);
19
+ if (!screenStateByScenario.has(stateKey)) {
20
+ const baseline = await capturePageBuffer(page, reportDir, "baseline");
21
+ screenStateByScenario.set(stateKey, { hash: screenshotHash(baseline) });
22
+ }
21
23
  await body();
22
- await captureStepScreenshot({
24
+ await captureStepEvidence({
23
25
  entriesByWorker,
24
26
  page,
25
27
  reportDir,
26
28
  screenshotDir,
27
29
  screenshotsDirName,
30
+ screenStateByScenario,
31
+ stateKey,
28
32
  step,
29
33
  testInfo,
30
34
  });
@@ -32,7 +36,6 @@ export function createPlaywrightSpecEvidence(test, options) {
32
36
  },
33
37
  };
34
38
  }
35
- /** Parse spec files and return all scenario step lines addressable by Playwright tests. */
36
39
  export async function loadSpecSteps(patterns, cwd = process.cwd()) {
37
40
  const previousCwd = process.cwd();
38
41
  const steps = [];
@@ -65,31 +68,75 @@ async function findSpecStep(stepsPromise, scenarioId, stepText) {
65
68
  }
66
69
  return step;
67
70
  }
68
- async function captureStepScreenshot(options) {
71
+ async function captureStepEvidence(options) {
72
+ const currentBuffer = await capturePageBuffer(options.page, options.reportDir, `line-${options.step.line}`);
73
+ const currentHash = screenshotHash(currentBuffer);
74
+ const previousState = options.screenStateByScenario.get(options.stateKey);
75
+ const title = `${options.step.scenarioId}:${options.step.line} ${options.step.keyword} ${options.step.text}`;
76
+ if (previousState?.hash === currentHash && previousState.line !== undefined) {
77
+ await recordEvidence(options, {
78
+ specPath: options.step.specPath,
79
+ line: options.step.line,
80
+ changed: false,
81
+ title: `${title} (unchanged)`,
82
+ testPath: options.testInfo.file,
83
+ comparedWithLine: previousState.line,
84
+ });
85
+ options.screenStateByScenario.set(options.stateKey, {
86
+ hash: currentHash,
87
+ line: options.step.line,
88
+ });
89
+ return;
90
+ }
69
91
  await mkdir(options.screenshotDir, { recursive: true });
70
92
  const fileName = `${options.step.scenarioId}-line-${options.step.line}-${slug(options.step.text)}.png`;
71
93
  const screenshotPath = path.join(options.screenshotDir, fileName);
72
94
  const relativePath = `${options.screenshotsDirName}/${fileName}`;
73
- const title = `${options.step.scenarioId}:${options.step.line} ${options.step.keyword} ${options.step.text}`;
74
- await options.page.screenshot({ fullPage: true, path: screenshotPath });
95
+ await writeFile(screenshotPath, currentBuffer);
75
96
  await options.testInfo.attach(title, {
76
97
  contentType: "image/png",
77
98
  path: screenshotPath,
78
99
  });
79
- const entries = options.entriesByWorker.get(options.testInfo.workerIndex) ?? [];
80
- entries.push({
100
+ await recordEvidence(options, {
81
101
  specPath: options.step.specPath,
82
102
  line: options.step.line,
103
+ changed: true,
83
104
  path: relativePath,
84
105
  title,
85
106
  testPath: options.testInfo.file,
86
107
  });
108
+ options.screenStateByScenario.set(options.stateKey, {
109
+ hash: currentHash,
110
+ line: options.step.line,
111
+ });
112
+ }
113
+ async function recordEvidence(options, entry) {
114
+ const entries = options.entriesByWorker.get(options.testInfo.workerIndex) ?? [];
115
+ entries.push(entry);
87
116
  options.entriesByWorker.set(options.testInfo.workerIndex, entries);
88
117
  await writeWorkerManifest(options.reportDir, options.testInfo.workerIndex, entries);
89
118
  }
90
- async function writeWorkerManifest(reportDir, workerIndex, screenshots) {
119
+ async function capturePageBuffer(page, reportDir, label) {
120
+ const tempDir = path.join(reportDir, ".visual-evidence-tmp");
121
+ await mkdir(tempDir, { recursive: true });
122
+ const tempPath = path.join(tempDir, `${process.pid}-${Date.now()}-${slug(label)}.png`);
123
+ try {
124
+ await page.screenshot({ fullPage: true, path: tempPath });
125
+ return await readFile(tempPath);
126
+ }
127
+ finally {
128
+ await rm(tempPath, { force: true });
129
+ }
130
+ }
131
+ function screenshotHash(buffer) {
132
+ return createHash("sha256").update(buffer).digest("hex");
133
+ }
134
+ function screenStateKey(testInfo, scenarioId) {
135
+ return `${testInfo.workerIndex}:${testInfo.file}:${scenarioId}`;
136
+ }
137
+ async function writeWorkerManifest(reportDir, workerIndex, evidence) {
91
138
  await mkdir(reportDir, { recursive: true });
92
- await writeFile(path.join(reportDir, `screenshots-${workerIndex}.json`), JSON.stringify({ screenshots }, null, 2), "utf8");
139
+ await writeFile(path.join(reportDir, `screenshots-${workerIndex}.json`), JSON.stringify({ evidence }, null, 2), "utf8");
93
140
  }
94
141
  function slug(value) {
95
142
  return value
@@ -1 +1 @@
1
- {"version":3,"file":"playwright.js","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"playwright.js","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"reportTemplate.d.ts","sourceRoot":"","sources":["../src/reportTemplate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,WAAW,EAEX,SAAS,EACT,cAAc,EACd,SAAS,EAET,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAYF,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,GAAE,aAAkB,UAe5B"}
1
+ {"version":3,"file":"reportTemplate.d.ts","sourceRoot":"","sources":["../src/reportTemplate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,WAAW,EAEX,SAAS,EACT,cAAc,EACd,SAAS,EAET,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAYF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,OAAO,GAAE,aAAkB,UAcjF"}
@@ -3,7 +3,7 @@ import { renderHtmlPage } from "./reportHtml.js";
3
3
  import { screenshotKey } from "./screenshots.js";
4
4
  export function renderHtmlReport(specs, options = {}) {
5
5
  const title = options.title ?? "Feature Spec Report";
6
- const screenshots = options.screenshots ?? [];
6
+ const evidence = options.screenshots ?? [];
7
7
  const sourceLinks = {
8
8
  githubBaseUrl: options.githubBaseUrl,
9
9
  githubRef: options.githubRef,
@@ -12,21 +12,21 @@ export function renderHtmlReport(specs, options = {}) {
12
12
  title,
13
13
  styles: featureReportStyles(),
14
14
  scripts: featureReportScripts(),
15
- body: featureReportBody({ specs, options, screenshots, sourceLinks, title }),
15
+ body: featureReportBody({ specs, options, evidence, sourceLinks, title }),
16
16
  });
17
17
  }
18
- function featureReportBody({ specs, options, screenshots, sourceLinks, title, }) {
18
+ function featureReportBody({ specs, options, evidence, sourceLinks, title, }) {
19
19
  return `
20
20
  <h1>${renderReportTitle(title, options.repositoryUrl)}</h1>
21
21
  <p>Generated ${html(formatGeneratedAt(options.generatedAt))}.</p>
22
22
  ${renderIssues(options.validationIssues ?? [])}
23
23
  ${renderModels(options.models ?? [], options.coverage, sourceLinks)}
24
- ${specs.map((spec) => renderSpec(spec, options.coverage, screenshots, sourceLinks)).join("\n")}
24
+ ${specs.map((spec) => renderSpec(spec, options.coverage, evidence, sourceLinks)).join("\n")}
25
25
  `;
26
26
  }
27
27
  function featureReportStyles() {
28
28
  return `.panel{border:1px solid #d0d7de;border-radius:8px;padding:20px;margin:18px 0}
29
- .ok{color:#1a7f37}.missing,.error{color:#cf222e}.warning{color:#9a6700}
29
+ .ok{color:#1a7f37}.missing,.error{color:#cf222e}.warning{color:#9a6700}.muted{color:#57606a}
30
30
  .badge{border:1px solid #d0d7de;border-radius:999px;padding:2px 8px;font-size:12px;white-space:nowrap}
31
31
  .feature-header{display:flex;gap:12px;align-items:center;justify-content:space-between}
32
32
  .scenario{border:1px solid #d0d7de;border-radius:8px;margin:12px 0;background:#fff}
@@ -81,20 +81,7 @@ function formatGeneratedAt(value) {
81
81
  if (Number.isNaN(date.getTime()))
82
82
  return value ?? "";
83
83
  const day = date.getDate();
84
- const month = [
85
- "January",
86
- "February",
87
- "March",
88
- "April",
89
- "May",
90
- "June",
91
- "July",
92
- "August",
93
- "September",
94
- "October",
95
- "November",
96
- "December",
97
- ][date.getMonth()];
84
+ const month = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"][date.getMonth()];
98
85
  const hours = String(date.getHours()).padStart(2, "0");
99
86
  const minutes = String(date.getMinutes()).padStart(2, "0");
100
87
  return `${day}${ordinalSuffix(day)} ${month} ${date.getFullYear()} at ${hours}:${minutes}`;
@@ -159,8 +146,8 @@ function renderModelRules(model, ruleCoverage, ruleScenarioLinks, sourceLinks) {
159
146
  })
160
147
  .join("")}</ul>`;
161
148
  }
162
- function renderSpec(spec, coverage, screenshots = [], sourceLinks = {}) {
163
- const screenshotsByLine = groupScreenshotsByLine(screenshots);
149
+ function renderSpec(spec, coverage, evidence = [], sourceLinks = {}) {
150
+ const evidenceByLine = groupEvidenceByLine(evidence);
164
151
  const ruleCoverage = coverage?.ruleCoverage ?? [];
165
152
  const scenarioCoverage = coverage?.scenarioCoverage ?? [];
166
153
  const ruleScenarioLinks = buildRuleScenarioLinks(ruleCoverage, scenarioCoverage);
@@ -173,32 +160,36 @@ function renderSpec(spec, coverage, screenshots = [], sourceLinks = {}) {
173
160
  <h3>Rules</h3>
174
161
  <ul>${spec.rules.map((rule) => renderFeatureRule(rule.id, rule.text, ruleCoverage, ruleScenarioLinks, sourceLinks)).join("")}</ul>
175
162
  <h3>Scenarios</h3>
176
- ${spec.scenarios
177
- .map((scenario) => renderScenario(spec, scenario, scenarioCoverage, ruleScenarioLinks, screenshotsByLine, sourceLinks))
178
- .join("\n")}
163
+ ${spec.scenarios.map((scenario) => renderScenario(spec, scenario, scenarioCoverage, ruleScenarioLinks, evidenceByLine, sourceLinks)).join("\n")}
179
164
  </section>`;
180
165
  }
181
166
  function renderFeatureRule(id, text, ruleCoverage, ruleScenarioLinks, sourceLinks) {
182
167
  const item = ruleCoverage.find((coverageItem) => coverageItem.id === id);
183
168
  return `<li><code>${html(id)}</code>: ${html(text)} ${ruleCoverageBadge(item, ruleScenarioIds(id, ruleScenarioLinks), sourceLinks)}</li>`;
184
169
  }
185
- function renderScenario(spec, scenario, scenarioCoverage, ruleScenarioLinks, screenshotsByLine, sourceLinks) {
186
- const screenshotCount = scenario.steps.reduce((count, step) => count +
187
- (screenshotsByLine.get(screenshotKey(spec.filePath, step.line))?.length ?? 0), 0);
170
+ function renderScenario(spec, scenario, scenarioCoverage, ruleScenarioLinks, evidenceByLine, sourceLinks) {
171
+ const scenarioEvidence = scenario.steps.flatMap((step) => evidenceByLine.get(screenshotKey(spec.filePath, step.line)) ?? []);
172
+ const changedCount = scenarioEvidence.filter((entry) => entry.changed && entry.path).length;
173
+ const unchangedCount = scenarioEvidence.filter((entry) => !entry.changed).length;
188
174
  const scenarioRuleIds = ruleIdsForScenario(scenario.id, spec.rules.map((rule) => rule.id), ruleScenarioLinks);
189
175
  const scenarioCoverageItem = scenarioCoverage.find((item) => item.id === scenario.id);
190
- return `<details class="scenario" data-has-images="${screenshotCount > 0 ? "true" : "false"}">
191
- <summary><code>${html(scenario.id)}</code>: ${html(scenario.title)} ${coverageBadge(scenarioCoverageItem?.covered, [], scenarioCoverageItem, sourceLinks)} <span class="badge">${screenshotCount} screenshot${screenshotCount === 1 ? "" : "s"}</span></summary>
192
- <div class="scenario-body">${renderScenarioRuleCoverage(scenarioRuleIds)}${scenario.steps.map((step) => renderStep(spec, step, screenshotsByLine, sourceLinks)).join("")}</div>
176
+ return `<details class="scenario" data-has-images="${changedCount > 0 ? "true" : "false"}">
177
+ <summary><code>${html(scenario.id)}</code>: ${html(scenario.title)} ${coverageBadge(scenarioCoverageItem?.covered, [], scenarioCoverageItem, sourceLinks)} ${renderEvidenceSummary(changedCount, unchangedCount)}</summary>
178
+ <div class="scenario-body">${renderScenarioRuleCoverage(scenarioRuleIds)}${scenario.steps.map((step) => renderStep(spec, step, evidenceByLine, sourceLinks)).join("")}</div>
193
179
  </details>`;
194
180
  }
195
- function renderScenarioRuleCoverage(ruleIds) {
196
- if (!ruleIds.length) {
197
- return `<p><strong>Rules covered by this scenario:</strong> <span class="missing">none referenced</span></p>`;
181
+ function renderEvidenceSummary(changedCount, unchangedCount) {
182
+ if (changedCount === 0 && unchangedCount === 0) {
183
+ return `<span class="badge muted">no visual evidence recorded</span>`;
198
184
  }
199
- return `<p><strong>Rules covered by this scenario:</strong> ${ruleIds
200
- .map((ruleId) => `<code>${html(ruleId)}</code>`)
201
- .join(" ")}</p>`;
185
+ const changedLabel = `${changedCount} visual change${changedCount === 1 ? "" : "s"}`;
186
+ const unchangedLabel = `${unchangedCount} unchanged screen${unchangedCount === 1 ? "" : "s"}`;
187
+ return `<span class="badge">${html([changedLabel, unchangedLabel].join(" · "))}</span>`;
188
+ }
189
+ function renderScenarioRuleCoverage(ruleIds) {
190
+ if (!ruleIds.length)
191
+ return `<p><strong>Rules covered by this scenario:</strong> <span class="muted">none referenced</span></p>`;
192
+ return `<p><strong>Rules covered by this scenario:</strong> ${ruleIds.map((ruleId) => `<code>${html(ruleId)}</code>`).join(" ")}</p>`;
202
193
  }
203
194
  function renderModelItemBody(body) {
204
195
  const lines = body.split("\n");
@@ -236,49 +227,40 @@ function renderModelItemBody(body) {
236
227
  function renderInlineMarkdown(source) {
237
228
  return source
238
229
  .split(/(`[^`]+`)/g)
239
- .map((part) => part.startsWith("`") && part.endsWith("`")
240
- ? `<code>${html(part.slice(1, -1))}</code>`
241
- : html(part))
230
+ .map((part) => part.startsWith("`") && part.endsWith("`") ? `<code>${html(part.slice(1, -1))}</code>` : html(part))
242
231
  .join("");
243
232
  }
244
233
  function isTableStart(lines, index) {
245
- return (isPipeTableRow(lines[index]) &&
246
- index + 1 < lines.length &&
247
- isTableSeparator(lines[index + 1]));
234
+ return isPipeTableRow(lines[index]) && index + 1 < lines.length && isTableSeparator(lines[index + 1]);
248
235
  }
249
236
  function isPipeTableRow(line) {
250
237
  return line.trim().startsWith("|") && line.trim().endsWith("|");
251
238
  }
252
239
  function isTableSeparator(line) {
253
- return (isPipeTableRow(line) &&
254
- splitTableRow(line).every((cell) => /^:?-{3,}:?$/.test(cell)));
240
+ return isPipeTableRow(line) && splitTableRow(line).every((cell) => /^:?-{3,}:?$/.test(cell));
255
241
  }
256
242
  function splitTableRow(line) {
257
- return line
258
- .trim()
259
- .replace(/^\|/, "")
260
- .replace(/\|$/, "")
261
- .split("|")
262
- .map((cell) => cell.trim());
243
+ return line.trim().replace(/^\|/, "").replace(/\|$/, "").split("|").map((cell) => cell.trim());
263
244
  }
264
245
  function renderTable(lines) {
265
246
  const headers = splitTableRow(lines[0]);
266
247
  const rows = lines.slice(1).map(splitTableRow);
267
- return `<div class="table-wrap"><table><thead><tr>${headers
268
- .map((header) => `<th>${renderInlineMarkdown(header)}</th>`)
269
- .join("")}</tr></thead><tbody>${rows
270
- .map((row) => `<tr>${row
271
- .map((cell) => `<td>${renderInlineMarkdown(cell)}</td>`)
272
- .join("")}</tr>`)
273
- .join("")}</tbody></table></div>`;
274
- }
275
- function renderStep(spec, step, screenshotsByLine, sourceLinks) {
276
- const screenshots = screenshotsByLine.get(screenshotKey(spec.filePath, step.line)) ?? [];
248
+ return `<div class="table-wrap"><table><thead><tr>${headers.map((header) => `<th>${renderInlineMarkdown(header)}</th>`).join("")}</tr></thead><tbody>${rows.map((row) => `<tr>${row.map((cell) => `<td>${renderInlineMarkdown(cell)}</td>`).join("")}</tr>`).join("")}</tbody></table></div>`;
249
+ }
250
+ function renderStep(spec, step, evidenceByLine, sourceLinks) {
251
+ const evidence = evidenceByLine.get(screenshotKey(spec.filePath, step.line)) ?? [];
252
+ const screenshots = evidence.filter((entry) => entry.changed && entry.path);
253
+ const unchanged = evidence.filter((entry) => !entry.changed);
277
254
  const evidenceBadge = screenshots.length
278
- ? `<span class="badge ok">${screenshots.length} screenshot${screenshots.length === 1 ? "" : "s"}</span>`
279
- : `<span class="badge missing">missing screenshot</span>`;
255
+ ? `<span class="badge ok">screen changed · screenshot captured</span>`
256
+ : unchanged.length
257
+ ? `<span class="badge muted">same screen${renderComparedWith(unchanged[0])}</span>`
258
+ : `<span class="badge muted" title="missing screenshot evidence is informational">no screenshot captured</span>`;
280
259
  return `<div class="step"><p><strong>${html(step.keyword)}</strong> ${html(step.text)} ${renderLineBadge(spec.filePath, step.line, sourceLinks)} ${evidenceBadge}</p>${renderScreenshots(screenshots)}</div>`;
281
260
  }
261
+ function renderComparedWith(entry) {
262
+ return entry.comparedWithLine ? ` as line ${html(String(entry.comparedWithLine))}` : " as previous screen";
263
+ }
282
264
  function renderLineBadge(filePath, line, sourceLinks) {
283
265
  const label = `line ${line}`;
284
266
  const url = sourceLineUrl(filePath, line, sourceLinks);
@@ -289,30 +271,21 @@ function renderLineBadge(filePath, line, sourceLinks) {
289
271
  function renderScreenshots(screenshots) {
290
272
  if (!screenshots.length)
291
273
  return "";
292
- return `<div class="screenshots">${screenshots
293
- .map((screenshot) => `<figure class="screenshot"><img src="${html(screenshot.path)}" alt="${html(screenshot.title ?? `Screenshot for ${screenshot.specPath}:${screenshot.line}`)}"><figcaption>${html(screenshot.title ?? `${screenshot.specPath}:${screenshot.line}`)}</figcaption></figure>`)
294
- .join("")}</div>`;
274
+ return `<div class="screenshots">${screenshots.map((screenshot) => `<figure class="screenshot"><img src="${html(screenshot.path ?? "")}" alt="${html(screenshot.title ?? `Screenshot for ${screenshot.specPath}:${screenshot.line}`)}"><figcaption>${html(screenshot.title ?? `${screenshot.specPath}:${screenshot.line}`)}</figcaption></figure>`).join("")}</div>`;
295
275
  }
296
276
  function coverageBadge(covered, suffixes = [], item, sourceLinks = {}) {
297
- return covered === undefined
298
- ? ""
299
- : covered
300
- ? `<span class="badge ok">covered${suffixes.length ? ` by ${suffixes.map(html).join(" ")}` : ""}${renderCoverageReferenceMarkers(item, sourceLinks)}</span>`
301
- : `<span class="badge missing">missing coverage</span>`;
277
+ return covered === undefined ? "" : covered ? `<span class="badge ok">covered${suffixes.length ? ` by ${suffixes.map(html).join(" ")}` : ""}${renderCoverageReferenceMarkers(item, sourceLinks)}</span>` : `<span class="badge missing">missing coverage</span>`;
302
278
  }
303
279
  function ruleCoverageBadge(ruleCoverage, scenarioIds, sourceLinks) {
304
- if (ruleCoverage?.covered && !scenarioIds.length) {
280
+ if (ruleCoverage?.covered && !scenarioIds.length)
305
281
  return coverageBadge(true, ["direct test"], ruleCoverage, sourceLinks);
306
- }
307
282
  return coverageBadge(ruleCoverage?.covered, scenarioIds, ruleCoverage, sourceLinks);
308
283
  }
309
284
  function renderCoverageReferenceMarkers(item, sourceLinks) {
310
285
  const references = uniqueCoverageReferences(item);
311
286
  if (!references.length)
312
287
  return "";
313
- return ` <span class="coverage-refs">${references
314
- .map((reference, index) => renderCoverageReferenceMarker(reference, index + 1, sourceLinks))
315
- .join(",")}</span>`;
288
+ return ` <span class="coverage-refs">${references.map((reference, index) => renderCoverageReferenceMarker(reference, index + 1, sourceLinks)).join(",")}</span>`;
316
289
  }
317
290
  function renderCoverageReferenceMarker(reference, index, sourceLinks) {
318
291
  const label = coverageReferenceLabel(reference);
@@ -347,29 +320,18 @@ function sourceLineUrl(filePath, line, sourceLinks) {
347
320
  return undefined;
348
321
  const baseUrl = sourceLinks.githubBaseUrl.replace(/\/$/, "");
349
322
  const ref = encodeURIComponent(sourceLinks.githubRef);
350
- const encodedFilePath = filePath
351
- .split("/")
352
- .map((segment) => encodeURIComponent(segment))
353
- .join("/");
323
+ const encodedFilePath = filePath.split("/").map((segment) => encodeURIComponent(segment)).join("/");
354
324
  return `${baseUrl}/blob/${ref}/${encodedFilePath}#L${line}`;
355
325
  }
356
326
  function ruleScenarioIds(ruleId, ruleScenarioLinks) {
357
- return Array.from(new Set(ruleScenarioLinks
358
- .filter((link) => link.ruleId === ruleId)
359
- .map((link) => link.scenarioId))).sort();
327
+ return Array.from(new Set(ruleScenarioLinks.filter((link) => link.ruleId === ruleId).map((link) => link.scenarioId))).sort();
360
328
  }
361
329
  function ruleIdsForScenario(scenarioId, specRuleIds, ruleScenarioLinks) {
362
- const ruleIds = new Set(ruleScenarioLinks
363
- .filter((link) => link.scenarioId === scenarioId)
364
- .map((link) => link.ruleId));
330
+ const ruleIds = new Set(ruleScenarioLinks.filter((link) => link.scenarioId === scenarioId).map((link) => link.ruleId));
365
331
  return specRuleIds.filter((ruleId) => ruleIds.has(ruleId));
366
332
  }
367
333
  function buildRuleScenarioLinks(ruleCoverage, scenarioCoverage) {
368
- const scenarioReferences = scenarioCoverage.flatMap((scenario) => scenario.references.map((reference) => ({
369
- scenarioId: scenario.id,
370
- filePath: reference.filePath,
371
- line: reference.line,
372
- })));
334
+ const scenarioReferences = scenarioCoverage.flatMap((scenario) => scenario.references.map((reference) => ({ scenarioId: scenario.id, filePath: reference.filePath, line: reference.line })));
373
335
  const links = [];
374
336
  const seen = new Set();
375
337
  for (const rule of ruleCoverage) {
@@ -389,16 +351,14 @@ function buildRuleScenarioLinks(ruleCoverage, scenarioCoverage) {
389
351
  function nearestScenarioReference(filePath, line, scenarioReferences) {
390
352
  const maxLineDistance = 8;
391
353
  return scenarioReferences
392
- .filter((reference) => reference.filePath === filePath &&
393
- reference.line <= line &&
394
- line - reference.line <= maxLineDistance)
354
+ .filter((reference) => reference.filePath === filePath && reference.line <= line && line - reference.line <= maxLineDistance)
395
355
  .sort((left, right) => right.line - left.line)[0];
396
356
  }
397
- function groupScreenshotsByLine(screenshots) {
357
+ function groupEvidenceByLine(evidence) {
398
358
  const grouped = new Map();
399
- for (const screenshot of screenshots) {
400
- const key = screenshotKey(screenshot.specPath, screenshot.line);
401
- grouped.set(key, [...(grouped.get(key) ?? []), screenshot]);
359
+ for (const entry of evidence) {
360
+ const key = screenshotKey(entry.specPath, entry.line);
361
+ grouped.set(key, [...(grouped.get(key) ?? []), entry]);
402
362
  }
403
363
  return grouped;
404
364
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reportTemplate.js","sourceRoot":"","sources":["../src/reportTemplate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reportTemplate.js","sourceRoot":"","sources":["../src/reportTemplate.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,6 @@
1
1
  import type { FeatureSpec, SpecScreenshot, ValidationIssue } from "./types.js";
2
- /** Load screenshot evidence manifests and normalize entries for report rendering. */
3
2
  export declare function collectSpecScreenshots(patterns: string[]): Promise<SpecScreenshot[]>;
4
- /** Validate screenshot evidence manifests against scenario policies. */
5
- export declare function validateScenarioScreenshots(specs: FeatureSpec[], screenshots: SpecScreenshot[]): ValidationIssue[];
3
+ export declare function validateScenarioScreenshots(specs: FeatureSpec[], evidence: SpecScreenshot[]): ValidationIssue[];
6
4
  export declare function screenshotKey(filePath: string, line: number): string;
7
5
  export declare function normalizeFilePath(filePath: string): string;
8
6
  //# sourceMappingURL=screenshots.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"screenshots.d.ts","sourceRoot":"","sources":["../src/screenshots.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE/E,qFAAqF;AACrF,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,6BAgB9D;AAED,wEAAwE;AACxE,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,WAAW,EAAE,EACpB,WAAW,EAAE,cAAc,EAAE,qBA0B9B;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAE3D;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,UAEjD"}
1
+ {"version":3,"file":"screenshots.d.ts","sourceRoot":"","sources":["../src/screenshots.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE/E,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,6BAgB9D;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,WAAW,EAAE,EACpB,QAAQ,EAAE,cAAc,EAAE,qBA0B3B;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAE3D;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,UAEjD"}
@@ -1,42 +1,36 @@
1
- /**
2
- * Screenshot evidence manifest loading and normalization for generated spec
3
- * implementation reports.
4
- */
5
1
  import { readFile } from "node:fs/promises";
6
2
  import { expandArtifactPatterns } from "./filePatterns.js";
7
- /** Load screenshot evidence manifests and normalize entries for report rendering. */
8
3
  export async function collectSpecScreenshots(patterns) {
9
- const screenshots = [];
4
+ const evidence = [];
10
5
  for (const file of await expandArtifactPatterns(patterns)) {
11
6
  const parsed = JSON.parse(await readFile(file, "utf8"));
12
- const entries = Array.isArray(parsed)
13
- ? parsed
7
+ const entries = isRecord(parsed) && Array.isArray(parsed.evidence)
8
+ ? parsed.evidence
14
9
  : isRecord(parsed) && Array.isArray(parsed.screenshots)
15
10
  ? parsed.screenshots
16
11
  : [];
17
12
  for (const entry of entries) {
18
- const screenshot = normalizeScreenshot(entry);
19
- if (screenshot)
20
- screenshots.push(screenshot);
13
+ const normalized = normalizeEvidence(entry);
14
+ if (normalized)
15
+ evidence.push(normalized);
21
16
  }
22
17
  }
23
- return screenshots;
18
+ return evidence;
24
19
  }
25
- /** Validate screenshot evidence manifests against scenario policies. */
26
- export function validateScenarioScreenshots(specs, screenshots) {
27
- const screenshotKeys = new Set(screenshots.map((screenshot) => screenshotKey(screenshot.specPath, screenshot.line)));
20
+ export function validateScenarioScreenshots(specs, evidence) {
21
+ const evidenceKeys = new Set(evidence.map((entry) => screenshotKey(entry.specPath, entry.line)));
28
22
  const issues = [];
29
23
  for (const spec of specs) {
30
24
  for (const scenario of spec.scenarios) {
31
25
  if (scenario.evidence.screenshots === "required") {
32
26
  for (const step of scenario.steps) {
33
- if (!screenshotKeys.has(screenshotKey(spec.filePath, step.line))) {
27
+ if (!evidenceKeys.has(screenshotKey(spec.filePath, step.line))) {
34
28
  issues.push({
35
29
  code: "missing-screenshot-evidence",
36
30
  severity: "error",
37
31
  filePath: spec.filePath,
38
32
  line: step.line,
39
- message: `Screenshot evidence is required for ${scenario.id} ${step.keyword} ${step.text}`,
33
+ message: `Visual evidence is required for ${scenario.id} ${step.keyword} ${step.text}`,
40
34
  });
41
35
  }
42
36
  }
@@ -51,23 +45,26 @@ export function screenshotKey(filePath, line) {
51
45
  export function normalizeFilePath(filePath) {
52
46
  return filePath.replace(/\\/g, "/").replace(/^\.\//, "");
53
47
  }
54
- function normalizeScreenshot(value) {
48
+ function normalizeEvidence(value) {
55
49
  if (!isRecord(value))
56
50
  return null;
57
51
  const specPath = value.specPath;
58
52
  const line = value.line;
53
+ const changed = value.changed;
59
54
  const imagePath = value.path ?? value.imagePath;
60
- if (typeof specPath !== "string" ||
61
- typeof line !== "number" ||
62
- typeof imagePath !== "string") {
55
+ if (typeof specPath !== "string" || typeof line !== "number")
56
+ return null;
57
+ const changedValue = typeof changed === "boolean" ? changed : true;
58
+ if (changedValue && typeof imagePath !== "string")
63
59
  return null;
64
- }
65
60
  return {
66
61
  specPath: normalizeFilePath(specPath),
67
62
  line,
68
- path: imagePath,
63
+ changed: changedValue,
64
+ path: typeof imagePath === "string" ? imagePath : undefined,
69
65
  title: typeof value.title === "string" ? value.title : undefined,
70
66
  testPath: typeof value.testPath === "string" ? value.testPath : undefined,
67
+ comparedWithLine: typeof value.comparedWithLine === "number" ? value.comparedWithLine : undefined,
71
68
  };
72
69
  }
73
70
  function isRecord(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"screenshots.js","sourceRoot":"","sources":["../src/screenshots.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"screenshots.js","sourceRoot":"","sources":["../src/screenshots.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,15 +1,9 @@
1
- /**
2
- * Shared TypeScript types for parsed spec documents, validation issues,
3
- * coverage summaries, test references, and screenshot evidence.
4
- */
5
- /** Shared frontmatter fields supported by all spec documents. */
6
1
  export type SpecFrontmatter = {
7
2
  id: string;
8
3
  title: string;
9
4
  status?: "draft" | "active" | "deprecated";
10
5
  owner?: string;
11
6
  };
12
- /** Frontmatter fields supported by documents that may reference models. */
13
7
  export type ModelReferenceFrontmatter = SpecFrontmatter & {
14
8
  model?: string;
15
9
  models?: string[] | string;
@@ -20,14 +14,11 @@ export type ScenarioEvidencePolicy = {
20
14
  test: ScenarioTestType;
21
15
  screenshots: ScreenshotPolicy;
22
16
  };
23
- /** Frontmatter fields supported by `*.feature.md` files. */
24
17
  export type FeatureFrontmatter = ModelReferenceFrontmatter & {
25
18
  test?: ScenarioTestType;
26
19
  screenshots?: ScreenshotPolicy;
27
20
  };
28
- /** Frontmatter fields supported by `*.design.md` files. */
29
21
  export type DesignFrontmatter = ModelReferenceFrontmatter;
30
- /** Parsed contents of one `*.model.md` file. */
31
22
  export type ModelSpec = {
32
23
  kind: "model";
33
24
  filePath: string;
@@ -38,7 +29,6 @@ export type ModelSpec = {
38
29
  rules: FeatureRule[];
39
30
  source: string;
40
31
  };
41
- /** Parsed contents of one `*.feature.md` file. */
42
32
  export type FeatureSpec = {
43
33
  kind?: "feature";
44
34
  filePath: string;
@@ -49,7 +39,6 @@ export type FeatureSpec = {
49
39
  scenarios: FeatureScenario[];
50
40
  source: string;
51
41
  };
52
- /** Parsed contents of one `*.stack.md` file. */
53
42
  export type StackSpec = {
54
43
  kind: "stack";
55
44
  filePath: string;
@@ -63,7 +52,6 @@ export type StackSpec = {
63
52
  rules: FeatureRule[];
64
53
  source: string;
65
54
  };
66
- /** Parsed contents of one `*.design.md` file. */
67
55
  export type DesignSpec = {
68
56
  kind: "design";
69
57
  filePath: string;
@@ -78,16 +66,13 @@ export type DesignSpec = {
78
66
  rules: FeatureRule[];
79
67
  source: string;
80
68
  };
81
- /** Any parsed spec document. */
82
69
  export type SpecDocument = ModelSpec | FeatureSpec | StackSpec | DesignSpec;
83
- /** A model concept declared in the `## Model` section. */
84
70
  export type ModelItem = {
85
71
  id: string;
86
72
  title: string;
87
73
  body: string;
88
74
  line: number;
89
75
  };
90
- /** A rule declared in the `## Rules` section. */
91
76
  export type FeatureRule = {
92
77
  id: string;
93
78
  text: string;
@@ -95,7 +80,6 @@ export type FeatureRule = {
95
80
  strength: "required" | "recommended" | "optional" | "unspecified";
96
81
  line: number;
97
82
  };
98
- /** A concrete example declared in the `## Scenarios` section. */
99
83
  export type FeatureScenario = {
100
84
  id: string;
101
85
  title: string;
@@ -103,7 +87,6 @@ export type FeatureScenario = {
103
87
  evidence: ScenarioEvidencePolicy;
104
88
  steps: FeatureStep[];
105
89
  };
106
- /** A single Given / When / Then style step inside a scenario. */
107
90
  export type FeatureStep = {
108
91
  keyword: StepKeyword;
109
92
  text: string;
@@ -111,7 +94,6 @@ export type FeatureStep = {
111
94
  };
112
95
  export type RuleKeyword = "MUST" | "MUST NOT" | "SHOULD" | "SHOULD NOT" | "MAY" | "OPTIONAL";
113
96
  export type StepKeyword = "Given" | "When" | "Then" | "And" | "But";
114
- /** Validation problem found in a spec, test reference, or report input. */
115
97
  export type ValidationIssue = {
116
98
  code: string;
117
99
  severity: "error" | "warning";
@@ -119,7 +101,6 @@ export type ValidationIssue = {
119
101
  filePath?: string;
120
102
  line?: number;
121
103
  };
122
- /** A model item, rule, or scenario ID found in executable tests. */
123
104
  export type TestReference = {
124
105
  id: string;
125
106
  filePath: string;
@@ -127,7 +108,6 @@ export type TestReference = {
127
108
  kind: "model" | "rule" | "scenario";
128
109
  source: "title" | "tag" | "covers" | "annotation" | "free-text";
129
110
  };
130
- /** Coverage state for one expected model item, rule, or scenario. */
131
111
  export type CoverageItem = {
132
112
  id: string;
133
113
  title?: string;
@@ -136,7 +116,6 @@ export type CoverageItem = {
136
116
  covered: boolean;
137
117
  references: TestReference[];
138
118
  };
139
- /** Complete test coverage mapping for a set of spec documents. */
140
119
  export type CoverageSummary = {
141
120
  modelCoverage?: CoverageItem[];
142
121
  ruleCoverage: CoverageItem[];
@@ -145,12 +124,13 @@ export type CoverageSummary = {
145
124
  orphanRuleReferences: TestReference[];
146
125
  orphanScenarioReferences: TestReference[];
147
126
  };
148
- /** Screenshot evidence associated with an exact spec line. */
149
127
  export type SpecScreenshot = {
150
128
  specPath: string;
151
129
  line: number;
152
- path: string;
130
+ changed?: boolean;
131
+ path?: string;
153
132
  title?: string;
154
133
  testPath?: string;
134
+ comparedWithLine?: number;
155
135
  };
156
136
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anselmdk/feature-spec-md",
3
- "version": "0.6.2",
3
+ "version": "0.7.0",
4
4
  "description": "Markdown specs for AI-assisted, testable spec driven development across model, feature, stack, and design documents.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -1,18 +1,36 @@
1
1
  {
2
- "screenshots": [
2
+ "evidence": [
3
3
  {
4
4
  "specPath": "src/mocks/current/specs/ticket-inbox.feature.md",
5
5
  "line": 27,
6
+ "changed": true,
6
7
  "path": "screenshots/SUPPORT-INBOX-S001-line-27-current.svg",
7
8
  "title": "Inbox with priority badges",
8
9
  "testPath": "src/mocks/current/tests/supportDesk.spec.ts"
9
10
  },
11
+ {
12
+ "specPath": "src/mocks/current/specs/ticket-inbox.feature.md",
13
+ "line": 28,
14
+ "changed": false,
15
+ "title": "Inbox remains visually unchanged after selecting the first ticket",
16
+ "testPath": "src/mocks/current/tests/supportDesk.spec.ts",
17
+ "comparedWithLine": 27
18
+ },
10
19
  {
11
20
  "specPath": "src/mocks/current/specs/ticket-reply.feature.md",
12
21
  "line": 27,
22
+ "changed": true,
13
23
  "path": "screenshots/SUPPORT-REPLY-S001-line-27-current.svg",
14
24
  "title": "Reply composer with suggested answer",
15
25
  "testPath": "src/mocks/current/tests/supportDesk.spec.ts"
26
+ },
27
+ {
28
+ "specPath": "src/mocks/current/specs/ticket-reply.feature.md",
29
+ "line": 28,
30
+ "changed": false,
31
+ "title": "Reply composer stays visually unchanged while text is reviewed",
32
+ "testPath": "src/mocks/current/tests/supportDesk.spec.ts",
33
+ "comparedWithLine": 27
16
34
  }
17
35
  ]
18
36
  }
@@ -1,11 +1,20 @@
1
1
  {
2
- "screenshots": [
2
+ "evidence": [
3
3
  {
4
4
  "specPath": "src/mocks/previous/specs/ticket-inbox.feature.md",
5
5
  "line": 27,
6
+ "changed": true,
6
7
  "path": "screenshots/SUPPORT-INBOX-S001-line-27-previous.svg",
7
8
  "title": "Inbox before priority badges",
8
9
  "testPath": "src/mocks/previous/tests/supportDesk.spec.ts"
10
+ },
11
+ {
12
+ "specPath": "src/mocks/previous/specs/ticket-inbox.feature.md",
13
+ "line": 28,
14
+ "changed": false,
15
+ "title": "Inbox remains visually unchanged after selecting the first ticket",
16
+ "testPath": "src/mocks/previous/tests/supportDesk.spec.ts",
17
+ "comparedWithLine": 27
9
18
  }
10
19
  ]
11
20
  }