a11ign 0.1.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 (59) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +140 -0
  3. package/dist/action/post-comment.d.ts +20 -0
  4. package/dist/action/post-comment.d.ts.map +1 -0
  5. package/dist/action/post-comment.js +93 -0
  6. package/dist/action/post-comment.js.map +1 -0
  7. package/dist/action/run.d.ts +2 -0
  8. package/dist/action/run.d.ts.map +1 -0
  9. package/dist/action/run.js +119 -0
  10. package/dist/action/run.js.map +1 -0
  11. package/dist/action/summary.d.ts +180 -0
  12. package/dist/action/summary.d.ts.map +1 -0
  13. package/dist/action/summary.js +355 -0
  14. package/dist/action/summary.js.map +1 -0
  15. package/dist/cli.d.ts +279 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +1028 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/fault-remediation.d.ts +87 -0
  20. package/dist/fault-remediation.d.ts.map +1 -0
  21. package/dist/fault-remediation.js +156 -0
  22. package/dist/fault-remediation.js.map +1 -0
  23. package/dist/forms/config.d.ts +69 -0
  24. package/dist/forms/config.d.ts.map +1 -0
  25. package/dist/forms/config.js +185 -0
  26. package/dist/forms/config.js.map +1 -0
  27. package/dist/forms/coverage.d.ts +51 -0
  28. package/dist/forms/coverage.d.ts.map +1 -0
  29. package/dist/forms/coverage.js +80 -0
  30. package/dist/forms/coverage.js.map +1 -0
  31. package/dist/forms/draft.d.ts +62 -0
  32. package/dist/forms/draft.d.ts.map +1 -0
  33. package/dist/forms/draft.js +165 -0
  34. package/dist/forms/draft.js.map +1 -0
  35. package/dist/index.d.ts +10 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +9 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/report.d.ts +48 -0
  40. package/dist/report.d.ts.map +1 -0
  41. package/dist/report.js +322 -0
  42. package/dist/report.js.map +1 -0
  43. package/dist/scan/axe-results.d.ts +25 -0
  44. package/dist/scan/axe-results.d.ts.map +1 -0
  45. package/dist/scan/axe-results.js +111 -0
  46. package/dist/scan/axe-results.js.map +1 -0
  47. package/dist/scan/axe.d.ts +158 -0
  48. package/dist/scan/axe.d.ts.map +1 -0
  49. package/dist/scan/axe.js +203 -0
  50. package/dist/scan/axe.js.map +1 -0
  51. package/dist/scan/page-title.d.ts +3 -0
  52. package/dist/scan/page-title.d.ts.map +1 -0
  53. package/dist/scan/page-title.js +41 -0
  54. package/dist/scan/page-title.js.map +1 -0
  55. package/dist/scan/run-axe.d.ts +2 -0
  56. package/dist/scan/run-axe.d.ts.map +1 -0
  57. package/dist/scan/run-axe.js +39 -0
  58. package/dist/scan/run-axe.js.map +1 -0
  59. package/package.json +60 -0
package/dist/cli.d.ts ADDED
@@ -0,0 +1,279 @@
1
+ #!/usr/bin/env node
2
+ import { type AxeFinding } from "./scan/axe.js";
3
+ import { type Report } from "./report.js";
4
+ import { type AfterRun } from "@a11ign/worker-fleet";
5
+ import { type LeftSite } from "@a11ign/evidence";
6
+ import type { CaptureStructure, CaptureInteraction, CaptureRequest as WireCaptureRequest, CaptureFormState } from "@a11ign/evidence";
7
+ import { type CaptureDoubt } from "@a11ign/evidence/verify";
8
+ import { type ConformanceRequirement } from "@a11ign/evidence/conformance";
9
+ import { type CriterionOutcome } from "@a11ign/judge/outcomes";
10
+ interface Args {
11
+ url: string;
12
+ task: string;
13
+ /** null when the user named no worker, which is what enables local-VM management. */
14
+ worker: string | null;
15
+ after: AfterRun;
16
+ json: boolean;
17
+ debug: boolean;
18
+ probeForms: boolean;
19
+ /** Tab through the page and report focus. Covers 2.1.2 No Keyboard Trap. */
20
+ probeFocus: boolean;
21
+ /**
22
+ * Follow the FIRST LINK and report the title either side. Covers 2.4.1 Bypass Blocks (an inert skip
23
+ * link) and 2.4.2 Page Titled (a route that changes without the title following it).
24
+ */
25
+ probeNavigation: boolean;
26
+ /** Focus the first few controls and report the title either side. Covers 3.2.1 On Focus. */
27
+ probeFocusContext: boolean;
28
+ /**
29
+ * Walk a few tab stops and press Escape, reporting what appeared on focus and whether Escape removed
30
+ * it. Covers 1.4.13 Content on Hover or Focus — the Dismissable bullet.
31
+ */
32
+ probeFocusReveal: boolean;
33
+ /** Run the optional axe-core layer. Off with --no-axe or A11Y_AXE=0. */
34
+ axe: boolean;
35
+ /**
36
+ * Path to a forms config (ADR 0024). Explicit, never auto-discovered: one implicit config cannot
37
+ * express more than one scenario, and instructing the tool to submit somebody's form should be
38
+ * visible in the workflow file rather than inferred from a file being present.
39
+ */
40
+ formsConfig: string | null;
41
+ /** Draft a forms config from what the screen reader announces on this page, and print it. */
42
+ emitFormConfig: boolean;
43
+ /** Say what WOULD be submitted, and submit nothing. */
44
+ plan: boolean;
45
+ /** Path to axe results produced elsewhere, used instead of running our own scan. */
46
+ axeResults: string | null;
47
+ /**
48
+ * Write the capture to `runs/witness/<stamp>-<slug>.json` after this run, and print the path. ON by
49
+ * default -- #431: a `witness` run kept nothing, so the reader whose run went wrong (a consent overlay,
50
+ * a short read, a timing that surprised them) had a printed report and no file to send anybody, and the
51
+ * evidence behind #311's own timing numbers was gone by the time anyone asked what they were made of.
52
+ * `--no-keep` is for a reader capturing their own site who does not want a transcript of it on disk.
53
+ */
54
+ keep: boolean;
55
+ }
56
+ export declare function applyArg(args: Args, argv: string[], i: number): number;
57
+ /** ARGV as a parameter, so a test needs no `process.argv`, and `main()` passes the real one. */
58
+ export declare function parseArgs(argv?: string[]): Args;
59
+ export interface CaptureResponse {
60
+ url: string;
61
+ screenReader: string;
62
+ transcript: string[];
63
+ /** A subset of the wire type, derived — known-gaps §15. `Pick` keeps the omission meaningful. */
64
+ structure?: Pick<CaptureStructure, "headings" | "landmarks" | "formFields">;
65
+ /**
66
+ * Also a subset of the wire type, derived the same way `structure` is above. `formChanges` and
67
+ * `postSubmitFields` stay optional here even though the wire type requires them, because both are
68
+ * `probeForms`-gated and this CLI does not always ask for that probe — an older response this type also
69
+ * has to describe predates the fields outright. Was hand-typed independently of `CaptureInteraction`
70
+ * until architecture-audit.md §5 (wire-contract unit, 2026-09-06): same field names, same shapes, no
71
+ * import relationship, so a future field added there would not appear here without anyone noticing.
72
+ */
73
+ interaction?: Pick<CaptureInteraction, "controls" | "stateChanges"> & Partial<Pick<CaptureInteraction, "formChanges" | "postSubmitFields">>;
74
+ environment?: Record<string, string>;
75
+ diagnostics?: unknown[];
76
+ }
77
+ /**
78
+ * Where the shadow scorer lives — same shape as `local-judge.ts`'s `scorerPaths()`, and for the same
79
+ * reason: the SCRIPT comes from `@a11ign/scorer`, resolved from its own module, so it never
80
+ * depended on the cwd. The INTERPRETER did: it defaulted to `packages/cli/.venv/bin/python`, a path
81
+ * nothing ever creates — the same defect M0 found in `local-judge.ts`'s own interpreter default, here
82
+ * one level removed. `local-judge.ts` settled on `A11Y_PYTHON` (falling back to `python3` on the PATH)
83
+ * as the shared answer; this mirrors it, with `A11Y_SHADOW_PYTHON` still able to point the shadow run at
84
+ * a different interpreter from the real judge's when that is deliberate.
85
+ *
86
+ * A function, not a module-level constant, so a test can assert the resolution the same way
87
+ * `local-judge.paths.test.ts` does — the module-level version could only ever be checked against
88
+ * whatever `process.env` happened to hold at import time.
89
+ */
90
+ export declare function shadowScorerPaths(): {
91
+ python: string;
92
+ script: string;
93
+ };
94
+ /**
95
+ * A one-line reason a stranger can read, from whatever a socket-level failure actually threw.
96
+ *
97
+ * `.message` is EMPTY for a raw `ECONNREFUSED` on this Node version — not a rare edge case, it is the
98
+ * common shape of "nothing is listening" — so printing `error.message` alone produces a bare, unexplained
99
+ * `()`. Measured directly: a real `http.request` failure against a closed port has `message: ""`,
100
+ * `code: "ECONNREFUSED"`. Falls back through `.code`, then `String(error)`, so there is always something.
101
+ */
102
+ export declare function errorReason(error: unknown): string;
103
+ /**
104
+ * Say which kind of doubt it is, in words that match the cause — and #398, say what to DO about it, the
105
+ * same WHAT/TRY/WHERE treatment a worker fault gets (`formatDoubtMessage`), not a bare sentence. Telling
106
+ * someone their page "read browser chrome" when a consent dialog held the screen reader inside their page
107
+ * sends them looking in the wrong place entirely; leaving it at that sends them nowhere at all.
108
+ */
109
+ export declare function warnUnverified(reason: CaptureDoubt, title: string | undefined): void;
110
+ /**
111
+ * `runs/witness/`, resolved LOCALLY rather than imported from `@a11ign/lab`'s `dataset-paths.mjs` -- the
112
+ * identical cycle `cli.test.ts`'s own header documents (#199, chairman's ruling): `@a11ign/lab` depends on
113
+ * the published `a11ign` package (`public-api.test.ts` imports it), so `cli` importing `dataset-paths.mjs`
114
+ * the other way would recreate the boundary defect ADR 0004 exists to prevent. See `dataset-paths.test.ts`'s
115
+ * `EXEMPT` entry for this file, added alongside this function.
116
+ *
117
+ * Anchored on `process.cwd()`, not this module's own location -- unlike `worker-fleet`'s `doctor.mjs`
118
+ * exemption a few files over. Those are internal tools that run inside this checkout; `witness` is the
119
+ * PUBLISHED, consumer-facing command #431 is about, run by someone outside this repo entirely, and their
120
+ * `runs/` is wherever they typed the command, not wherever npm happened to install the package.
121
+ */
122
+ export declare function witnessArtifactRoot(): string;
123
+ /** The `<slug>` half of `<stamp>-<slug>.json` -- the URL with nothing a filesystem would reject. */
124
+ export declare function witnessArtifactSlug(url: string): string;
125
+ /**
126
+ * #431: the ONLY artefact a `witness` run produces besides its own printed report -- so the reader whose
127
+ * run went wrong has something to send, and `capture:explain` (built to answer "what actually happened on
128
+ * a page" from a capture's own diagnostic marks) has a real product-path file to open rather than only the
129
+ * synthetic corpus under `runs/real-page-corpus`.
130
+ *
131
+ * Written BEFORE judging, not after: the raw capture is real evidence the moment the screen reader
132
+ * finishes, and a judge crash or a doubtful capture must not cost the one thing a bad run could otherwise
133
+ * still hand somebody. THROWS on a write failure rather than reporting a path that is not really there --
134
+ * the acceptance's own mutation is "delete the write and confirm `capture:explain` has nothing to open",
135
+ * because a path that is printed but not written is worse than no path.
136
+ */
137
+ export declare function writeWitnessArtifact(cap: CaptureResponse, task: string): string;
138
+ /** The path line, printed relative to where the reader is standing rather than an absolute machine path. */
139
+ export declare function reportWitnessArtifact(path: string | null): void;
140
+ /**
141
+ * What this run establishes against WCAG's five conformance requirements (§5.2).
142
+ *
143
+ * Built from the capture rather than assumed, because Requirement 2 (Full pages) turns on whether the
144
+ * sweeps actually reached the end of the page — and `environment` carries the exact screen-reader and
145
+ * browser versions Requirement 4 scopes the claim to.
146
+ *
147
+ * `assessedCriteria` is what the shipped assessors can return a finding for, and NOT what we captured
148
+ * evidence about. `interaction.focusOrder` is the cautionary case: the worker records it, no rule or
149
+ * scorer head reads it, so counting it would report a criterion as covered while a keyboard trap in that
150
+ * array reached nobody.
151
+ */
152
+ /**
153
+ * What this run can and cannot claim, from a capture. EXPORTED because it is pure over a capture object,
154
+ * and this repo has 2,122 real captures on disk — so it is testable against evidence a real screen reader
155
+ * produced, not against a hand-written shape somebody imagined.
156
+ */
157
+ export declare function conformanceFor(cap: CaptureResponse, axe: AxeFinding[] | null, left?: {
158
+ control: string;
159
+ notExamined: readonly string[];
160
+ } | null): ConformanceRequirement[];
161
+ /**
162
+ * #1363: WHERE THE EXAMINATION ENDED. Rehearsal 2's probe opened the W3C's embedded YouTube player, the tab became
163
+ * youtube.com, and every probe after it -- the rest of the form-field sweep, the links, the focus pass, the
164
+ * route-change finding -- was judged as w3.org's. What this returns as `examined` is only what was observed ON the
165
+ * page, and it is what the judge, the conformance scope, the outcomes and the JSON are given. `captureDoubt` keeps
166
+ * the whole capture: whether the run read the requested page at all is a question about everything it read.
167
+ */
168
+ export declare function examineWithinTheSite(cap: CaptureResponse): {
169
+ left: LeftSite | null;
170
+ notExamined: readonly string[];
171
+ examined: CaptureResponse;
172
+ };
173
+ /**
174
+ * The machine-readable result, for CI and for anything downstream of this tool.
175
+ *
176
+ * `structure` and `interaction` are included DELIBERATELY. They were omitted once, so this output carried only
177
+ * the read-through and dropped every structural sweep and interaction probe — the evidence behind most
178
+ * findings. A consumer reading it could not tell "this page has no links" from "links were never recorded",
179
+ * and the local judge's evidence guard, given exactly that, suppressed a correct 4.1.2 finding scored at 0.993.
180
+ *
181
+ * Exported so `result-json-fields-documented.test.ts` (#1637) can drive it with a real recorded result and
182
+ * pin its emitted top-level keys to the Action guide's field table, the same way `examineWithinTheSite` and
183
+ * `conformanceFor` are exported for their own acceptance tests.
184
+ */
185
+ export declare function printJson({ url, task, cap, verdict, ruleFindings, captureVerified, unverifiedReason, conformance, outcomes, leftSite: left, artifactPath }: {
186
+ url: string;
187
+ task: string;
188
+ cap: CaptureResponse;
189
+ verdict: Report["verdict"];
190
+ ruleFindings: AxeFinding[] | null;
191
+ captureVerified: boolean;
192
+ unverifiedReason?: CaptureDoubt;
193
+ conformance: ConformanceRequirement[];
194
+ outcomes: CriterionOutcome[];
195
+ leftSite: LeftSite | null;
196
+ artifactPath: string | null;
197
+ }): void;
198
+ type RuleLayer = "none" | "run" | "import";
199
+ export declare function chooseRuleLayer({ wantAxe, axeResults }: {
200
+ wantAxe: boolean;
201
+ axeResults: string | null;
202
+ }, isAvailable?: () => Promise<boolean>): Promise<RuleLayer>;
203
+ /**
204
+ * This CLI's own outbound request, kept as a SEPARATE type from the wire's `CaptureRequest` rather than
205
+ * used directly: this is the fixed set of fields THIS caller sends (`url`, `steps`, `probeTables` and the
206
+ * rest of the wire type's fields are other callers' business), and unlike the wire type it makes each
207
+ * field required — every construction site below names all of them explicitly, so a field silently
208
+ * defaulting away is a mistake this type is written to catch. `Required<Pick<...>>` derives the field
209
+ * SHAPES from `@a11ign/evidence` so a renamed or retyped field fails here at compile time, rather
210
+ * than the independent hand-typed copy that stood here until the wire-contract unit (2026-09-06,
211
+ * architecture-audit.md §5) — same names, same types, no import, so a drift would have compiled clean.
212
+ */
213
+ export type CaptureRequest = Required<Pick<WireCaptureRequest, "task" | "probeForms" | "probeFocus" | "probeNavigation" | "probeFocusContext" | "probeFocusReveal">> & {
214
+ worker: string;
215
+ /**
216
+ * ONE declared state (ADR 0024), or none.
217
+ *
218
+ * One per capture and never several, because an error submission leaves a dirty form and an error
219
+ * banner, and a success submission may navigate away — so a second state cannot start from the first.
220
+ * The host issues a capture per state for that reason, rather than the worker looping.
221
+ */
222
+ formState?: FormStateRequest;
223
+ };
224
+ /**
225
+ * The resolved state as it goes over the wire: names and values, with the schema already checked.
226
+ * `state` is REQUIRED here though the wire type leaves it optional (a backend with none declared) — ADR
227
+ * 0024 means this CLI always names one before it submits.
228
+ */
229
+ type FormStateRequest = Omit<CaptureFormState, "state"> & {
230
+ state: string;
231
+ };
232
+ /**
233
+ * How long to wait for a capture, measured against the WORKER's own bound rather than guessed.
234
+ *
235
+ * The margin is deliberate: the worker is the component that knows why a capture failed, and it must always
236
+ * be the one that gets to say so — a client that gives up first replaces a diagnosis with "no answer".
237
+ *
238
+ * This comment used to state the real defect and then not fix it: `fetch`'s ~300 s headers timeout sits BELOW
239
+ * the worker's 520 s hard timeout, so `scan` died with `UND_ERR_HEADERS_TIMEOUT` on any page that took longer
240
+ * than five minutes, and the number below never applied. `AbortSignal.timeout()` does not govern that cap;
241
+ * only a different client does. Measured, and the reason `requestJson` exists — see worker-http.mjs.
242
+ */
243
+ /**
244
+ * A SENTENCE, not the wire body — a worker's error response is JSON meant for a program, and printing it
245
+ * verbatim at a person (`Worker error 429: {"error":"a capture is already in progress"}`) makes them parse
246
+ * it themselves. 429 in particular has a real, immediate remedy that the raw body does not say out loud.
247
+ */
248
+ export declare function describeWorkerError(status: number, body: unknown): string;
249
+ /**
250
+ * A fresh `onProgress` callback per capture, so the notice fires at most ONCE — #426's second half. The
251
+ * plumbing already existed and was unused for this caller (`captureTolerantly` has always accepted
252
+ * `onProgress` and polled `/progress` while a capture is in flight; this was the one caller that never
253
+ * passed one). `/progress`'s `phases` array carries the SAME two marks a finished capture's `captureDoubt`
254
+ * reads, so `earlyContainmentVerdict` applies the identical threshold early rather than a different,
255
+ * unvalidated one — see that function's own comment in `@a11ign/evidence/verify`.
256
+ *
257
+ * NEVER a rejection: this only ever prints to stderr. `onProgress`'s return value is unused by
258
+ * `capture-client.mjs`, so there is no path from here back into whether the capture continues — the rule
259
+ * this project has paid for once already ("a check must never reject evidence whose absence is the
260
+ * finding"), applied to a warning instead of a gate.
261
+ *
262
+ * A closure rather than a module-level flag: two concurrent captures (this CLI's own `Promise.all` in
263
+ * `captureAndScan` runs the capture beside axe, and a caller could invoke `captureViaWorker` more than
264
+ * once) must not share one "already notified" bit.
265
+ */
266
+ export declare function earlyContainmentWatcher(): (progress: object) => void;
267
+ /**
268
+ * THROUGH `captureTolerantly` NOW, not a bare `requestJson` POST — architecture-audit.md §5, item 6.
269
+ *
270
+ * This was the one caller of ten that sent no `captureId`, so the async-dispatch, poll and lost-response
271
+ * recovery every lab client already had (see `@a11ign/worker-fleet/capture-client`) was unavailable
272
+ * to the one caller that is a real user: a dropped response here used to mean the page was silently never
273
+ * examined, on a capture that may already have completed. `captureTolerantly` mints its own id, so this
274
+ * function's only job is the request BODY and turning a transport failure into a message about the page,
275
+ * not about a Map or a protocol.
276
+ */
277
+ export declare function captureViaWorker(url: string, { task, worker, probeForms, probeFocus, probeNavigation, probeFocusContext, probeFocusReveal, formState }: CaptureRequest): Promise<CaptureResponse>;
278
+ export {};
279
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}