qfai 0.4.6 → 0.4.9

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 (156) hide show
  1. package/README.md +3 -1
  2. package/assets/init/.qfai/promptpack/steering/traceability.md +10 -1
  3. package/dist/cli/index.cjs +2 -2
  4. package/dist/cli/index.d.ts +0 -2
  5. package/dist/cli/index.mjs +2 -2
  6. package/dist/index.cjs +2 -2
  7. package/dist/index.d.ts +167 -2
  8. package/dist/index.mjs +2 -2
  9. package/package.json +3 -1
  10. package/dist/cli/commands/init.d.ts +0 -8
  11. package/dist/cli/commands/init.d.ts.map +0 -1
  12. package/dist/cli/commands/init.js +0 -30
  13. package/dist/cli/commands/init.js.map +0 -1
  14. package/dist/cli/commands/report.d.ts +0 -7
  15. package/dist/cli/commands/report.d.ts.map +0 -1
  16. package/dist/cli/commands/report.js +0 -108
  17. package/dist/cli/commands/report.js.map +0 -1
  18. package/dist/cli/commands/validate.d.ts +0 -9
  19. package/dist/cli/commands/validate.d.ts.map +0 -1
  20. package/dist/cli/commands/validate.js +0 -57
  21. package/dist/cli/commands/validate.js.map +0 -1
  22. package/dist/cli/index.d.ts.map +0 -1
  23. package/dist/cli/index.js +0 -7
  24. package/dist/cli/index.js.map +0 -1
  25. package/dist/cli/lib/args.d.ts +0 -18
  26. package/dist/cli/lib/args.d.ts.map +0 -1
  27. package/dist/cli/lib/args.js +0 -98
  28. package/dist/cli/lib/args.js.map +0 -1
  29. package/dist/cli/lib/assets.d.ts +0 -2
  30. package/dist/cli/lib/assets.d.ts.map +0 -1
  31. package/dist/cli/lib/assets.js +0 -24
  32. package/dist/cli/lib/assets.js.map +0 -1
  33. package/dist/cli/lib/failOn.d.ts +0 -5
  34. package/dist/cli/lib/failOn.d.ts.map +0 -1
  35. package/dist/cli/lib/failOn.js +0 -10
  36. package/dist/cli/lib/failOn.js.map +0 -1
  37. package/dist/cli/lib/fs.d.ts +0 -11
  38. package/dist/cli/lib/fs.d.ts.map +0 -1
  39. package/dist/cli/lib/fs.js +0 -91
  40. package/dist/cli/lib/fs.js.map +0 -1
  41. package/dist/cli/lib/logger.d.ts +0 -4
  42. package/dist/cli/lib/logger.d.ts.map +0 -1
  43. package/dist/cli/lib/logger.js +0 -10
  44. package/dist/cli/lib/logger.js.map +0 -1
  45. package/dist/cli/main.d.ts +0 -2
  46. package/dist/cli/main.d.ts.map +0 -1
  47. package/dist/cli/main.js +0 -66
  48. package/dist/cli/main.js.map +0 -1
  49. package/dist/core/config.d.ts +0 -47
  50. package/dist/core/config.d.ts.map +0 -1
  51. package/dist/core/config.js +0 -224
  52. package/dist/core/config.js.map +0 -1
  53. package/dist/core/contractIndex.d.ts +0 -12
  54. package/dist/core/contractIndex.d.ts.map +0 -1
  55. package/dist/core/contractIndex.js +0 -38
  56. package/dist/core/contractIndex.js.map +0 -1
  57. package/dist/core/contracts.d.ts +0 -5
  58. package/dist/core/contracts.d.ts.map +0 -1
  59. package/dist/core/contracts.js +0 -42
  60. package/dist/core/contracts.js.map +0 -1
  61. package/dist/core/contractsDecl.d.ts +0 -3
  62. package/dist/core/contractsDecl.d.ts.map +0 -1
  63. package/dist/core/contractsDecl.js +0 -19
  64. package/dist/core/contractsDecl.js.map +0 -1
  65. package/dist/core/discovery.d.ts +0 -14
  66. package/dist/core/discovery.d.ts.map +0 -1
  67. package/dist/core/discovery.js +0 -55
  68. package/dist/core/discovery.js.map +0 -1
  69. package/dist/core/fs.d.ts +0 -11
  70. package/dist/core/fs.d.ts.map +0 -1
  71. package/dist/core/fs.js +0 -68
  72. package/dist/core/fs.js.map +0 -1
  73. package/dist/core/gherkin/parse.d.ts +0 -7
  74. package/dist/core/gherkin/parse.d.ts.map +0 -1
  75. package/dist/core/gherkin/parse.js +0 -25
  76. package/dist/core/gherkin/parse.js.map +0 -1
  77. package/dist/core/ids.d.ts +0 -6
  78. package/dist/core/ids.d.ts.map +0 -1
  79. package/dist/core/ids.js +0 -52
  80. package/dist/core/ids.js.map +0 -1
  81. package/dist/core/index.d.ts +0 -13
  82. package/dist/core/index.d.ts.map +0 -1
  83. package/dist/core/index.js +0 -13
  84. package/dist/core/index.js.map +0 -1
  85. package/dist/core/parse/adr.d.ts +0 -13
  86. package/dist/core/parse/adr.d.ts.map +0 -1
  87. package/dist/core/parse/adr.js +0 -33
  88. package/dist/core/parse/adr.js.map +0 -1
  89. package/dist/core/parse/gherkin.d.ts +0 -12
  90. package/dist/core/parse/gherkin.d.ts.map +0 -1
  91. package/dist/core/parse/gherkin.js +0 -22
  92. package/dist/core/parse/gherkin.js.map +0 -1
  93. package/dist/core/parse/markdown.d.ts +0 -14
  94. package/dist/core/parse/markdown.d.ts.map +0 -1
  95. package/dist/core/parse/markdown.js +0 -45
  96. package/dist/core/parse/markdown.js.map +0 -1
  97. package/dist/core/parse/spec.d.ts +0 -36
  98. package/dist/core/parse/spec.d.ts.map +0 -1
  99. package/dist/core/parse/spec.js +0 -123
  100. package/dist/core/parse/spec.js.map +0 -1
  101. package/dist/core/report.d.ts +0 -55
  102. package/dist/core/report.d.ts.map +0 -1
  103. package/dist/core/report.js +0 -393
  104. package/dist/core/report.js.map +0 -1
  105. package/dist/core/scenarioModel.d.ts +0 -33
  106. package/dist/core/scenarioModel.d.ts.map +0 -1
  107. package/dist/core/scenarioModel.js +0 -128
  108. package/dist/core/scenarioModel.js.map +0 -1
  109. package/dist/core/specLayout.d.ts +0 -8
  110. package/dist/core/specLayout.d.ts.map +0 -1
  111. package/dist/core/specLayout.js +0 -36
  112. package/dist/core/specLayout.js.map +0 -1
  113. package/dist/core/traceability.d.ts +0 -26
  114. package/dist/core/traceability.d.ts.map +0 -1
  115. package/dist/core/traceability.js +0 -157
  116. package/dist/core/traceability.js.map +0 -1
  117. package/dist/core/types.d.ts +0 -31
  118. package/dist/core/types.d.ts.map +0 -1
  119. package/dist/core/types.js +0 -2
  120. package/dist/core/types.js.map +0 -1
  121. package/dist/core/validate.d.ts +0 -4
  122. package/dist/core/validate.d.ts.map +0 -1
  123. package/dist/core/validate.js +0 -45
  124. package/dist/core/validate.js.map +0 -1
  125. package/dist/core/validators/contracts.d.ts +0 -5
  126. package/dist/core/validators/contracts.d.ts.map +0 -1
  127. package/dist/core/validators/contracts.js +0 -189
  128. package/dist/core/validators/contracts.js.map +0 -1
  129. package/dist/core/validators/delta.d.ts +0 -4
  130. package/dist/core/validators/delta.d.ts.map +0 -1
  131. package/dist/core/validators/delta.js +0 -68
  132. package/dist/core/validators/delta.js.map +0 -1
  133. package/dist/core/validators/ids.d.ts +0 -4
  134. package/dist/core/validators/ids.d.ts.map +0 -1
  135. package/dist/core/validators/ids.js +0 -88
  136. package/dist/core/validators/ids.js.map +0 -1
  137. package/dist/core/validators/scenario.d.ts +0 -5
  138. package/dist/core/validators/scenario.d.ts.map +0 -1
  139. package/dist/core/validators/scenario.js +0 -127
  140. package/dist/core/validators/scenario.js.map +0 -1
  141. package/dist/core/validators/spec.d.ts +0 -5
  142. package/dist/core/validators/spec.d.ts.map +0 -1
  143. package/dist/core/validators/spec.js +0 -94
  144. package/dist/core/validators/spec.js.map +0 -1
  145. package/dist/core/validators/traceability.d.ts +0 -4
  146. package/dist/core/validators/traceability.d.ts.map +0 -1
  147. package/dist/core/validators/traceability.js +0 -222
  148. package/dist/core/validators/traceability.js.map +0 -1
  149. package/dist/core/version.d.ts +0 -2
  150. package/dist/core/version.d.ts.map +0 -1
  151. package/dist/core/version.js +0 -25
  152. package/dist/core/version.js.map +0 -1
  153. package/dist/index.d.ts.map +0 -1
  154. package/dist/index.js +0 -2
  155. package/dist/index.js.map +0 -1
  156. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,26 +0,0 @@
1
- export declare const SC_TAG_RE: RegExp;
2
- export declare const SC_TEST_ANNOTATION_RE: RegExp;
3
- export declare const DEFAULT_TEST_FILE_EXCLUDE_GLOBS: string[];
4
- export type ScCoverage = {
5
- total: number;
6
- covered: number;
7
- missing: number;
8
- missingIds: string[];
9
- refs: Record<string, string[]>;
10
- };
11
- export type TestFileScan = {
12
- globs: string[];
13
- excludeGlobs: string[];
14
- matchedFileCount: number;
15
- };
16
- export type ScTestReferenceResult = {
17
- refs: Map<string, Set<string>>;
18
- scan: TestFileScan;
19
- error?: string;
20
- };
21
- export declare function extractAnnotatedScIds(text: string): string[];
22
- export declare function collectScIdsFromScenarioFiles(scenarioFiles: string[]): Promise<Set<string>>;
23
- export declare function collectScIdSourcesFromScenarioFiles(scenarioFiles: string[]): Promise<Map<string, Set<string>>>;
24
- export declare function collectScTestReferences(root: string, globs: string[], excludeGlobs: string[]): Promise<ScTestReferenceResult>;
25
- export declare function buildScCoverage(scIds: Iterable<string>, refs: Map<string, Set<string>>): ScCoverage;
26
- //# sourceMappingURL=traceability.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"traceability.d.ts","sourceRoot":"","sources":["../../src/core/traceability.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,SAAS,QAAe,CAAC;AACtC,eAAO,MAAM,qBAAqB,QAAyB,CAAC;AAC5D,eAAO,MAAM,+BAA+B,UAS3C,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/B,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAS5D;AAED,wBAAsB,6BAA6B,CACjD,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAkBtB;AAED,wBAAsB,mCAAmC,CACvD,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAqBnC;AAED,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EAAE,EACf,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,qBAAqB,CAAC,CA4DhC;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EACvB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,GAC7B,UAAU,CAwBZ"}
@@ -1,157 +0,0 @@
1
- import { readFile } from "node:fs/promises";
2
- import path from "node:path";
3
- import { collectFilesByGlobs } from "./fs.js";
4
- import { parseScenarioDocument } from "./scenarioModel.js";
5
- export const SC_TAG_RE = /^SC-\d{4}$/;
6
- export const SC_TEST_ANNOTATION_RE = /\bQFAI:SC-(\d{4})\b/g;
7
- export const DEFAULT_TEST_FILE_EXCLUDE_GLOBS = [
8
- "**/node_modules/**",
9
- "**/.git/**",
10
- "**/.qfai/**",
11
- "**/dist/**",
12
- "**/build/**",
13
- "**/coverage/**",
14
- "**/.next/**",
15
- "**/out/**",
16
- ];
17
- export function extractAnnotatedScIds(text) {
18
- const ids = new Set();
19
- for (const match of text.matchAll(SC_TEST_ANNOTATION_RE)) {
20
- const suffix = match[1];
21
- if (suffix) {
22
- ids.add(`SC-${suffix}`);
23
- }
24
- }
25
- return Array.from(ids);
26
- }
27
- export async function collectScIdsFromScenarioFiles(scenarioFiles) {
28
- const scIds = new Set();
29
- for (const file of scenarioFiles) {
30
- const text = await readFile(file, "utf-8");
31
- const { document, errors } = parseScenarioDocument(text, file);
32
- if (!document || errors.length > 0) {
33
- continue;
34
- }
35
- for (const scenario of document.scenarios) {
36
- for (const tag of scenario.tags) {
37
- if (SC_TAG_RE.test(tag)) {
38
- scIds.add(tag);
39
- }
40
- }
41
- }
42
- }
43
- return scIds;
44
- }
45
- export async function collectScIdSourcesFromScenarioFiles(scenarioFiles) {
46
- const sources = new Map();
47
- for (const file of scenarioFiles) {
48
- const text = await readFile(file, "utf-8");
49
- const { document, errors } = parseScenarioDocument(text, file);
50
- if (!document || errors.length > 0) {
51
- continue;
52
- }
53
- for (const scenario of document.scenarios) {
54
- for (const tag of scenario.tags) {
55
- if (!SC_TAG_RE.test(tag)) {
56
- continue;
57
- }
58
- const current = sources.get(tag) ?? new Set();
59
- current.add(file);
60
- sources.set(tag, current);
61
- }
62
- }
63
- }
64
- return sources;
65
- }
66
- export async function collectScTestReferences(root, globs, excludeGlobs) {
67
- const refs = new Map();
68
- const normalizedGlobs = normalizeGlobs(globs);
69
- const normalizedExcludeGlobs = normalizeGlobs(excludeGlobs);
70
- const mergedExcludeGlobs = Array.from(new Set([...DEFAULT_TEST_FILE_EXCLUDE_GLOBS, ...normalizedExcludeGlobs]));
71
- if (normalizedGlobs.length === 0) {
72
- return {
73
- refs,
74
- scan: {
75
- globs: normalizedGlobs,
76
- excludeGlobs: mergedExcludeGlobs,
77
- matchedFileCount: 0,
78
- },
79
- };
80
- }
81
- let files = [];
82
- try {
83
- files = await collectFilesByGlobs(root, {
84
- globs: normalizedGlobs,
85
- ignore: mergedExcludeGlobs,
86
- });
87
- }
88
- catch (error) {
89
- return {
90
- refs,
91
- scan: {
92
- globs: normalizedGlobs,
93
- excludeGlobs: mergedExcludeGlobs,
94
- matchedFileCount: 0,
95
- },
96
- error: formatError(error),
97
- };
98
- }
99
- const normalizedFiles = Array.from(new Set(files.map((file) => path.normalize(file))));
100
- for (const file of normalizedFiles) {
101
- const text = await readFile(file, "utf-8");
102
- const scIds = extractAnnotatedScIds(text);
103
- if (scIds.length === 0) {
104
- continue;
105
- }
106
- for (const scId of scIds) {
107
- const current = refs.get(scId) ?? new Set();
108
- current.add(file);
109
- refs.set(scId, current);
110
- }
111
- }
112
- return {
113
- refs,
114
- scan: {
115
- globs: normalizedGlobs,
116
- excludeGlobs: mergedExcludeGlobs,
117
- matchedFileCount: normalizedFiles.length,
118
- },
119
- };
120
- }
121
- export function buildScCoverage(scIds, refs) {
122
- const sortedScIds = toSortedArray(scIds);
123
- const refsRecord = {};
124
- const missingIds = [];
125
- let covered = 0;
126
- for (const scId of sortedScIds) {
127
- const files = refs.get(scId);
128
- const sortedFiles = files ? toSortedArray(files) : [];
129
- refsRecord[scId] = sortedFiles;
130
- if (sortedFiles.length === 0) {
131
- missingIds.push(scId);
132
- }
133
- else {
134
- covered += 1;
135
- }
136
- }
137
- return {
138
- total: sortedScIds.length,
139
- covered,
140
- missing: missingIds.length,
141
- missingIds,
142
- refs: refsRecord,
143
- };
144
- }
145
- function toSortedArray(values) {
146
- return Array.from(new Set(values)).sort((a, b) => a.localeCompare(b));
147
- }
148
- function normalizeGlobs(globs) {
149
- return globs.map((glob) => glob.trim()).filter((glob) => glob.length > 0);
150
- }
151
- function formatError(error) {
152
- if (error instanceof Error) {
153
- return error.message;
154
- }
155
- return String(error);
156
- }
157
- //# sourceMappingURL=traceability.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"traceability.js","sourceRoot":"","sources":["../../src/core/traceability.ts"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
1
- import type { ScCoverage, TestFileScan } from "./traceability.js";
2
- export type IssueSeverity = "info" | "warning" | "error";
3
- export type IssueLocation = {
4
- line: number;
5
- column?: number;
6
- };
7
- export type Issue = {
8
- code: string;
9
- severity: IssueSeverity;
10
- message: string;
11
- file?: string;
12
- refs?: string[];
13
- rule?: string;
14
- loc?: IssueLocation;
15
- };
16
- export type ValidationCounts = {
17
- info: number;
18
- warning: number;
19
- error: number;
20
- };
21
- export type ValidationTraceability = {
22
- sc: ScCoverage;
23
- testFiles: TestFileScan;
24
- };
25
- export type ValidationResult = {
26
- toolVersion: string;
27
- issues: Issue[];
28
- counts: ValidationCounts;
29
- traceability: ValidationTraceability;
30
- };
31
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAElE,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,aAAa,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,UAAU,CAAC;IACf,SAAS,EAAE,YAAY,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,gBAAgB,CAAC;IACzB,YAAY,EAAE,sBAAsB,CAAC;CACtC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
@@ -1,4 +0,0 @@
1
- import { type ConfigLoadResult } from "./config.js";
2
- import type { ValidationResult } from "./types.js";
3
- export declare function validateProject(root: string, configResult?: ConfigLoadResult): Promise<ValidationResult>;
4
- //# sourceMappingURL=validate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAO7E,OAAO,KAAK,EAA2B,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAS5E,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,gBAAgB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAiC3B"}
@@ -1,45 +0,0 @@
1
- import { loadConfig, resolvePath } from "./config.js";
2
- import { collectScenarioFiles } from "./discovery.js";
3
- import { buildScCoverage, collectScIdsFromScenarioFiles, collectScTestReferences, } from "./traceability.js";
4
- import { resolveToolVersion } from "./version.js";
5
- import { validateContracts } from "./validators/contracts.js";
6
- import { validateDeltas } from "./validators/delta.js";
7
- import { validateDefinedIds } from "./validators/ids.js";
8
- import { validateScenarios } from "./validators/scenario.js";
9
- import { validateSpecs } from "./validators/spec.js";
10
- import { validateTraceability } from "./validators/traceability.js";
11
- export async function validateProject(root, configResult) {
12
- const resolved = configResult ?? (await loadConfig(root));
13
- const { config, issues: configIssues } = resolved;
14
- const issues = [
15
- ...configIssues,
16
- ...(await validateSpecs(root, config)),
17
- ...(await validateDeltas(root, config)),
18
- ...(await validateScenarios(root, config)),
19
- ...(await validateContracts(root, config)),
20
- ...(await validateDefinedIds(root, config)),
21
- ...(await validateTraceability(root, config)),
22
- ];
23
- const specsRoot = resolvePath(root, config, "specsDir");
24
- const scenarioFiles = await collectScenarioFiles(specsRoot);
25
- const scIds = await collectScIdsFromScenarioFiles(scenarioFiles);
26
- const { refs: scTestRefs, scan: testFiles } = await collectScTestReferences(root, config.validation.traceability.testFileGlobs, config.validation.traceability.testFileExcludeGlobs);
27
- const scCoverage = buildScCoverage(scIds, scTestRefs);
28
- const toolVersion = await resolveToolVersion();
29
- return {
30
- toolVersion,
31
- issues,
32
- counts: countIssues(issues),
33
- traceability: {
34
- sc: scCoverage,
35
- testFiles,
36
- },
37
- };
38
- }
39
- function countIssues(issues) {
40
- return issues.reduce((acc, issue) => {
41
- acc[issue.severity] += 1;
42
- return acc;
43
- }, { info: 0, warning: 0, error: 0 });
44
- }
45
- //# sourceMappingURL=validate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAyB,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EACL,eAAe,EACf,6BAA6B,EAC7B,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,YAA+B;IAE/B,MAAM,QAAQ,GAAG,YAAY,IAAI,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAC;IAClD,MAAM,MAAM,GAAG;QACb,GAAG,YAAY;QACf,GAAG,CAAC,MAAM,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtC,GAAG,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,GAAG,CAAC,MAAM,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,GAAG,CAAC,MAAM,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;KAC9C,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,MAAM,6BAA6B,CAAC,aAAa,CAAC,CAAC;IACjE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,uBAAuB,CACzE,IAAI,EACJ,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,aAAa,EAC5C,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,oBAAoB,CACpD,CAAC;IACF,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAEtD,MAAM,WAAW,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC/C,OAAO;QACL,WAAW;QACX,MAAM;QACN,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;QAC3B,YAAY,EAAE;YACZ,EAAE,EAAE,UAAU;YACd,SAAS;SACV;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,MAAe;IAClC,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACb,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAClC,CAAC;AACJ,CAAC"}
@@ -1,5 +0,0 @@
1
- import type { QfaiConfig } from "../config.js";
2
- import type { Issue } from "../types.js";
3
- export declare function validateContracts(root: string, config: QfaiConfig): Promise<Issue[]>;
4
- export declare function lintSql(text: string, file: string): Issue[];
5
- //# sourceMappingURL=contracts.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../../src/core/validators/contracts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAc/C,OAAO,KAAK,EAAE,KAAK,EAAiB,MAAM,aAAa,CAAC;AAYxD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,KAAK,EAAE,CAAC,CAWlB;AAkLD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE,CAgB3D"}
@@ -1,189 +0,0 @@
1
- import { readFile } from "node:fs/promises";
2
- import path from "node:path";
3
- import { resolvePath } from "../config.js";
4
- import { parseStructuredContract } from "../contracts.js";
5
- import { buildContractIndex } from "../contractIndex.js";
6
- import { extractDeclaredContractIds, stripContractDeclarationLines, } from "../contractsDecl.js";
7
- import { collectApiContractFiles, collectDbContractFiles, collectUiContractFiles, } from "../discovery.js";
8
- import { extractInvalidIds } from "../ids.js";
9
- const SQL_DANGEROUS_PATTERNS = [
10
- { pattern: /\bDROP\s+TABLE\b/i, label: "DROP TABLE" },
11
- { pattern: /\bDROP\s+DATABASE\b/i, label: "DROP DATABASE" },
12
- { pattern: /\bTRUNCATE\b/i, label: "TRUNCATE" },
13
- {
14
- pattern: /\bALTER\s+TABLE\b[\s\S]*\bDROP\b/i,
15
- label: "ALTER TABLE ... DROP",
16
- },
17
- ];
18
- export async function validateContracts(root, config) {
19
- const issues = [];
20
- const contractsRoot = resolvePath(root, config, "contractsDir");
21
- issues.push(...(await validateUiContracts(path.join(contractsRoot, "ui"))));
22
- issues.push(...(await validateApiContracts(path.join(contractsRoot, "api"))));
23
- issues.push(...(await validateDbContracts(path.join(contractsRoot, "db"))));
24
- const contractIndex = await buildContractIndex(root, config);
25
- issues.push(...validateDuplicateContractIds(contractIndex));
26
- return issues;
27
- }
28
- async function validateUiContracts(uiRoot) {
29
- const files = await collectUiContractFiles(uiRoot);
30
- if (files.length === 0) {
31
- return [
32
- issue("QFAI-UI-000", "UI 契約ファイルが見つかりません。", "info", uiRoot, "contracts.ui.files"),
33
- ];
34
- }
35
- const issues = [];
36
- for (const file of files) {
37
- const text = await readFile(file, "utf-8");
38
- const invalidIds = extractInvalidIds(text, [
39
- "SPEC",
40
- "BR",
41
- "SC",
42
- "UI",
43
- "API",
44
- "DB",
45
- "ADR",
46
- ]);
47
- if (invalidIds.length > 0) {
48
- issues.push(issue("QFAI-ID-002", `ID フォーマットが不正です: ${invalidIds.join(", ")}`, "error", file, "id.format", invalidIds));
49
- }
50
- const declaredIds = extractDeclaredContractIds(text);
51
- issues.push(...validateDeclaredContractIds(declaredIds, file, "UI"));
52
- try {
53
- parseStructuredContract(file, stripContractDeclarationLines(text));
54
- }
55
- catch (error) {
56
- issues.push(issue("QFAI-CONTRACT-001", `UI 契約ファイルの解析に失敗しました: ${file} (${formatError(error)})`, "error", file, "contracts.ui.parse"));
57
- }
58
- }
59
- return issues;
60
- }
61
- async function validateApiContracts(apiRoot) {
62
- const files = await collectApiContractFiles(apiRoot);
63
- if (files.length === 0) {
64
- return [
65
- issue("QFAI-API-000", "API 契約ファイルが見つかりません。", "info", apiRoot, "contracts.api.files"),
66
- ];
67
- }
68
- const issues = [];
69
- for (const file of files) {
70
- const text = await readFile(file, "utf-8");
71
- const invalidIds = extractInvalidIds(text, [
72
- "SPEC",
73
- "BR",
74
- "SC",
75
- "UI",
76
- "API",
77
- "DB",
78
- "ADR",
79
- ]);
80
- if (invalidIds.length > 0) {
81
- issues.push(issue("QFAI-ID-002", `ID フォーマットが不正です: ${invalidIds.join(", ")}`, "error", file, "id.format", invalidIds));
82
- }
83
- const declaredIds = extractDeclaredContractIds(text);
84
- issues.push(...validateDeclaredContractIds(declaredIds, file, "API"));
85
- let doc;
86
- try {
87
- doc = parseStructuredContract(file, stripContractDeclarationLines(text));
88
- }
89
- catch (error) {
90
- issues.push(issue("QFAI-CONTRACT-001", `API 契約ファイルの解析に失敗しました: ${file} (${formatError(error)})`, "error", file, "contracts.api.parse"));
91
- continue;
92
- }
93
- if (!hasOpenApi(doc)) {
94
- issues.push(issue("QFAI-API-001", "OpenAPI 定義が見つかりません。", "error", file, "contracts.api.openapi"));
95
- }
96
- }
97
- return issues;
98
- }
99
- async function validateDbContracts(dbRoot) {
100
- const files = await collectDbContractFiles(dbRoot);
101
- if (files.length === 0) {
102
- return [
103
- issue("QFAI-DB-000", "DB 契約ファイルが見つかりません。", "info", dbRoot, "contracts.db.files"),
104
- ];
105
- }
106
- const issues = [];
107
- for (const file of files) {
108
- const text = await readFile(file, "utf-8");
109
- const invalidIds = extractInvalidIds(text, [
110
- "SPEC",
111
- "BR",
112
- "SC",
113
- "UI",
114
- "API",
115
- "DB",
116
- "ADR",
117
- ]);
118
- if (invalidIds.length > 0) {
119
- issues.push(issue("QFAI-ID-002", `ID フォーマットが不正です: ${invalidIds.join(", ")}`, "error", file, "id.format", invalidIds));
120
- }
121
- const declaredIds = extractDeclaredContractIds(text);
122
- issues.push(...validateDeclaredContractIds(declaredIds, file, "DB"));
123
- issues.push(...lintSql(text, file));
124
- }
125
- return issues;
126
- }
127
- export function lintSql(text, file) {
128
- const issues = [];
129
- for (const { pattern, label } of SQL_DANGEROUS_PATTERNS) {
130
- if (pattern.test(text)) {
131
- issues.push(issue("QFAI-DB-001", `危険な SQL 操作が含まれています: ${label}`, "warning", file, "contracts.db.sql"));
132
- }
133
- }
134
- return issues;
135
- }
136
- function validateDeclaredContractIds(ids, file, kind) {
137
- const issues = [];
138
- if (ids.length === 0) {
139
- issues.push(issue("QFAI-CONTRACT-010", `契約ファイルに QFAI-CONTRACT-ID がありません: ${file}`, "error", file, "contracts.declaration"));
140
- return issues;
141
- }
142
- if (ids.length > 1) {
143
- issues.push(issue("QFAI-CONTRACT-011", `契約ファイルに複数の QFAI-CONTRACT-ID が宣言されています: ${ids.join(", ")}`, "error", file, "contracts.declaration", ids));
144
- return issues;
145
- }
146
- const [id] = ids;
147
- if (id && !id.startsWith(`${kind}-`)) {
148
- issues.push(issue("QFAI-CONTRACT-013", `契約ファイルの QFAI-CONTRACT-ID が ${kind}- ではありません: ${id}`, "error", file, "contracts.declarationPrefix", [id]));
149
- }
150
- return issues;
151
- }
152
- function validateDuplicateContractIds(contractIndex) {
153
- const issues = [];
154
- for (const [id, files] of contractIndex.idToFiles.entries()) {
155
- if (files.size <= 1) {
156
- continue;
157
- }
158
- const sortedFiles = Array.from(files).sort((a, b) => a.localeCompare(b));
159
- issues.push(issue("QFAI-CONTRACT-012", `契約 ID が複数ファイルで宣言されています: ${id} (${sortedFiles.join(", ")})`, "error", sortedFiles[0], "contracts.idDuplicate", [id]));
160
- }
161
- return issues;
162
- }
163
- function hasOpenApi(doc) {
164
- return typeof doc.openapi === "string" && doc.openapi.length > 0;
165
- }
166
- function formatError(error) {
167
- if (error instanceof Error) {
168
- return error.message;
169
- }
170
- return String(error);
171
- }
172
- function issue(code, message, severity, file, rule, refs) {
173
- const issue = {
174
- code,
175
- severity,
176
- message,
177
- };
178
- if (file) {
179
- issue.file = file;
180
- }
181
- if (rule) {
182
- issue.rule = rule;
183
- }
184
- if (refs && refs.length > 0) {
185
- issue.refs = refs;
186
- }
187
- return issue;
188
- }
189
- //# sourceMappingURL=contracts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../src/core/validators/contracts.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import type { QfaiConfig } from "../config.js";
2
- import type { Issue } from "../types.js";
3
- export declare function validateDeltas(root: string, config: QfaiConfig): Promise<Issue[]>;
4
- //# sourceMappingURL=delta.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"delta.d.ts","sourceRoot":"","sources":["../../../src/core/validators/delta.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,KAAK,EAAE,KAAK,EAAiB,MAAM,aAAa,CAAC;AAQxD,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,KAAK,EAAE,CAAC,CA6DlB"}
@@ -1,68 +0,0 @@
1
- import { readFile } from "node:fs/promises";
2
- import path from "node:path";
3
- import { resolvePath } from "../config.js";
4
- import { collectSpecPackDirs } from "../discovery.js";
5
- const SECTION_RE = /^##\s+変更区分/m;
6
- const COMPAT_LINE_RE = /^\s*-\s*\[[ xX]\]\s*Compatibility\b/m;
7
- const CHANGE_LINE_RE = /^\s*-\s*\[[ xX]\]\s*Change\/Improvement\b/m;
8
- const COMPAT_CHECKED_RE = /^\s*-\s*\[[xX]\]\s*Compatibility\b/m;
9
- const CHANGE_CHECKED_RE = /^\s*-\s*\[[xX]\]\s*Change\/Improvement\b/m;
10
- export async function validateDeltas(root, config) {
11
- const specsRoot = resolvePath(root, config, "specsDir");
12
- const packs = await collectSpecPackDirs(specsRoot);
13
- if (packs.length === 0) {
14
- return [];
15
- }
16
- const issues = [];
17
- for (const pack of packs) {
18
- const deltaPath = path.join(pack, "delta.md");
19
- let text;
20
- try {
21
- text = await readFile(deltaPath, "utf-8");
22
- }
23
- catch (error) {
24
- if (isMissingFileError(error)) {
25
- issues.push(issue("QFAI-DELTA-001", "delta.md が見つかりません。", "error", deltaPath, "delta.exists"));
26
- continue;
27
- }
28
- throw error;
29
- }
30
- const hasSection = SECTION_RE.test(text);
31
- const hasCompatibility = COMPAT_LINE_RE.test(text);
32
- const hasChange = CHANGE_LINE_RE.test(text);
33
- if (!hasSection || !hasCompatibility || !hasChange) {
34
- issues.push(issue("QFAI-DELTA-002", "delta.md の変更区分が不足しています。", "error", deltaPath, "delta.section"));
35
- continue;
36
- }
37
- const compatibilityChecked = COMPAT_CHECKED_RE.test(text);
38
- const changeChecked = CHANGE_CHECKED_RE.test(text);
39
- if (compatibilityChecked === changeChecked) {
40
- issues.push(issue("QFAI-DELTA-003", "delta.md の変更区分はどちらか1つだけ選択してください(両方ON/両方OFFは無効です)。", "error", deltaPath, "delta.classification"));
41
- }
42
- }
43
- return issues;
44
- }
45
- function isMissingFileError(error) {
46
- if (!error || typeof error !== "object") {
47
- return false;
48
- }
49
- return error.code === "ENOENT";
50
- }
51
- function issue(code, message, severity, file, rule, refs) {
52
- const issue = {
53
- code,
54
- severity,
55
- message,
56
- };
57
- if (file) {
58
- issue.file = file;
59
- }
60
- if (rule) {
61
- issue.rule = rule;
62
- }
63
- if (refs && refs.length > 0) {
64
- issue.refs = refs;
65
- }
66
- return issue;
67
- }
68
- //# sourceMappingURL=delta.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"delta.js","sourceRoot":"","sources":["../../../src/core/validators/delta.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import type { QfaiConfig } from "../config.js";
2
- import type { Issue } from "../types.js";
3
- export declare function validateDefinedIds(root: string, config: QfaiConfig): Promise<Issue[]>;
4
- //# sourceMappingURL=ids.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../../../src/core/validators/ids.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAM/C,OAAO,KAAK,EAAE,KAAK,EAAiB,MAAM,aAAa,CAAC;AAIxD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,KAAK,EAAE,CAAC,CAmClB"}