@a11yst/cli 1.0.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.
Files changed (165) hide show
  1. package/LICENSE +373 -0
  2. package/NOTICE.md +11 -0
  3. package/README.md +60 -0
  4. package/TRADEMARKS.md +52 -0
  5. package/dist/bin.d.ts +3 -0
  6. package/dist/bin.d.ts.map +1 -0
  7. package/dist/bin.js +9 -0
  8. package/dist/bin.js.map +1 -0
  9. package/dist/ci-policy-options.d.ts +15 -0
  10. package/dist/ci-policy-options.d.ts.map +1 -0
  11. package/dist/ci-policy-options.js +54 -0
  12. package/dist/ci-policy-options.js.map +1 -0
  13. package/dist/cli-progress.d.ts +16 -0
  14. package/dist/cli-progress.d.ts.map +1 -0
  15. package/dist/cli-progress.js +35 -0
  16. package/dist/cli-progress.js.map +1 -0
  17. package/dist/command-program.d.ts +7 -0
  18. package/dist/command-program.d.ts.map +1 -0
  19. package/dist/command-program.js +950 -0
  20. package/dist/command-program.js.map +1 -0
  21. package/dist/commands/audit-flow-output.d.ts +4 -0
  22. package/dist/commands/audit-flow-output.d.ts.map +1 -0
  23. package/dist/commands/audit-flow-output.js +119 -0
  24. package/dist/commands/audit-flow-output.js.map +1 -0
  25. package/dist/commands/audit-policy-output.d.ts +9 -0
  26. package/dist/commands/audit-policy-output.d.ts.map +1 -0
  27. package/dist/commands/audit-policy-output.js +95 -0
  28. package/dist/commands/audit-policy-output.js.map +1 -0
  29. package/dist/commands/audit.d.ts +15 -0
  30. package/dist/commands/audit.d.ts.map +1 -0
  31. package/dist/commands/audit.js +178 -0
  32. package/dist/commands/audit.js.map +1 -0
  33. package/dist/commands/baseline-config.d.ts +14 -0
  34. package/dist/commands/baseline-config.d.ts.map +1 -0
  35. package/dist/commands/baseline-config.js +33 -0
  36. package/dist/commands/baseline-config.js.map +1 -0
  37. package/dist/commands/baseline.d.ts +86 -0
  38. package/dist/commands/baseline.d.ts.map +1 -0
  39. package/dist/commands/baseline.js +392 -0
  40. package/dist/commands/baseline.js.map +1 -0
  41. package/dist/commands/classify.d.ts +30 -0
  42. package/dist/commands/classify.d.ts.map +1 -0
  43. package/dist/commands/classify.js +105 -0
  44. package/dist/commands/classify.js.map +1 -0
  45. package/dist/commands/detect.d.ts +12 -0
  46. package/dist/commands/detect.d.ts.map +1 -0
  47. package/dist/commands/detect.js +213 -0
  48. package/dist/commands/detect.js.map +1 -0
  49. package/dist/commands/doctor.d.ts +16 -0
  50. package/dist/commands/doctor.d.ts.map +1 -0
  51. package/dist/commands/doctor.js +404 -0
  52. package/dist/commands/doctor.js.map +1 -0
  53. package/dist/commands/findings.d.ts +45 -0
  54. package/dist/commands/findings.d.ts.map +1 -0
  55. package/dist/commands/findings.js +220 -0
  56. package/dist/commands/findings.js.map +1 -0
  57. package/dist/commands/flows.d.ts +30 -0
  58. package/dist/commands/flows.d.ts.map +1 -0
  59. package/dist/commands/flows.js +108 -0
  60. package/dist/commands/flows.js.map +1 -0
  61. package/dist/commands/init.d.ts +64 -0
  62. package/dist/commands/init.d.ts.map +1 -0
  63. package/dist/commands/init.js +293 -0
  64. package/dist/commands/init.js.map +1 -0
  65. package/dist/commands/profiles.d.ts +5 -0
  66. package/dist/commands/profiles.d.ts.map +1 -0
  67. package/dist/commands/profiles.js +39 -0
  68. package/dist/commands/profiles.js.map +1 -0
  69. package/dist/commands/report.d.ts +72 -0
  70. package/dist/commands/report.d.ts.map +1 -0
  71. package/dist/commands/report.js +284 -0
  72. package/dist/commands/report.js.map +1 -0
  73. package/dist/commands/results-loader.d.ts +15 -0
  74. package/dist/commands/results-loader.d.ts.map +1 -0
  75. package/dist/commands/results-loader.js +100 -0
  76. package/dist/commands/results-loader.js.map +1 -0
  77. package/dist/commands/routes.d.ts +35 -0
  78. package/dist/commands/routes.d.ts.map +1 -0
  79. package/dist/commands/routes.js +201 -0
  80. package/dist/commands/routes.js.map +1 -0
  81. package/dist/commands/unclassify.d.ts +22 -0
  82. package/dist/commands/unclassify.d.ts.map +1 -0
  83. package/dist/commands/unclassify.js +79 -0
  84. package/dist/commands/unclassify.js.map +1 -0
  85. package/dist/index.d.ts +11 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +10 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/output.d.ts +9 -0
  90. package/dist/output.d.ts.map +1 -0
  91. package/dist/output.js +29 -0
  92. package/dist/output.js.map +1 -0
  93. package/dist/presentation/ansi.d.ts +12 -0
  94. package/dist/presentation/ansi.d.ts.map +1 -0
  95. package/dist/presentation/ansi.js +51 -0
  96. package/dist/presentation/ansi.js.map +1 -0
  97. package/dist/presentation/audit-presentation.d.ts +20 -0
  98. package/dist/presentation/audit-presentation.d.ts.map +1 -0
  99. package/dist/presentation/audit-presentation.js +409 -0
  100. package/dist/presentation/audit-presentation.js.map +1 -0
  101. package/dist/presentation/boundary.d.ts +5 -0
  102. package/dist/presentation/boundary.d.ts.map +1 -0
  103. package/dist/presentation/boundary.js +4 -0
  104. package/dist/presentation/boundary.js.map +1 -0
  105. package/dist/presentation/brand-header.d.ts +6 -0
  106. package/dist/presentation/brand-header.d.ts.map +1 -0
  107. package/dist/presentation/brand-header.js +18 -0
  108. package/dist/presentation/brand-header.js.map +1 -0
  109. package/dist/presentation/capabilities.d.ts +4 -0
  110. package/dist/presentation/capabilities.d.ts.map +1 -0
  111. package/dist/presentation/capabilities.js +25 -0
  112. package/dist/presentation/capabilities.js.map +1 -0
  113. package/dist/presentation/color.d.ts +13 -0
  114. package/dist/presentation/color.d.ts.map +1 -0
  115. package/dist/presentation/color.js +27 -0
  116. package/dist/presentation/color.js.map +1 -0
  117. package/dist/presentation/disclaimers.d.ts +3 -0
  118. package/dist/presentation/disclaimers.d.ts.map +1 -0
  119. package/dist/presentation/disclaimers.js +3 -0
  120. package/dist/presentation/disclaimers.js.map +1 -0
  121. package/dist/presentation/finding-groups.d.ts +14 -0
  122. package/dist/presentation/finding-groups.d.ts.map +1 -0
  123. package/dist/presentation/finding-groups.js +77 -0
  124. package/dist/presentation/finding-groups.js.map +1 -0
  125. package/dist/presentation/finding-source-report.d.ts +21 -0
  126. package/dist/presentation/finding-source-report.d.ts.map +1 -0
  127. package/dist/presentation/finding-source-report.js +134 -0
  128. package/dist/presentation/finding-source-report.js.map +1 -0
  129. package/dist/presentation/human-output.d.ts +4 -0
  130. package/dist/presentation/human-output.d.ts.map +1 -0
  131. package/dist/presentation/human-output.js +8 -0
  132. package/dist/presentation/human-output.js.map +1 -0
  133. package/dist/presentation/index.d.ts +15 -0
  134. package/dist/presentation/index.d.ts.map +1 -0
  135. package/dist/presentation/index.js +13 -0
  136. package/dist/presentation/index.js.map +1 -0
  137. package/dist/presentation/mode.d.ts +4 -0
  138. package/dist/presentation/mode.d.ts.map +1 -0
  139. package/dist/presentation/mode.js +8 -0
  140. package/dist/presentation/mode.js.map +1 -0
  141. package/dist/presentation/progress-mode.d.ts +20 -0
  142. package/dist/presentation/progress-mode.d.ts.map +1 -0
  143. package/dist/presentation/progress-mode.js +38 -0
  144. package/dist/presentation/progress-mode.js.map +1 -0
  145. package/dist/presentation/progress-reporter.d.ts +18 -0
  146. package/dist/presentation/progress-reporter.d.ts.map +1 -0
  147. package/dist/presentation/progress-reporter.js +236 -0
  148. package/dist/presentation/progress-reporter.js.map +1 -0
  149. package/dist/presentation/progress-signals.d.ts +2 -0
  150. package/dist/presentation/progress-signals.d.ts.map +1 -0
  151. package/dist/presentation/progress-signals.js +14 -0
  152. package/dist/presentation/progress-signals.js.map +1 -0
  153. package/dist/presentation/status.d.ts +11 -0
  154. package/dist/presentation/status.d.ts.map +1 -0
  155. package/dist/presentation/status.js +14 -0
  156. package/dist/presentation/status.js.map +1 -0
  157. package/dist/presentation/types.d.ts +23 -0
  158. package/dist/presentation/types.d.ts.map +1 -0
  159. package/dist/presentation/types.js +2 -0
  160. package/dist/presentation/types.js.map +1 -0
  161. package/dist/run-cli.d.ts +6 -0
  162. package/dist/run-cli.d.ts.map +1 -0
  163. package/dist/run-cli.js +15 -0
  164. package/dist/run-cli.js.map +1 -0
  165. package/package.json +69 -0
@@ -0,0 +1,86 @@
1
+ import { dispositionLabel, type BaselineUpdatePreview, type CompareBaselineResult } from "@a11yst/baseline";
2
+ import type { BaselineComparisonArtifact, BaselineFile, BaselineSummary, AuditExecutionResult } from "@a11yst/types";
3
+ export interface RunBaselineCreateOptions {
4
+ cwd: string;
5
+ configPath?: string;
6
+ from?: string;
7
+ force?: boolean;
8
+ }
9
+ export interface BaselineCreateResult {
10
+ status: "created";
11
+ baselinePath: string;
12
+ entryCount: number;
13
+ createdAt: string;
14
+ }
15
+ export interface RunBaselineStatusOptions {
16
+ cwd: string;
17
+ configPath?: string;
18
+ baselineOverride?: string;
19
+ }
20
+ export interface BaselineStatusResult {
21
+ status: "ok";
22
+ baselinePath: string;
23
+ baseline: BaselineFile;
24
+ comparison?: CompareBaselineResult;
25
+ resultsPath?: string;
26
+ }
27
+ export interface RunBaselineUpdateOptions {
28
+ cwd: string;
29
+ configPath?: string;
30
+ from?: string;
31
+ dryRun?: boolean;
32
+ acceptNew?: boolean;
33
+ removeResolved?: boolean;
34
+ yes?: boolean;
35
+ }
36
+ export interface BaselineUpdateResult {
37
+ status: "preview" | "updated" | "unchanged";
38
+ baselinePath: string;
39
+ preview: BaselineUpdatePreview;
40
+ resultsPath: string;
41
+ comparison: CompareBaselineResult;
42
+ updated?: BaselineFile;
43
+ }
44
+ export interface RunBaselineMigrateOptions {
45
+ cwd: string;
46
+ configPath?: string;
47
+ baselineOverride?: string;
48
+ dryRun?: boolean;
49
+ yes?: boolean;
50
+ }
51
+ export interface BaselineMigrateResult {
52
+ status: "preview" | "migrated" | "unchanged";
53
+ baselinePath: string;
54
+ migrated: boolean;
55
+ message: string;
56
+ baseline: BaselineFile;
57
+ }
58
+ export declare function runBaselineCreate(options: RunBaselineCreateOptions): Promise<BaselineCreateResult>;
59
+ export declare function runBaselineStatus(options: RunBaselineStatusOptions): Promise<BaselineStatusResult>;
60
+ export declare function runBaselineUpdate(options: RunBaselineUpdateOptions): Promise<BaselineUpdateResult>;
61
+ export declare function runBaselineMigrate(options: RunBaselineMigrateOptions): Promise<BaselineMigrateResult>;
62
+ export declare function formatBaselineCreateHuman(result: BaselineCreateResult): string;
63
+ export declare function formatBaselineCreateJson(result: BaselineCreateResult): unknown;
64
+ export declare function formatBaselineStatusHuman(result: BaselineStatusResult): string;
65
+ export declare function formatBaselineStatusJson(result: BaselineStatusResult): unknown;
66
+ export declare function formatBaselineUpdateHuman(result: BaselineUpdateResult): string;
67
+ export declare function formatBaselineUpdateJson(result: BaselineUpdateResult): unknown;
68
+ export declare function formatBaselineMigrateHuman(result: BaselineMigrateResult): string;
69
+ export declare function formatBaselineMigrateJson(result: BaselineMigrateResult): unknown;
70
+ export declare function formatBaselineComparisonArtifact(summary: BaselineSummary): string[];
71
+ export { dispositionLabel, type BaselineComparisonArtifact };
72
+ export declare function applyBaselineToAuditResult(options: {
73
+ cwd: string;
74
+ configPath?: string;
75
+ result: AuditExecutionResult;
76
+ noBaseline?: boolean;
77
+ baselineOverride?: string;
78
+ explicitBaselineRequired?: boolean;
79
+ }): Promise<AuditExecutionResult>;
80
+ export declare function createBaselineAfterAudit(options: {
81
+ cwd: string;
82
+ configPath?: string;
83
+ result: AuditExecutionResult;
84
+ force?: boolean;
85
+ }): Promise<BaselineCreateResult>;
86
+ //# sourceMappingURL=baseline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/commands/baseline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,392 @@
1
+ import { access } from "node:fs/promises";
2
+ import { applyBaselineUpdate, compareBaselineWithAudit, createBaselineFromAudit, loadBaselineFile, migrateBaseline, previewBaselineUpdate, readBaselineFileState, writeBaselineFile, dispositionLabel, } from "@a11yst/baseline";
3
+ import { formatLabelValue } from "../output.js";
4
+ import { baselineFileExists, loadBaselineContext } from "./baseline-config.js";
5
+ import { loadAuditResults } from "./results-loader.js";
6
+ async function ensureBaselineWritable(baselinePath, force) {
7
+ if (force)
8
+ return;
9
+ try {
10
+ await access(baselinePath);
11
+ throw new Error(`Baseline file already exists at "${baselinePath}". Use --force to overwrite it.`);
12
+ }
13
+ catch (error) {
14
+ if (error instanceof Error && error.message.includes("already exists")) {
15
+ throw error;
16
+ }
17
+ }
18
+ }
19
+ export async function runBaselineCreate(options) {
20
+ const context = await loadBaselineContext({
21
+ cwd: options.cwd,
22
+ configPath: options.configPath,
23
+ });
24
+ await ensureBaselineWritable(context.baselinePath, options.force);
25
+ const { result, resultsPath } = await loadAuditResults({
26
+ cwd: options.cwd,
27
+ resultsPath: options.from,
28
+ });
29
+ const baseline = createBaselineFromAudit(result, { resultPath: resultsPath });
30
+ await writeBaselineFile(context.baselinePath, baseline);
31
+ return {
32
+ status: "created",
33
+ baselinePath: context.baselinePath,
34
+ entryCount: baseline.entries.length,
35
+ createdAt: baseline.createdAt,
36
+ };
37
+ }
38
+ async function tryLoadComparison(options) {
39
+ try {
40
+ const loaded = await loadAuditResults({ cwd: options.cwd });
41
+ const comparison = compareBaselineWithAudit(options.baseline, loaded.result, {
42
+ baselinePath: options.baselinePath,
43
+ applyClassifications: options.applyClassifications,
44
+ });
45
+ return { comparison, resultsPath: loaded.resultsPath };
46
+ }
47
+ catch {
48
+ return undefined;
49
+ }
50
+ }
51
+ export async function runBaselineStatus(options) {
52
+ const context = await loadBaselineContext({
53
+ cwd: options.cwd,
54
+ configPath: options.configPath,
55
+ baselineOverride: options.baselineOverride,
56
+ });
57
+ const baseline = await loadBaselineFile(context.baselinePath);
58
+ const compared = await tryLoadComparison({
59
+ cwd: options.cwd,
60
+ configPath: options.configPath,
61
+ baselineOverride: options.baselineOverride,
62
+ baseline,
63
+ baselinePath: context.baselinePath,
64
+ applyClassifications: context.baseline.classifications,
65
+ });
66
+ return {
67
+ status: "ok",
68
+ baselinePath: context.baselinePath,
69
+ baseline,
70
+ ...(compared
71
+ ? { comparison: compared.comparison, resultsPath: compared.resultsPath }
72
+ : {}),
73
+ };
74
+ }
75
+ export async function runBaselineUpdate(options) {
76
+ const context = await loadBaselineContext({
77
+ cwd: options.cwd,
78
+ configPath: options.configPath,
79
+ });
80
+ const baseline = await loadBaselineFile(context.baselinePath);
81
+ const fileState = await readBaselineFileState(context.baselinePath);
82
+ const { result, resultsPath } = await loadAuditResults({
83
+ cwd: options.cwd,
84
+ resultsPath: options.from,
85
+ });
86
+ const comparison = compareBaselineWithAudit(baseline, result, {
87
+ baselinePath: context.baselinePath,
88
+ applyClassifications: context.baseline.classifications,
89
+ });
90
+ const preview = previewBaselineUpdate(baseline, comparison);
91
+ const willWrite = Boolean(options.acceptNew || options.removeResolved);
92
+ const dryRun = options.dryRun !== false || !willWrite;
93
+ if (!preview.hasChanges) {
94
+ return {
95
+ status: "unchanged",
96
+ baselinePath: context.baselinePath,
97
+ preview,
98
+ resultsPath,
99
+ comparison,
100
+ };
101
+ }
102
+ if (dryRun || !willWrite) {
103
+ return {
104
+ status: "preview",
105
+ baselinePath: context.baselinePath,
106
+ preview,
107
+ resultsPath,
108
+ comparison,
109
+ };
110
+ }
111
+ if (!options.yes) {
112
+ const error = new Error("Baseline update requires confirmation. Re-run with --yes to apply.");
113
+ error.exitCode = 2;
114
+ error.preview = {
115
+ status: "preview",
116
+ baselinePath: context.baselinePath,
117
+ preview,
118
+ resultsPath,
119
+ comparison,
120
+ };
121
+ throw error;
122
+ }
123
+ const updated = applyBaselineUpdate(baseline, comparison, {
124
+ acceptNew: options.acceptNew,
125
+ removeResolved: options.removeResolved,
126
+ });
127
+ if (!updated) {
128
+ return {
129
+ status: "unchanged",
130
+ baselinePath: context.baselinePath,
131
+ preview,
132
+ resultsPath,
133
+ comparison,
134
+ };
135
+ }
136
+ await writeBaselineFile(context.baselinePath, updated, {
137
+ expectedHash: fileState.hash,
138
+ expectedMtimeMs: fileState.mtimeMs,
139
+ });
140
+ return {
141
+ status: "updated",
142
+ baselinePath: context.baselinePath,
143
+ preview,
144
+ resultsPath,
145
+ comparison,
146
+ updated,
147
+ };
148
+ }
149
+ export async function runBaselineMigrate(options) {
150
+ const context = await loadBaselineContext({
151
+ cwd: options.cwd,
152
+ configPath: options.configPath,
153
+ baselineOverride: options.baselineOverride,
154
+ });
155
+ const fileState = await readBaselineFileState(context.baselinePath);
156
+ const migratedResult = migrateBaseline(JSON.parse(fileState.content));
157
+ if (!migratedResult.migrated) {
158
+ return {
159
+ status: "unchanged",
160
+ baselinePath: context.baselinePath,
161
+ migrated: false,
162
+ message: migratedResult.message,
163
+ baseline: migratedResult.baseline,
164
+ };
165
+ }
166
+ if (options.dryRun) {
167
+ return {
168
+ status: "preview",
169
+ baselinePath: context.baselinePath,
170
+ migrated: true,
171
+ message: migratedResult.message,
172
+ baseline: migratedResult.baseline,
173
+ };
174
+ }
175
+ if (!options.yes) {
176
+ const error = new Error("Baseline migration requires confirmation. Re-run with --yes to apply.");
177
+ error.exitCode = 2;
178
+ throw error;
179
+ }
180
+ await writeBaselineFile(context.baselinePath, migratedResult.baseline, {
181
+ expectedHash: fileState.hash,
182
+ expectedMtimeMs: fileState.mtimeMs,
183
+ });
184
+ return {
185
+ status: "migrated",
186
+ baselinePath: context.baselinePath,
187
+ migrated: true,
188
+ message: migratedResult.message,
189
+ baseline: migratedResult.baseline,
190
+ };
191
+ }
192
+ function formatSummaryBlock(summary) {
193
+ return [
194
+ formatLabelValue("NEW", String(summary.newFindings)),
195
+ formatLabelValue("KNOWN", String(summary.knownFindings)),
196
+ formatLabelValue("REGRESSED", String(summary.regressedFindings)),
197
+ formatLabelValue("RESOLVED", String(summary.resolvedFindings)),
198
+ formatLabelValue("NOT COMPARED", String(summary.notComparedFindings)),
199
+ ];
200
+ }
201
+ function formatDispositionCounts(summary) {
202
+ const lines = ["Classifications"];
203
+ lines.push(formatLabelValue("False positive", String(summary.dispositions.falsePositive)));
204
+ lines.push(formatLabelValue("Accepted risk", String(summary.dispositions.acceptedRisk)));
205
+ lines.push(formatLabelValue("Third party", String(summary.dispositions.thirdParty)));
206
+ lines.push(formatLabelValue("Not applicable", String(summary.dispositions.notApplicable)));
207
+ lines.push(formatLabelValue("Manual review", String(summary.dispositions.manualReview)));
208
+ lines.push(formatLabelValue("Expired", String(summary.expiredClassifications)));
209
+ return lines;
210
+ }
211
+ function formatPreviewHuman(preview) {
212
+ const lines = ["Proposed baseline changes", ""];
213
+ lines.push(formatLabelValue("Add", String(preview.added.length)));
214
+ lines.push(formatLabelValue("Remove", String(preview.removed.length)));
215
+ lines.push(formatLabelValue("Unchanged", String(preview.unchanged.length)));
216
+ lines.push(formatLabelValue("Regressed", String(preview.regressed.length)));
217
+ if (preview.regressed.length > 0) {
218
+ lines.push("");
219
+ lines.push("Regressions are never accepted silently:");
220
+ for (const entry of preview.regressed) {
221
+ lines.push(`- ${entry.ruleId} (${entry.fingerprint.slice(0, 12)}…)`);
222
+ }
223
+ }
224
+ return lines;
225
+ }
226
+ export function formatBaselineCreateHuman(result) {
227
+ return [
228
+ "Baseline created",
229
+ "",
230
+ formatLabelValue("Path", result.baselinePath),
231
+ formatLabelValue("Entries", String(result.entryCount)),
232
+ formatLabelValue("Created", result.createdAt),
233
+ "",
234
+ "A baseline records known accessibility debt.",
235
+ "It does not make that debt accessible or compliant.",
236
+ ].join("\n");
237
+ }
238
+ export function formatBaselineCreateJson(result) {
239
+ return result;
240
+ }
241
+ export function formatBaselineStatusHuman(result) {
242
+ const lines = ["Baseline status", ""];
243
+ lines.push(formatLabelValue("Path", result.baselinePath));
244
+ lines.push(formatLabelValue("Schema", result.baseline.schemaVersion));
245
+ lines.push(formatLabelValue("Fingerprint", result.baseline.fingerprintVersion));
246
+ lines.push(formatLabelValue("Created", result.baseline.createdAt));
247
+ lines.push(formatLabelValue("Updated", result.baseline.updatedAt));
248
+ lines.push(formatLabelValue("Entries", String(result.baseline.entries.length)));
249
+ const classified = result.baseline.entries.filter((entry) => entry.classification).length;
250
+ lines.push(formatLabelValue("Classified", String(classified)));
251
+ if (result.comparison) {
252
+ lines.push("");
253
+ lines.push("Compared with latest audit");
254
+ if (result.resultsPath) {
255
+ lines.push(formatLabelValue("Results", result.resultsPath));
256
+ }
257
+ lines.push("");
258
+ lines.push(...formatSummaryBlock(result.comparison.summary));
259
+ lines.push("");
260
+ lines.push(...formatDispositionCounts(result.comparison.summary));
261
+ }
262
+ else {
263
+ lines.push("");
264
+ lines.push("No latest audit results found for comparison.");
265
+ }
266
+ lines.push("");
267
+ lines.push("A baseline records known accessibility debt.");
268
+ lines.push("It does not make that debt accessible or compliant.");
269
+ return lines.join("\n");
270
+ }
271
+ export function formatBaselineStatusJson(result) {
272
+ return {
273
+ status: result.status,
274
+ baselinePath: result.baselinePath,
275
+ baseline: result.baseline,
276
+ resultsPath: result.resultsPath,
277
+ summary: result.comparison?.summary,
278
+ artifact: result.comparison?.artifact,
279
+ };
280
+ }
281
+ export function formatBaselineUpdateHuman(result) {
282
+ const lines = result.status === "updated"
283
+ ? ["Baseline updated", ""]
284
+ : result.status === "unchanged"
285
+ ? ["Baseline unchanged", ""]
286
+ : ["Baseline update preview", ""];
287
+ lines.push(formatLabelValue("Path", result.baselinePath));
288
+ lines.push(formatLabelValue("Results", result.resultsPath));
289
+ lines.push("");
290
+ lines.push(...formatPreviewHuman(result.preview));
291
+ if (result.status === "preview") {
292
+ lines.push("");
293
+ lines.push("No changes were written.");
294
+ lines.push("Use --accept-new and/or --remove-resolved with --yes to apply.");
295
+ }
296
+ if (result.comparison.summary.baselineUsed) {
297
+ lines.push("");
298
+ lines.push(...formatSummaryBlock(result.comparison.summary));
299
+ }
300
+ return lines.join("\n");
301
+ }
302
+ export function formatBaselineUpdateJson(result) {
303
+ return {
304
+ status: result.status,
305
+ baselinePath: result.baselinePath,
306
+ resultsPath: result.resultsPath,
307
+ preview: result.preview,
308
+ summary: result.comparison.summary,
309
+ updated: result.updated,
310
+ };
311
+ }
312
+ export function formatBaselineMigrateHuman(result) {
313
+ const lines = result.status === "migrated"
314
+ ? ["Baseline migrated", ""]
315
+ : result.status === "preview"
316
+ ? ["Baseline migration preview", ""]
317
+ : ["Baseline migration", ""];
318
+ lines.push(formatLabelValue("Path", result.baselinePath));
319
+ lines.push(formatLabelValue("Migrated", result.migrated ? "yes" : "no"));
320
+ lines.push(formatLabelValue("Message", result.message));
321
+ if (result.status === "preview") {
322
+ lines.push("");
323
+ lines.push("No changes were written. Re-run without --dry-run and with --yes to apply.");
324
+ }
325
+ return lines.join("\n");
326
+ }
327
+ export function formatBaselineMigrateJson(result) {
328
+ return {
329
+ status: result.status,
330
+ baselinePath: result.baselinePath,
331
+ migrated: result.migrated,
332
+ message: result.message,
333
+ baseline: result.baseline,
334
+ };
335
+ }
336
+ export function formatBaselineComparisonArtifact(summary) {
337
+ if (!summary.baselineUsed) {
338
+ return [];
339
+ }
340
+ return ["", "Baseline comparison", "", ...formatSummaryBlock(summary), ""];
341
+ }
342
+ export { dispositionLabel };
343
+ export async function applyBaselineToAuditResult(options) {
344
+ if (options.noBaseline) {
345
+ return options.result;
346
+ }
347
+ const context = await loadBaselineContext({
348
+ cwd: options.cwd,
349
+ configPath: options.configPath,
350
+ baselineOverride: options.baselineOverride,
351
+ });
352
+ const exists = await baselineFileExists(context.baselinePath);
353
+ if (!exists) {
354
+ if (options.explicitBaselineRequired || options.baselineOverride) {
355
+ throw new Error(`Baseline file not found: ${context.baselinePath}`);
356
+ }
357
+ if (!context.baseline.compare) {
358
+ return options.result;
359
+ }
360
+ return options.result;
361
+ }
362
+ const baseline = await loadBaselineFile(context.baselinePath);
363
+ const comparison = compareBaselineWithAudit(baseline, options.result, {
364
+ baselinePath: context.baselinePath,
365
+ applyClassifications: context.baseline.classifications,
366
+ });
367
+ return {
368
+ ...options.result,
369
+ findings: comparison.findings,
370
+ baselineSummary: comparison.summary,
371
+ resolvedFindings: comparison.resolvedFindings,
372
+ notComparedFindings: comparison.notComparedFindings,
373
+ };
374
+ }
375
+ export async function createBaselineAfterAudit(options) {
376
+ const context = await loadBaselineContext({
377
+ cwd: options.cwd,
378
+ configPath: options.configPath,
379
+ });
380
+ await ensureBaselineWritable(context.baselinePath, options.force);
381
+ const baseline = createBaselineFromAudit(options.result, {
382
+ resultPath: options.result.artifacts?.resultsPath,
383
+ });
384
+ await writeBaselineFile(context.baselinePath, baseline);
385
+ return {
386
+ status: "created",
387
+ baselinePath: context.baselinePath,
388
+ entryCount: baseline.entries.length,
389
+ createdAt: baseline.createdAt,
390
+ };
391
+ }
392
+ //# sourceMappingURL=baseline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/commands/baseline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { FindingClassification, FindingDisposition } from "@a11yst/types";
2
+ export interface RunClassifyOptions {
3
+ cwd: string;
4
+ configPath?: string;
5
+ findingId: string;
6
+ from?: string;
7
+ disposition: FindingDisposition;
8
+ reason: string;
9
+ owner?: string;
10
+ ticket?: string;
11
+ expires?: string;
12
+ review?: string;
13
+ notes?: string;
14
+ yes?: boolean;
15
+ }
16
+ export interface ClassifyResult {
17
+ status: "preview" | "classified";
18
+ baselinePath: string;
19
+ findingId: string;
20
+ fingerprint: string;
21
+ disposition: FindingDisposition;
22
+ classification: FindingClassification;
23
+ }
24
+ export declare function runClassify(options: RunClassifyOptions): Promise<ClassifyResult>;
25
+ export declare function formatClassifyHuman(result: ClassifyResult): string;
26
+ export declare function formatClassifyJson(result: ClassifyResult): unknown;
27
+ export declare function formatClassifyPreviewFromError(error: Error & {
28
+ preview?: ClassifyResult;
29
+ }): ClassifyResult | undefined;
30
+ //# sourceMappingURL=classify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/commands/classify.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAK/E,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,kBAAkB,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,GAAG,YAAY,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,kBAAkB,CAAC;IAChC,cAAc,EAAE,qBAAqB,CAAC;CACvC;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CAsFtF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA4BlE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAElE;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,KAAK,GAAG;IAAE,OAAO,CAAC,EAAE,cAAc,CAAA;CAAE,GAAG,cAAc,GAAG,SAAS,CAEtH"}
@@ -0,0 +1,105 @@
1
+ import { applyClassificationToEntry, entryFromFinding, loadBaselineFile, readBaselineFileState, rejectResolvedDisposition, resolveFindingIdentifier, validateClassification, writeBaselineFile, dispositionLabel, } from "@a11yst/baseline";
2
+ import { formatLabelValue } from "../output.js";
3
+ import { loadBaselineContext } from "./baseline-config.js";
4
+ import { loadAuditResults } from "./results-loader.js";
5
+ export async function runClassify(options) {
6
+ rejectResolvedDisposition(options.disposition);
7
+ const context = await loadBaselineContext({
8
+ cwd: options.cwd,
9
+ configPath: options.configPath,
10
+ });
11
+ const { result } = await loadAuditResults({
12
+ cwd: options.cwd,
13
+ resultsPath: options.from,
14
+ });
15
+ const match = resolveFindingIdentifier(result, options.findingId);
16
+ const finding = match.finding;
17
+ const classification = {
18
+ disposition: options.disposition,
19
+ reason: options.reason,
20
+ createdAt: new Date().toISOString(),
21
+ scope: {
22
+ type: "finding",
23
+ fingerprint: finding.fingerprint,
24
+ },
25
+ ...(options.owner ? { owner: options.owner } : {}),
26
+ ...(options.ticket ? { ticket: options.ticket } : {}),
27
+ ...(options.expires ? { expiresAt: options.expires } : {}),
28
+ ...(options.review ? { reviewAt: options.review } : {}),
29
+ ...(options.notes ? { notes: options.notes } : {}),
30
+ };
31
+ validateClassification(classification);
32
+ const baseline = await loadBaselineFile(context.baselinePath);
33
+ const existing = baseline.entries.find((entry) => entry.fingerprint === finding.fingerprint);
34
+ const now = new Date().toISOString();
35
+ const entry = existing ??
36
+ entryFromFinding(finding, result.runs.find((run) => run.findings.some((item) => item.fingerprint === finding.fingerprint)), now);
37
+ const updatedEntry = applyClassificationToEntry(entry, classification, now, Boolean(existing?.classification));
38
+ if (!options.yes) {
39
+ const error = new Error("Classification requires confirmation. Re-run with --yes to apply.");
40
+ error.exitCode = 2;
41
+ error.preview = {
42
+ status: "preview",
43
+ baselinePath: context.baselinePath,
44
+ findingId: finding.id,
45
+ fingerprint: finding.fingerprint,
46
+ disposition: options.disposition,
47
+ classification,
48
+ };
49
+ throw error;
50
+ }
51
+ const fileState = await readBaselineFileState(context.baselinePath);
52
+ const nextEntries = existing
53
+ ? baseline.entries.map((item) => item.fingerprint === finding.fingerprint ? updatedEntry : item)
54
+ : [...baseline.entries, updatedEntry];
55
+ await writeBaselineFile(context.baselinePath, {
56
+ ...baseline,
57
+ updatedAt: now,
58
+ entries: nextEntries,
59
+ }, {
60
+ expectedHash: fileState.hash,
61
+ expectedMtimeMs: fileState.mtimeMs,
62
+ });
63
+ return {
64
+ status: "classified",
65
+ baselinePath: context.baselinePath,
66
+ findingId: finding.id,
67
+ fingerprint: finding.fingerprint,
68
+ disposition: options.disposition,
69
+ classification,
70
+ };
71
+ }
72
+ export function formatClassifyHuman(result) {
73
+ const lines = result.status === "classified"
74
+ ? ["Classification saved", ""]
75
+ : ["Classification preview", ""];
76
+ lines.push(formatLabelValue("Baseline", result.baselinePath));
77
+ lines.push(formatLabelValue("Finding", result.findingId));
78
+ lines.push(formatLabelValue("Fingerprint", result.fingerprint));
79
+ lines.push(formatLabelValue("Disposition", dispositionLabel(result.disposition)));
80
+ lines.push(formatLabelValue("Reason", result.classification.reason));
81
+ if (result.classification.owner) {
82
+ lines.push(formatLabelValue("Owner", result.classification.owner));
83
+ }
84
+ if (result.classification.ticket) {
85
+ lines.push(formatLabelValue("Ticket", result.classification.ticket));
86
+ }
87
+ if (result.classification.expiresAt) {
88
+ lines.push(formatLabelValue("Expires", result.classification.expiresAt));
89
+ }
90
+ if (result.classification.reviewAt) {
91
+ lines.push(formatLabelValue("Review", result.classification.reviewAt));
92
+ }
93
+ if (result.status === "preview") {
94
+ lines.push("");
95
+ lines.push("No changes were written. Re-run with --yes to apply.");
96
+ }
97
+ return lines.join("\n");
98
+ }
99
+ export function formatClassifyJson(result) {
100
+ return result;
101
+ }
102
+ export function formatClassifyPreviewFromError(error) {
103
+ return error.preview;
104
+ }
105
+ //# sourceMappingURL=classify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/commands/classify.ts"],"names":[],"mappings":"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"}