@jitsusama/agentic-harness.core 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.
- package/README.md +52 -0
- package/dist/advisor/charter.d.ts +14 -0
- package/dist/advisor/charter.js +48 -0
- package/dist/advisor/findings.d.ts +43 -0
- package/dist/advisor/findings.js +82 -0
- package/dist/advisor/index.d.ts +24 -0
- package/dist/advisor/index.js +23 -0
- package/dist/advisor/settings.d.ts +16 -0
- package/dist/advisor/settings.js +30 -0
- package/dist/advisor/substantive.d.ts +14 -0
- package/dist/advisor/substantive.js +33 -0
- package/dist/advisor/tools.d.ts +38 -0
- package/dist/advisor/tools.js +202 -0
- package/dist/attribution/commit-hook.d.ts +53 -0
- package/dist/attribution/commit-hook.js +133 -0
- package/dist/attribution/gh-footer.d.ts +27 -0
- package/dist/attribution/gh-footer.js +80 -0
- package/dist/attribution/index.d.ts +11 -0
- package/dist/attribution/index.js +11 -0
- package/dist/attribution/model-name.d.ts +11 -0
- package/dist/attribution/model-name.js +26 -0
- package/dist/bin/attribution.d.ts +36 -0
- package/dist/bin/attribution.js +82 -0
- package/dist/bin/cli.d.ts +14 -0
- package/dist/bin/cli.js +236 -0
- package/dist/bin/gate-deps.d.ts +23 -0
- package/dist/bin/gate-deps.js +61 -0
- package/dist/bin/guardians.d.ts +51 -0
- package/dist/bin/guardians.js +174 -0
- package/dist/bin/memory.d.ts +16 -0
- package/dist/bin/memory.js +81 -0
- package/dist/bin/notes.d.ts +30 -0
- package/dist/bin/notes.js +67 -0
- package/dist/bin/process-exec.d.ts +14 -0
- package/dist/bin/process-exec.js +31 -0
- package/dist/bin/quest.d.ts +38 -0
- package/dist/bin/quest.js +187 -0
- package/dist/bin/slack-auth.d.ts +49 -0
- package/dist/bin/slack-auth.js +107 -0
- package/dist/clock/index.d.ts +46 -0
- package/dist/clock/index.js +72 -0
- package/dist/command/cwd.d.ts +21 -0
- package/dist/command/cwd.js +60 -0
- package/dist/command/edit.d.ts +14 -0
- package/dist/command/edit.js +22 -0
- package/dist/command/flags.d.ts +29 -0
- package/dist/command/flags.js +111 -0
- package/dist/command/index.d.ts +16 -0
- package/dist/command/index.js +12 -0
- package/dist/command/tokenize.d.ts +7 -0
- package/dist/command/tokenize.js +315 -0
- package/dist/command/types.d.ts +66 -0
- package/dist/command/types.js +9 -0
- package/dist/completion/index.d.ts +17 -0
- package/dist/completion/index.js +16 -0
- package/dist/completion/investigate.d.ts +63 -0
- package/dist/completion/investigate.js +198 -0
- package/dist/completion/resolve.d.ts +29 -0
- package/dist/completion/resolve.js +42 -0
- package/dist/completion/side.d.ts +51 -0
- package/dist/completion/side.js +93 -0
- package/dist/completion/types.d.ts +84 -0
- package/dist/completion/types.js +14 -0
- package/dist/exec/exec.d.ts +38 -0
- package/dist/exec/exec.js +51 -0
- package/dist/exec/index.d.ts +8 -0
- package/dist/exec/index.js +8 -0
- package/dist/gate/decision.d.ts +52 -0
- package/dist/gate/decision.js +68 -0
- package/dist/gate/deps.d.ts +14 -0
- package/dist/gate/deps.js +1 -0
- package/dist/gate/index.d.ts +2 -0
- package/dist/gate/index.js +1 -0
- package/dist/git-cli/index.d.ts +47 -0
- package/dist/git-cli/index.js +127 -0
- package/dist/github-cli/command-spec.d.ts +14 -0
- package/dist/github-cli/command-spec.js +18 -0
- package/dist/github-cli/index.d.ts +71 -0
- package/dist/github-cli/index.js +188 -0
- package/dist/google/apis/calendar.d.ts +64 -0
- package/dist/google/apis/calendar.js +297 -0
- package/dist/google/apis/docs.d.ts +29 -0
- package/dist/google/apis/docs.js +154 -0
- package/dist/google/apis/drive.d.ts +46 -0
- package/dist/google/apis/drive.js +189 -0
- package/dist/google/apis/gmail.d.ts +67 -0
- package/dist/google/apis/gmail.js +374 -0
- package/dist/google/apis/index.d.ts +10 -0
- package/dist/google/apis/index.js +10 -0
- package/dist/google/apis/sheets.d.ts +16 -0
- package/dist/google/apis/sheets.js +54 -0
- package/dist/google/apis/slides.d.ts +16 -0
- package/dist/google/apis/slides.js +40 -0
- package/dist/google/auth/browser.d.ts +5 -0
- package/dist/google/auth/browser.js +27 -0
- package/dist/google/auth/credentials.d.ts +26 -0
- package/dist/google/auth/credentials.js +69 -0
- package/dist/google/auth/errors.d.ts +15 -0
- package/dist/google/auth/errors.js +26 -0
- package/dist/google/auth/index.d.ts +12 -0
- package/dist/google/auth/index.js +12 -0
- package/dist/google/auth/oauth-app.d.ts +15 -0
- package/dist/google/auth/oauth-app.js +20 -0
- package/dist/google/auth/oauth.d.ts +46 -0
- package/dist/google/auth/oauth.js +146 -0
- package/dist/google/auth/server.d.ts +13 -0
- package/dist/google/auth/server.js +70 -0
- package/dist/google/auth/setup-instructions.d.ts +16 -0
- package/dist/google/auth/setup-instructions.js +24 -0
- package/dist/google/auth/store.d.ts +19 -0
- package/dist/google/auth/store.js +27 -0
- package/dist/google/index.d.ts +13 -0
- package/dist/google/index.js +12 -0
- package/dist/google/paths.d.ts +17 -0
- package/dist/google/paths.js +28 -0
- package/dist/google/renderers/calendar.d.ts +23 -0
- package/dist/google/renderers/calendar.js +312 -0
- package/dist/google/renderers/drive.d.ts +31 -0
- package/dist/google/renderers/drive.js +214 -0
- package/dist/google/renderers/email.d.ts +16 -0
- package/dist/google/renderers/email.js +130 -0
- package/dist/google/renderers/index.d.ts +8 -0
- package/dist/google/renderers/index.js +8 -0
- package/dist/google/types.d.ts +143 -0
- package/dist/google/types.js +27 -0
- package/dist/governance/distill.d.ts +31 -0
- package/dist/governance/distill.js +78 -0
- package/dist/governance/index.d.ts +11 -0
- package/dist/governance/index.js +10 -0
- package/dist/governance/render.d.ts +13 -0
- package/dist/governance/render.js +23 -0
- package/dist/governance/store.d.ts +32 -0
- package/dist/governance/store.js +102 -0
- package/dist/governance/types.d.ts +19 -0
- package/dist/governance/types.js +9 -0
- package/dist/guardian/index.d.ts +7 -0
- package/dist/guardian/index.js +7 -0
- package/dist/guardian/types.d.ts +37 -0
- package/dist/guardian/types.js +12 -0
- package/dist/internal/github/cli.d.ts +40 -0
- package/dist/internal/github/cli.js +102 -0
- package/dist/internal/guardian/commit-file.d.ts +7 -0
- package/dist/internal/guardian/commit-file.js +36 -0
- package/dist/internal/guardian/commit-format.d.ts +35 -0
- package/dist/internal/guardian/commit-format.js +63 -0
- package/dist/internal/guardian/commit-shell.d.ts +38 -0
- package/dist/internal/guardian/commit-shell.js +134 -0
- package/dist/internal/guardian/history-gate.d.ts +41 -0
- package/dist/internal/guardian/history-gate.js +76 -0
- package/dist/internal/guardian/prose-gate.d.ts +31 -0
- package/dist/internal/guardian/prose-gate.js +50 -0
- package/dist/internal/guardian/redirect-gate.d.ts +41 -0
- package/dist/internal/guardian/redirect-gate.js +114 -0
- package/dist/internal/guardian/section-gate.d.ts +20 -0
- package/dist/internal/guardian/section-gate.js +36 -0
- package/dist/internal/guardian/title-gate.d.ts +20 -0
- package/dist/internal/guardian/title-gate.js +36 -0
- package/dist/internal/json-array.d.ts +11 -0
- package/dist/internal/json-array.js +40 -0
- package/dist/internal/lsp/registry.d.ts +12 -0
- package/dist/internal/lsp/registry.js +16 -0
- package/dist/internal/notes/discovery.d.ts +59 -0
- package/dist/internal/notes/discovery.js +91 -0
- package/dist/internal/notes/frontmatter.d.ts +52 -0
- package/dist/internal/notes/frontmatter.js +163 -0
- package/dist/internal/notes/id.d.ts +42 -0
- package/dist/internal/notes/id.js +80 -0
- package/dist/internal/notes/io.d.ts +25 -0
- package/dist/internal/notes/io.js +51 -0
- package/dist/internal/notes/sanitize.d.ts +19 -0
- package/dist/internal/notes/sanitize.js +35 -0
- package/dist/internal/process-global.d.ts +20 -0
- package/dist/internal/process-global.js +28 -0
- package/dist/internal/quest/alias-index.d.ts +61 -0
- package/dist/internal/quest/alias-index.js +69 -0
- package/dist/internal/quest/append-journey.d.ts +22 -0
- package/dist/internal/quest/append-journey.js +63 -0
- package/dist/internal/quest/bash-write.d.ts +49 -0
- package/dist/internal/quest/bash-write.js +208 -0
- package/dist/internal/quest/dates.d.ts +14 -0
- package/dist/internal/quest/dates.js +20 -0
- package/dist/internal/quest/discovery.d.ts +96 -0
- package/dist/internal/quest/discovery.js +354 -0
- package/dist/internal/quest/fields.d.ts +37 -0
- package/dist/internal/quest/fields.js +94 -0
- package/dist/internal/quest/frontmatter.d.ts +88 -0
- package/dist/internal/quest/frontmatter.js +630 -0
- package/dist/internal/quest/git-signals.d.ts +53 -0
- package/dist/internal/quest/git-signals.js +192 -0
- package/dist/internal/quest/id.d.ts +50 -0
- package/dist/internal/quest/id.js +116 -0
- package/dist/internal/quest/io.d.ts +54 -0
- package/dist/internal/quest/io.js +233 -0
- package/dist/internal/quest/mentions.d.ts +45 -0
- package/dist/internal/quest/mentions.js +70 -0
- package/dist/internal/quest/mutate.d.ts +38 -0
- package/dist/internal/quest/mutate.js +83 -0
- package/dist/internal/quest/process-liveness.d.ts +98 -0
- package/dist/internal/quest/process-liveness.js +216 -0
- package/dist/internal/quest/quest-doc.d.ts +116 -0
- package/dist/internal/quest/quest-doc.js +239 -0
- package/dist/internal/quest/ranking.d.ts +48 -0
- package/dist/internal/quest/ranking.js +114 -0
- package/dist/internal/quest/reopen.d.ts +65 -0
- package/dist/internal/quest/reopen.js +113 -0
- package/dist/internal/quest/resolve-cwd.d.ts +32 -0
- package/dist/internal/quest/resolve-cwd.js +89 -0
- package/dist/internal/quest/sanitize.d.ts +42 -0
- package/dist/internal/quest/sanitize.js +69 -0
- package/dist/internal/quest/scaffold.d.ts +59 -0
- package/dist/internal/quest/scaffold.js +169 -0
- package/dist/internal/quest/scratch.d.ts +27 -0
- package/dist/internal/quest/scratch.js +106 -0
- package/dist/internal/quest/session-liveness.d.ts +125 -0
- package/dist/internal/quest/session-liveness.js +386 -0
- package/dist/internal/quest/session-ownership.d.ts +22 -0
- package/dist/internal/quest/session-ownership.js +100 -0
- package/dist/internal/quest/session-registry.d.ts +221 -0
- package/dist/internal/quest/session-registry.js +266 -0
- package/dist/internal/quest/status.d.ts +10 -0
- package/dist/internal/quest/status.js +15 -0
- package/dist/internal/quest/structural-journal.d.ts +41 -0
- package/dist/internal/quest/structural-journal.js +67 -0
- package/dist/internal/quest/structural.d.ts +43 -0
- package/dist/internal/quest/structural.js +77 -0
- package/dist/internal/quest/toc.d.ts +28 -0
- package/dist/internal/quest/toc.js +90 -0
- package/dist/internal/quest/trees.d.ts +53 -0
- package/dist/internal/quest/trees.js +145 -0
- package/dist/internal/quest/url-fetchers.d.ts +50 -0
- package/dist/internal/quest/url-fetchers.js +97 -0
- package/dist/internal/quest/write-classifier.d.ts +46 -0
- package/dist/internal/quest/write-classifier.js +59 -0
- package/dist/internal/refs/builtins.d.ts +32 -0
- package/dist/internal/refs/builtins.js +179 -0
- package/dist/internal/refs/registry.d.ts +25 -0
- package/dist/internal/refs/registry.js +42 -0
- package/dist/internal/registry/global-symbol-registry.d.ts +37 -0
- package/dist/internal/registry/global-symbol-registry.js +55 -0
- package/dist/internal/review/registry.d.ts +12 -0
- package/dist/internal/review/registry.js +16 -0
- package/dist/internal/sqlite/db.d.ts +16 -0
- package/dist/internal/sqlite/db.js +26 -0
- package/dist/internal/terminal/builtins.d.ts +8 -0
- package/dist/internal/terminal/builtins.js +14 -0
- package/dist/internal/terminal/drivers/fallback.d.ts +8 -0
- package/dist/internal/terminal/drivers/fallback.js +31 -0
- package/dist/internal/terminal/drivers/shared.d.ts +39 -0
- package/dist/internal/terminal/drivers/shared.js +51 -0
- package/dist/internal/terminal/drivers/tmux.d.ts +14 -0
- package/dist/internal/terminal/drivers/tmux.js +88 -0
- package/dist/internal/terminal/drivers/wezterm.d.ts +35 -0
- package/dist/internal/terminal/drivers/wezterm.js +175 -0
- package/dist/internal/terminal/registry.d.ts +12 -0
- package/dist/internal/terminal/registry.js +16 -0
- package/dist/internal/tree/builtins.d.ts +8 -0
- package/dist/internal/tree/builtins.js +10 -0
- package/dist/internal/tree/providers/git-worktree.d.ts +20 -0
- package/dist/internal/tree/providers/git-worktree.js +279 -0
- package/dist/internal/tree/registry.d.ts +12 -0
- package/dist/internal/tree/registry.js +16 -0
- package/dist/lsp/config.d.ts +77 -0
- package/dist/lsp/config.js +154 -0
- package/dist/lsp/external.d.ts +13 -0
- package/dist/lsp/external.js +52 -0
- package/dist/lsp/format.d.ts +11 -0
- package/dist/lsp/format.js +54 -0
- package/dist/lsp/index.d.ts +17 -0
- package/dist/lsp/index.js +16 -0
- package/dist/lsp/offsets.d.ts +22 -0
- package/dist/lsp/offsets.js +51 -0
- package/dist/lsp/registry.d.ts +28 -0
- package/dist/lsp/registry.js +45 -0
- package/dist/lsp/standalone/backend.d.ts +42 -0
- package/dist/lsp/standalone/backend.js +150 -0
- package/dist/lsp/standalone/document.d.ts +45 -0
- package/dist/lsp/standalone/document.js +81 -0
- package/dist/lsp/standalone/server.d.ts +84 -0
- package/dist/lsp/standalone/server.js +521 -0
- package/dist/lsp/types.d.ts +119 -0
- package/dist/lsp/types.js +13 -0
- package/dist/memory/db.d.ts +15 -0
- package/dist/memory/db.js +25 -0
- package/dist/memory/index.d.ts +12 -0
- package/dist/memory/index.js +11 -0
- package/dist/memory/paths.d.ts +19 -0
- package/dist/memory/paths.js +33 -0
- package/dist/memory/scope.d.ts +14 -0
- package/dist/memory/scope.js +22 -0
- package/dist/memory/store.d.ts +12 -0
- package/dist/memory/store.js +146 -0
- package/dist/memory/types.d.ts +80 -0
- package/dist/memory/types.js +6 -0
- package/dist/notes/types.d.ts +50 -0
- package/dist/notes/types.js +23 -0
- package/dist/notes/verbs/create.d.ts +5 -0
- package/dist/notes/verbs/create.js +55 -0
- package/dist/notes/verbs/mutate.d.ts +8 -0
- package/dist/notes/verbs/mutate.js +152 -0
- package/dist/notes/verbs/queries.d.ts +15 -0
- package/dist/notes/verbs/queries.js +116 -0
- package/dist/notes/verbs/reindex.d.ts +12 -0
- package/dist/notes/verbs/reindex.js +35 -0
- package/dist/notes/verbs/shared.d.ts +37 -0
- package/dist/notes/verbs/shared.js +29 -0
- package/dist/observability/index.d.ts +13 -0
- package/dist/observability/index.js +12 -0
- package/dist/observability/recorder.d.ts +50 -0
- package/dist/observability/recorder.js +77 -0
- package/dist/observability/store.d.ts +22 -0
- package/dist/observability/store.js +213 -0
- package/dist/observability/types.d.ts +82 -0
- package/dist/observability/types.js +1 -0
- package/dist/process/index.d.ts +9 -0
- package/dist/process/index.js +9 -0
- package/dist/process/process.d.ts +95 -0
- package/dist/process/process.js +153 -0
- package/dist/prose/block.d.ts +9 -0
- package/dist/prose/block.js +43 -0
- package/dist/prose/detect.d.ts +50 -0
- package/dist/prose/detect.js +217 -0
- package/dist/prose/gate.d.ts +14 -0
- package/dist/prose/gate.js +21 -0
- package/dist/prose/index.d.ts +4 -0
- package/dist/prose/index.js +4 -0
- package/dist/prose/wrap.d.ts +9 -0
- package/dist/prose/wrap.js +47 -0
- package/dist/quest/actions.d.ts +20 -0
- package/dist/quest/actions.js +107 -0
- package/dist/quest/config.d.ts +79 -0
- package/dist/quest/config.js +83 -0
- package/dist/quest/index.d.ts +29 -0
- package/dist/quest/index.js +28 -0
- package/dist/quest/lifecycle.d.ts +365 -0
- package/dist/quest/lifecycle.js +900 -0
- package/dist/quest/lookup.d.ts +243 -0
- package/dist/quest/lookup.js +496 -0
- package/dist/quest/machine.d.ts +48 -0
- package/dist/quest/machine.js +96 -0
- package/dist/quest/render-rows.d.ts +166 -0
- package/dist/quest/render-rows.js +214 -0
- package/dist/quest/state.d.ts +111 -0
- package/dist/quest/state.js +46 -0
- package/dist/quest/types.d.ts +224 -0
- package/dist/quest/types.js +10 -0
- package/dist/quest/verbs/alias.d.ts +9 -0
- package/dist/quest/verbs/alias.js +129 -0
- package/dist/quest/verbs/lifecycle.d.ts +36 -0
- package/dist/quest/verbs/lifecycle.js +407 -0
- package/dist/quest/verbs/queries.d.ts +24 -0
- package/dist/quest/verbs/queries.js +241 -0
- package/dist/quest/verbs/reorder.d.ts +15 -0
- package/dist/quest/verbs/reorder.js +85 -0
- package/dist/quest/verbs/shared.d.ts +63 -0
- package/dist/quest/verbs/shared.js +35 -0
- package/dist/quest/verbs/stage.d.ts +39 -0
- package/dist/quest/verbs/stage.js +506 -0
- package/dist/quest/verbs/structural.d.ts +23 -0
- package/dist/quest/verbs/structural.js +310 -0
- package/dist/quest/verbs/tree-ops.d.ts +20 -0
- package/dist/quest/verbs/tree-ops.js +289 -0
- package/dist/refs/index.d.ts +13 -0
- package/dist/refs/index.js +12 -0
- package/dist/refs/lookup.d.ts +53 -0
- package/dist/refs/lookup.js +102 -0
- package/dist/refs/register.d.ts +34 -0
- package/dist/refs/register.js +44 -0
- package/dist/refs/types.d.ts +81 -0
- package/dist/refs/types.js +17 -0
- package/dist/remote/index.d.ts +9 -0
- package/dist/remote/index.js +9 -0
- package/dist/remote/name.d.ts +22 -0
- package/dist/remote/name.js +30 -0
- package/dist/result/cite.d.ts +84 -0
- package/dist/result/cite.js +127 -0
- package/dist/result/counts.d.ts +15 -0
- package/dist/result/counts.js +17 -0
- package/dist/result/details.d.ts +61 -0
- package/dist/result/details.js +121 -0
- package/dist/result/digest.d.ts +37 -0
- package/dist/result/digest.js +227 -0
- package/dist/result/follow.d.ts +29 -0
- package/dist/result/follow.js +37 -0
- package/dist/result/index.d.ts +26 -0
- package/dist/result/index.js +26 -0
- package/dist/result/listing.d.ts +62 -0
- package/dist/result/listing.js +72 -0
- package/dist/result/location.d.ts +67 -0
- package/dist/result/location.js +125 -0
- package/dist/result/query.d.ts +67 -0
- package/dist/result/query.js +144 -0
- package/dist/result/spill.d.ts +41 -0
- package/dist/result/spill.js +121 -0
- package/dist/result/store.d.ts +83 -0
- package/dist/result/store.js +214 -0
- package/dist/result/view.d.ts +31 -0
- package/dist/result/view.js +38 -0
- package/dist/review/anchor.d.ts +84 -0
- package/dist/review/anchor.js +89 -0
- package/dist/review/ask/agents.d.ts +80 -0
- package/dist/review/ask/agents.js +296 -0
- package/dist/review/ask/anchorable.d.ts +35 -0
- package/dist/review/ask/anchorable.js +76 -0
- package/dist/review/ask/answer.d.ts +54 -0
- package/dist/review/ask/answer.js +209 -0
- package/dist/review/ask/audit.d.ts +71 -0
- package/dist/review/ask/audit.js +158 -0
- package/dist/review/ask/collect.d.ts +41 -0
- package/dist/review/ask/collect.js +82 -0
- package/dist/review/ask/council.d.ts +290 -0
- package/dist/review/ask/council.js +386 -0
- package/dist/review/ask/critique.d.ts +69 -0
- package/dist/review/ask/critique.js +157 -0
- package/dist/review/ask/harvest.d.ts +119 -0
- package/dist/review/ask/harvest.js +409 -0
- package/dist/review/ask/identity.d.ts +93 -0
- package/dist/review/ask/identity.js +134 -0
- package/dist/review/ask/judge.d.ts +37 -0
- package/dist/review/ask/judge.js +140 -0
- package/dist/review/ask/persona.d.ts +84 -0
- package/dist/review/ask/persona.js +127 -0
- package/dist/review/ask/progress.d.ts +117 -0
- package/dist/review/ask/progress.js +137 -0
- package/dist/review/ask/prompt.d.ts +131 -0
- package/dist/review/ask/prompt.js +242 -0
- package/dist/review/ask/roster.d.ts +94 -0
- package/dist/review/ask/roster.js +338 -0
- package/dist/review/ask/run.d.ts +435 -0
- package/dist/review/ask/run.js +340 -0
- package/dist/review/ask/span.d.ts +70 -0
- package/dist/review/ask/span.js +166 -0
- package/dist/review/ask/stack-round.d.ts +66 -0
- package/dist/review/ask/stack-round.js +125 -0
- package/dist/review/ask/start.d.ts +48 -0
- package/dist/review/ask/start.js +118 -0
- package/dist/review/ask/store.d.ts +83 -0
- package/dist/review/ask/store.js +226 -0
- package/dist/review/ask/wire.d.ts +89 -0
- package/dist/review/ask/wire.js +204 -0
- package/dist/review/attach.d.ts +161 -0
- package/dist/review/attach.js +357 -0
- package/dist/review/authoring.d.ts +84 -0
- package/dist/review/authoring.js +203 -0
- package/dist/review/backed.d.ts +90 -0
- package/dist/review/backed.js +168 -0
- package/dist/review/bind.d.ts +75 -0
- package/dist/review/bind.js +223 -0
- package/dist/review/budget.d.ts +133 -0
- package/dist/review/budget.js +278 -0
- package/dist/review/capabilities.d.ts +217 -0
- package/dist/review/capabilities.js +46 -0
- package/dist/review/change.d.ts +155 -0
- package/dist/review/change.js +15 -0
- package/dist/review/checks.d.ts +56 -0
- package/dist/review/checks.js +11 -0
- package/dist/review/config.d.ts +71 -0
- package/dist/review/config.js +125 -0
- package/dist/review/conventions.d.ts +35 -0
- package/dist/review/conventions.js +58 -0
- package/dist/review/conversation.d.ts +98 -0
- package/dist/review/conversation.js +16 -0
- package/dist/review/decided.d.ts +58 -0
- package/dist/review/decided.js +67 -0
- package/dist/review/diff.d.ts +116 -0
- package/dist/review/diff.js +237 -0
- package/dist/review/draft/continuation.d.ts +23 -0
- package/dist/review/draft/continuation.js +32 -0
- package/dist/review/draft/fanout.d.ts +57 -0
- package/dist/review/draft/fanout.js +46 -0
- package/dist/review/draft/handle.d.ts +55 -0
- package/dist/review/draft/handle.js +110 -0
- package/dist/review/draft/plan.d.ts +112 -0
- package/dist/review/draft/plan.js +343 -0
- package/dist/review/draft/publish.d.ts +38 -0
- package/dist/review/draft/publish.js +118 -0
- package/dist/review/draft/render.d.ts +32 -0
- package/dist/review/draft/render.js +100 -0
- package/dist/review/draft/state.d.ts +98 -0
- package/dist/review/draft/state.js +83 -0
- package/dist/review/draft/store.d.ts +33 -0
- package/dist/review/draft/store.js +100 -0
- package/dist/review/elsewhere.d.ts +27 -0
- package/dist/review/elsewhere.js +39 -0
- package/dist/review/engine.d.ts +106 -0
- package/dist/review/engine.js +243 -0
- package/dist/review/events.d.ts +59 -0
- package/dist/review/events.js +35 -0
- package/dist/review/failed.d.ts +46 -0
- package/dist/review/failed.js +56 -0
- package/dist/review/finding.d.ts +81 -0
- package/dist/review/finding.js +85 -0
- package/dist/review/fix.d.ts +147 -0
- package/dist/review/fix.js +175 -0
- package/dist/review/followup.d.ts +84 -0
- package/dist/review/followup.js +123 -0
- package/dist/review/index.d.ts +134 -0
- package/dist/review/index.js +80 -0
- package/dist/review/keys.d.ts +23 -0
- package/dist/review/keys.js +40 -0
- package/dist/review/landing.d.ts +37 -0
- package/dist/review/landing.js +68 -0
- package/dist/review/lenses.d.ts +132 -0
- package/dist/review/lenses.js +430 -0
- package/dist/review/propose-from.d.ts +76 -0
- package/dist/review/propose-from.js +86 -0
- package/dist/review/provider.d.ts +306 -0
- package/dist/review/provider.js +16 -0
- package/dist/review/providers/git/index.d.ts +23 -0
- package/dist/review/providers/git/index.js +214 -0
- package/dist/review/providers/github/authoring.d.ts +22 -0
- package/dist/review/providers/github/authoring.js +350 -0
- package/dist/review/providers/github/claims.d.ts +49 -0
- package/dist/review/providers/github/claims.js +136 -0
- package/dist/review/providers/github/conversation.d.ts +18 -0
- package/dist/review/providers/github/conversation.js +455 -0
- package/dist/review/providers/github/fields.d.ts +30 -0
- package/dist/review/providers/github/fields.js +47 -0
- package/dist/review/providers/github/index.d.ts +15 -0
- package/dist/review/providers/github/index.js +110 -0
- package/dist/review/providers/github/proposals.d.ts +14 -0
- package/dist/review/providers/github/proposals.js +298 -0
- package/dist/review/providers/github/queue.d.ts +46 -0
- package/dist/review/providers/github/queue.js +122 -0
- package/dist/review/providers/github/stacking.d.ts +20 -0
- package/dist/review/providers/github/stacking.js +107 -0
- package/dist/review/queue.d.ts +43 -0
- package/dist/review/queue.js +56 -0
- package/dist/review/reactable.d.ts +93 -0
- package/dist/review/reactable.js +140 -0
- package/dist/review/register.d.ts +52 -0
- package/dist/review/register.js +53 -0
- package/dist/review/resolve.d.ts +58 -0
- package/dist/review/resolve.js +150 -0
- package/dist/review/retarget.d.ts +73 -0
- package/dist/review/retarget.js +82 -0
- package/dist/review/revisited.d.ts +77 -0
- package/dist/review/revisited.js +121 -0
- package/dist/review/stack.d.ts +110 -0
- package/dist/review/stack.js +52 -0
- package/dist/sections/block.d.ts +9 -0
- package/dist/sections/block.js +42 -0
- package/dist/sections/detect.d.ts +31 -0
- package/dist/sections/detect.js +67 -0
- package/dist/sections/gate.d.ts +21 -0
- package/dist/sections/gate.js +22 -0
- package/dist/sections/index.d.ts +5 -0
- package/dist/sections/index.js +5 -0
- package/dist/sections/sanctioned.d.ts +13 -0
- package/dist/sections/sanctioned.js +21 -0
- package/dist/shell/index.d.ts +8 -0
- package/dist/shell/index.js +8 -0
- package/dist/shell/parse.d.ts +125 -0
- package/dist/shell/parse.js +298 -0
- package/dist/slack/api/channels.d.ts +12 -0
- package/dist/slack/api/channels.js +28 -0
- package/dist/slack/api/client.d.ts +94 -0
- package/dist/slack/api/client.js +272 -0
- package/dist/slack/api/files.d.ts +95 -0
- package/dist/slack/api/files.js +223 -0
- package/dist/slack/api/index.d.ts +11 -0
- package/dist/slack/api/index.js +11 -0
- package/dist/slack/api/messages.d.ts +98 -0
- package/dist/slack/api/messages.js +292 -0
- package/dist/slack/api/reactions.d.ts +47 -0
- package/dist/slack/api/reactions.js +50 -0
- package/dist/slack/api/resolve-conversations.d.ts +43 -0
- package/dist/slack/api/resolve-conversations.js +130 -0
- package/dist/slack/api/resolve-messages.d.ts +29 -0
- package/dist/slack/api/resolve-messages.js +93 -0
- package/dist/slack/api/resolve-users.d.ts +27 -0
- package/dist/slack/api/resolve-users.js +73 -0
- package/dist/slack/api/search.d.ts +86 -0
- package/dist/slack/api/search.js +186 -0
- package/dist/slack/api/users.d.ts +12 -0
- package/dist/slack/api/users.js +33 -0
- package/dist/slack/auth/browser-extract.d.ts +33 -0
- package/dist/slack/auth/browser-extract.js +201 -0
- package/dist/slack/auth/browser.d.ts +5 -0
- package/dist/slack/auth/browser.js +25 -0
- package/dist/slack/auth/credentials.d.ts +14 -0
- package/dist/slack/auth/credentials.js +24 -0
- package/dist/slack/auth/errors.d.ts +9 -0
- package/dist/slack/auth/errors.js +19 -0
- package/dist/slack/auth/extract.d.ts +23 -0
- package/dist/slack/auth/extract.js +44 -0
- package/dist/slack/auth/index.d.ts +12 -0
- package/dist/slack/auth/index.js +11 -0
- package/dist/slack/auth/oauth-app.d.ts +11 -0
- package/dist/slack/auth/oauth-app.js +20 -0
- package/dist/slack/auth/oauth.d.ts +31 -0
- package/dist/slack/auth/oauth.js +82 -0
- package/dist/slack/auth/server.d.ts +14 -0
- package/dist/slack/auth/server.js +75 -0
- package/dist/slack/auth/store.d.ts +17 -0
- package/dist/slack/auth/store.js +27 -0
- package/dist/slack/block-message.d.ts +9 -0
- package/dist/slack/block-message.js +30 -0
- package/dist/slack/blocks.d.ts +94 -0
- package/dist/slack/blocks.js +765 -0
- package/dist/slack/content-gate.d.ts +12 -0
- package/dist/slack/content-gate.js +22 -0
- package/dist/slack/detect.d.ts +31 -0
- package/dist/slack/detect.js +125 -0
- package/dist/slack/index.d.ts +18 -0
- package/dist/slack/index.js +17 -0
- package/dist/slack/paths.d.ts +28 -0
- package/dist/slack/paths.js +46 -0
- package/dist/slack/renderers/channel.d.ts +6 -0
- package/dist/slack/renderers/channel.js +27 -0
- package/dist/slack/renderers/index.d.ts +9 -0
- package/dist/slack/renderers/index.js +9 -0
- package/dist/slack/renderers/message.d.ts +21 -0
- package/dist/slack/renderers/message.js +214 -0
- package/dist/slack/renderers/reactions.d.ts +8 -0
- package/dist/slack/renderers/reactions.js +43 -0
- package/dist/slack/renderers/search.d.ts +6 -0
- package/dist/slack/renderers/search.js +39 -0
- package/dist/slack/renderers/user.d.ts +6 -0
- package/dist/slack/renderers/user.js +32 -0
- package/dist/slack/resolvers/cache.d.ts +29 -0
- package/dist/slack/resolvers/cache.js +70 -0
- package/dist/slack/resolvers/conversation-cache.d.ts +42 -0
- package/dist/slack/resolvers/conversation-cache.js +128 -0
- package/dist/slack/resolvers/conversation.d.ts +44 -0
- package/dist/slack/resolvers/conversation.js +229 -0
- package/dist/slack/resolvers/index.d.ts +8 -0
- package/dist/slack/resolvers/index.js +8 -0
- package/dist/slack/resolvers/target.d.ts +19 -0
- package/dist/slack/resolvers/target.js +45 -0
- package/dist/slack/resolvers/url.d.ts +20 -0
- package/dist/slack/resolvers/url.js +22 -0
- package/dist/slack/resolvers/user.d.ts +54 -0
- package/dist/slack/resolvers/user.js +134 -0
- package/dist/slack/types.d.ts +180 -0
- package/dist/slack/types.js +13 -0
- package/dist/tdd/attest.d.ts +21 -0
- package/dist/tdd/attest.js +21 -0
- package/dist/tdd/discipline.d.ts +11 -0
- package/dist/tdd/discipline.js +28 -0
- package/dist/tdd/index.d.ts +14 -0
- package/dist/tdd/index.js +13 -0
- package/dist/tdd/machine.d.ts +48 -0
- package/dist/tdd/machine.js +139 -0
- package/dist/tdd/presentation.d.ts +34 -0
- package/dist/tdd/presentation.js +38 -0
- package/dist/tdd/queries.d.ts +10 -0
- package/dist/tdd/queries.js +22 -0
- package/dist/terminal/index.d.ts +12 -0
- package/dist/terminal/index.js +11 -0
- package/dist/terminal/register.d.ts +21 -0
- package/dist/terminal/register.js +31 -0
- package/dist/terminal/resolve.d.ts +63 -0
- package/dist/terminal/resolve.js +117 -0
- package/dist/terminal/types.d.ts +134 -0
- package/dist/terminal/types.js +19 -0
- package/dist/thinking/index.d.ts +20 -0
- package/dist/thinking/index.js +27 -0
- package/dist/title/block.d.ts +9 -0
- package/dist/title/block.js +32 -0
- package/dist/title/detect.d.ts +25 -0
- package/dist/title/detect.js +154 -0
- package/dist/title/gate.d.ts +19 -0
- package/dist/title/gate.js +21 -0
- package/dist/title/index.d.ts +3 -0
- package/dist/title/index.js +3 -0
- package/dist/tree/index.d.ts +18 -0
- package/dist/tree/index.js +17 -0
- package/dist/tree/register.d.ts +21 -0
- package/dist/tree/register.js +31 -0
- package/dist/tree/resolve.d.ts +20 -0
- package/dist/tree/resolve.js +31 -0
- package/dist/tree/types.d.ts +83 -0
- package/dist/tree/types.js +12 -0
- package/dist/ui/count.d.ts +29 -0
- package/dist/ui/count.js +35 -0
- package/dist/ui/path.d.ts +25 -0
- package/dist/ui/path.js +40 -0
- package/dist/verify/index.d.ts +17 -0
- package/dist/verify/index.js +14 -0
- package/dist/verify/project.d.ts +21 -0
- package/dist/verify/project.js +49 -0
- package/dist/verify/resolve.d.ts +26 -0
- package/dist/verify/resolve.js +27 -0
- package/dist/verify/run.d.ts +31 -0
- package/dist/verify/run.js +145 -0
- package/dist/web/a11y/announcements.d.ts +67 -0
- package/dist/web/a11y/announcements.js +116 -0
- package/dist/web/a11y/budget.d.ts +75 -0
- package/dist/web/a11y/budget.js +97 -0
- package/dist/web/a11y/focus.d.ts +37 -0
- package/dist/web/a11y/focus.js +106 -0
- package/dist/web/a11y/index.d.ts +19 -0
- package/dist/web/a11y/index.js +25 -0
- package/dist/web/a11y/naming.d.ts +23 -0
- package/dist/web/a11y/naming.js +55 -0
- package/dist/web/a11y/outline.d.ts +23 -0
- package/dist/web/a11y/outline.js +42 -0
- package/dist/web/a11y/reading.d.ts +12 -0
- package/dist/web/a11y/reading.js +101 -0
- package/dist/web/a11y/scope.d.ts +23 -0
- package/dist/web/a11y/scope.js +99 -0
- package/dist/web/a11y/states.d.ts +22 -0
- package/dist/web/a11y/states.js +53 -0
- package/dist/web/a11y/tree.d.ts +124 -0
- package/dist/web/a11y/tree.js +269 -0
- package/dist/web/a11y/walk.d.ts +225 -0
- package/dist/web/a11y/walk.js +568 -0
- package/dist/web/a11y/walkprobe.d.ts +44 -0
- package/dist/web/a11y/walkprobe.js +365 -0
- package/dist/web/audit/axe.d.ts +219 -0
- package/dist/web/audit/axe.js +322 -0
- package/dist/web/audit/behind.d.ts +63 -0
- package/dist/web/audit/behind.js +142 -0
- package/dist/web/audit/capture.d.ts +43 -0
- package/dist/web/audit/capture.js +185 -0
- package/dist/web/audit/colour.d.ts +85 -0
- package/dist/web/audit/colour.js +189 -0
- package/dist/web/audit/contrast.d.ts +74 -0
- package/dist/web/audit/contrast.js +104 -0
- package/dist/web/audit/health.d.ts +27 -0
- package/dist/web/audit/health.js +57 -0
- package/dist/web/audit/index.d.ts +22 -0
- package/dist/web/audit/index.js +22 -0
- package/dist/web/audit/pair.d.ts +55 -0
- package/dist/web/audit/pair.js +157 -0
- package/dist/web/audit/probe.d.ts +31 -0
- package/dist/web/audit/probe.js +189 -0
- package/dist/web/audit/report.d.ts +22 -0
- package/dist/web/audit/report.js +250 -0
- package/dist/web/audit/structure.d.ts +126 -0
- package/dist/web/audit/structure.js +595 -0
- package/dist/web/audit/sweep.d.ts +66 -0
- package/dist/web/audit/sweep.js +117 -0
- package/dist/web/audit/target.d.ts +89 -0
- package/dist/web/audit/target.js +168 -0
- package/dist/web/audit/verdict.d.ts +48 -0
- package/dist/web/audit/verdict.js +52 -0
- package/dist/web/audit/visual.d.ts +161 -0
- package/dist/web/audit/visual.js +297 -0
- package/dist/web/browser.d.ts +213 -0
- package/dist/web/browser.js +927 -0
- package/dist/web/compare/images.d.ts +45 -0
- package/dist/web/compare/images.js +101 -0
- package/dist/web/compare/index.d.ts +15 -0
- package/dist/web/compare/index.js +15 -0
- package/dist/web/compare/provenance.d.ts +48 -0
- package/dist/web/compare/provenance.js +86 -0
- package/dist/web/compare/regions.d.ts +78 -0
- package/dist/web/compare/regions.js +211 -0
- package/dist/web/cookies/extract.d.ts +26 -0
- package/dist/web/cookies/extract.js +167 -0
- package/dist/web/cookies/index.d.ts +8 -0
- package/dist/web/cookies/index.js +7 -0
- package/dist/web/cookies/inject.d.ts +13 -0
- package/dist/web/cookies/inject.js +27 -0
- package/dist/web/cookies/setup.d.ts +31 -0
- package/dist/web/cookies/setup.js +94 -0
- package/dist/web/design/index.d.ts +9 -0
- package/dist/web/design/index.js +9 -0
- package/dist/web/design/inventory.d.ts +126 -0
- package/dist/web/design/inventory.js +324 -0
- package/dist/web/design/probe.d.ts +24 -0
- package/dist/web/design/probe.js +88 -0
- package/dist/web/element/actionable.d.ts +34 -0
- package/dist/web/element/actionable.js +48 -0
- package/dist/web/element/animations.d.ts +48 -0
- package/dist/web/element/animations.js +74 -0
- package/dist/web/element/box.d.ts +53 -0
- package/dist/web/element/box.js +58 -0
- package/dist/web/element/hover.d.ts +75 -0
- package/dist/web/element/hover.js +172 -0
- package/dist/web/element/index.d.ts +17 -0
- package/dist/web/element/index.js +17 -0
- package/dist/web/element/listeners.d.ts +72 -0
- package/dist/web/element/listeners.js +98 -0
- package/dist/web/element/measure.d.ts +40 -0
- package/dist/web/element/measure.js +118 -0
- package/dist/web/element/probes.d.ts +108 -0
- package/dist/web/element/probes.js +195 -0
- package/dist/web/element/pseudo.d.ts +51 -0
- package/dist/web/element/pseudo.js +96 -0
- package/dist/web/element/view.d.ts +30 -0
- package/dist/web/element/view.js +117 -0
- package/dist/web/element/visibility.d.ts +42 -0
- package/dist/web/element/visibility.js +67 -0
- package/dist/web/envelope/artifacts.d.ts +23 -0
- package/dist/web/envelope/artifacts.js +45 -0
- package/dist/web/envelope/index.d.ts +9 -0
- package/dist/web/envelope/index.js +9 -0
- package/dist/web/envelope/naming.d.ts +23 -0
- package/dist/web/envelope/naming.js +43 -0
- package/dist/web/envelope/paged.d.ts +42 -0
- package/dist/web/envelope/paged.js +99 -0
- package/dist/web/envelope/sink.d.ts +43 -0
- package/dist/web/envelope/sink.js +67 -0
- package/dist/web/environment/devices.d.ts +65 -0
- package/dist/web/environment/devices.js +82 -0
- package/dist/web/environment/emulation.d.ts +124 -0
- package/dist/web/environment/emulation.js +258 -0
- package/dist/web/environment/index.d.ts +15 -0
- package/dist/web/environment/index.js +15 -0
- package/dist/web/environment/probes.d.ts +18 -0
- package/dist/web/environment/probes.js +40 -0
- package/dist/web/environment/shaping.d.ts +90 -0
- package/dist/web/environment/shaping.js +141 -0
- package/dist/web/environment/status.d.ts +51 -0
- package/dist/web/environment/status.js +109 -0
- package/dist/web/environment/storage.d.ts +55 -0
- package/dist/web/environment/storage.js +142 -0
- package/dist/web/environment/tabs.d.ts +32 -0
- package/dist/web/environment/tabs.js +47 -0
- package/dist/web/environment/view.d.ts +10 -0
- package/dist/web/environment/view.js +42 -0
- package/dist/web/evaluate/index.d.ts +6 -0
- package/dist/web/evaluate/index.js +6 -0
- package/dist/web/evaluate/outcome.d.ts +74 -0
- package/dist/web/evaluate/outcome.js +91 -0
- package/dist/web/evaluate/probe.d.ts +31 -0
- package/dist/web/evaluate/probe.js +303 -0
- package/dist/web/index.d.ts +47 -0
- package/dist/web/index.js +47 -0
- package/dist/web/input/index.d.ts +11 -0
- package/dist/web/input/index.js +11 -0
- package/dist/web/input/keys.d.ts +48 -0
- package/dist/web/input/keys.js +189 -0
- package/dist/web/input/pointer.d.ts +56 -0
- package/dist/web/input/pointer.js +77 -0
- package/dist/web/input/touch.d.ts +61 -0
- package/dist/web/input/touch.js +83 -0
- package/dist/web/mermaid.d.ts +69 -0
- package/dist/web/mermaid.js +223 -0
- package/dist/web/paths.d.ts +16 -0
- package/dist/web/paths.js +27 -0
- package/dist/web/perf/heap.d.ts +42 -0
- package/dist/web/perf/heap.js +73 -0
- package/dist/web/perf/index.d.ts +14 -0
- package/dist/web/perf/index.js +14 -0
- package/dist/web/perf/layers.d.ts +98 -0
- package/dist/web/perf/layers.js +165 -0
- package/dist/web/perf/probe.d.ts +26 -0
- package/dist/web/perf/probe.js +123 -0
- package/dist/web/perf/profile.d.ts +53 -0
- package/dist/web/perf/profile.js +97 -0
- package/dist/web/perf/trace.d.ts +152 -0
- package/dist/web/perf/trace.js +429 -0
- package/dist/web/perf/view.d.ts +6 -0
- package/dist/web/perf/view.js +86 -0
- package/dist/web/perf/vitals.d.ts +141 -0
- package/dist/web/perf/vitals.js +175 -0
- package/dist/web/reader.d.ts +131 -0
- package/dist/web/reader.js +340 -0
- package/dist/web/screenshot.d.ts +50 -0
- package/dist/web/screenshot.js +108 -0
- package/dist/web/search.d.ts +49 -0
- package/dist/web/search.js +137 -0
- package/dist/web/session/artifacts.d.ts +32 -0
- package/dist/web/session/artifacts.js +47 -0
- package/dist/web/session/emulation.d.ts +118 -0
- package/dist/web/session/emulation.js +307 -0
- package/dist/web/session/recording.d.ts +51 -0
- package/dist/web/session/recording.js +64 -0
- package/dist/web/session/settling.d.ts +42 -0
- package/dist/web/session/settling.js +104 -0
- package/dist/web/session/shaping.d.ts +48 -0
- package/dist/web/session/shaping.js +113 -0
- package/dist/web/session/sourcemaps.d.ts +64 -0
- package/dist/web/session/sourcemaps.js +135 -0
- package/dist/web/session/telemetry.d.ts +219 -0
- package/dist/web/session/telemetry.js +486 -0
- package/dist/web/session/wires.d.ts +22 -0
- package/dist/web/session/wires.js +11 -0
- package/dist/web/session.d.ts +1153 -0
- package/dist/web/session.js +3400 -0
- package/dist/web/snapshot/deep.d.ts +36 -0
- package/dist/web/snapshot/deep.js +91 -0
- package/dist/web/snapshot/flatten.d.ts +101 -0
- package/dist/web/snapshot/flatten.js +131 -0
- package/dist/web/snapshot/index.d.ts +8 -0
- package/dist/web/snapshot/index.js +10 -0
- package/dist/web/snapshot/presented.d.ts +32 -0
- package/dist/web/snapshot/presented.js +74 -0
- package/dist/web/snapshot/query.d.ts +67 -0
- package/dist/web/snapshot/query.js +136 -0
- package/dist/web/sourcemap/index.d.ts +9 -0
- package/dist/web/sourcemap/index.js +9 -0
- package/dist/web/sourcemap/mappings.d.ts +111 -0
- package/dist/web/sourcemap/mappings.js +218 -0
- package/dist/web/styles/capture.d.ts +49 -0
- package/dist/web/styles/capture.js +85 -0
- package/dist/web/styles/cascade.d.ts +107 -0
- package/dist/web/styles/cascade.js +275 -0
- package/dist/web/styles/curation.d.ts +45 -0
- package/dist/web/styles/curation.js +282 -0
- package/dist/web/styles/index.d.ts +10 -0
- package/dist/web/styles/index.js +10 -0
- package/dist/web/target/index.d.ts +7 -0
- package/dist/web/target/index.js +7 -0
- package/dist/web/target/refusals.d.ts +59 -0
- package/dist/web/target/refusals.js +305 -0
- package/dist/web/target/target.d.ts +59 -0
- package/dist/web/target/target.js +94 -0
- package/dist/web/telemetry/buffer.d.ts +35 -0
- package/dist/web/telemetry/buffer.js +72 -0
- package/dist/web/telemetry/console.d.ts +127 -0
- package/dist/web/telemetry/console.js +217 -0
- package/dist/web/telemetry/dialogs.d.ts +41 -0
- package/dist/web/telemetry/dialogs.js +38 -0
- package/dist/web/telemetry/downloads.d.ts +42 -0
- package/dist/web/telemetry/downloads.js +65 -0
- package/dist/web/telemetry/failure.d.ts +31 -0
- package/dist/web/telemetry/failure.js +72 -0
- package/dist/web/telemetry/har.d.ts +97 -0
- package/dist/web/telemetry/har.js +227 -0
- package/dist/web/telemetry/index.d.ts +18 -0
- package/dist/web/telemetry/index.js +18 -0
- package/dist/web/telemetry/lifecycle.d.ts +69 -0
- package/dist/web/telemetry/lifecycle.js +120 -0
- package/dist/web/telemetry/network.d.ts +152 -0
- package/dist/web/telemetry/network.js +130 -0
- package/dist/web/telemetry/requests.d.ts +31 -0
- package/dist/web/telemetry/requests.js +119 -0
- package/dist/web/telemetry/sockets.d.ts +56 -0
- package/dist/web/telemetry/sockets.js +101 -0
- package/dist/web/telemetry/view.d.ts +16 -0
- package/dist/web/telemetry/view.js +125 -0
- package/dist/web/wait/conditions.d.ts +87 -0
- package/dist/web/wait/conditions.js +100 -0
- package/dist/web/wait/index.d.ts +6 -0
- package/dist/web/wait/index.js +6 -0
- package/dist/web/wait/settle.d.ts +54 -0
- package/dist/web/wait/settle.js +84 -0
- package/dist/work/ask.d.ts +45 -0
- package/dist/work/ask.js +85 -0
- package/dist/work/author.d.ts +61 -0
- package/dist/work/author.js +144 -0
- package/dist/work/broker.d.ts +151 -0
- package/dist/work/broker.js +165 -0
- package/dist/work/events.d.ts +98 -0
- package/dist/work/events.js +57 -0
- package/dist/work/history.d.ts +69 -0
- package/dist/work/history.js +174 -0
- package/dist/work/index.d.ts +49 -0
- package/dist/work/index.js +33 -0
- package/dist/work/inplay.d.ts +43 -0
- package/dist/work/inplay.js +42 -0
- package/dist/work/memory.d.ts +84 -0
- package/dist/work/memory.js +203 -0
- package/dist/work/objection.d.ts +92 -0
- package/dist/work/objection.js +72 -0
- package/dist/work/provider.d.ts +79 -0
- package/dist/work/provider.js +45 -0
- package/dist/work/providers/git.d.ts +29 -0
- package/dist/work/providers/git.js +87 -0
- package/dist/work/publish.d.ts +53 -0
- package/dist/work/publish.js +139 -0
- package/dist/work/rebase.d.ts +78 -0
- package/dist/work/rebase.js +261 -0
- package/dist/work/reclaim.d.ts +56 -0
- package/dist/work/reclaim.js +52 -0
- package/dist/work/register.d.ts +29 -0
- package/dist/work/register.js +41 -0
- package/dist/work/stack.d.ts +126 -0
- package/dist/work/stack.js +243 -0
- package/dist/work/stacks.d.ts +156 -0
- package/dist/work/stacks.js +524 -0
- package/dist/work/survey.d.ts +52 -0
- package/dist/work/survey.js +58 -0
- package/dist/work/tidy.d.ts +147 -0
- package/dist/work/tidy.js +136 -0
- package/dist/work/tree.d.ts +120 -0
- package/dist/work/tree.js +69 -0
- package/dist/work/unattended.d.ts +40 -0
- package/dist/work/unattended.js +57 -0
- package/package.json +145 -0
|
@@ -0,0 +1,568 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The keyboard walk: what a person who never touches a mouse
|
|
3
|
+
* can actually reach.
|
|
4
|
+
*
|
|
5
|
+
* Every finding here comes from what the browser did when Tab
|
|
6
|
+
* was pressed, not from reading markup and predicting what it
|
|
7
|
+
* ought to do. A focus trap written by hand, a positive tabindex
|
|
8
|
+
* reordering the page, a div wearing a button's clothes: none of
|
|
9
|
+
* these are visible in the markup as bugs, and all of them are
|
|
10
|
+
* obvious the moment you try to tab through.
|
|
11
|
+
*
|
|
12
|
+
* The one judgment that is presentational, and labelled as such,
|
|
13
|
+
* is whether a focus indicator exists: that is decided by
|
|
14
|
+
* comparing what the browser computed for the element at rest
|
|
15
|
+
* against what it computed with focus on it. Whether the
|
|
16
|
+
* resulting indicator is bright enough to see is a contrast
|
|
17
|
+
* question, and belongs with the contrast audit rather than
|
|
18
|
+
* here; this module records the indicator so that audit can
|
|
19
|
+
* judge it.
|
|
20
|
+
*/
|
|
21
|
+
import { isOpaque, parseRgb } from "../audit/colour.js";
|
|
22
|
+
import { judgeNonText, NON_TEXT_MINIMUM } from "../audit/contrast.js";
|
|
23
|
+
import { count, renderVerdict, standingFor, wasWere, } from "../audit/verdict.js";
|
|
24
|
+
/**
|
|
25
|
+
* How much two boxes must share vertically to count as one line.
|
|
26
|
+
*
|
|
27
|
+
* Buttons of different heights in a toolbar do not share a top
|
|
28
|
+
* edge to the pixel, and demanding that they do would miss every
|
|
29
|
+
* real case. Half the shorter one is enough to mean "beside",
|
|
30
|
+
* and little enough to keep stacked rows apart.
|
|
31
|
+
*/
|
|
32
|
+
const SAME_LINE = 0.5;
|
|
33
|
+
/** Whether two boxes sit on the same line as a reader sees it. */
|
|
34
|
+
function beside(one, other) {
|
|
35
|
+
const overlap = Math.min(one.y + one.height, other.y + other.height) -
|
|
36
|
+
Math.max(one.y, other.y);
|
|
37
|
+
if (overlap <= 0)
|
|
38
|
+
return false;
|
|
39
|
+
return overlap >= Math.min(one.height, other.height) * SAME_LINE;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Tab order that contradicts the order things are read in.
|
|
43
|
+
*
|
|
44
|
+
* Only same-line inversions, and deliberately so. The general
|
|
45
|
+
* question, whether tab order follows the visual flow of the
|
|
46
|
+
* page, cannot be answered without deciding whether a layout is
|
|
47
|
+
* meant to be read in rows or in columns, and a two-column form
|
|
48
|
+
* that tabs down one column and then the other is both extremely
|
|
49
|
+
* common and perfectly correct. A check that flagged it would be
|
|
50
|
+
* wrong far more often than right, and a false accessibility
|
|
51
|
+
* finding costs more than a missing one.
|
|
52
|
+
*
|
|
53
|
+
* Two controls side by side, tabbed in the opposite order to the
|
|
54
|
+
* one they are read in, has no such excuse. It is what
|
|
55
|
+
* row-reverse and hand-set order values do, and the keyboard
|
|
56
|
+
* order it produces contradicts the page for everybody.
|
|
57
|
+
*/
|
|
58
|
+
export function outOfVisualOrder(stops, direction) {
|
|
59
|
+
const jumps = [];
|
|
60
|
+
for (let at = 1; at < stops.length; at += 1) {
|
|
61
|
+
const before = stops[at - 1];
|
|
62
|
+
const after = stops[at];
|
|
63
|
+
if (before === undefined || after === undefined)
|
|
64
|
+
continue;
|
|
65
|
+
// A stop focus never reached, or one the browser gave no box,
|
|
66
|
+
// says nothing about order.
|
|
67
|
+
if (before.index === -1 || after.index === -1)
|
|
68
|
+
continue;
|
|
69
|
+
// The walk laps the page, so the step from the last control
|
|
70
|
+
// back to the first is a cycle rather than a jump. Measured:
|
|
71
|
+
// on an ordinary page that wrap is a right-to-left move
|
|
72
|
+
// between two elements that happen to share a line, and it was
|
|
73
|
+
// the check's first false positive.
|
|
74
|
+
//
|
|
75
|
+
// Within one lap, tab follows document order, which is the
|
|
76
|
+
// order candidates are numbered in, so an ascending index is
|
|
77
|
+
// what distinguishes a real step from the wrap. A page using
|
|
78
|
+
// positive tabindex breaks that, and is reported separately
|
|
79
|
+
// for doing so; missing a reversal there is the right way to
|
|
80
|
+
// be wrong.
|
|
81
|
+
if (after.index <= before.index)
|
|
82
|
+
continue;
|
|
83
|
+
const here = before.rect;
|
|
84
|
+
const next = after.rect;
|
|
85
|
+
if (here === undefined || next === undefined)
|
|
86
|
+
continue;
|
|
87
|
+
if (!beside(here, next))
|
|
88
|
+
continue;
|
|
89
|
+
const backwards = direction === "rtl" ? next.x > here.x : next.x < here.x;
|
|
90
|
+
if (backwards)
|
|
91
|
+
jumps.push({ before, after });
|
|
92
|
+
}
|
|
93
|
+
return jumps;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Whether an outline is actually drawn.
|
|
97
|
+
*
|
|
98
|
+
* A width survives in the computed style even when the style is
|
|
99
|
+
* none, so an element with no outline at all still reports three
|
|
100
|
+
* pixels of it. Comparing widths alone would call that a change.
|
|
101
|
+
*/
|
|
102
|
+
/**
|
|
103
|
+
* Say how many controls the trap shut out, and name a few.
|
|
104
|
+
*
|
|
105
|
+
* A bare count is the least useful true thing available here: a
|
|
106
|
+
* reader who is told six controls are stranded still has to go
|
|
107
|
+
* and find out which. These are the controls a keyboard user can
|
|
108
|
+
* no longer reach, so they are worth naming.
|
|
109
|
+
*/
|
|
110
|
+
function strandedSentence(stranded) {
|
|
111
|
+
const named = stranded
|
|
112
|
+
.map((candidate) => candidate.name || candidate.tag)
|
|
113
|
+
.filter((name) => name.length > 0);
|
|
114
|
+
const shown = named.slice(0, MAX_NAMED_STRANDED);
|
|
115
|
+
const rest = named.length - shown.length;
|
|
116
|
+
const list = shown.length === 0
|
|
117
|
+
? ""
|
|
118
|
+
: `: ${shown.join(", ")}${rest > 0 ? `, and ${rest} more` : ""}`;
|
|
119
|
+
const count = stranded.length === 1
|
|
120
|
+
? "1 control is stranded outside it"
|
|
121
|
+
: `${stranded.length} controls are stranded outside it`;
|
|
122
|
+
return ` ${count}${list}.`;
|
|
123
|
+
}
|
|
124
|
+
/** How many stranded controls to name before counting the rest. */
|
|
125
|
+
const MAX_NAMED_STRANDED = 6;
|
|
126
|
+
function outlineDrawn(style) {
|
|
127
|
+
return style.outlineStyle !== "none";
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Where the focus indicator lives, by comparing rest with focus.
|
|
131
|
+
*
|
|
132
|
+
* This is the honest test, and the only one that survives
|
|
133
|
+
* contact with real pages: not whether the author wrote an
|
|
134
|
+
* outline rule, but whether the browser draws anything
|
|
135
|
+
* differently when the element has focus.
|
|
136
|
+
*/
|
|
137
|
+
export function indicatorOf(resting, focused) {
|
|
138
|
+
const outlineChanged = outlineDrawn(focused) !== outlineDrawn(resting) ||
|
|
139
|
+
(outlineDrawn(focused) &&
|
|
140
|
+
(focused.outlineColor !== resting.outlineColor ||
|
|
141
|
+
focused.outlineWidth !== resting.outlineWidth));
|
|
142
|
+
if (outlineChanged)
|
|
143
|
+
return "outline";
|
|
144
|
+
if (focused.boxShadow !== resting.boxShadow)
|
|
145
|
+
return "boxShadow";
|
|
146
|
+
if (focused.backgroundColor !== resting.backgroundColor)
|
|
147
|
+
return "background";
|
|
148
|
+
if (focused.borderColor !== resting.borderColor)
|
|
149
|
+
return "border";
|
|
150
|
+
if (focused.color !== resting.color)
|
|
151
|
+
return "colour";
|
|
152
|
+
return "none";
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Whether a focus indicator can actually be seen.
|
|
156
|
+
*
|
|
157
|
+
* The walk decides an indicator exists by seeing the computed
|
|
158
|
+
* style change. That is a weaker claim than it sounds, and the
|
|
159
|
+
* gap between the two is where the real defect lives: a ring in
|
|
160
|
+
* a colour a shade off the background satisfies every existence
|
|
161
|
+
* check ever written and still leaves someone unable to tell
|
|
162
|
+
* where they are. WCAG 2.4.11 puts the bar at 3:1 against what
|
|
163
|
+
* the indicator is drawn against, which is the same bar 1.4.11
|
|
164
|
+
* sets for any control's own colours.
|
|
165
|
+
*
|
|
166
|
+
* Only an outline is judged. A box shadow can be any number of
|
|
167
|
+
* layers offset in any direction, a background or colour change
|
|
168
|
+
* moves the very surface the comparison would use, and in
|
|
169
|
+
* neither case does the computed value say which pixels changed.
|
|
170
|
+
* Those come back undecided, which is this package's word for a
|
|
171
|
+
* question it will not answer by guessing. A transparent surface
|
|
172
|
+
* is undecided for the same reason: the colour behind the ring
|
|
173
|
+
* belongs to some ancestor the computed style does not name, and
|
|
174
|
+
* compositing against a guess is how a page gets accused of a
|
|
175
|
+
* failure it does not have.
|
|
176
|
+
*/
|
|
177
|
+
export function judgeIndicator(input) {
|
|
178
|
+
if (input.indicator !== "outline") {
|
|
179
|
+
return {
|
|
180
|
+
standing: "undecided",
|
|
181
|
+
reason: `the indicator is a ${input.indicator} change, and which ` +
|
|
182
|
+
"pixels it alters cannot be read from the computed style",
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
const ring = parseRgb(input.focused.outlineColor);
|
|
186
|
+
const surface = parseRgb(input.resting.backgroundColor);
|
|
187
|
+
if (!ring || !surface) {
|
|
188
|
+
return {
|
|
189
|
+
standing: "undecided",
|
|
190
|
+
reason: "the ring or the surface behind it is not a plain colour",
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
if (!isOpaque(surface)) {
|
|
194
|
+
return {
|
|
195
|
+
standing: "undecided",
|
|
196
|
+
reason: "the surface behind the ring is see-through, so its " +
|
|
197
|
+
"colour belongs to an ancestor this cannot name",
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
const verdict = judgeNonText({ foreground: ring, background: surface });
|
|
201
|
+
// The contrast layer has its own reasons for declining, and they
|
|
202
|
+
// are better than any this one could invent, so they travel out
|
|
203
|
+
// rather than being flattened into a generic shrug.
|
|
204
|
+
if (verdict.kind === "undecidable") {
|
|
205
|
+
return { standing: "undecided", reason: verdict.because };
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
standing: verdict.passes ? "pass" : "fail",
|
|
209
|
+
ratio: verdict.ratio,
|
|
210
|
+
reason: verdict.passes
|
|
211
|
+
? `the ring reaches ${verdict.ratio}:1 against what it sits on`
|
|
212
|
+
: `the ring reaches only ${verdict.ratio}:1 against what it ` +
|
|
213
|
+
`sits on, short of the ${NON_TEXT_MINIMUM}:1 that 2.4.11 asks`,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* The shortest cycle the walk ended in, if it ended in one.
|
|
218
|
+
*
|
|
219
|
+
* A tab order that works is a cycle too: it comes back round to
|
|
220
|
+
* the start. What makes a cycle a trap is that it is smaller
|
|
221
|
+
* than the page, so the caller compares it against the
|
|
222
|
+
* candidates rather than this function deciding alone.
|
|
223
|
+
*/
|
|
224
|
+
function trailingCycle(indices) {
|
|
225
|
+
for (let period = 1; period * 2 <= indices.length; period += 1) {
|
|
226
|
+
const tail = indices.slice(-period);
|
|
227
|
+
const before = indices.slice(-period * 2, -period);
|
|
228
|
+
if (tail.every((value, at) => value === before[at]))
|
|
229
|
+
return tail;
|
|
230
|
+
}
|
|
231
|
+
return [];
|
|
232
|
+
}
|
|
233
|
+
/** Read the walk. */
|
|
234
|
+
export function analyseWalk(capture) {
|
|
235
|
+
const { candidates, stops } = capture;
|
|
236
|
+
const indicators = new Map();
|
|
237
|
+
const noIndicator = [];
|
|
238
|
+
const faintIndicator = [];
|
|
239
|
+
const restingByIndex = new Map(candidates.map((candidate) => [candidate.index, candidate.resting]));
|
|
240
|
+
for (const stop of stops) {
|
|
241
|
+
const resting = restingByIndex.get(stop.index);
|
|
242
|
+
if (!resting)
|
|
243
|
+
continue;
|
|
244
|
+
const indicator = indicatorOf(resting, stop.focused);
|
|
245
|
+
indicators.set(stop.index, indicator);
|
|
246
|
+
if (indicator === "none" &&
|
|
247
|
+
!noIndicator.some((s) => s.index === stop.index)) {
|
|
248
|
+
noIndicator.push(stop);
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
// An indicator that exists still has to be visible. Only a
|
|
252
|
+
// decided failure is collected: undecided is left alone rather
|
|
253
|
+
// than reported as a maybe, because the walk's verdict is read
|
|
254
|
+
// as a list of things to fix.
|
|
255
|
+
const seen = judgeIndicator({ indicator, resting, focused: stop.focused });
|
|
256
|
+
if (seen.standing === "fail" &&
|
|
257
|
+
seen.ratio !== undefined &&
|
|
258
|
+
!faintIndicator.some((faint) => faint.stop.index === stop.index)) {
|
|
259
|
+
faintIndicator.push({ stop, ratio: seen.ratio });
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
const visited = new Set(stops.map((stop) => stop.index));
|
|
263
|
+
const missed = candidates.filter((candidate) => !visited.has(candidate.index));
|
|
264
|
+
const cycle = trailingCycle(stops.map((stop) => stop.index));
|
|
265
|
+
const cycleMembers = new Set(cycle);
|
|
266
|
+
// A cycle is only a trap when something focusable sits outside
|
|
267
|
+
// it. A page whose whole tab order loops is working correctly.
|
|
268
|
+
//
|
|
269
|
+
// Two things that are not traps used to be reported as one.
|
|
270
|
+
//
|
|
271
|
+
// A modal dialog contains focus deliberately: that is the
|
|
272
|
+
// pattern working, and the background controls it excludes are
|
|
273
|
+
// exactly what lands in `missed`, so the reference
|
|
274
|
+
// implementation of an accessible dialog produced this check's
|
|
275
|
+
// loudest possible output.
|
|
276
|
+
//
|
|
277
|
+
// A walk cut short by its own budget has not visited the rest
|
|
278
|
+
// of the page yet. Everything it did not reach is unvisited,
|
|
279
|
+
// not unreachable, and calling that a trap blames the page for
|
|
280
|
+
// a limit we imposed.
|
|
281
|
+
const inModal = (index) => stops.some((stop) => stop.index === index && stop.inModal === true) ||
|
|
282
|
+
candidates.some((candidate) => candidate.index === index && candidate.inModal === true);
|
|
283
|
+
// Index -1 is focus resting on the body between laps rather
|
|
284
|
+
// than on any candidate, which headless Chrome does every time
|
|
285
|
+
// round. It is not a control the dialog failed to contain, so
|
|
286
|
+
// it must not decide whether the cycle is inside one; leaving
|
|
287
|
+
// it in made every real modal look like a leak.
|
|
288
|
+
const cycled = cycle.filter((index) => index >= 0);
|
|
289
|
+
const modalCycle = cycled.length > 0 && cycled.every(inModal);
|
|
290
|
+
// A trap and a budget shortfall both end with the walk stopping
|
|
291
|
+
// early, and telling them apart is the whole job here. The
|
|
292
|
+
// signal is whether the walk was looping or still finding new
|
|
293
|
+
// controls when it ran out: a settled cycle smaller than the
|
|
294
|
+
// page is a trap however long we let it run, while a walk that
|
|
295
|
+
// was still making progress simply needed more stops.
|
|
296
|
+
const looping = cycled.length > 0;
|
|
297
|
+
// What makes a cycle a trap is that focus cannot leave it, so
|
|
298
|
+
// the question is which controls sit outside it, not which were
|
|
299
|
+
// never visited.
|
|
300
|
+
//
|
|
301
|
+
// Those are different sets, and the difference is the commonest
|
|
302
|
+
// trap there is. A page that tabs through its header, reaches a
|
|
303
|
+
// widget and then cycles inside it for ever has visited every
|
|
304
|
+
// control: nothing is missed, and asking about missed controls
|
|
305
|
+
// called it clean. The header is still unreachable from inside
|
|
306
|
+
// the widget, which is the whole complaint. The reference
|
|
307
|
+
// keydown trap, two buttons swallowing Tab after two ordinary
|
|
308
|
+
// links, was reported as passing for exactly this reason, and
|
|
309
|
+
// only looked detected while phantom candidates were padding
|
|
310
|
+
// the missed list.
|
|
311
|
+
const outsideCycle = candidates.filter((candidate) => !cycleMembers.has(candidate.index));
|
|
312
|
+
const trapped = looping && outsideCycle.length > 0 && !modalCycle;
|
|
313
|
+
const ranOut = capture.cappedAt !== undefined && !looping;
|
|
314
|
+
const trap = trapped
|
|
315
|
+
? {
|
|
316
|
+
// A cycle has no natural first member: where the repeat
|
|
317
|
+
// was detected is an arbitrary rotation, so "In B, In A"
|
|
318
|
+
// read oddly beside a tab order listing In A first.
|
|
319
|
+
// Document order is the one the reader already has.
|
|
320
|
+
members: [...cycleMembers]
|
|
321
|
+
.sort((a, b) => a - b)
|
|
322
|
+
.map((index) => stops.find((stop) => stop.index === index))
|
|
323
|
+
.filter((stop) => stop !== undefined),
|
|
324
|
+
escapeFreed: capture.escapeFreed === true,
|
|
325
|
+
stranded: outsideCycle,
|
|
326
|
+
}
|
|
327
|
+
: undefined;
|
|
328
|
+
const positiveTabindex = candidates.filter((candidate) => (candidate.tabindex ?? 0) > 0);
|
|
329
|
+
// Document order is the order the candidates were collected
|
|
330
|
+
// in, so a walk that visits them out of that order has been
|
|
331
|
+
// reordered by something, almost always a positive tabindex.
|
|
332
|
+
const arrival = stops
|
|
333
|
+
.map((stop) => stop.index)
|
|
334
|
+
.filter((index, at, all) => index >= 0 && all.indexOf(index) === at);
|
|
335
|
+
// A modal legitimately takes focus out of document order: its
|
|
336
|
+
// controls come after the background ones in the source and
|
|
337
|
+
// before them in the tab order. Reporting that as a reordered
|
|
338
|
+
// page blames the dialog for working.
|
|
339
|
+
const reordered = !modalCycle &&
|
|
340
|
+
arrival.some((index, at) => at > 0 && index < (arrival[at - 1] ?? -1));
|
|
341
|
+
return {
|
|
342
|
+
stops,
|
|
343
|
+
...(trap ? { trap } : {}),
|
|
344
|
+
missed,
|
|
345
|
+
noIndicator,
|
|
346
|
+
faintIndicator,
|
|
347
|
+
// The page's own direction, when the capture reported it. A
|
|
348
|
+
// right-to-left page reads the other way, and the geometry
|
|
349
|
+
// that is wrong in English is correct in Arabic.
|
|
350
|
+
outOfOrder: outOfVisualOrder(stops, capture.direction ?? "ltr"),
|
|
351
|
+
indicators,
|
|
352
|
+
// The walk laps the page, so an offscreen stop is met once
|
|
353
|
+
// per lap. It is one problem, not one per visit.
|
|
354
|
+
offscreen: stops.filter((stop, at) => !stop.inViewport &&
|
|
355
|
+
stop.index >= 0 &&
|
|
356
|
+
stops.findIndex((other) => other.index === stop.index) === at),
|
|
357
|
+
positiveTabindex,
|
|
358
|
+
unreachable: capture.unreachable,
|
|
359
|
+
reordered,
|
|
360
|
+
...(ranOut && capture.cappedAt !== undefined
|
|
361
|
+
? { cappedAt: capture.cappedAt }
|
|
362
|
+
: {}),
|
|
363
|
+
modalHeldFocus: modalCycle,
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
/** How many stops are worth listing before summarising. */
|
|
367
|
+
const MAX_LISTED_STOPS = 40;
|
|
368
|
+
/**
|
|
369
|
+
* How many of anything else is worth naming before counting.
|
|
370
|
+
*
|
|
371
|
+
* The tab order has always stopped at forty and said how many
|
|
372
|
+
* more there were. The finding lists beside it printed every
|
|
373
|
+
* entry, so one article answered with two hundred and fifty
|
|
374
|
+
* unvisited control names, longer than the rest of the report
|
|
375
|
+
* together and mostly repetitions of the same word.
|
|
376
|
+
*/
|
|
377
|
+
export const MAX_LISTED_FINDINGS = 12;
|
|
378
|
+
/** Name a few, count the rest, in one place for every list. */
|
|
379
|
+
function listSome(lines, entries, cap = MAX_LISTED_FINDINGS) {
|
|
380
|
+
for (const entry of entries.slice(0, cap))
|
|
381
|
+
lines.push(` ${entry}`);
|
|
382
|
+
if (entries.length > cap) {
|
|
383
|
+
lines.push(` ... and ${entries.length - cap} more.`);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
/** The walk, as a person would report it. */
|
|
387
|
+
export function renderWalk(findings) {
|
|
388
|
+
const lines = [];
|
|
389
|
+
const real = findings.stops.filter((stop) => stop.index >= 0);
|
|
390
|
+
// A tab order is a cycle, so the walk deliberately goes round
|
|
391
|
+
// more than once to prove it. Printing every lap would say the
|
|
392
|
+
// same thing ten times over; the distinct stops, in the order
|
|
393
|
+
// they were first reached, say all of it.
|
|
394
|
+
const seen = new Set();
|
|
395
|
+
const firstPass = real.filter((stop) => {
|
|
396
|
+
if (seen.has(stop.index))
|
|
397
|
+
return false;
|
|
398
|
+
seen.add(stop.index);
|
|
399
|
+
return true;
|
|
400
|
+
});
|
|
401
|
+
const looped = real.length > firstPass.length;
|
|
402
|
+
const measured = `Tabbed through ${firstPass.length} distinct stops` +
|
|
403
|
+
`${looped ? ", then the order repeated" : ""}.`;
|
|
404
|
+
if (findings.trap) {
|
|
405
|
+
const names = findings.trap.members
|
|
406
|
+
.map((stop) => stop.name || stop.tag)
|
|
407
|
+
.join(", ");
|
|
408
|
+
lines.push(`FOCUS TRAP: once inside, tab only ever reaches ${names}.`, findings.trap.escapeFreed
|
|
409
|
+
? " Escape does get out, so a keyboard user is not stranded."
|
|
410
|
+
: " Escape does not get out either. There is no way back to " +
|
|
411
|
+
"the page without a mouse.", strandedSentence(findings.trap.stranded), "");
|
|
412
|
+
}
|
|
413
|
+
if (findings.noIndicator.length > 0) {
|
|
414
|
+
lines.push("No visible focus indicator, so focus cannot be followed:");
|
|
415
|
+
listSome(lines, findings.noIndicator.map((stop) => `${stop.name || stop.tag} (${stop.tag.toLowerCase()})`));
|
|
416
|
+
lines.push("");
|
|
417
|
+
}
|
|
418
|
+
if (findings.faintIndicator.length > 0) {
|
|
419
|
+
lines.push("Focus indicator too faint to make out, which 2.4.11 holds " +
|
|
420
|
+
`to ${NON_TEXT_MINIMUM}:1:`);
|
|
421
|
+
listSome(lines, findings.faintIndicator.map((faint) => `${faint.stop.name || faint.stop.tag} ` +
|
|
422
|
+
`(${faint.stop.tag.toLowerCase()}) at ${faint.ratio}:1`));
|
|
423
|
+
lines.push("");
|
|
424
|
+
}
|
|
425
|
+
if (findings.outOfOrder.length > 0) {
|
|
426
|
+
lines.push("Side by side, but tabbed in the opposite order to the one " +
|
|
427
|
+
"they read in (2.4.3, worth a look rather than a failure):");
|
|
428
|
+
listSome(lines, findings.outOfOrder.map((jump) => `${jump.before.name || jump.before.tag} is reached before ` +
|
|
429
|
+
`${jump.after.name || jump.after.tag}, which sits to its left`));
|
|
430
|
+
lines.push("");
|
|
431
|
+
}
|
|
432
|
+
if (findings.unreachable.length > 0) {
|
|
433
|
+
lines.push("Behaves interactively but tab never reaches it:");
|
|
434
|
+
listSome(lines, findings.unreachable.map((item) => `${item.name || item.tag} (${item.tag.toLowerCase()}) ` +
|
|
435
|
+
`- ${item.because}`));
|
|
436
|
+
lines.push("");
|
|
437
|
+
}
|
|
438
|
+
if (findings.positiveTabindex.length > 0) {
|
|
439
|
+
lines.push("Positive tabindex, which pulls these ahead of everything else " +
|
|
440
|
+
"on the page:");
|
|
441
|
+
listSome(lines, findings.positiveTabindex.map((candidate) => `${candidate.name || candidate.tag} (tabindex ` +
|
|
442
|
+
`${candidate.tabindex})`));
|
|
443
|
+
lines.push("");
|
|
444
|
+
}
|
|
445
|
+
else if (findings.reordered) {
|
|
446
|
+
lines.push("The tab order does not follow the document order.", "");
|
|
447
|
+
}
|
|
448
|
+
if (findings.offscreen.length > 0) {
|
|
449
|
+
lines.push("Focused while off screen, so the page appears not to react:");
|
|
450
|
+
listSome(lines, findings.offscreen.map((stop) => stop.name || stop.tag));
|
|
451
|
+
lines.push("");
|
|
452
|
+
}
|
|
453
|
+
if (findings.missed.length > 0 &&
|
|
454
|
+
!findings.trap &&
|
|
455
|
+
!findings.modalHeldFocus) {
|
|
456
|
+
lines.push(findings.cappedAt === undefined
|
|
457
|
+
? `${findings.missed.length} focusable things were never reached:`
|
|
458
|
+
: `${findings.missed.length} focusable things were not visited ` +
|
|
459
|
+
`before the walk hit its ${findings.cappedAt}-stop budget. ` +
|
|
460
|
+
"Raise maxStops to walk the rest:");
|
|
461
|
+
listSome(lines, findings.missed.map((candidate) => candidate.name || candidate.tag));
|
|
462
|
+
lines.push("");
|
|
463
|
+
}
|
|
464
|
+
lines.push("The order tab took:");
|
|
465
|
+
for (const [at, stop] of firstPass.slice(0, MAX_LISTED_STOPS).entries()) {
|
|
466
|
+
const indicator = findings.indicators.get(stop.index);
|
|
467
|
+
const ring = indicator && indicator !== "none" ? "" : " [no ring]";
|
|
468
|
+
lines.push(` ${String(at + 1).padStart(2)}. ${stop.name || stop.tag}${ring}`);
|
|
469
|
+
}
|
|
470
|
+
if (firstPass.length > MAX_LISTED_STOPS) {
|
|
471
|
+
lines.push(` ... and ${firstPass.length - MAX_LISTED_STOPS} more.`);
|
|
472
|
+
}
|
|
473
|
+
// A trap or an unreachable control is a page a keyboard user
|
|
474
|
+
// cannot finish using, so those fail. An invisible ring or a
|
|
475
|
+
// rearranged order makes the page hard rather than impossible.
|
|
476
|
+
//
|
|
477
|
+
// A walk that ran out of budget has not finished looking, so
|
|
478
|
+
// what it did not reach is unvisited rather than unreachable.
|
|
479
|
+
// Counting those as failures made the tool's own limit read as
|
|
480
|
+
// the page's defect, and maxStops the shortest route to a
|
|
481
|
+
// fabricated critical verdict.
|
|
482
|
+
//
|
|
483
|
+
// A modal holding focus excludes the page behind it on purpose,
|
|
484
|
+
// so what it kept focus away from is neither missed nor a
|
|
485
|
+
// budget overrun.
|
|
486
|
+
const excused = findings.cappedAt !== undefined || findings.modalHeldFocus;
|
|
487
|
+
const failures = (findings.trap ? 1 : 0) +
|
|
488
|
+
findings.unreachable.length +
|
|
489
|
+
(excused ? 0 : findings.missed.length);
|
|
490
|
+
const warnings = findings.noIndicator.length +
|
|
491
|
+
findings.faintIndicator.length +
|
|
492
|
+
findings.offscreen.length +
|
|
493
|
+
findings.positiveTabindex.length +
|
|
494
|
+
(findings.reordered ? 1 : 0) +
|
|
495
|
+
// A walk that laps inside a modal always spends its whole
|
|
496
|
+
// budget and never reaches the page behind. The dialog was the
|
|
497
|
+
// limit, not the budget, so this is not something to raise.
|
|
498
|
+
(!findings.modalHeldFocus &&
|
|
499
|
+
findings.cappedAt !== undefined &&
|
|
500
|
+
findings.missed.length > 0
|
|
501
|
+
? 1
|
|
502
|
+
: 0);
|
|
503
|
+
return renderVerdict({
|
|
504
|
+
standing: standingFor({ failures, warnings }),
|
|
505
|
+
headline: headlineFor(findings, warnings),
|
|
506
|
+
measured,
|
|
507
|
+
}, lines.join("\n"));
|
|
508
|
+
}
|
|
509
|
+
/** Say the worst true thing about the walk, in one line. */
|
|
510
|
+
function headlineFor(findings, warnings) {
|
|
511
|
+
if (findings.trap) {
|
|
512
|
+
return findings.trap.escapeFreed
|
|
513
|
+
? "Focus is trapped, though Escape gets out."
|
|
514
|
+
: "Focus is trapped with no way out but a mouse.";
|
|
515
|
+
}
|
|
516
|
+
// Focus held inside a dialog is the pattern working. The
|
|
517
|
+
// background controls it excludes are what a modal is for, so
|
|
518
|
+
// they are neither missed nor a budget problem.
|
|
519
|
+
if (findings.modalHeldFocus) {
|
|
520
|
+
return ("A modal dialog is holding focus, which is correct. " +
|
|
521
|
+
`Tab cycles its ${findings.stops.length > 0 ? "controls" : "content"} ` +
|
|
522
|
+
"and does not reach the page behind it.");
|
|
523
|
+
}
|
|
524
|
+
if (findings.cappedAt !== undefined && findings.missed.length > 0) {
|
|
525
|
+
return (`The walk stopped at its ${findings.cappedAt}-stop budget with ` +
|
|
526
|
+
`${findings.missed.length} controls not yet visited.`);
|
|
527
|
+
}
|
|
528
|
+
// Two different faults, so they are counted and named
|
|
529
|
+
// separately. Summing them under one sentence reported "6 things
|
|
530
|
+
// can be operated but never focused" for a page with one such
|
|
531
|
+
// thing and five unvisited controls, and the report below it
|
|
532
|
+
// listed the one, so the headline argued with its own detail.
|
|
533
|
+
if (findings.unreachable.length > 0 && findings.missed.length > 0) {
|
|
534
|
+
return (`${count(findings.unreachable.length, "thing")} can be operated ` +
|
|
535
|
+
`but never focused, and ${count(findings.missed.length, "control")} ` +
|
|
536
|
+
`${wasWere(findings.missed.length)} never reached.`);
|
|
537
|
+
}
|
|
538
|
+
if (findings.unreachable.length > 0) {
|
|
539
|
+
return `${count(findings.unreachable.length, "thing")} can be operated but never focused.`;
|
|
540
|
+
}
|
|
541
|
+
if (findings.missed.length > 0) {
|
|
542
|
+
return (`${count(findings.missed.length, "control")} ` +
|
|
543
|
+
`${wasWere(findings.missed.length)} never reached.`);
|
|
544
|
+
}
|
|
545
|
+
if (warnings > 0) {
|
|
546
|
+
return warnings === 1
|
|
547
|
+
? "Every control was reached, but 1 stop is hard to follow."
|
|
548
|
+
: `Every control was reached, but ${warnings} stops are hard to follow.`;
|
|
549
|
+
}
|
|
550
|
+
// Only Tab was pressed, so this cannot claim the controls
|
|
551
|
+
// operate. Nor can it claim the visual order matches: the check
|
|
552
|
+
// that exists catches two controls side by side tabbed against
|
|
553
|
+
// the way they read, and deliberately declines the general
|
|
554
|
+
// question, because deciding whether a layout is meant to be
|
|
555
|
+
// read in rows or columns is not something geometry settles.
|
|
556
|
+
// Saying "in order, with focus visible" asserted both.
|
|
557
|
+
//
|
|
558
|
+
// Nor can it say the rings are visible. It once did, on the
|
|
559
|
+
// strength of the style changing on focus, which is a different
|
|
560
|
+
// claim wearing the same word: a ring one shade off its
|
|
561
|
+
// background changes the style and cannot be seen. Contrast is
|
|
562
|
+
// measured now, but only for outlines over a known surface, so
|
|
563
|
+
// "visible" would still be speaking for the shadows and
|
|
564
|
+
// see-through backgrounds this declines to judge. What is true
|
|
565
|
+
// of every control here is that focus does something visible to
|
|
566
|
+
// it, and the faint ones are listed above by name.
|
|
567
|
+
return "Tab reached every control, each with a focus indicator.";
|
|
568
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The page-side half of the keyboard walk.
|
|
3
|
+
*
|
|
4
|
+
* These ship as source strings because they declare helpers of
|
|
5
|
+
* their own, and the bundler renames every named inner binding
|
|
6
|
+
* through a wrapper the page has never heard of. A function
|
|
7
|
+
* handed over as a value would throw before it registered
|
|
8
|
+
* anything, silently.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Collect everything the browser will let focus land on, and
|
|
12
|
+
* remember what each looks like at rest.
|
|
13
|
+
*
|
|
14
|
+
* The list is deliberately built from the browser's own view: an
|
|
15
|
+
* element that is display:none or disabled is not focusable no
|
|
16
|
+
* matter what its markup says, and asking the computed style is
|
|
17
|
+
* the only way to know.
|
|
18
|
+
*/
|
|
19
|
+
export declare const WALK_COLLECT: string;
|
|
20
|
+
/**
|
|
21
|
+
* Read where focus is now.
|
|
22
|
+
*
|
|
23
|
+
* The index is looked up against the same array the collection
|
|
24
|
+
* pass stored, so identity is the element itself rather than a
|
|
25
|
+
* selector that might match twice.
|
|
26
|
+
*/
|
|
27
|
+
export declare const WALK_READ: string;
|
|
28
|
+
/**
|
|
29
|
+
* Remember where focus and the viewport were before the walk.
|
|
30
|
+
*
|
|
31
|
+
* The walk is one of the two reads that deliberately change the
|
|
32
|
+
* page, so it owes the caller the page it was handed back. Tab
|
|
33
|
+
* scrolls each stop into view, and the health digest runs the
|
|
34
|
+
* keyboard check before the visual and design ones, so a walk
|
|
35
|
+
* that leaves the page scrolled moves the ground under every
|
|
36
|
+
* measurement that follows it in the same run. Performance now
|
|
37
|
+
* runs ahead of the walk rather than behind it, for a related
|
|
38
|
+
* reason: the walk's own work was being measured as the page's.
|
|
39
|
+
*
|
|
40
|
+
* Paired with WALK_RESTORE below, which puts both back.
|
|
41
|
+
*/
|
|
42
|
+
export declare const WALK_REMEMBER = "(() => {\n\twindow.__walkOrigin = {\n\t\tel: document.activeElement,\n\t\tx: window.scrollX,\n\t\ty: window.scrollY,\n\t};\n\treturn true;\n})()";
|
|
43
|
+
/** Put focus and the scroll position back where the walk found them. */
|
|
44
|
+
export declare const WALK_RESTORE = "(() => {\n\tconst origin = window.__walkOrigin;\n\tif (document.activeElement && document.activeElement.blur) {\n\t\tdocument.activeElement.blur();\n\t}\n\tif (origin) {\n\t\tconst el = origin.el;\n\t\t// Refocusing only makes sense if it is still in the document\n\t\t// and could hold focus in the first place; body cannot.\n\t\tif (el && el.isConnected && typeof el.focus === \"function\" &&\n\t\t\tel !== document.body && el !== document.documentElement) {\n\t\t\ttry { el.focus({ preventScroll: true }); } catch { /* gone */ }\n\t\t}\n\t\twindow.scrollTo(origin.x, origin.y);\n\t}\n\twindow.__walkOrigin = undefined;\n\twindow.__walkCandidates = undefined;\n\treturn true;\n})()";
|