@anselmdk/feature-spec-md 0.1.0 → 0.1.1-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -7
- package/SPEC_FORMAT.md +175 -35
- package/dist/cli.js +134 -27
- package/dist/cli.js.map +1 -1
- package/dist/filePatterns.d.ts +5 -0
- package/dist/filePatterns.d.ts.map +1 -0
- package/dist/filePatterns.js +24 -0
- package/dist/filePatterns.js.map +1 -0
- package/dist/html.d.ts +2 -0
- package/dist/html.d.ts.map +1 -0
- package/dist/html.js +9 -0
- package/dist/html.js.map +1 -0
- package/dist/index.d.ts +14 -69
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +95 -43
- package/dist/index.js.map +1 -1
- package/dist/playwright.d.ts +45 -0
- package/dist/playwright.d.ts.map +1 -0
- package/dist/playwright.js +109 -0
- package/dist/playwright.js.map +1 -0
- package/dist/reportTemplate.d.ts +14 -0
- package/dist/reportTemplate.d.ts.map +1 -0
- package/dist/reportTemplate.js +154 -0
- package/dist/reportTemplate.js.map +1 -0
- package/dist/screenshots.d.ts +6 -0
- package/dist/screenshots.d.ts.map +1 -0
- package/dist/screenshots.js +49 -0
- package/dist/screenshots.js.map +1 -0
- package/dist/specDocuments.d.ts +72 -0
- package/dist/specDocuments.d.ts.map +1 -0
- package/dist/specDocuments.js +389 -0
- package/dist/specDocuments.js.map +1 -0
- package/dist/types.d.ts +142 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +20 -4
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { expandFilePatterns } from "./filePatterns.js";
|
|
3
|
+
import { buildCoverageSummary, parseFeatureSpec, parseTestReferences, validateCoverage, validateFeatureSpec, } from "./index.js";
|
|
4
|
+
const modelIdPattern = /\b[A-Z][A-Z0-9]*(?:-[A-Z0-9]+)*-M\d{3}\b/g;
|
|
5
|
+
export function parseSpecDocument(source, options = {}) {
|
|
6
|
+
const filePath = options.filePath ?? "<inline>";
|
|
7
|
+
const kind = options.kind ?? kindFromPath(filePath);
|
|
8
|
+
if (kind === "model")
|
|
9
|
+
return parseModelSpec(source, { filePath });
|
|
10
|
+
if (kind === "stack")
|
|
11
|
+
return parseStackSpec(source, { filePath });
|
|
12
|
+
if (kind === "design")
|
|
13
|
+
return parseDesignSpec(source, { filePath });
|
|
14
|
+
return { ...parseFeatureSpec(source, { filePath }), kind: "feature" };
|
|
15
|
+
}
|
|
16
|
+
export function parseModelSpec(source, options = {}) {
|
|
17
|
+
const filePath = options.filePath ?? "<inline>";
|
|
18
|
+
const parsed = parseBase(source);
|
|
19
|
+
return {
|
|
20
|
+
kind: "model",
|
|
21
|
+
filePath,
|
|
22
|
+
frontmatter: parsed.frontmatter,
|
|
23
|
+
title: parsed.title,
|
|
24
|
+
purpose: parsed.purpose,
|
|
25
|
+
modelItems: parseModelItems(parsed.lines, parsed.bodyStartLine),
|
|
26
|
+
rules: parseRules(parsed.lines, parsed.bodyStartLine),
|
|
27
|
+
source,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function parseStackSpec(source, options = {}) {
|
|
31
|
+
const filePath = options.filePath ?? "<inline>";
|
|
32
|
+
const parsed = parseBase(source);
|
|
33
|
+
return {
|
|
34
|
+
kind: "stack",
|
|
35
|
+
filePath,
|
|
36
|
+
frontmatter: parsed.frontmatter,
|
|
37
|
+
title: parsed.title,
|
|
38
|
+
purpose: parsed.purpose,
|
|
39
|
+
stack: sectionText(parsed.lines, "Stack").trim(),
|
|
40
|
+
context: sectionText(parsed.lines, "Context").trim(),
|
|
41
|
+
rationale: sectionText(parsed.lines, "Rationale").trim(),
|
|
42
|
+
consequences: sectionText(parsed.lines, "Consequences").trim(),
|
|
43
|
+
rules: parseRules(parsed.lines, parsed.bodyStartLine),
|
|
44
|
+
source,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function parseDesignSpec(source, options = {}) {
|
|
48
|
+
const filePath = options.filePath ?? "<inline>";
|
|
49
|
+
const parsed = parseBase(source);
|
|
50
|
+
return {
|
|
51
|
+
kind: "design",
|
|
52
|
+
filePath,
|
|
53
|
+
frontmatter: parsed.frontmatter,
|
|
54
|
+
title: parsed.title,
|
|
55
|
+
purpose: parsed.purpose,
|
|
56
|
+
design: sectionText(parsed.lines, "Design").trim(),
|
|
57
|
+
principles: sectionText(parsed.lines, "Principles").trim(),
|
|
58
|
+
layout: sectionText(parsed.lines, "Layout").trim(),
|
|
59
|
+
interaction: sectionText(parsed.lines, "Interaction").trim(),
|
|
60
|
+
visualStyle: sectionText(parsed.lines, "Visual style").trim(),
|
|
61
|
+
rules: parseRules(parsed.lines, parsed.bodyStartLine),
|
|
62
|
+
source,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export async function loadSpecDocuments(patterns) {
|
|
66
|
+
const documents = [];
|
|
67
|
+
for (const file of await expandFilePatterns(patterns)) {
|
|
68
|
+
documents.push(parseSpecDocument(await readFile(file, "utf8"), { filePath: file }));
|
|
69
|
+
}
|
|
70
|
+
return documents;
|
|
71
|
+
}
|
|
72
|
+
export function parseSpecTestReferences(source, filePath = "<inline>") {
|
|
73
|
+
const lines = source.split(/\r?\n/);
|
|
74
|
+
const modelRefs = Array.from(source.matchAll(modelIdPattern)).map((match) => ({
|
|
75
|
+
id: match[0],
|
|
76
|
+
filePath,
|
|
77
|
+
line: lineForOffset(lines, match.index ?? 0),
|
|
78
|
+
kind: "model",
|
|
79
|
+
source: "free-text",
|
|
80
|
+
}));
|
|
81
|
+
return dedupe([...parseTestReferences(source, filePath), ...modelRefs]);
|
|
82
|
+
}
|
|
83
|
+
export async function collectSpecTestReferences(patterns) {
|
|
84
|
+
const refs = [];
|
|
85
|
+
for (const file of await expandFilePatterns(patterns)) {
|
|
86
|
+
refs.push(...parseSpecTestReferences(await readFile(file, "utf8"), file));
|
|
87
|
+
}
|
|
88
|
+
return refs;
|
|
89
|
+
}
|
|
90
|
+
export function validateModelSpec(spec) {
|
|
91
|
+
const issues = [];
|
|
92
|
+
validateCommonSpec(spec, issues);
|
|
93
|
+
if (!spec.modelItems.length) {
|
|
94
|
+
issues.push(issue(spec, "missing-model-items", "error", "Model spec must include at least one -M001 model item."));
|
|
95
|
+
}
|
|
96
|
+
for (const item of spec.modelItems) {
|
|
97
|
+
if (!item.id.startsWith(`${spec.frontmatter.id}-`)) {
|
|
98
|
+
issues.push(issue(spec, "wrong-model-prefix", "error", `Model item id "${item.id}" must start with ${spec.frontmatter.id}-.`, item.line));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return issues;
|
|
102
|
+
}
|
|
103
|
+
export function validateStackSpec(spec) {
|
|
104
|
+
const issues = [];
|
|
105
|
+
validateCommonSpec(spec, issues);
|
|
106
|
+
if (!spec.stack) {
|
|
107
|
+
issues.push(issue(spec, "missing-stack", "error", "Stack spec must include a non-empty ## Stack section."));
|
|
108
|
+
}
|
|
109
|
+
return issues;
|
|
110
|
+
}
|
|
111
|
+
export function validateDesignSpec(spec) {
|
|
112
|
+
const issues = [];
|
|
113
|
+
validateCommonSpec(spec, issues);
|
|
114
|
+
if (!spec.design) {
|
|
115
|
+
issues.push(issue(spec, "missing-design", "error", "Design spec must include a non-empty ## Design section."));
|
|
116
|
+
}
|
|
117
|
+
return issues;
|
|
118
|
+
}
|
|
119
|
+
export function validateSpecDocument(spec) {
|
|
120
|
+
if (spec.kind === "model")
|
|
121
|
+
return validateModelSpec(spec);
|
|
122
|
+
if (spec.kind === "stack")
|
|
123
|
+
return validateStackSpec(spec);
|
|
124
|
+
if (spec.kind === "design")
|
|
125
|
+
return validateDesignSpec(spec);
|
|
126
|
+
return validateFeatureSpec(spec);
|
|
127
|
+
}
|
|
128
|
+
export function validateSpecGraph(documents) {
|
|
129
|
+
const issues = [];
|
|
130
|
+
const modelIds = new Set(documents.filter(isModelSpec).map((model) => model.frontmatter.id));
|
|
131
|
+
const seen = new Map();
|
|
132
|
+
for (const doc of documents) {
|
|
133
|
+
for (const entry of documentIds(doc)) {
|
|
134
|
+
const first = seen.get(entry.id);
|
|
135
|
+
if (first) {
|
|
136
|
+
issues.push({
|
|
137
|
+
code: "duplicate-id",
|
|
138
|
+
severity: "error",
|
|
139
|
+
message: `Duplicate id "${entry.id}".`,
|
|
140
|
+
filePath: entry.filePath,
|
|
141
|
+
line: entry.line,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
seen.set(entry.id, entry);
|
|
145
|
+
}
|
|
146
|
+
if (isModelReferencingSpec(doc)) {
|
|
147
|
+
for (const modelId of referencedModelIds(doc)) {
|
|
148
|
+
if (!modelIds.has(modelId)) {
|
|
149
|
+
issues.push({
|
|
150
|
+
code: "unknown-model-reference",
|
|
151
|
+
severity: "error",
|
|
152
|
+
message: `Spec references unknown model "${modelId}".`,
|
|
153
|
+
filePath: doc.filePath,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return issues;
|
|
160
|
+
}
|
|
161
|
+
export function buildSpecCoverageSummary(documents, references) {
|
|
162
|
+
const baseCoverage = buildCoverageSummary(documents.filter(isFeatureSpec), references);
|
|
163
|
+
const modelRefs = references.filter((ref) => ref.kind === "model");
|
|
164
|
+
const modelItems = documents.flatMap((doc) => doc.kind === "model" ? doc.modelItems.map((modelItem) => ({ doc, modelItem })) : []);
|
|
165
|
+
return {
|
|
166
|
+
...baseCoverage,
|
|
167
|
+
modelCoverage: modelItems.map(({ doc, modelItem }) => ({
|
|
168
|
+
id: modelItem.id,
|
|
169
|
+
title: modelItem.title,
|
|
170
|
+
filePath: doc.filePath,
|
|
171
|
+
line: modelItem.line,
|
|
172
|
+
references: modelRefs.filter((ref) => ref.id === modelItem.id),
|
|
173
|
+
covered: modelRefs.some((ref) => ref.id === modelItem.id),
|
|
174
|
+
})),
|
|
175
|
+
orphanModelReferences: modelRefs.filter((ref) => !modelItems.some(({ modelItem }) => modelItem.id === ref.id)),
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
export async function checkSpecDocuments(options) {
|
|
179
|
+
const documents = await loadSpecDocuments(options.specs);
|
|
180
|
+
const references = options.tests?.length ? await collectSpecTestReferences(options.tests) : [];
|
|
181
|
+
const coverage = options.tests?.length ? buildSpecCoverageSummary(documents, references) : undefined;
|
|
182
|
+
const validationIssues = [...documents.flatMap(validateSpecDocument), ...validateSpecGraph(documents)];
|
|
183
|
+
const coverageIssues = coverage
|
|
184
|
+
? [...validateCoverage(coverage, options), ...validateModelCoverage(coverage, options.requireModelCoverage)]
|
|
185
|
+
: [];
|
|
186
|
+
const models = documents.filter(isModelSpec);
|
|
187
|
+
const features = documents.filter(isFeatureSpec);
|
|
188
|
+
const stacks = documents.filter(isStackSpec);
|
|
189
|
+
const designs = documents.filter(isDesignSpec);
|
|
190
|
+
return {
|
|
191
|
+
documents,
|
|
192
|
+
models,
|
|
193
|
+
features,
|
|
194
|
+
stacks,
|
|
195
|
+
designs,
|
|
196
|
+
specs: features,
|
|
197
|
+
validationIssues,
|
|
198
|
+
coverage,
|
|
199
|
+
coverageIssues,
|
|
200
|
+
ok: ![...validationIssues, ...coverageIssues].some((issue) => issue.severity === "error"),
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
function validateModelCoverage(coverage, required = false) {
|
|
204
|
+
const issues = [];
|
|
205
|
+
if (required) {
|
|
206
|
+
for (const item of coverage.modelCoverage?.filter((item) => !item.covered) ?? []) {
|
|
207
|
+
issues.push({
|
|
208
|
+
code: "missing-model-coverage",
|
|
209
|
+
severity: "error",
|
|
210
|
+
message: `Model item "${item.id}" has no matching test reference.`,
|
|
211
|
+
filePath: item.filePath,
|
|
212
|
+
line: item.line,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
for (const ref of coverage.orphanModelReferences ?? []) {
|
|
217
|
+
issues.push({
|
|
218
|
+
code: "orphan-model-reference",
|
|
219
|
+
severity: "error",
|
|
220
|
+
message: `Test references unknown model item "${ref.id}".`,
|
|
221
|
+
filePath: ref.filePath,
|
|
222
|
+
line: ref.line,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
return issues;
|
|
226
|
+
}
|
|
227
|
+
function parseBase(source) {
|
|
228
|
+
const normalized = source.replace(/\r\n/g, "\n");
|
|
229
|
+
if (!normalized.startsWith("---\n")) {
|
|
230
|
+
throw new Error("Spec document must start with frontmatter delimited by ---. ");
|
|
231
|
+
}
|
|
232
|
+
const endIndex = normalized.indexOf("\n---\n", 4);
|
|
233
|
+
if (endIndex === -1) {
|
|
234
|
+
throw new Error("Spec document frontmatter must end with a second --- delimiter.");
|
|
235
|
+
}
|
|
236
|
+
const frontmatter = parseFrontmatter(normalized.slice(4, endIndex));
|
|
237
|
+
if (!frontmatter.id || !frontmatter.title) {
|
|
238
|
+
throw new Error("Spec document frontmatter must contain id and title.");
|
|
239
|
+
}
|
|
240
|
+
const body = normalized.slice(endIndex + 5);
|
|
241
|
+
const lines = body.split("\n");
|
|
242
|
+
const bodyStartLine = normalized.slice(0, endIndex + 5).split("\n").length;
|
|
243
|
+
return {
|
|
244
|
+
frontmatter,
|
|
245
|
+
lines,
|
|
246
|
+
bodyStartLine,
|
|
247
|
+
title: lines
|
|
248
|
+
.find((line) => line.startsWith("# "))
|
|
249
|
+
?.replace(/^#\s+/, "")
|
|
250
|
+
.trim() ?? frontmatter.title,
|
|
251
|
+
purpose: sectionText(lines, "Purpose").trim(),
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
function parseFrontmatter(source) {
|
|
255
|
+
const data = {};
|
|
256
|
+
for (const line of source.split("\n")) {
|
|
257
|
+
const match = line.match(/^([A-Za-z][A-Za-z0-9_-]*):\s*(.*)$/);
|
|
258
|
+
if (match) {
|
|
259
|
+
data[match[1]] = match[2]
|
|
260
|
+
.replace(/^[']|[']$/g, "")
|
|
261
|
+
.replace(/^[\"]|[\"]$/g, "")
|
|
262
|
+
.trim();
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return data;
|
|
266
|
+
}
|
|
267
|
+
function parseModelItems(lines, bodyStartLine) {
|
|
268
|
+
const bounds = sectionBounds(lines, "Model");
|
|
269
|
+
if (!bounds)
|
|
270
|
+
return [];
|
|
271
|
+
const items = [];
|
|
272
|
+
for (let i = bounds.start; i < bounds.end; i += 1) {
|
|
273
|
+
const match = lines[i].match(/^###\s+([A-Z][A-Z0-9]*(?:-[A-Z0-9]+)*-M\d{3}):\s+(.+)$/);
|
|
274
|
+
if (match) {
|
|
275
|
+
items.push({ id: match[1], title: match[2].trim(), body: "", line: bodyStartLine + i });
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return items;
|
|
279
|
+
}
|
|
280
|
+
function parseRules(lines, bodyStartLine) {
|
|
281
|
+
const bounds = sectionBounds(lines, "Rules");
|
|
282
|
+
if (!bounds)
|
|
283
|
+
return [];
|
|
284
|
+
return lines.slice(bounds.start, bounds.end).flatMap((line, index) => {
|
|
285
|
+
const match = line.match(/^\s*-\s+([A-Z][A-Z0-9]*(?:-[A-Z0-9]+)*-R\d{3}):\s+(.+)$/);
|
|
286
|
+
return match
|
|
287
|
+
? [
|
|
288
|
+
{
|
|
289
|
+
id: match[1],
|
|
290
|
+
text: match[2].trim(),
|
|
291
|
+
strength: "unspecified",
|
|
292
|
+
line: bodyStartLine + bounds.start + index,
|
|
293
|
+
},
|
|
294
|
+
]
|
|
295
|
+
: [];
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
function sectionBounds(lines, heading) {
|
|
299
|
+
const start = lines.findIndex((line) => line.trim() === `## ${heading}`);
|
|
300
|
+
if (start === -1)
|
|
301
|
+
return null;
|
|
302
|
+
let end = lines.length;
|
|
303
|
+
for (let i = start + 1; i < lines.length; i += 1) {
|
|
304
|
+
if (/^##\s+/.test(lines[i])) {
|
|
305
|
+
end = i;
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return { start: start + 1, end };
|
|
310
|
+
}
|
|
311
|
+
function sectionText(lines, heading) {
|
|
312
|
+
const bounds = sectionBounds(lines, heading);
|
|
313
|
+
return bounds ? lines.slice(bounds.start, bounds.end).join("\n") : "";
|
|
314
|
+
}
|
|
315
|
+
function validateCommonSpec(spec, issues) {
|
|
316
|
+
if (!spec.purpose) {
|
|
317
|
+
issues.push(issue(spec, "missing-purpose", "error", "Spec document must include a non-empty ## Purpose section."));
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
function issue(spec, code, severity, message, line) {
|
|
321
|
+
return { code, severity, message, filePath: spec.filePath, line };
|
|
322
|
+
}
|
|
323
|
+
function referencedModelIds(spec) {
|
|
324
|
+
const models = typeof spec.frontmatter.models === "string"
|
|
325
|
+
? spec.frontmatter.models.split(",")
|
|
326
|
+
: spec.frontmatter.models ?? [];
|
|
327
|
+
return [spec.frontmatter.model, ...models]
|
|
328
|
+
.map((model) => model?.trim())
|
|
329
|
+
.filter((model) => Boolean(model));
|
|
330
|
+
}
|
|
331
|
+
function kindFromPath(filePath) {
|
|
332
|
+
if (filePath.endsWith(".model.md"))
|
|
333
|
+
return "model";
|
|
334
|
+
if (filePath.endsWith(".stack.md"))
|
|
335
|
+
return "stack";
|
|
336
|
+
if (filePath.endsWith(".design.md"))
|
|
337
|
+
return "design";
|
|
338
|
+
return "feature";
|
|
339
|
+
}
|
|
340
|
+
function isModelSpec(doc) {
|
|
341
|
+
return doc.kind === "model";
|
|
342
|
+
}
|
|
343
|
+
function isFeatureSpec(doc) {
|
|
344
|
+
return doc.kind === "feature" || doc.kind === undefined;
|
|
345
|
+
}
|
|
346
|
+
function isStackSpec(doc) {
|
|
347
|
+
return doc.kind === "stack";
|
|
348
|
+
}
|
|
349
|
+
function isDesignSpec(doc) {
|
|
350
|
+
return doc.kind === "design";
|
|
351
|
+
}
|
|
352
|
+
function isModelReferencingSpec(doc) {
|
|
353
|
+
return isFeatureSpec(doc) || isDesignSpec(doc);
|
|
354
|
+
}
|
|
355
|
+
function documentIds(doc) {
|
|
356
|
+
return [
|
|
357
|
+
{ id: doc.frontmatter.id, filePath: doc.filePath },
|
|
358
|
+
...doc.rules.map((rule) => ({ id: rule.id, filePath: doc.filePath, line: rule.line })),
|
|
359
|
+
...(doc.kind === "model"
|
|
360
|
+
? doc.modelItems.map((item) => ({ id: item.id, filePath: doc.filePath, line: item.line }))
|
|
361
|
+
: isFeatureSpec(doc)
|
|
362
|
+
? doc.scenarios.map((scenario) => ({
|
|
363
|
+
id: scenario.id,
|
|
364
|
+
filePath: doc.filePath,
|
|
365
|
+
line: scenario.line,
|
|
366
|
+
}))
|
|
367
|
+
: []),
|
|
368
|
+
];
|
|
369
|
+
}
|
|
370
|
+
function lineForOffset(lines, offset) {
|
|
371
|
+
let consumed = 0;
|
|
372
|
+
for (const [index, line] of lines.entries()) {
|
|
373
|
+
consumed += line.length + 1;
|
|
374
|
+
if (consumed > offset)
|
|
375
|
+
return index + 1;
|
|
376
|
+
}
|
|
377
|
+
return lines.length;
|
|
378
|
+
}
|
|
379
|
+
function dedupe(refs) {
|
|
380
|
+
const seen = new Set();
|
|
381
|
+
return refs.filter((ref) => {
|
|
382
|
+
const key = `${ref.kind}:${ref.id}:${ref.filePath}:${ref.line}:${ref.source}`;
|
|
383
|
+
if (seen.has(key))
|
|
384
|
+
return false;
|
|
385
|
+
seen.add(key);
|
|
386
|
+
return true;
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
//# sourceMappingURL=specDocuments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specDocuments.js","sourceRoot":"","sources":["../src/specDocuments.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/** Shared frontmatter fields supported by all spec documents. */
|
|
2
|
+
export type SpecFrontmatter = {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
status?: "draft" | "active" | "deprecated";
|
|
6
|
+
owner?: string;
|
|
7
|
+
};
|
|
8
|
+
/** Frontmatter fields supported by documents that may reference models. */
|
|
9
|
+
export type ModelReferenceFrontmatter = SpecFrontmatter & {
|
|
10
|
+
model?: string;
|
|
11
|
+
models?: string[] | string;
|
|
12
|
+
};
|
|
13
|
+
/** Frontmatter fields supported by `*.feature.md` files. */
|
|
14
|
+
export type FeatureFrontmatter = ModelReferenceFrontmatter;
|
|
15
|
+
/** Frontmatter fields supported by `*.design.md` files. */
|
|
16
|
+
export type DesignFrontmatter = ModelReferenceFrontmatter;
|
|
17
|
+
/** Parsed contents of one `*.model.md` file. */
|
|
18
|
+
export type ModelSpec = {
|
|
19
|
+
kind: "model";
|
|
20
|
+
filePath: string;
|
|
21
|
+
frontmatter: SpecFrontmatter;
|
|
22
|
+
title: string;
|
|
23
|
+
purpose: string;
|
|
24
|
+
modelItems: ModelItem[];
|
|
25
|
+
rules: FeatureRule[];
|
|
26
|
+
source: string;
|
|
27
|
+
};
|
|
28
|
+
/** Parsed contents of one `*.feature.md` file. */
|
|
29
|
+
export type FeatureSpec = {
|
|
30
|
+
kind?: "feature";
|
|
31
|
+
filePath: string;
|
|
32
|
+
frontmatter: FeatureFrontmatter;
|
|
33
|
+
title: string;
|
|
34
|
+
purpose: string;
|
|
35
|
+
rules: FeatureRule[];
|
|
36
|
+
scenarios: FeatureScenario[];
|
|
37
|
+
source: string;
|
|
38
|
+
};
|
|
39
|
+
/** Parsed contents of one `*.stack.md` file. */
|
|
40
|
+
export type StackSpec = {
|
|
41
|
+
kind: "stack";
|
|
42
|
+
filePath: string;
|
|
43
|
+
frontmatter: SpecFrontmatter;
|
|
44
|
+
title: string;
|
|
45
|
+
purpose: string;
|
|
46
|
+
stack: string;
|
|
47
|
+
context: string;
|
|
48
|
+
rationale: string;
|
|
49
|
+
consequences: string;
|
|
50
|
+
rules: FeatureRule[];
|
|
51
|
+
source: string;
|
|
52
|
+
};
|
|
53
|
+
/** Parsed contents of one `*.design.md` file. */
|
|
54
|
+
export type DesignSpec = {
|
|
55
|
+
kind: "design";
|
|
56
|
+
filePath: string;
|
|
57
|
+
frontmatter: DesignFrontmatter;
|
|
58
|
+
title: string;
|
|
59
|
+
purpose: string;
|
|
60
|
+
design: string;
|
|
61
|
+
principles: string;
|
|
62
|
+
layout: string;
|
|
63
|
+
interaction: string;
|
|
64
|
+
visualStyle: string;
|
|
65
|
+
rules: FeatureRule[];
|
|
66
|
+
source: string;
|
|
67
|
+
};
|
|
68
|
+
/** Any parsed spec document. */
|
|
69
|
+
export type SpecDocument = ModelSpec | FeatureSpec | StackSpec | DesignSpec;
|
|
70
|
+
/** A model concept declared in the `## Model` section. */
|
|
71
|
+
export type ModelItem = {
|
|
72
|
+
id: string;
|
|
73
|
+
title: string;
|
|
74
|
+
body: string;
|
|
75
|
+
line: number;
|
|
76
|
+
};
|
|
77
|
+
/** A rule declared in the `## Rules` section. */
|
|
78
|
+
export type FeatureRule = {
|
|
79
|
+
id: string;
|
|
80
|
+
text: string;
|
|
81
|
+
keyword?: RuleKeyword;
|
|
82
|
+
strength: "required" | "recommended" | "optional" | "unspecified";
|
|
83
|
+
line: number;
|
|
84
|
+
};
|
|
85
|
+
/** A concrete example declared in the `## Scenarios` section. */
|
|
86
|
+
export type FeatureScenario = {
|
|
87
|
+
id: string;
|
|
88
|
+
title: string;
|
|
89
|
+
line: number;
|
|
90
|
+
steps: FeatureStep[];
|
|
91
|
+
};
|
|
92
|
+
/** A single Given / When / Then style step inside a scenario. */
|
|
93
|
+
export type FeatureStep = {
|
|
94
|
+
keyword: StepKeyword;
|
|
95
|
+
text: string;
|
|
96
|
+
line: number;
|
|
97
|
+
};
|
|
98
|
+
export type RuleKeyword = "MUST" | "MUST NOT" | "SHOULD" | "SHOULD NOT" | "MAY" | "OPTIONAL";
|
|
99
|
+
export type StepKeyword = "Given" | "When" | "Then" | "And" | "But";
|
|
100
|
+
/** Validation problem found in a spec, test reference, or report input. */
|
|
101
|
+
export type ValidationIssue = {
|
|
102
|
+
code: string;
|
|
103
|
+
severity: "error" | "warning";
|
|
104
|
+
message: string;
|
|
105
|
+
filePath?: string;
|
|
106
|
+
line?: number;
|
|
107
|
+
};
|
|
108
|
+
/** A model item, rule, or scenario ID found in executable tests. */
|
|
109
|
+
export type TestReference = {
|
|
110
|
+
id: string;
|
|
111
|
+
filePath: string;
|
|
112
|
+
line: number;
|
|
113
|
+
kind: "model" | "rule" | "scenario";
|
|
114
|
+
source: "title" | "tag" | "covers" | "annotation" | "free-text";
|
|
115
|
+
};
|
|
116
|
+
/** Coverage state for one expected model item, rule, or scenario. */
|
|
117
|
+
export type CoverageItem = {
|
|
118
|
+
id: string;
|
|
119
|
+
title?: string;
|
|
120
|
+
filePath?: string;
|
|
121
|
+
line?: number;
|
|
122
|
+
covered: boolean;
|
|
123
|
+
references: TestReference[];
|
|
124
|
+
};
|
|
125
|
+
/** Complete test coverage mapping for a set of spec documents. */
|
|
126
|
+
export type CoverageSummary = {
|
|
127
|
+
modelCoverage?: CoverageItem[];
|
|
128
|
+
ruleCoverage: CoverageItem[];
|
|
129
|
+
scenarioCoverage: CoverageItem[];
|
|
130
|
+
orphanModelReferences?: TestReference[];
|
|
131
|
+
orphanRuleReferences: TestReference[];
|
|
132
|
+
orphanScenarioReferences: TestReference[];
|
|
133
|
+
};
|
|
134
|
+
/** Screenshot evidence associated with an exact spec line. */
|
|
135
|
+
export type SpecScreenshot = {
|
|
136
|
+
specPath: string;
|
|
137
|
+
line: number;
|
|
138
|
+
path: string;
|
|
139
|
+
title?: string;
|
|
140
|
+
testPath?: string;
|
|
141
|
+
};
|
|
142
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anselmdk/feature-spec-md",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Markdown feature specs with rule
|
|
3
|
+
"version": "0.1.1-rc.1",
|
|
4
|
+
"description": "Markdown feature specs with model, rule, and scenario IDs, validation, coverage checks, and generated reports.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"feature-spec-md": "./dist/cli.js"
|
|
@@ -10,6 +10,14 @@
|
|
|
10
10
|
".": {
|
|
11
11
|
"types": "./dist/index.d.ts",
|
|
12
12
|
"import": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./specDocuments": {
|
|
15
|
+
"types": "./dist/specDocuments.d.ts",
|
|
16
|
+
"import": "./dist/specDocuments.js"
|
|
17
|
+
},
|
|
18
|
+
"./playwright": {
|
|
19
|
+
"types": "./dist/playwright.d.ts",
|
|
20
|
+
"import": "./dist/playwright.js"
|
|
13
21
|
}
|
|
14
22
|
},
|
|
15
23
|
"files": [
|
|
@@ -27,9 +35,15 @@
|
|
|
27
35
|
"build": "tsc -p tsconfig.build.json",
|
|
28
36
|
"prepare": "npm run build",
|
|
29
37
|
"dev": "tsx src/cli.ts",
|
|
30
|
-
"
|
|
38
|
+
"spec": "tsx src/cli.ts check",
|
|
39
|
+
"spec:init": "tsx src/cli.ts init",
|
|
40
|
+
"spec:report": "tsx src/cli.ts report",
|
|
41
|
+
"format": "prettier --write .",
|
|
42
|
+
"check:example": "tsx src/cli.ts check --specs examples/**/*.feature.md --require-scenario-coverage=false",
|
|
31
43
|
"report:example": "tsx src/cli.ts report --specs examples/**/*.feature.md --tests tests/**/*.test.ts --out test-results/feature-spec-report/index.html",
|
|
32
|
-
"test": "
|
|
44
|
+
"test": "npm run test:unit && npm run test:playwright",
|
|
45
|
+
"test:unit": "tsx --test tests/**/*.test.ts",
|
|
46
|
+
"test:playwright": "playwright install chromium && playwright test",
|
|
33
47
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
34
48
|
"verify": "npm run typecheck && npm test && npm run build && npm run check:example"
|
|
35
49
|
},
|
|
@@ -43,7 +57,9 @@
|
|
|
43
57
|
],
|
|
44
58
|
"license": "MIT",
|
|
45
59
|
"devDependencies": {
|
|
60
|
+
"@playwright/test": "^1.60.0",
|
|
46
61
|
"@types/node": "^25.3.2",
|
|
62
|
+
"prettier": "^3.8.4",
|
|
47
63
|
"tsx": "^4.21.0",
|
|
48
64
|
"typescript": "^5.9.3"
|
|
49
65
|
}
|