@anselmdk/feature-spec-md 0.1.0 → 0.1.1-rc.2

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 (41) hide show
  1. package/README.md +57 -7
  2. package/SPEC_FORMAT.md +175 -35
  3. package/dist/cli.js +169 -29
  4. package/dist/cli.js.map +1 -1
  5. package/dist/filePatterns.d.ts +5 -0
  6. package/dist/filePatterns.d.ts.map +1 -0
  7. package/dist/filePatterns.js +24 -0
  8. package/dist/filePatterns.js.map +1 -0
  9. package/dist/html.d.ts +2 -0
  10. package/dist/html.d.ts.map +1 -0
  11. package/dist/html.js +9 -0
  12. package/dist/html.js.map +1 -0
  13. package/dist/index.d.ts +14 -69
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +95 -43
  16. package/dist/index.js.map +1 -1
  17. package/dist/playwright.d.ts +45 -0
  18. package/dist/playwright.d.ts.map +1 -0
  19. package/dist/playwright.js +109 -0
  20. package/dist/playwright.js.map +1 -0
  21. package/dist/reportTemplate.d.ts +14 -0
  22. package/dist/reportTemplate.d.ts.map +1 -0
  23. package/dist/reportTemplate.js +154 -0
  24. package/dist/reportTemplate.js.map +1 -0
  25. package/dist/screenshots.d.ts +6 -0
  26. package/dist/screenshots.d.ts.map +1 -0
  27. package/dist/screenshots.js +49 -0
  28. package/dist/screenshots.js.map +1 -0
  29. package/dist/specDocuments.d.ts +72 -0
  30. package/dist/specDocuments.d.ts.map +1 -0
  31. package/dist/specDocuments.js +414 -0
  32. package/dist/specDocuments.js.map +1 -0
  33. package/dist/testImplementationReport.d.ts +31 -0
  34. package/dist/testImplementationReport.d.ts.map +1 -0
  35. package/dist/testImplementationReport.js +88 -0
  36. package/dist/testImplementationReport.js.map +1 -0
  37. package/dist/types.d.ts +142 -0
  38. package/dist/types.d.ts.map +1 -0
  39. package/dist/types.js +2 -0
  40. package/dist/types.js.map +1 -0
  41. package/package.json +20 -4
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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.0",
4
- "description": "Markdown feature specs with rule/scenario IDs, validation, coverage checks, and generated reports.",
3
+ "version": "0.1.1-rc.2",
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
- "check:example": "tsx src/cli.ts check --specs examples/**/*.feature.md --tests tests/**/*.test.ts --require-scenario-coverage=false",
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": "tsx --test tests/**/*.test.ts",
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
  }