@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,357 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which change a call is about, when the caller did not say.
|
|
3
|
+
*
|
|
4
|
+
* Every review tool used to demand a change on every call, so
|
|
5
|
+
* reading a diff and then its threads meant naming the same
|
|
6
|
+
* pull request twice, and the second naming was where typos
|
|
7
|
+
* lived. A session attaches to what it is working on instead,
|
|
8
|
+
* and a call without a change acts on that.
|
|
9
|
+
*
|
|
10
|
+
* The rule is the browser integration's, because it was learned
|
|
11
|
+
* the same way and there is no reason for two answers to the
|
|
12
|
+
* same question. What differs is only the vocabulary: sessions
|
|
13
|
+
* are opened and changes are attached.
|
|
14
|
+
*/
|
|
15
|
+
import { mkdir, readdir, readFile, rm, stat, writeFile, } from "node:fs/promises";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { changeKey } from "./keys.js";
|
|
18
|
+
/**
|
|
19
|
+
* Carry one session's attachments into another.
|
|
20
|
+
*
|
|
21
|
+
* For a fork, which is the same work continued under a new session
|
|
22
|
+
* id. Scoping attachments by session is what stopped one session
|
|
23
|
+
* retargeting another's round, and it made a fork start with nothing
|
|
24
|
+
* attached, so the first call after one either refused for want of a
|
|
25
|
+
* change or acted on whatever was named by hand. Neither is what
|
|
26
|
+
* forking means.
|
|
27
|
+
*
|
|
28
|
+
* A copy rather than a move: the session forked from is still there
|
|
29
|
+
* and still working on what it was working on.
|
|
30
|
+
*
|
|
31
|
+
* Never overwrites a change the fork already holds, and carried ones
|
|
32
|
+
* are attached oldest first, so the parent's order survives and
|
|
33
|
+
* anything the fork attaches afterwards outranks all of it. That
|
|
34
|
+
* ordering is the point rather than a detail: `changeInPlay` takes the
|
|
35
|
+
* most recent when a call names nothing, so an inherited change
|
|
36
|
+
* outranking what this session just said it was working on would act
|
|
37
|
+
* on the wrong one and announce it as the most recent.
|
|
38
|
+
*
|
|
39
|
+
* Written through the store's own `attach`, so the record's shape and
|
|
40
|
+
* the sequence rule stay in one place. Reading through a store and
|
|
41
|
+
* writing around it is how two spellings of one format come about.
|
|
42
|
+
*
|
|
43
|
+
* Awaited at session start, unlike the reclamations it sits beside.
|
|
44
|
+
* Those are about the machine; this is about the answer to the next
|
|
45
|
+
* call, and a fork whose first review call lands before the copy
|
|
46
|
+
* finishes sees the refusal this exists to prevent.
|
|
47
|
+
*
|
|
48
|
+
* Advisory in what it reads: what it cannot read it does not carry,
|
|
49
|
+
* and nothing about a fork fails over it.
|
|
50
|
+
*
|
|
51
|
+
* Returns how many were carried.
|
|
52
|
+
*/
|
|
53
|
+
export async function inheritAttachments(root, from, to) {
|
|
54
|
+
// Reading and writing one directory, where every name collides with
|
|
55
|
+
// itself, is a way to lose an attachment rather than keep one.
|
|
56
|
+
if (safeName(from) === safeName(to))
|
|
57
|
+
return 0;
|
|
58
|
+
const parent = createAttachmentStore(root, from);
|
|
59
|
+
const fork = createAttachmentStore(root, to);
|
|
60
|
+
let held;
|
|
61
|
+
let mine;
|
|
62
|
+
try {
|
|
63
|
+
held = await parent.list();
|
|
64
|
+
mine = await fork.list();
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// An unreadable directory carries nothing. An attachment is a
|
|
68
|
+
// convenience and never the record of anything.
|
|
69
|
+
return 0;
|
|
70
|
+
}
|
|
71
|
+
const already = new Set(mine.map((one) => changeKey(one.change)));
|
|
72
|
+
// Newest first, as `list` answers, since each one goes below the
|
|
73
|
+
// last: the parent's order comes out the same way up.
|
|
74
|
+
const carrying = held.filter((one) => !already.has(changeKey(one.change)));
|
|
75
|
+
let carried = 0;
|
|
76
|
+
for (const one of carrying) {
|
|
77
|
+
try {
|
|
78
|
+
await fork.inherit(one.change);
|
|
79
|
+
carried += 1;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// One that cannot be written is one the fork attaches again
|
|
83
|
+
// by hand, which is a smaller loss than a fork that fails to
|
|
84
|
+
// start over a convenience.
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return carried;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Give back the directories of sessions that have stopped using them.
|
|
91
|
+
*
|
|
92
|
+
* Scoping attachments per session means one directory per session for
|
|
93
|
+
* as long as the state directory lives, so something has to take them
|
|
94
|
+
* back. Age is judged on the newest attachment inside, not on the
|
|
95
|
+
* directory itself: a directory's timestamp moves when an entry is
|
|
96
|
+
* added or removed and stands still when one is rewritten in place, so
|
|
97
|
+
* a session that keeps freshening the same change would age as though
|
|
98
|
+
* nobody had touched it. The one asking is never swept regardless,
|
|
99
|
+
* because a long-lived session attaches its work once and then only
|
|
100
|
+
* reads it, which is exactly the shape an age rule mistakes for
|
|
101
|
+
* abandonment.
|
|
102
|
+
*
|
|
103
|
+
* Files are left alone. Attachments made before scoping existed sit
|
|
104
|
+
* flat in the root and belong to no session, so no session's rule
|
|
105
|
+
* should decide their fate; deleting somebody's attachment to tidy up
|
|
106
|
+
* is a poor trade for the disk it returns. They cost bytes and are
|
|
107
|
+
* invisible to every scoped caller.
|
|
108
|
+
*
|
|
109
|
+
* Putting them on this clock was tried and taken back out. An orphan
|
|
110
|
+
* is by definition a file nothing has written since scoping landed, so
|
|
111
|
+
* judging one by its own age gives no grace to the population it
|
|
112
|
+
* targets: on any machine where scoping shipped a month ago, every one
|
|
113
|
+
* of them goes on the first session start after the sweep ships. A
|
|
114
|
+
* month of grace that protects nobody it was written for is not an
|
|
115
|
+
* argument, and eighty kilobytes is not a reason to go looking for a
|
|
116
|
+
* better one.
|
|
117
|
+
*
|
|
118
|
+
* An empty directory is swept, since it holds nothing anybody can
|
|
119
|
+
* lose.
|
|
120
|
+
*
|
|
121
|
+
* Returns how many were taken back.
|
|
122
|
+
*/
|
|
123
|
+
export async function pruneAttachments(root, options) {
|
|
124
|
+
let entries;
|
|
125
|
+
try {
|
|
126
|
+
entries = await readdir(root, { withFileTypes: true });
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// Nothing has ever been attached, so there is nothing to reclaim.
|
|
130
|
+
return 0;
|
|
131
|
+
}
|
|
132
|
+
const cutoff = Date.now() - options.olderThanMs;
|
|
133
|
+
// Through the same rewriting the store used to build the directory
|
|
134
|
+
// name, or a session whose id holds a character a path cannot carry
|
|
135
|
+
// would fail to match its own and be swept by the sweep that
|
|
136
|
+
// promises never to touch it.
|
|
137
|
+
const mine = options.keep === undefined ? undefined : safeName(options.keep);
|
|
138
|
+
let taken = 0;
|
|
139
|
+
for (const entry of entries) {
|
|
140
|
+
if (!entry.isDirectory())
|
|
141
|
+
continue;
|
|
142
|
+
if (entry.name === mine)
|
|
143
|
+
continue;
|
|
144
|
+
const path = join(root, entry.name);
|
|
145
|
+
try {
|
|
146
|
+
if ((await newestWithin(path)) > cutoff)
|
|
147
|
+
continue;
|
|
148
|
+
await rm(path, { recursive: true, force: true });
|
|
149
|
+
taken += 1;
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// Another session may be writing here, or may have removed it
|
|
153
|
+
// already. Reclaiming disk is advisory: what it cannot take
|
|
154
|
+
// back this time it will find again next time.
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return taken;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* When anything in this directory was last written.
|
|
161
|
+
*
|
|
162
|
+
* Zero for one holding nothing, which reads as long ago and is right:
|
|
163
|
+
* an empty directory has nothing to lose.
|
|
164
|
+
*/
|
|
165
|
+
async function newestWithin(path) {
|
|
166
|
+
const names = await readdir(path);
|
|
167
|
+
let newest = 0;
|
|
168
|
+
for (const name of names) {
|
|
169
|
+
try {
|
|
170
|
+
newest = Math.max(newest, (await stat(join(path, name))).mtimeMs);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// Removed while being read, by another session's sweep or its
|
|
174
|
+
// own detach. It cannot be the newest thing here if it is
|
|
175
|
+
// already gone.
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return newest;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* File name for an attachment.
|
|
182
|
+
*
|
|
183
|
+
* Keyed by the provider-scoped change key rather than the label,
|
|
184
|
+
* because a label is for people: two systems can spell the same
|
|
185
|
+
* repo differently, and a label carrying a slash or a pair of
|
|
186
|
+
* dots would otherwise name a path outside the store. The key is
|
|
187
|
+
* hashed to a flat name for the same reason.
|
|
188
|
+
*/
|
|
189
|
+
function fileFor(change) {
|
|
190
|
+
return `${safeName(changeKey(change))}.json`;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* One path segment, from a name that came from somewhere else.
|
|
194
|
+
*
|
|
195
|
+
* A change key or a session id is whatever the provider or the host
|
|
196
|
+
* chose, so one carrying a slash or a pair of dots would name a path
|
|
197
|
+
* outside the store.
|
|
198
|
+
*/
|
|
199
|
+
function safeName(name) {
|
|
200
|
+
const safe = name.replace(/[^A-Za-z0-9._-]/g, "_").replace(/^\.+/, "_");
|
|
201
|
+
return safe === "" ? "_" : safe;
|
|
202
|
+
}
|
|
203
|
+
/** Read one attachment, or nothing when it is unreadable. */
|
|
204
|
+
async function readAttachment(path) {
|
|
205
|
+
try {
|
|
206
|
+
const parsed = JSON.parse(await readFile(path, "utf8"));
|
|
207
|
+
if (typeof parsed !== "object" ||
|
|
208
|
+
parsed === null ||
|
|
209
|
+
!("change" in parsed) ||
|
|
210
|
+
!("attachedAt" in parsed) ||
|
|
211
|
+
typeof parsed.seq !== "number") {
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
214
|
+
return parsed;
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
// An attachment is a convenience, never the record of
|
|
218
|
+
// anything. A file half-written by a kill, or left by an
|
|
219
|
+
// older shape of this type, should cost the reader nothing:
|
|
220
|
+
// they attach again and carry on.
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Attachments on disk, one flat directory of JSON files.
|
|
226
|
+
*
|
|
227
|
+
* The same idiom as the draft store, and for the same reasons:
|
|
228
|
+
* legible to somebody who goes looking, cheap to list, and with
|
|
229
|
+
* no index that can fall out of step with the files it claims to
|
|
230
|
+
* describe.
|
|
231
|
+
*/
|
|
232
|
+
export function createAttachmentStore(root, sessionId) {
|
|
233
|
+
// One directory per session. What a session is working on is a fact
|
|
234
|
+
// about that session, and keeping every session's answer in one
|
|
235
|
+
// place made the newest of them everybody's: a round in one session
|
|
236
|
+
// was silently retargeted by another session attaching its own work,
|
|
237
|
+
// and the judge that followed consolidated a different repository's
|
|
238
|
+
// council while reporting success. Two sessions attached to the same
|
|
239
|
+
// change also need their own file, or detaching in one detaches in
|
|
240
|
+
// the other.
|
|
241
|
+
//
|
|
242
|
+
// Required, with no unscoped branch to fall into. It used to be
|
|
243
|
+
// optional, on the reasoning that a caller with no session cannot be
|
|
244
|
+
// racing one, and the caller that had no session id to give was the
|
|
245
|
+
// one that raced: it passed undefined every time and every session
|
|
246
|
+
// shared this root. A caller with nothing better to say can pass
|
|
247
|
+
// anything stable and unique to itself, which is a decision it can
|
|
248
|
+
// make and this cannot.
|
|
249
|
+
const mine = join(root, safeName(sessionId));
|
|
250
|
+
/** One attachment on disk, at the position it was given. */
|
|
251
|
+
async function write(change, seq) {
|
|
252
|
+
await mkdir(mine, { recursive: true });
|
|
253
|
+
const record = {
|
|
254
|
+
change,
|
|
255
|
+
attachedAt: new Date().toISOString(),
|
|
256
|
+
seq,
|
|
257
|
+
};
|
|
258
|
+
await writeFile(join(mine, fileFor(change)), JSON.stringify(record, null, 2), "utf8");
|
|
259
|
+
}
|
|
260
|
+
return {
|
|
261
|
+
async attach(change) {
|
|
262
|
+
const held = await this.list();
|
|
263
|
+
const highest = held.reduce((max, a) => Math.max(max, a.seq), 0);
|
|
264
|
+
await write(change, highest + 1);
|
|
265
|
+
},
|
|
266
|
+
async inherit(change) {
|
|
267
|
+
// Below the lowest rather than above the highest, and below
|
|
268
|
+
// zero once nothing is lower. The counter only has to climb
|
|
269
|
+
// within a session for the order to mean what it says, and
|
|
270
|
+
// what a fork inherits happened before the session began.
|
|
271
|
+
const held = await this.list();
|
|
272
|
+
const lowest = held.reduce((min, a) => Math.min(min, a.seq), 1);
|
|
273
|
+
await write(change, lowest - 1);
|
|
274
|
+
},
|
|
275
|
+
async detach(label) {
|
|
276
|
+
const found = (await this.list()).find((a) => a.change.label === label);
|
|
277
|
+
if (!found)
|
|
278
|
+
return false;
|
|
279
|
+
await rm(join(mine, fileFor(found.change)), { force: true });
|
|
280
|
+
return true;
|
|
281
|
+
},
|
|
282
|
+
async list() {
|
|
283
|
+
let names;
|
|
284
|
+
try {
|
|
285
|
+
names = await readdir(mine);
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
// Nothing has been attached yet, so there is no
|
|
289
|
+
// directory. That is not a failure to report.
|
|
290
|
+
return [];
|
|
291
|
+
}
|
|
292
|
+
const read = await Promise.all(names
|
|
293
|
+
.filter((name) => name.endsWith(".json"))
|
|
294
|
+
.map((name) => readAttachment(join(mine, name))));
|
|
295
|
+
return read
|
|
296
|
+
.filter((a) => a !== undefined)
|
|
297
|
+
.sort((a, b) => b.seq - a.seq);
|
|
298
|
+
},
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Which attached change a call should act on.
|
|
303
|
+
*
|
|
304
|
+
* An explicit name is never second-guessed: somebody who names a
|
|
305
|
+
* change means that change, and a typo is better reported than
|
|
306
|
+
* quietly redirected to whatever else happens to be attached.
|
|
307
|
+
*
|
|
308
|
+
* With nothing named, one attached change is used and said out
|
|
309
|
+
* loud, so the reader knows what was read or written. Several
|
|
310
|
+
* stay a refusal rather than a guess, because acting on the
|
|
311
|
+
* wrong change is worse than being asked which one, and the
|
|
312
|
+
* hint only breaks that tie when it points at something actually
|
|
313
|
+
* attached.
|
|
314
|
+
*/
|
|
315
|
+
export function changeInPlay(asked, hint, attached) {
|
|
316
|
+
if (asked !== undefined)
|
|
317
|
+
return { label: asked };
|
|
318
|
+
if (hint !== undefined && attached.includes(hint))
|
|
319
|
+
return { label: hint };
|
|
320
|
+
const [newest, ...rest] = attached;
|
|
321
|
+
if (newest === undefined)
|
|
322
|
+
return { candidates: attached };
|
|
323
|
+
if (rest.length === 0) {
|
|
324
|
+
return {
|
|
325
|
+
label: newest,
|
|
326
|
+
note: `Using ${newest}, the only change attached.`,
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
// Recency settles it, because attaching a change is how you say what you
|
|
330
|
+
// are working on now. This used to refuse whenever two were attached, on
|
|
331
|
+
// the grounds that choosing could report on the wrong change, and the
|
|
332
|
+
// result was worse than the risk: a second attachment paralysed every
|
|
333
|
+
// tool, and the way out was to detach something. Meanwhile `attach`
|
|
334
|
+
// promised that later calls could leave the change out, and the listing
|
|
335
|
+
// promised newest first, and the store had kept a monotonic sequence all
|
|
336
|
+
// along for exactly this. Three claims that only a rule like this makes
|
|
337
|
+
// true.
|
|
338
|
+
//
|
|
339
|
+
// Said out loud every time, and it names the others, because the whole
|
|
340
|
+
// objection to choosing was silence rather than choice: a person who
|
|
341
|
+
// meant the other one has to be told which was taken and that the rest
|
|
342
|
+
// are still there.
|
|
343
|
+
return {
|
|
344
|
+
label: newest,
|
|
345
|
+
note: `Using ${newest}, attached most recently. Also attached: ${rest.join(", ")}. Name a change to act on one of those instead.`,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
/** Say what to choose between, when the choice cannot be made here. */
|
|
349
|
+
export function chooseChange(candidates) {
|
|
350
|
+
if (candidates.length === 0) {
|
|
351
|
+
return ("No change is attached. Run review attach with a change, or a " +
|
|
352
|
+
"base and head, and everything after it will act on that.");
|
|
353
|
+
}
|
|
354
|
+
return (`Several changes are attached: ${candidates.join(", ")}. Name the ` +
|
|
355
|
+
"one to act on, since choosing for you could report on the wrong " +
|
|
356
|
+
"change.");
|
|
357
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether an authoring intent will work here, asked before trying.
|
|
3
|
+
*
|
|
4
|
+
* Reviewing degrades gracefully: a comment that cannot anchor becomes
|
|
5
|
+
* prose and the reader still gets the remark. Authoring does not. A
|
|
6
|
+
* retarget that means something different on this backend moves changes
|
|
7
|
+
* nobody asked to move, and a push to a change sitting in a merge queue
|
|
8
|
+
* ejects it and everything batched with it. The cheap moment to find
|
|
9
|
+
* out is before the call, not from a rejected request.
|
|
10
|
+
*
|
|
11
|
+
* So this answers three things rather than one: whether it will work,
|
|
12
|
+
* why not, and what to do instead. The third is what makes a refusal
|
|
13
|
+
* useful. A caller told only that something is unsupported has to go
|
|
14
|
+
* and read a CLI's help to find the door that is open, and every
|
|
15
|
+
* difference encoded here was found by doing exactly that.
|
|
16
|
+
*/
|
|
17
|
+
import type { AuthoringCapabilities, PersonForm } from "./capabilities.js";
|
|
18
|
+
import { type QueueState } from "./queue.js";
|
|
19
|
+
/** Something a caller wants to do to a proposal. */
|
|
20
|
+
export interface AuthoringIntent {
|
|
21
|
+
kind: "propose" | "propose-stack"
|
|
22
|
+
/**
|
|
23
|
+
* Changing a change's own text: title, body, labels, assignees.
|
|
24
|
+
*
|
|
25
|
+
* Kept apart from `retarget` because only moving the base is a
|
|
26
|
+
* retarget, and conflating them refused a title change on a
|
|
27
|
+
* backend where retargeting happens to be a stack operation.
|
|
28
|
+
*/
|
|
29
|
+
| "edit" | "retarget" | "set-draft" | "close" | "reopen" | "merge" | "request-reviewers"
|
|
30
|
+
/**
|
|
31
|
+
* Asking CI to run again.
|
|
32
|
+
*
|
|
33
|
+
* Not in {@link MUTATES}: a rerun starts a build, it does not
|
|
34
|
+
* move the branch or the base, so it does not eject a change
|
|
35
|
+
* from a merge queue the way an edit or a retarget does.
|
|
36
|
+
*/
|
|
37
|
+
| "rerun-checks";
|
|
38
|
+
/** Naming reviewers as part of proposing. */
|
|
39
|
+
withReviewers?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Where the change stands with a merge queue, read from the
|
|
42
|
+
* proposal rather than decided by the caller.
|
|
43
|
+
*
|
|
44
|
+
* This was a boolean, and a boolean was wrong twice over. Nothing
|
|
45
|
+
* ever set it, so the refusal below could not be reached; and it
|
|
46
|
+
* could not tell a change batched with fifty others from one being
|
|
47
|
+
* tested alone, which is the whole difference between an expensive
|
|
48
|
+
* mistake and a cheap one.
|
|
49
|
+
*/
|
|
50
|
+
queue?: QueueState;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Whether it will work, and what to do instead when it will not.
|
|
54
|
+
*
|
|
55
|
+
* The permitted arm carries an optional `caution`, for the case that is
|
|
56
|
+
* neither safe nor refusable: a backend that has a merge queue and could
|
|
57
|
+
* not tell us where this change stands in it. Refusing would make every
|
|
58
|
+
* unreachable queue a read-only backend, and permitting silently hands
|
|
59
|
+
* somebody an expensive mistake with no warning. So it is permitted, out
|
|
60
|
+
* loud, and the confirmation gate is where a person decides.
|
|
61
|
+
*/
|
|
62
|
+
export type Offerable = {
|
|
63
|
+
ok: true;
|
|
64
|
+
caution?: string;
|
|
65
|
+
} | {
|
|
66
|
+
ok: false;
|
|
67
|
+
reason: string;
|
|
68
|
+
instead?: string;
|
|
69
|
+
};
|
|
70
|
+
/** Whether this provider will accept this intent, and what to say. */
|
|
71
|
+
/**
|
|
72
|
+
* Whether any of these are not the form the backend names people in.
|
|
73
|
+
*
|
|
74
|
+
* A phrase naming the offenders and the form wanted, or undefined when
|
|
75
|
+
* every one of them will do. Checked before the request, because a
|
|
76
|
+
* backend that refuses an assignee on the create route refuses it after
|
|
77
|
+
* the change exists.
|
|
78
|
+
*
|
|
79
|
+
* Nothing is translated. A login cannot be turned into an email without
|
|
80
|
+
* asking somebody who knows, and guessing one from the other is how a
|
|
81
|
+
* change gets assigned to a person who does not exist.
|
|
82
|
+
*/
|
|
83
|
+
export declare function misnamedPeople(who: string[], form: PersonForm): string | undefined;
|
|
84
|
+
export declare function offerable(intent: AuthoringIntent, capabilities: AuthoringCapabilities | undefined, providerId: string): Offerable;
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether an authoring intent will work here, asked before trying.
|
|
3
|
+
*
|
|
4
|
+
* Reviewing degrades gracefully: a comment that cannot anchor becomes
|
|
5
|
+
* prose and the reader still gets the remark. Authoring does not. A
|
|
6
|
+
* retarget that means something different on this backend moves changes
|
|
7
|
+
* nobody asked to move, and a push to a change sitting in a merge queue
|
|
8
|
+
* ejects it and everything batched with it. The cheap moment to find
|
|
9
|
+
* out is before the call, not from a rejected request.
|
|
10
|
+
*
|
|
11
|
+
* So this answers three things rather than one: whether it will work,
|
|
12
|
+
* why not, and what to do instead. The third is what makes a refusal
|
|
13
|
+
* useful. A caller told only that something is unsupported has to go
|
|
14
|
+
* and read a CLI's help to find the door that is open, and every
|
|
15
|
+
* difference encoded here was found by doing exactly that.
|
|
16
|
+
*/
|
|
17
|
+
import { queueRefusal } from "./queue.js";
|
|
18
|
+
/**
|
|
19
|
+
* Intents that change the change itself.
|
|
20
|
+
*
|
|
21
|
+
* Merging is deliberately absent: a queue exists to merge things, so
|
|
22
|
+
* merging is not a mutation the queue objects to. Closing is absent for
|
|
23
|
+
* the same reason a queue does not care, and because a caller closing
|
|
24
|
+
* an enqueued change has already decided.
|
|
25
|
+
*/
|
|
26
|
+
const MUTATES = new Set([
|
|
27
|
+
"edit",
|
|
28
|
+
"retarget",
|
|
29
|
+
"set-draft",
|
|
30
|
+
]);
|
|
31
|
+
/** Whether this provider will accept this intent, and what to say. */
|
|
32
|
+
/**
|
|
33
|
+
* Whether any of these are not the form the backend names people in.
|
|
34
|
+
*
|
|
35
|
+
* A phrase naming the offenders and the form wanted, or undefined when
|
|
36
|
+
* every one of them will do. Checked before the request, because a
|
|
37
|
+
* backend that refuses an assignee on the create route refuses it after
|
|
38
|
+
* the change exists.
|
|
39
|
+
*
|
|
40
|
+
* Nothing is translated. A login cannot be turned into an email without
|
|
41
|
+
* asking somebody who knows, and guessing one from the other is how a
|
|
42
|
+
* change gets assigned to a person who does not exist.
|
|
43
|
+
*/
|
|
44
|
+
export function misnamedPeople(who, form) {
|
|
45
|
+
if (form === "unknown" || who.length === 0)
|
|
46
|
+
return undefined;
|
|
47
|
+
// An address has an @ and a login does not. Crude on purpose: the job is
|
|
48
|
+
// to catch a whole set given in the other form, which is what happens
|
|
49
|
+
// when somebody carries habits from one backend to another, not to
|
|
50
|
+
// validate an address.
|
|
51
|
+
const wrong = who.filter((one) => one.includes("@") !== (form === "email"));
|
|
52
|
+
if (wrong.length === 0)
|
|
53
|
+
return undefined;
|
|
54
|
+
const wanted = form === "email"
|
|
55
|
+
? "an email address, as this backend names people"
|
|
56
|
+
: "a login, as this backend names people";
|
|
57
|
+
return `${wrong.join(", ")} ${wrong.length === 1 ? "is not" : "are not"} ${wanted}.`;
|
|
58
|
+
}
|
|
59
|
+
export function offerable(intent, capabilities, providerId) {
|
|
60
|
+
if (capabilities === undefined) {
|
|
61
|
+
return {
|
|
62
|
+
ok: false,
|
|
63
|
+
reason: `The ${providerId} provider does not author changes, so there is nothing here to ${intent.kind.replace("-", " ")}.`,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// Asked before the per-intent questions, because a queue ejection is
|
|
67
|
+
// expensive whatever the intent was and the answer does not depend
|
|
68
|
+
// on whether the backend could otherwise do it.
|
|
69
|
+
const queued = capabilities.refusesWhileEnqueued && MUTATES.has(intent.kind);
|
|
70
|
+
if (queued) {
|
|
71
|
+
const refusal = queueRefusal(intent.queue, providerId);
|
|
72
|
+
if (refusal)
|
|
73
|
+
return { ok: false, ...refusal };
|
|
74
|
+
}
|
|
75
|
+
// Having a queue and not knowing where the change sits in it is its own
|
|
76
|
+
// answer: on some backends the queue lives somewhere the change's own
|
|
77
|
+
// API cannot see, so silence there is ignorance rather than safety.
|
|
78
|
+
//
|
|
79
|
+
// It decorates the answer instead of being one. Returning it directly
|
|
80
|
+
// skipped every per-intent question below, which permitted a retarget
|
|
81
|
+
// on a backend that had just said it could not do one. Three tests
|
|
82
|
+
// caught that, which is the only reason this reads as it does.
|
|
83
|
+
const answer = decide(intent, capabilities, providerId);
|
|
84
|
+
if (!answer.ok || !queued || intent.queue !== undefined)
|
|
85
|
+
return answer;
|
|
86
|
+
return {
|
|
87
|
+
...answer,
|
|
88
|
+
caution: `${providerId} has a merge queue and did not say where this change stands in it. If it is queued, this ejects it and everything batched with it. Check before approving.`,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/** What this provider says about this intent, queue aside. */
|
|
92
|
+
function decide(intent, capabilities, providerId) {
|
|
93
|
+
switch (intent.kind) {
|
|
94
|
+
case "propose":
|
|
95
|
+
return proposable(intent, capabilities, providerId);
|
|
96
|
+
case "edit":
|
|
97
|
+
// Every backend surveyed can change a change's own text. The
|
|
98
|
+
// queue check above is the only thing that stops an edit, which
|
|
99
|
+
// is the whole reason this is not folded into `retarget`.
|
|
100
|
+
return { ok: true };
|
|
101
|
+
case "propose-stack":
|
|
102
|
+
return capabilities.proposeStack
|
|
103
|
+
? { ok: true }
|
|
104
|
+
: {
|
|
105
|
+
ok: false,
|
|
106
|
+
reason: `The ${providerId} provider proposes one change at a time.`,
|
|
107
|
+
instead: "Propose each change in the stack in dependency order, roots first.",
|
|
108
|
+
};
|
|
109
|
+
case "retarget":
|
|
110
|
+
return retargetable(capabilities, providerId);
|
|
111
|
+
case "set-draft":
|
|
112
|
+
return capabilities.setDraft
|
|
113
|
+
? { ok: true }
|
|
114
|
+
: {
|
|
115
|
+
ok: false,
|
|
116
|
+
reason: `The ${providerId} provider cannot move an existing change between draft and ready.`,
|
|
117
|
+
instead: "Decide draft or ready when the change is proposed, since this backend fixes it then.",
|
|
118
|
+
};
|
|
119
|
+
case "reopen":
|
|
120
|
+
return capabilities.reopen
|
|
121
|
+
? { ok: true }
|
|
122
|
+
: {
|
|
123
|
+
ok: false,
|
|
124
|
+
reason: `The ${providerId} provider cannot reopen a closed change.`,
|
|
125
|
+
instead: "Propose the work again as a new change.",
|
|
126
|
+
};
|
|
127
|
+
case "close":
|
|
128
|
+
return capabilities.close
|
|
129
|
+
? { ok: true }
|
|
130
|
+
: {
|
|
131
|
+
ok: false,
|
|
132
|
+
reason: `The ${providerId} provider cannot close a change.`,
|
|
133
|
+
};
|
|
134
|
+
case "merge":
|
|
135
|
+
return capabilities.merge
|
|
136
|
+
? { ok: true }
|
|
137
|
+
: {
|
|
138
|
+
ok: false,
|
|
139
|
+
reason: `The ${providerId} provider cannot merge a change.`,
|
|
140
|
+
};
|
|
141
|
+
case "request-reviewers":
|
|
142
|
+
return reviewable(capabilities, providerId);
|
|
143
|
+
case "rerun-checks":
|
|
144
|
+
return capabilities.rerunChecks
|
|
145
|
+
? { ok: true }
|
|
146
|
+
: {
|
|
147
|
+
ok: false,
|
|
148
|
+
reason: `The ${providerId} provider cannot ask CI to run again.`,
|
|
149
|
+
instead: "Retrigger it wherever that backend's CI is driven from, which is not always the same system that hosts the change.",
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/** Proposing, and whether reviewers can ride along. */
|
|
154
|
+
function proposable(intent, capabilities, providerId) {
|
|
155
|
+
if (!capabilities.propose) {
|
|
156
|
+
return {
|
|
157
|
+
ok: false,
|
|
158
|
+
reason: `The ${providerId} provider cannot propose a change.`,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
if (intent.withReviewers === true && capabilities.reviewersAt === "never") {
|
|
162
|
+
return {
|
|
163
|
+
ok: false,
|
|
164
|
+
reason: `The ${providerId} provider has no notion of requested reviewers.`,
|
|
165
|
+
instead: "Propose the change, then ask people to look at it yourself.",
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
return { ok: true };
|
|
169
|
+
}
|
|
170
|
+
/** Retargeting, which is not the same operation on every backend. */
|
|
171
|
+
function retargetable(capabilities, providerId) {
|
|
172
|
+
if (capabilities.retarget === "change")
|
|
173
|
+
return { ok: true };
|
|
174
|
+
if (capabilities.retarget === "stack") {
|
|
175
|
+
return {
|
|
176
|
+
ok: false,
|
|
177
|
+
reason: `On ${providerId} a change's base is not set on the change. Retargeting is a stack operation there, so moving one change means resubmitting the stack it sits in.`,
|
|
178
|
+
instead: "Restack locally so the change sits on the base you want, then submit the stack.",
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
ok: false,
|
|
183
|
+
reason: `The ${providerId} provider cannot change what a proposal targets.`,
|
|
184
|
+
instead: "Close this change and propose it again against the base you want.",
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/** Requesting reviewers after the fact, which one backend will not do. */
|
|
188
|
+
function reviewable(capabilities, providerId) {
|
|
189
|
+
if (capabilities.reviewersAt === "any-time")
|
|
190
|
+
return { ok: true };
|
|
191
|
+
if (capabilities.reviewersAt === "creation") {
|
|
192
|
+
return {
|
|
193
|
+
ok: false,
|
|
194
|
+
reason: `The ${providerId} provider takes reviewers only as a change is created.`,
|
|
195
|
+
instead: "Name the reviewers when proposing. On an existing change, ask them directly instead.",
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
ok: false,
|
|
200
|
+
reason: `The ${providerId} provider has no notion of requested reviewers.`,
|
|
201
|
+
instead: "Ask people to look at it yourself.",
|
|
202
|
+
};
|
|
203
|
+
}
|