@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,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comparing two screenshots.
|
|
3
|
+
*
|
|
4
|
+
* The comparison itself is pixelmatch, which already handles the
|
|
5
|
+
* thing that makes naive diffing useless: antialiasing. Two
|
|
6
|
+
* renders of identical markup differ along every curved edge,
|
|
7
|
+
* and a tool that reports those has told you nothing while
|
|
8
|
+
* looking thorough.
|
|
9
|
+
*
|
|
10
|
+
* What is added here is the refusal to compare images of
|
|
11
|
+
* different sizes. Padding or cropping one to fit would produce
|
|
12
|
+
* a number, and the number would be a lie: everything below the
|
|
13
|
+
* join would read as changed. A page that got taller is a real
|
|
14
|
+
* result and deserves saying so.
|
|
15
|
+
*/
|
|
16
|
+
import { PNG } from "pngjs";
|
|
17
|
+
import { type Comparison, type Placed } from "./regions.js";
|
|
18
|
+
/**
|
|
19
|
+
* How different a pixel must be to count.
|
|
20
|
+
*
|
|
21
|
+
* pixelmatch's own scale, where zero matches exactly. This is a
|
|
22
|
+
* presentational choice: it decides what counts as a change, not
|
|
23
|
+
* what one is.
|
|
24
|
+
*/
|
|
25
|
+
export declare const MATCH_THRESHOLD = 0.1;
|
|
26
|
+
/** Read a PNG from bytes. */
|
|
27
|
+
export declare function readPng(bytes: Buffer): PNG;
|
|
28
|
+
/** What a diff produced, including the image of itself. */
|
|
29
|
+
export interface DiffResult {
|
|
30
|
+
readonly comparison: Comparison;
|
|
31
|
+
/** The diff image, when there was anything to draw. */
|
|
32
|
+
readonly image?: Buffer;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Compare two images and locate what changed.
|
|
36
|
+
*
|
|
37
|
+
* The diff image is only produced when something differs, since
|
|
38
|
+
* writing an empty overlay to disk for an unchanged page is a
|
|
39
|
+
* file somebody has to open to learn nothing.
|
|
40
|
+
*/
|
|
41
|
+
export declare function compareImages(baseline: PNG, current: PNG, elements?: readonly Placed[], options?: {
|
|
42
|
+
readonly threshold?: number;
|
|
43
|
+
readonly cell?: number;
|
|
44
|
+
readonly scale?: number;
|
|
45
|
+
}): DiffResult;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comparing two screenshots.
|
|
3
|
+
*
|
|
4
|
+
* The comparison itself is pixelmatch, which already handles the
|
|
5
|
+
* thing that makes naive diffing useless: antialiasing. Two
|
|
6
|
+
* renders of identical markup differ along every curved edge,
|
|
7
|
+
* and a tool that reports those has told you nothing while
|
|
8
|
+
* looking thorough.
|
|
9
|
+
*
|
|
10
|
+
* What is added here is the refusal to compare images of
|
|
11
|
+
* different sizes. Padding or cropping one to fit would produce
|
|
12
|
+
* a number, and the number would be a lie: everything below the
|
|
13
|
+
* join would read as changed. A page that got taller is a real
|
|
14
|
+
* result and deserves saying so.
|
|
15
|
+
*/
|
|
16
|
+
import pixelmatch from "pixelmatch";
|
|
17
|
+
import { PNG } from "pngjs";
|
|
18
|
+
import { attributeRegions, clusterRegions, } from "./regions.js";
|
|
19
|
+
/**
|
|
20
|
+
* How different a pixel must be to count.
|
|
21
|
+
*
|
|
22
|
+
* pixelmatch's own scale, where zero matches exactly. This is a
|
|
23
|
+
* presentational choice: it decides what counts as a change, not
|
|
24
|
+
* what one is.
|
|
25
|
+
*/
|
|
26
|
+
export const MATCH_THRESHOLD = 0.1;
|
|
27
|
+
/** Read a PNG from bytes. */
|
|
28
|
+
export function readPng(bytes) {
|
|
29
|
+
return PNG.sync.read(bytes);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Compare two images and locate what changed.
|
|
33
|
+
*
|
|
34
|
+
* The diff image is only produced when something differs, since
|
|
35
|
+
* writing an empty overlay to disk for an unchanged page is a
|
|
36
|
+
* file somebody has to open to learn nothing.
|
|
37
|
+
*/
|
|
38
|
+
export function compareImages(baseline, current, elements = [], options = {}) {
|
|
39
|
+
if (baseline.width !== current.width || baseline.height !== current.height) {
|
|
40
|
+
return {
|
|
41
|
+
comparison: {
|
|
42
|
+
kind: "incomparable",
|
|
43
|
+
because: `the baseline is ${baseline.width} by ${baseline.height} and ` +
|
|
44
|
+
`this one is ${current.width} by ${current.height}. A page ` +
|
|
45
|
+
"that changed size is a result in itself, so neither was " +
|
|
46
|
+
"cropped to fit.",
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const { width, height } = baseline;
|
|
51
|
+
const diff = new PNG({ width, height });
|
|
52
|
+
const changedPixels = pixelmatch(baseline.data, current.data, diff.data, width, height, { threshold: options.threshold ?? MATCH_THRESHOLD });
|
|
53
|
+
if (changedPixels === 0) {
|
|
54
|
+
return {
|
|
55
|
+
comparison: {
|
|
56
|
+
kind: "compared",
|
|
57
|
+
width,
|
|
58
|
+
height,
|
|
59
|
+
changedPixels: 0,
|
|
60
|
+
fraction: 0,
|
|
61
|
+
regions: [],
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// pixelmatch paints differing pixels red into the diff image,
|
|
66
|
+
// so the mask is read back out of what it drew rather than
|
|
67
|
+
// diffing a second time.
|
|
68
|
+
const changed = new Uint8Array(width * height);
|
|
69
|
+
for (let index = 0; index < changed.length; index += 1) {
|
|
70
|
+
const at = index * 4;
|
|
71
|
+
changed[index] =
|
|
72
|
+
diff.data[at] === 255 && (diff.data[at + 1] ?? 0) < 128 ? 1 : 0;
|
|
73
|
+
}
|
|
74
|
+
// A screenshot taken at device pixel ratio two is twice the
|
|
75
|
+
// size of the layout the elements were measured in, so region
|
|
76
|
+
// coordinates are brought back to CSS pixels before anything
|
|
77
|
+
// is attributed to an element.
|
|
78
|
+
const scale = options.scale ?? 1;
|
|
79
|
+
const regions = clusterRegions(changed, width, height, {
|
|
80
|
+
...(options.cell === undefined ? {} : { cell: options.cell }),
|
|
81
|
+
}).map((region) => scale === 1
|
|
82
|
+
? region
|
|
83
|
+
: {
|
|
84
|
+
...region,
|
|
85
|
+
x: Math.round(region.x / scale),
|
|
86
|
+
y: Math.round(region.y / scale),
|
|
87
|
+
width: Math.round(region.width / scale),
|
|
88
|
+
height: Math.round(region.height / scale),
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
comparison: {
|
|
92
|
+
kind: "compared",
|
|
93
|
+
width,
|
|
94
|
+
height,
|
|
95
|
+
changedPixels,
|
|
96
|
+
fraction: changedPixels / (width * height),
|
|
97
|
+
regions: attributeRegions(regions, elements),
|
|
98
|
+
},
|
|
99
|
+
image: PNG.sync.write(diff),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comparing a page against a baseline of itself.
|
|
3
|
+
*
|
|
4
|
+
* Only the region logic is exported here, and that is the point:
|
|
5
|
+
* it is pure, it works on any change mask whatever produced one,
|
|
6
|
+
* and importing it must not drag in a PNG decoder. Somebody
|
|
7
|
+
* clustering a diff they already have should not pay for
|
|
8
|
+
* pixelmatch and pngjs to do it.
|
|
9
|
+
*
|
|
10
|
+
* The image half lives in ./images.js and is imported directly
|
|
11
|
+
* by the session, which is already holding a browser open and
|
|
12
|
+
* has no purity left to protect.
|
|
13
|
+
*/
|
|
14
|
+
export { type BaselineProvenance, describeDrift, parse, sidecarFor, stringify, } from "./provenance.js";
|
|
15
|
+
export { type AttributedRegion, attributeRegions, CELL_SIZE, type Comparison, clusterRegions, IGNORABLE_FRACTION, MIN_REGION_PIXELS, type Placed, type Region, renderComparison, } from "./regions.js";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comparing a page against a baseline of itself.
|
|
3
|
+
*
|
|
4
|
+
* Only the region logic is exported here, and that is the point:
|
|
5
|
+
* it is pure, it works on any change mask whatever produced one,
|
|
6
|
+
* and importing it must not drag in a PNG decoder. Somebody
|
|
7
|
+
* clustering a diff they already have should not pay for
|
|
8
|
+
* pixelmatch and pngjs to do it.
|
|
9
|
+
*
|
|
10
|
+
* The image half lives in ./images.js and is imported directly
|
|
11
|
+
* by the session, which is already holding a browser open and
|
|
12
|
+
* has no purity left to protect.
|
|
13
|
+
*/
|
|
14
|
+
export { describeDrift, parse, sidecarFor, stringify, } from "./provenance.js";
|
|
15
|
+
export { attributeRegions, CELL_SIZE, clusterRegions, IGNORABLE_FRACTION, MIN_REGION_PIXELS, renderComparison, } from "./regions.js";
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a visual baseline was recorded under, and whether a later
|
|
3
|
+
* capture is comparable to it.
|
|
4
|
+
*
|
|
5
|
+
* A baseline is a claim about one page under one set of
|
|
6
|
+
* conditions. Without recording those conditions a comparison
|
|
7
|
+
* cannot tell a regression from a change of subject: record on
|
|
8
|
+
* the cart page, navigate to the checkout page, compare, and the
|
|
9
|
+
* diff reports confident failures attributed to the checkout
|
|
10
|
+
* page's elements. Image size alone cannot catch it, because two
|
|
11
|
+
* pages at the same viewport are the same size.
|
|
12
|
+
*
|
|
13
|
+
* Pure: the session captures the facts, this decides what they
|
|
14
|
+
* mean, and a capture from anywhere else works the same way.
|
|
15
|
+
*/
|
|
16
|
+
/** The conditions a baseline image was taken under. */
|
|
17
|
+
export interface BaselineProvenance {
|
|
18
|
+
/** The page the shot was of. */
|
|
19
|
+
readonly url: string;
|
|
20
|
+
/** Emulated viewport width, when one was set. */
|
|
21
|
+
readonly width?: number;
|
|
22
|
+
/** Emulated viewport height, when one was set. */
|
|
23
|
+
readonly height?: number;
|
|
24
|
+
/** Device pixel ratio the shot was rasterized at. */
|
|
25
|
+
readonly deviceScaleFactor: number;
|
|
26
|
+
}
|
|
27
|
+
/** Where the provenance for a baseline image lives. */
|
|
28
|
+
export declare function sidecarFor(baselinePath: string): string;
|
|
29
|
+
/** Serialize provenance for storage beside its image. */
|
|
30
|
+
export declare function stringify(provenance: BaselineProvenance): string;
|
|
31
|
+
/**
|
|
32
|
+
* Read provenance back, or undefined when there is none to read.
|
|
33
|
+
*
|
|
34
|
+
* Undefined is a real answer rather than a failure: baselines
|
|
35
|
+
* recorded before provenance existed have no sidecar, and
|
|
36
|
+
* discarding them would turn an upgrade into silent data loss.
|
|
37
|
+
*/
|
|
38
|
+
export declare function parse(text: string): BaselineProvenance | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* Say how a capture differs from the baseline's conditions, or
|
|
41
|
+
* undefined when the two are comparable.
|
|
42
|
+
*
|
|
43
|
+
* The message names both sides, because the useful next step
|
|
44
|
+
* differs completely depending on which one is wrong: a changed
|
|
45
|
+
* URL means the wrong baseline was named, and a changed viewport
|
|
46
|
+
* means the emulation drifted.
|
|
47
|
+
*/
|
|
48
|
+
export declare function describeDrift(was: BaselineProvenance, now: BaselineProvenance): string | undefined;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a visual baseline was recorded under, and whether a later
|
|
3
|
+
* capture is comparable to it.
|
|
4
|
+
*
|
|
5
|
+
* A baseline is a claim about one page under one set of
|
|
6
|
+
* conditions. Without recording those conditions a comparison
|
|
7
|
+
* cannot tell a regression from a change of subject: record on
|
|
8
|
+
* the cart page, navigate to the checkout page, compare, and the
|
|
9
|
+
* diff reports confident failures attributed to the checkout
|
|
10
|
+
* page's elements. Image size alone cannot catch it, because two
|
|
11
|
+
* pages at the same viewport are the same size.
|
|
12
|
+
*
|
|
13
|
+
* Pure: the session captures the facts, this decides what they
|
|
14
|
+
* mean, and a capture from anywhere else works the same way.
|
|
15
|
+
*/
|
|
16
|
+
/** Where the provenance for a baseline image lives. */
|
|
17
|
+
export function sidecarFor(baselinePath) {
|
|
18
|
+
return `${baselinePath}.json`;
|
|
19
|
+
}
|
|
20
|
+
/** Serialize provenance for storage beside its image. */
|
|
21
|
+
export function stringify(provenance) {
|
|
22
|
+
return `${JSON.stringify(provenance, null, "\t")}\n`;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Read provenance back, or undefined when there is none to read.
|
|
26
|
+
*
|
|
27
|
+
* Undefined is a real answer rather than a failure: baselines
|
|
28
|
+
* recorded before provenance existed have no sidecar, and
|
|
29
|
+
* discarding them would turn an upgrade into silent data loss.
|
|
30
|
+
*/
|
|
31
|
+
export function parse(text) {
|
|
32
|
+
try {
|
|
33
|
+
const raw = JSON.parse(text);
|
|
34
|
+
if (typeof raw !== "object" || raw === null)
|
|
35
|
+
return undefined;
|
|
36
|
+
const record = raw;
|
|
37
|
+
if (typeof record.url !== "string")
|
|
38
|
+
return undefined;
|
|
39
|
+
if (typeof record.deviceScaleFactor !== "number")
|
|
40
|
+
return undefined;
|
|
41
|
+
return {
|
|
42
|
+
url: record.url,
|
|
43
|
+
...(typeof record.width === "number" ? { width: record.width } : {}),
|
|
44
|
+
...(typeof record.height === "number" ? { height: record.height } : {}),
|
|
45
|
+
deviceScaleFactor: record.deviceScaleFactor,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// A truncated or hand-edited sidecar is not worth failing a
|
|
50
|
+
// comparison over. Treating it as absent falls back to the
|
|
51
|
+
// behaviour baselines had before provenance was recorded.
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** A viewport as it reads in a refusal. */
|
|
56
|
+
function viewportOf(provenance) {
|
|
57
|
+
const { width, height } = provenance;
|
|
58
|
+
if (width === undefined && height === undefined)
|
|
59
|
+
return "no set viewport";
|
|
60
|
+
return `${width ?? "auto"}x${height ?? "auto"}`;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Say how a capture differs from the baseline's conditions, or
|
|
64
|
+
* undefined when the two are comparable.
|
|
65
|
+
*
|
|
66
|
+
* The message names both sides, because the useful next step
|
|
67
|
+
* differs completely depending on which one is wrong: a changed
|
|
68
|
+
* URL means the wrong baseline was named, and a changed viewport
|
|
69
|
+
* means the emulation drifted.
|
|
70
|
+
*/
|
|
71
|
+
export function describeDrift(was, now) {
|
|
72
|
+
if (was.url !== now.url) {
|
|
73
|
+
return (`the baseline was recorded on ${was.url} and this is ` +
|
|
74
|
+
`${now.url}. Comparing two different pages would report ` +
|
|
75
|
+
"every difference between them as a regression.");
|
|
76
|
+
}
|
|
77
|
+
if (was.width !== now.width || was.height !== now.height) {
|
|
78
|
+
return (`the baseline was recorded at ${viewportOf(was)} and this is ` +
|
|
79
|
+
`${viewportOf(now)}. Re-record it, or set the viewport back.`);
|
|
80
|
+
}
|
|
81
|
+
if (was.deviceScaleFactor !== now.deviceScaleFactor) {
|
|
82
|
+
return (`the baseline was rasterized at ${was.deviceScaleFactor}x and ` +
|
|
83
|
+
`this is ${now.deviceScaleFactor}x. Every edge would differ.`);
|
|
84
|
+
}
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turning a field of changed pixels into places that changed.
|
|
3
|
+
*
|
|
4
|
+
* A pixel count is nearly useless on its own. Two hundred
|
|
5
|
+
* thousand differing pixels might be the whole page shifted by
|
|
6
|
+
* one row, or one image swapped, and those need opposite
|
|
7
|
+
* responses. What a person wants is where, and how many
|
|
8
|
+
* separate wheres there are.
|
|
9
|
+
*
|
|
10
|
+
* Regions are built on a coarse grid rather than by exact
|
|
11
|
+
* connected pixels, deliberately. Pixel-exact blobs split a
|
|
12
|
+
* single moved paragraph into one region per glyph; a grid of a
|
|
13
|
+
* few pixels joins them into the thing that actually moved.
|
|
14
|
+
*/
|
|
15
|
+
/** A changed area of the image, in pixels. */
|
|
16
|
+
export interface Region {
|
|
17
|
+
readonly x: number;
|
|
18
|
+
readonly y: number;
|
|
19
|
+
readonly width: number;
|
|
20
|
+
readonly height: number;
|
|
21
|
+
/** How many pixels inside it actually differ. */
|
|
22
|
+
readonly pixels: number;
|
|
23
|
+
}
|
|
24
|
+
/** How wide a grid cell is when grouping changes. */
|
|
25
|
+
export declare const CELL_SIZE = 8;
|
|
26
|
+
/** Regions smaller than this are noise, not a change. */
|
|
27
|
+
export declare const MIN_REGION_PIXELS = 4;
|
|
28
|
+
/**
|
|
29
|
+
* Group changed pixels into rectangles.
|
|
30
|
+
*
|
|
31
|
+
* `changed` is one entry per pixel, row-major, truthy where the
|
|
32
|
+
* two images differ. That shape is what an image diff produces
|
|
33
|
+
* and costs nothing to build from one.
|
|
34
|
+
*/
|
|
35
|
+
export declare function clusterRegions(changed: ArrayLike<number> | readonly boolean[], width: number, height: number, options?: {
|
|
36
|
+
readonly cell?: number;
|
|
37
|
+
readonly minPixels?: number;
|
|
38
|
+
}): readonly Region[];
|
|
39
|
+
/** An element, for saying what a changed region sits on. */
|
|
40
|
+
export interface Placed {
|
|
41
|
+
readonly selector: string;
|
|
42
|
+
readonly rect: {
|
|
43
|
+
readonly x: number;
|
|
44
|
+
readonly y: number;
|
|
45
|
+
readonly width: number;
|
|
46
|
+
readonly height: number;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** A region with the element it most likely belongs to. */
|
|
50
|
+
export interface AttributedRegion extends Region {
|
|
51
|
+
readonly selector?: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Say what each changed region sits on.
|
|
55
|
+
*
|
|
56
|
+
* The smallest element that fully contains the region wins,
|
|
57
|
+
* since every region is inside the body and saying so helps
|
|
58
|
+
* nobody. A region spanning two elements is left unattributed
|
|
59
|
+
* rather than blamed on their common ancestor: "something under
|
|
60
|
+
* main changed" is not an answer.
|
|
61
|
+
*/
|
|
62
|
+
export declare function attributeRegions(regions: readonly Region[], elements: readonly Placed[]): readonly AttributedRegion[];
|
|
63
|
+
/** What a comparison concluded. */
|
|
64
|
+
export type Comparison = {
|
|
65
|
+
readonly kind: "compared";
|
|
66
|
+
readonly width: number;
|
|
67
|
+
readonly height: number;
|
|
68
|
+
readonly changedPixels: number;
|
|
69
|
+
readonly fraction: number;
|
|
70
|
+
readonly regions: readonly AttributedRegion[];
|
|
71
|
+
} | {
|
|
72
|
+
readonly kind: "incomparable";
|
|
73
|
+
readonly because: string;
|
|
74
|
+
};
|
|
75
|
+
/** Below this share of the image, a change is worth ignoring. */
|
|
76
|
+
export declare const IGNORABLE_FRACTION = 0.0001;
|
|
77
|
+
/** Say what changed, and where. */
|
|
78
|
+
export declare function renderComparison(comparison: Comparison, artifacts?: readonly string[]): string;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turning a field of changed pixels into places that changed.
|
|
3
|
+
*
|
|
4
|
+
* A pixel count is nearly useless on its own. Two hundred
|
|
5
|
+
* thousand differing pixels might be the whole page shifted by
|
|
6
|
+
* one row, or one image swapped, and those need opposite
|
|
7
|
+
* responses. What a person wants is where, and how many
|
|
8
|
+
* separate wheres there are.
|
|
9
|
+
*
|
|
10
|
+
* Regions are built on a coarse grid rather than by exact
|
|
11
|
+
* connected pixels, deliberately. Pixel-exact blobs split a
|
|
12
|
+
* single moved paragraph into one region per glyph; a grid of a
|
|
13
|
+
* few pixels joins them into the thing that actually moved.
|
|
14
|
+
*/
|
|
15
|
+
import { renderVerdict } from "../audit/verdict.js";
|
|
16
|
+
/** How wide a grid cell is when grouping changes. */
|
|
17
|
+
export const CELL_SIZE = 8;
|
|
18
|
+
/** Regions smaller than this are noise, not a change. */
|
|
19
|
+
export const MIN_REGION_PIXELS = 4;
|
|
20
|
+
/**
|
|
21
|
+
* Group changed pixels into rectangles.
|
|
22
|
+
*
|
|
23
|
+
* `changed` is one entry per pixel, row-major, truthy where the
|
|
24
|
+
* two images differ. That shape is what an image diff produces
|
|
25
|
+
* and costs nothing to build from one.
|
|
26
|
+
*/
|
|
27
|
+
export function clusterRegions(changed, width, height, options = {}) {
|
|
28
|
+
const cell = options.cell ?? CELL_SIZE;
|
|
29
|
+
const minPixels = options.minPixels ?? MIN_REGION_PIXELS;
|
|
30
|
+
if (width <= 0 || height <= 0)
|
|
31
|
+
return [];
|
|
32
|
+
const across = Math.ceil(width / cell);
|
|
33
|
+
const down = Math.ceil(height / cell);
|
|
34
|
+
// One count per cell, so a region knows how much of it moved,
|
|
35
|
+
// and the true extent of the changed pixels inside it. The
|
|
36
|
+
// grid decides what groups together; it must not decide the
|
|
37
|
+
// bounds, or a region snapped out to cell edges stops fitting
|
|
38
|
+
// inside the element it belongs to and gets blamed on the body.
|
|
39
|
+
const counts = new Int32Array(across * down);
|
|
40
|
+
const leftOf = new Int32Array(across * down).fill(width);
|
|
41
|
+
const topOf = new Int32Array(across * down).fill(height);
|
|
42
|
+
const rightOf = new Int32Array(across * down).fill(-1);
|
|
43
|
+
const bottomOf = new Int32Array(across * down).fill(-1);
|
|
44
|
+
for (let y = 0; y < height; y += 1) {
|
|
45
|
+
for (let x = 0; x < width; x += 1) {
|
|
46
|
+
if (!changed[y * width + x])
|
|
47
|
+
continue;
|
|
48
|
+
const at = Math.floor(y / cell) * across + Math.floor(x / cell);
|
|
49
|
+
counts[at] += 1;
|
|
50
|
+
if (x < (leftOf[at] ?? width))
|
|
51
|
+
leftOf[at] = x;
|
|
52
|
+
if (y < (topOf[at] ?? height))
|
|
53
|
+
topOf[at] = y;
|
|
54
|
+
if (x > (rightOf[at] ?? -1))
|
|
55
|
+
rightOf[at] = x;
|
|
56
|
+
if (y > (bottomOf[at] ?? -1))
|
|
57
|
+
bottomOf[at] = y;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const seen = new Uint8Array(across * down);
|
|
61
|
+
const regions = [];
|
|
62
|
+
for (let index = 0; index < counts.length; index += 1) {
|
|
63
|
+
if (seen[index] || (counts[index] ?? 0) === 0)
|
|
64
|
+
continue;
|
|
65
|
+
// Flood fill across touching cells, diagonals included, so a
|
|
66
|
+
// change running at an angle stays one region.
|
|
67
|
+
const stack = [index];
|
|
68
|
+
seen[index] = 1;
|
|
69
|
+
let minX = width;
|
|
70
|
+
let minY = height;
|
|
71
|
+
let maxX = -1;
|
|
72
|
+
let maxY = -1;
|
|
73
|
+
let pixels = 0;
|
|
74
|
+
while (stack.length > 0) {
|
|
75
|
+
const at = stack.pop();
|
|
76
|
+
if (at === undefined)
|
|
77
|
+
continue;
|
|
78
|
+
const cellX = at % across;
|
|
79
|
+
const cellY = Math.floor(at / across);
|
|
80
|
+
pixels += counts[at] ?? 0;
|
|
81
|
+
minX = Math.min(minX, leftOf[at] ?? width);
|
|
82
|
+
minY = Math.min(minY, topOf[at] ?? height);
|
|
83
|
+
maxX = Math.max(maxX, rightOf[at] ?? -1);
|
|
84
|
+
maxY = Math.max(maxY, bottomOf[at] ?? -1);
|
|
85
|
+
for (let dy = -1; dy <= 1; dy += 1) {
|
|
86
|
+
for (let dx = -1; dx <= 1; dx += 1) {
|
|
87
|
+
const nx = cellX + dx;
|
|
88
|
+
const ny = cellY + dy;
|
|
89
|
+
if (nx < 0 || ny < 0 || nx >= across || ny >= down)
|
|
90
|
+
continue;
|
|
91
|
+
const next = ny * across + nx;
|
|
92
|
+
if (seen[next] || (counts[next] ?? 0) === 0)
|
|
93
|
+
continue;
|
|
94
|
+
seen[next] = 1;
|
|
95
|
+
stack.push(next);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (pixels < minPixels)
|
|
100
|
+
continue;
|
|
101
|
+
regions.push({
|
|
102
|
+
x: minX,
|
|
103
|
+
y: minY,
|
|
104
|
+
width: maxX - minX + 1,
|
|
105
|
+
height: maxY - minY + 1,
|
|
106
|
+
pixels,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// Biggest change first: it is the one most likely to matter.
|
|
110
|
+
return regions.sort((a, b) => b.pixels - a.pixels);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Whether an element covers a changed region.
|
|
114
|
+
*
|
|
115
|
+
* The element's box is rounded outward to the pixels it can
|
|
116
|
+
* paint into before comparing. A rect is fractional and a
|
|
117
|
+
* region is whole pixels, so an element starting at y=442.5
|
|
118
|
+
* paints row 442, and comparing the two raw numbers rejected it
|
|
119
|
+
* by half a pixel. Every change then fell through to the body,
|
|
120
|
+
* which is an answer that helps nobody.
|
|
121
|
+
*/
|
|
122
|
+
function contains(outer, region) {
|
|
123
|
+
return (region.x >= Math.floor(outer.x) &&
|
|
124
|
+
region.y >= Math.floor(outer.y) &&
|
|
125
|
+
region.x + region.width <= Math.ceil(outer.x + outer.width) &&
|
|
126
|
+
region.y + region.height <= Math.ceil(outer.y + outer.height));
|
|
127
|
+
}
|
|
128
|
+
function area(rect) {
|
|
129
|
+
return rect.width * rect.height;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Say what each changed region sits on.
|
|
133
|
+
*
|
|
134
|
+
* The smallest element that fully contains the region wins,
|
|
135
|
+
* since every region is inside the body and saying so helps
|
|
136
|
+
* nobody. A region spanning two elements is left unattributed
|
|
137
|
+
* rather than blamed on their common ancestor: "something under
|
|
138
|
+
* main changed" is not an answer.
|
|
139
|
+
*/
|
|
140
|
+
export function attributeRegions(regions, elements) {
|
|
141
|
+
return regions.map((region) => {
|
|
142
|
+
let best;
|
|
143
|
+
for (const element of elements) {
|
|
144
|
+
if (!contains(element.rect, region))
|
|
145
|
+
continue;
|
|
146
|
+
if (best === undefined || area(element.rect) < area(best.rect)) {
|
|
147
|
+
best = element;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return best === undefined ? region : { ...region, selector: best.selector };
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/** Below this share of the image, a change is worth ignoring. */
|
|
154
|
+
export const IGNORABLE_FRACTION = 0.0001;
|
|
155
|
+
/** How many regions to name before counting the rest. */
|
|
156
|
+
const MAX_NAMED_REGIONS = 8;
|
|
157
|
+
/** Say what changed, and where. */
|
|
158
|
+
export function renderComparison(comparison, artifacts = []) {
|
|
159
|
+
if (comparison.kind === "incomparable") {
|
|
160
|
+
return renderVerdict({
|
|
161
|
+
standing: "warn",
|
|
162
|
+
headline: "The two images cannot be compared.",
|
|
163
|
+
measured: comparison.because,
|
|
164
|
+
}, "");
|
|
165
|
+
}
|
|
166
|
+
const { changedPixels, fraction, regions, width, height } = comparison;
|
|
167
|
+
if (changedPixels === 0) {
|
|
168
|
+
return renderVerdict({
|
|
169
|
+
standing: "pass",
|
|
170
|
+
headline: "Identical to the baseline.",
|
|
171
|
+
measured: `Compared every pixel of ${width} by ${height}.`,
|
|
172
|
+
}, "");
|
|
173
|
+
}
|
|
174
|
+
const percent = (fraction * 100).toFixed(fraction < 0.001 ? 4 : 2);
|
|
175
|
+
const noise = fraction < IGNORABLE_FRACTION;
|
|
176
|
+
const lines = [];
|
|
177
|
+
for (const region of regions.slice(0, MAX_NAMED_REGIONS)) {
|
|
178
|
+
const where = region.selector ? ` ${region.selector}` : "";
|
|
179
|
+
lines.push(` ${region.width} by ${region.height} at ` +
|
|
180
|
+
`(${region.x}, ${region.y}), ${region.pixels} pixels${where}`);
|
|
181
|
+
}
|
|
182
|
+
if (regions.length > MAX_NAMED_REGIONS) {
|
|
183
|
+
lines.push(` ... and ${regions.length - MAX_NAMED_REGIONS} more regions`);
|
|
184
|
+
}
|
|
185
|
+
if (artifacts.length > 0) {
|
|
186
|
+
lines.push("", ...artifacts);
|
|
187
|
+
}
|
|
188
|
+
return renderVerdict({
|
|
189
|
+
// A change too small to see is worth a warning rather than
|
|
190
|
+
// a failure: it is usually the renderer, not the page.
|
|
191
|
+
standing: noise ? "warn" : "fail",
|
|
192
|
+
headline: regions.length === 0
|
|
193
|
+
? // Clustering drops anything under a few pixels, while
|
|
194
|
+
// the changed count keeps them, so a change scattered
|
|
195
|
+
// thinly across the image used to render a failure
|
|
196
|
+
// headline over an empty body: nowhere to look and
|
|
197
|
+
// nothing to do.
|
|
198
|
+
`${changedPixels} pixels differ, ${percent} percent of ` +
|
|
199
|
+
"the image, too scattered to gather into a region."
|
|
200
|
+
: `${changedPixels} pixels differ, ${percent} percent of the ` +
|
|
201
|
+
`image, across ${regions.length} ` +
|
|
202
|
+
`${regions.length === 1 ? "region" : "separate regions"}.`,
|
|
203
|
+
measured: noise
|
|
204
|
+
? "That is small enough to be rendering noise rather than a change."
|
|
205
|
+
: regions.length === 0
|
|
206
|
+
? `Compared every pixel of ${width} by ${height}. Look at ` +
|
|
207
|
+
"the diff image below; single-pixel differences spread " +
|
|
208
|
+
"over an image are usually a font or antialiasing change."
|
|
209
|
+
: `Compared every pixel of ${width} by ${height}.`,
|
|
210
|
+
}, lines.join("\n"));
|
|
211
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cookie extraction: reads encrypted cookies from the local
|
|
3
|
+
* Chrome profile, decrypts them, and returns puppeteer-compatible
|
|
4
|
+
* cookie objects.
|
|
5
|
+
*
|
|
6
|
+
* Handles __Host- prefix cookies and correct domain matching
|
|
7
|
+
* per RFC 6265.
|
|
8
|
+
*/
|
|
9
|
+
/** Cookie in puppeteer-compatible format. */
|
|
10
|
+
export interface PuppeteerCookie {
|
|
11
|
+
name: string;
|
|
12
|
+
value: string;
|
|
13
|
+
domain: string;
|
|
14
|
+
path: string;
|
|
15
|
+
expires: number;
|
|
16
|
+
httpOnly: boolean;
|
|
17
|
+
secure: boolean;
|
|
18
|
+
sameSite?: "Strict" | "Lax" | "None";
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Read Chrome cookies for a URL, decrypt them, and return in
|
|
22
|
+
* puppeteer-compatible format. Returns an empty array if the key
|
|
23
|
+
* hasn't been set up, the profile can't be found, or decryption
|
|
24
|
+
* fails.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getCookiesForUrl(url: string): Promise<PuppeteerCookie[]>;
|