@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,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading changes from GitHub.
|
|
3
|
+
*
|
|
4
|
+
* GitHub says a merged pull request is `closed` with a
|
|
5
|
+
* `merged_at` timestamp, and calls a draft a state in one API
|
|
6
|
+
* and a flag in another. The neutral model says merged is its
|
|
7
|
+
* own state and draft is a flag, so the translation happens
|
|
8
|
+
* here, once, rather than in every caller that has to decide
|
|
9
|
+
* what `closed` meant.
|
|
10
|
+
*/
|
|
11
|
+
import { run } from "../../../exec/index.js";
|
|
12
|
+
import { GHOST, githubChange, ownerRepoFromKey } from "./claims.js";
|
|
13
|
+
import { labelsAndAssignees } from "./fields.js";
|
|
14
|
+
import { landabilityFrom, QUEUE_QUERY, queueStateFrom } from "./queue.js";
|
|
15
|
+
/** Where a materialized change lands, so it is easy to spot. */
|
|
16
|
+
const LOCAL_REF_PREFIX = "refs/pi-review/github";
|
|
17
|
+
/** The `owner/repo` a ref belongs to, or a clear failure. */
|
|
18
|
+
function slugOf(repo) {
|
|
19
|
+
const owned = ownerRepoFromKey(repo.key);
|
|
20
|
+
if (!owned) {
|
|
21
|
+
throw new Error(`${repo.key} is not a GitHub repo key`);
|
|
22
|
+
}
|
|
23
|
+
return `${owned.owner}/${owned.repo}`;
|
|
24
|
+
}
|
|
25
|
+
function asRecord(value, what) {
|
|
26
|
+
if (typeof value !== "object" || value === null) {
|
|
27
|
+
throw new Error(`GitHub returned no ${what}`);
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
function str(value) {
|
|
32
|
+
return typeof value === "string" ? value : undefined;
|
|
33
|
+
}
|
|
34
|
+
function nested(value, key) {
|
|
35
|
+
const record = asRecord(value, "object");
|
|
36
|
+
const inner = record[key];
|
|
37
|
+
return typeof inner === "object" && inner !== null
|
|
38
|
+
? inner
|
|
39
|
+
: {};
|
|
40
|
+
}
|
|
41
|
+
function num(value) {
|
|
42
|
+
return typeof value === "number" ? value : undefined;
|
|
43
|
+
}
|
|
44
|
+
/** Who acted, or the ghost GitHub attributes orphaned work to. */
|
|
45
|
+
function actorFrom(login) {
|
|
46
|
+
return { id: str(login) ?? GHOST };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* How big the change is, from whichever of GitHub's spellings
|
|
50
|
+
* answered: REST says `changed_files`, GraphQL and the CLI say
|
|
51
|
+
* `changedFiles`.
|
|
52
|
+
*
|
|
53
|
+
* Each field is carried only when it is actually there. An
|
|
54
|
+
* unreported count and a count of zero are different facts, and a
|
|
55
|
+
* reader shown "0 files changed" would believe the wrong one.
|
|
56
|
+
*/
|
|
57
|
+
function sizeOf(raw) {
|
|
58
|
+
const additions = num(raw.additions);
|
|
59
|
+
const deletions = num(raw.deletions);
|
|
60
|
+
const changedFiles = num(raw.changedFiles) ?? num(raw.changed_files);
|
|
61
|
+
return {
|
|
62
|
+
...(additions !== undefined ? { additions } : {}),
|
|
63
|
+
...(deletions !== undefined ? { deletions } : {}),
|
|
64
|
+
...(changedFiles !== undefined ? { changedFiles } : {}),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* GitHub's state plus its merge timestamp, as one state. A
|
|
69
|
+
* closed pull request that merged is merged; one that did not
|
|
70
|
+
* is closed.
|
|
71
|
+
*/
|
|
72
|
+
function stateOf(raw) {
|
|
73
|
+
if (str(raw.merged_at))
|
|
74
|
+
return "merged";
|
|
75
|
+
const state = (str(raw.state) ?? "open").toLowerCase();
|
|
76
|
+
if (state === "merged")
|
|
77
|
+
return "merged";
|
|
78
|
+
return state === "closed" ? "closed" : "open";
|
|
79
|
+
}
|
|
80
|
+
/** One pull request from the REST representation. */
|
|
81
|
+
function proposalFromRest(repo, raw) {
|
|
82
|
+
const id = String(raw.number ?? "");
|
|
83
|
+
return {
|
|
84
|
+
ref: githubChange(repo, id),
|
|
85
|
+
title: str(raw.title) ?? "",
|
|
86
|
+
body: str(raw.body) ?? "",
|
|
87
|
+
state: stateOf(raw),
|
|
88
|
+
draft: raw.draft === true,
|
|
89
|
+
author: actorFrom(nested(raw, "user").login),
|
|
90
|
+
base: str(nested(raw, "base").ref) ?? "",
|
|
91
|
+
head: str(nested(raw, "head").ref) ?? "",
|
|
92
|
+
...(str(nested(raw, "head").sha)
|
|
93
|
+
? { headCommit: str(nested(raw, "head").sha) }
|
|
94
|
+
: {}),
|
|
95
|
+
...(str(raw.created_at) ? { createdAt: str(raw.created_at) } : {}),
|
|
96
|
+
...(str(raw.updated_at) ? { updatedAt: str(raw.updated_at) } : {}),
|
|
97
|
+
...(str(raw.html_url) ? { url: str(raw.html_url) } : {}),
|
|
98
|
+
...sizeOf(raw),
|
|
99
|
+
...labelsAndAssignees(raw),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* One pull request from `gh pr list --json`, which is neither
|
|
104
|
+
* REST nor GraphQL but a third spelling of the same thing.
|
|
105
|
+
*/
|
|
106
|
+
function proposalFromListing(repo, raw) {
|
|
107
|
+
const id = String(raw.number ?? "");
|
|
108
|
+
const state = (str(raw.state) ?? "OPEN").toLowerCase();
|
|
109
|
+
return {
|
|
110
|
+
ref: githubChange(repo, id),
|
|
111
|
+
title: str(raw.title) ?? "",
|
|
112
|
+
body: str(raw.body) ?? "",
|
|
113
|
+
state: state === "merged" ? "merged" : state === "closed" ? "closed" : "open",
|
|
114
|
+
draft: raw.isDraft === true,
|
|
115
|
+
author: actorFrom(nested(raw, "author").login),
|
|
116
|
+
base: str(raw.baseRefName) ?? "",
|
|
117
|
+
head: str(raw.headRefName) ?? "",
|
|
118
|
+
...(str(raw.url) ? { url: str(raw.url) } : {}),
|
|
119
|
+
...sizeOf(raw),
|
|
120
|
+
...labelsAndAssignees(raw),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/** One check's state, from either of GitHub's two shapes. */
|
|
124
|
+
function checkStateOf(raw) {
|
|
125
|
+
// Check runs report status plus conclusion; legacy statuses
|
|
126
|
+
// report a single state.
|
|
127
|
+
const status = (str(raw.status) ?? "").toUpperCase();
|
|
128
|
+
const conclusion = (str(raw.conclusion) ?? "").toUpperCase();
|
|
129
|
+
const legacy = (str(raw.state) ?? "").toUpperCase();
|
|
130
|
+
if (status && status !== "COMPLETED")
|
|
131
|
+
return "pending";
|
|
132
|
+
const outcome = conclusion || legacy;
|
|
133
|
+
if (!outcome)
|
|
134
|
+
return "unreported";
|
|
135
|
+
if (["SUCCESS", "NEUTRAL"].includes(outcome))
|
|
136
|
+
return "passing";
|
|
137
|
+
if (["SKIPPED"].includes(outcome))
|
|
138
|
+
return "skipped";
|
|
139
|
+
if (["PENDING", "EXPECTED", "QUEUED"].includes(outcome))
|
|
140
|
+
return "pending";
|
|
141
|
+
return "failing";
|
|
142
|
+
}
|
|
143
|
+
/** Roll checks up, keeping unreported apart from failing. */
|
|
144
|
+
function rollUp(checks) {
|
|
145
|
+
if (checks.length === 0)
|
|
146
|
+
return "unreported";
|
|
147
|
+
if (checks.some((check) => check.state === "failing"))
|
|
148
|
+
return "failing";
|
|
149
|
+
if (checks.some((check) => check.state === "pending"))
|
|
150
|
+
return "pending";
|
|
151
|
+
if (checks.some((check) => check.state === "unreported"))
|
|
152
|
+
return "pending";
|
|
153
|
+
return "passing";
|
|
154
|
+
}
|
|
155
|
+
/** Build the proposals facet. */
|
|
156
|
+
export function githubProposals(exec) {
|
|
157
|
+
async function json(args, what) {
|
|
158
|
+
const stdout = await run(exec, "gh", args, what);
|
|
159
|
+
return JSON.parse(stdout);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Where the change stands with a merge queue, or nothing.
|
|
163
|
+
*
|
|
164
|
+
* A second call, and a GraphQL one, because REST does not carry the
|
|
165
|
+
* queue and neither does `gh pr view --json`. Both were checked
|
|
166
|
+
* against the live API rather than assumed.
|
|
167
|
+
*
|
|
168
|
+
* Failure is swallowed on purpose, and this is the one place in the
|
|
169
|
+
* provider where that is right: the queue is an extra fact about a
|
|
170
|
+
* change, and a token that cannot run GraphQL, or a GitHub instance
|
|
171
|
+
* too old to have merge queues, must still be able to read the change
|
|
172
|
+
* itself. An absent queue reads as unknown downstream, which permits
|
|
173
|
+
* the mutation, so guessing wrong here costs a gate that does not fire
|
|
174
|
+
* rather than one that fires wrongly.
|
|
175
|
+
*/
|
|
176
|
+
/**
|
|
177
|
+
* The two things only GraphQL will say: where the change stands with the
|
|
178
|
+
* queue, and whether it could land. One query for both, since they come
|
|
179
|
+
* from the same node and a second round trip would buy nothing.
|
|
180
|
+
*/
|
|
181
|
+
async function standingOf(repo, id) {
|
|
182
|
+
const owned = ownerRepoFromKey(repo.key);
|
|
183
|
+
if (!owned)
|
|
184
|
+
return {};
|
|
185
|
+
const number = Number(id);
|
|
186
|
+
if (!Number.isInteger(number))
|
|
187
|
+
return {};
|
|
188
|
+
try {
|
|
189
|
+
const raw = await json([
|
|
190
|
+
"api",
|
|
191
|
+
"graphql",
|
|
192
|
+
"-f",
|
|
193
|
+
`query=${QUEUE_QUERY}`,
|
|
194
|
+
"-F",
|
|
195
|
+
`owner=${owned.owner}`,
|
|
196
|
+
"-F",
|
|
197
|
+
`name=${owned.repo}`,
|
|
198
|
+
"-F",
|
|
199
|
+
`number=${number}`,
|
|
200
|
+
], `reading where pull request ${id} stands`);
|
|
201
|
+
const landing = landabilityFrom(raw);
|
|
202
|
+
return {
|
|
203
|
+
queue: queueStateFrom(raw),
|
|
204
|
+
...(landing === undefined ? {} : { landing }),
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// Neither is worth failing a read of the change over: both are
|
|
209
|
+
// decoration on a proposal that was fetched successfully, and a
|
|
210
|
+
// caller can tell unreported from clear.
|
|
211
|
+
return {};
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
async fetch(ref) {
|
|
216
|
+
const raw = await json(["api", `repos/${slugOf(ref.repo)}/pulls/${ref.id}`], `reading pull request ${ref.id}`);
|
|
217
|
+
const proposal = proposalFromRest(ref.repo, asRecord(raw, "pull request"));
|
|
218
|
+
return { ...proposal, ...(await standingOf(ref.repo, ref.id)) };
|
|
219
|
+
},
|
|
220
|
+
async diff(ref) {
|
|
221
|
+
return run(exec, "gh", ["pr", "diff", ref.id, "--repo", slugOf(ref.repo)], `reading the diff of pull request ${ref.id}`);
|
|
222
|
+
},
|
|
223
|
+
async checks(ref) {
|
|
224
|
+
const raw = await json([
|
|
225
|
+
"pr",
|
|
226
|
+
"view",
|
|
227
|
+
ref.id,
|
|
228
|
+
"--repo",
|
|
229
|
+
slugOf(ref.repo),
|
|
230
|
+
"--json",
|
|
231
|
+
"statusCheckRollup",
|
|
232
|
+
], `reading checks on pull request ${ref.id}`);
|
|
233
|
+
const rollup = asRecord(raw, "checks").statusCheckRollup;
|
|
234
|
+
const entries = Array.isArray(rollup) ? rollup : [];
|
|
235
|
+
const checks = entries.map((entry) => {
|
|
236
|
+
const record = asRecord(entry, "check");
|
|
237
|
+
const name = str(record.name) ?? str(record.context) ?? "unnamed check";
|
|
238
|
+
const url = str(record.detailsUrl) ?? str(record.targetUrl);
|
|
239
|
+
return {
|
|
240
|
+
name,
|
|
241
|
+
state: checkStateOf(record),
|
|
242
|
+
...(url ? { url } : {}),
|
|
243
|
+
};
|
|
244
|
+
});
|
|
245
|
+
return { state: rollUp(checks), checks };
|
|
246
|
+
},
|
|
247
|
+
async list(repo, filter) {
|
|
248
|
+
const args = ["pr", "list", "--repo", slugOf(repo), "--json"];
|
|
249
|
+
args.push("number,title,body,state,isDraft,author,baseRefName,headRefName,url," +
|
|
250
|
+
// Free in the same call, and a listing is exactly where
|
|
251
|
+
// knowing which change is the big one earns its keep.
|
|
252
|
+
"additions,deletions,changedFiles");
|
|
253
|
+
if (filter.state)
|
|
254
|
+
args.push("--state", filter.state);
|
|
255
|
+
if (filter.author)
|
|
256
|
+
args.push("--author", filter.author);
|
|
257
|
+
if (filter.base)
|
|
258
|
+
args.push("--base", filter.base);
|
|
259
|
+
if (filter.head)
|
|
260
|
+
args.push("--head", filter.head);
|
|
261
|
+
if (filter.limit !== undefined)
|
|
262
|
+
args.push("--limit", String(filter.limit));
|
|
263
|
+
const raw = await json(args, "listing pull requests");
|
|
264
|
+
const entries = Array.isArray(raw) ? raw : [];
|
|
265
|
+
return entries.map((entry) => proposalFromListing(repo, asRecord(entry, "pull request")));
|
|
266
|
+
},
|
|
267
|
+
async fileAt(ref, path, at) {
|
|
268
|
+
const raw = await json([
|
|
269
|
+
"api",
|
|
270
|
+
`repos/${slugOf(ref.repo)}/contents/${path}?ref=${encodeURIComponent(at)}`,
|
|
271
|
+
], `reading ${path} at ${at}`);
|
|
272
|
+
const answer = asRecord(raw, `contents of ${path}`);
|
|
273
|
+
const encoded = answer.content;
|
|
274
|
+
if (typeof encoded !== "string" || encoded.trim() === "") {
|
|
275
|
+
// A directory answers with an array, and a file too large
|
|
276
|
+
// for this route answers with an empty content field.
|
|
277
|
+
// Returning "" for either would look like an empty file.
|
|
278
|
+
throw new Error(`${path} at ${at} came back with no content, so it is not a file this route can serve.`);
|
|
279
|
+
}
|
|
280
|
+
// The encoding arrives wrapped at a fixed column, so the
|
|
281
|
+
// payload contains newlines that are not part of it.
|
|
282
|
+
return Buffer.from(encoded.replace(/\s+/g, ""), "base64").toString("utf8");
|
|
283
|
+
},
|
|
284
|
+
async fetchAsRef(ref, repoRoot) {
|
|
285
|
+
const local = `${LOCAL_REF_PREFIX}/${ref.id}`;
|
|
286
|
+
const remote = ref.repo.remoteUrl ?? "origin";
|
|
287
|
+
await run(exec, "git", [
|
|
288
|
+
"-C",
|
|
289
|
+
repoRoot,
|
|
290
|
+
"fetch",
|
|
291
|
+
"--force",
|
|
292
|
+
remote,
|
|
293
|
+
`pull/${ref.id}/head:${local}`,
|
|
294
|
+
], `fetching pull request ${ref.id}`);
|
|
295
|
+
return local;
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where GitHub says a pull request stands with a merge queue.
|
|
3
|
+
*
|
|
4
|
+
* The queue is not on the REST representation and not among the fields
|
|
5
|
+
* `gh pr view --json` offers, so this is the one place the GitHub
|
|
6
|
+
* provider has to ask GraphQL. Both facts were checked against a live
|
|
7
|
+
* API rather than assumed: `gh pr view --json` lists `autoMergeRequest`
|
|
8
|
+
* and `mergeStateStatus` and nothing else queue-shaped, and
|
|
9
|
+
* `MergeQueueEntry` exists only on the GraphQL `PullRequest`.
|
|
10
|
+
*
|
|
11
|
+
* GitHub's own vocabulary turned out to be sharper than the neutral
|
|
12
|
+
* model's first draft. `MergeQueueEntryState` distinguishes
|
|
13
|
+
* `AWAITING_CHECKS` from `QUEUED`, and `MergeQueueEntry.solo` says
|
|
14
|
+
* whether the change is being tested by itself or batched with others.
|
|
15
|
+
* That last one is the difference between ejecting one change's checks
|
|
16
|
+
* and ejecting a batch's, which is the whole reason a caller asks.
|
|
17
|
+
*/
|
|
18
|
+
import type { Landability } from "../../landing.js";
|
|
19
|
+
import type { QueueState } from "../../queue.js";
|
|
20
|
+
/** The GraphQL selection this module reads. */
|
|
21
|
+
export declare const QUEUE_QUERY = "query($owner:String!,$name:String!,$number:Int!){\n repository(owner:$owner,name:$name){\n pullRequest(number:$number){\n isInMergeQueue\n autoMergeRequest{enabledAt}\n mergeQueueEntry{state position solo}\n reviewDecision\n mergeStateStatus\n mergeable\n }\n }\n}";
|
|
22
|
+
/**
|
|
23
|
+
* Where GitHub says the change stands with landing.
|
|
24
|
+
*
|
|
25
|
+
* Read from the query the queue already runs, so it costs nothing extra. Three fields
|
|
26
|
+
* rather than one, because GitHub splits the question the same way this model does:
|
|
27
|
+
* `reviewDecision` is the people, `mergeStateStatus` is the checks and the base, and
|
|
28
|
+
* `mergeable` is whether the trees still agree.
|
|
29
|
+
*
|
|
30
|
+
* `BLOCKED` deliberately does not become `failingRequiredCheck`. It means a required
|
|
31
|
+
* status has not passed, which covers one that has not run as well as one that failed, and
|
|
32
|
+
* naming a check as failing when it merely has not started sends somebody to read a log
|
|
33
|
+
* that does not exist. The word itself is passed through instead.
|
|
34
|
+
*/
|
|
35
|
+
export declare function landabilityFrom(raw: unknown): Landability | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Translate GitHub's answer into the neutral queue state.
|
|
38
|
+
*
|
|
39
|
+
* Three sources, in order of how much they cost to be wrong about.
|
|
40
|
+
* A merge queue entry is authoritative and detailed. Failing that, an
|
|
41
|
+
* auto-merge request means somebody has asked for this to land and the
|
|
42
|
+
* backend is waiting, which is the `waiting` posture rather than the
|
|
43
|
+
* `queued` one: nothing is batched, so nothing else gets ejected.
|
|
44
|
+
* Failing both, the change is not queued.
|
|
45
|
+
*/
|
|
46
|
+
export declare function queueStateFrom(raw: unknown): QueueState;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where GitHub says a pull request stands with a merge queue.
|
|
3
|
+
*
|
|
4
|
+
* The queue is not on the REST representation and not among the fields
|
|
5
|
+
* `gh pr view --json` offers, so this is the one place the GitHub
|
|
6
|
+
* provider has to ask GraphQL. Both facts were checked against a live
|
|
7
|
+
* API rather than assumed: `gh pr view --json` lists `autoMergeRequest`
|
|
8
|
+
* and `mergeStateStatus` and nothing else queue-shaped, and
|
|
9
|
+
* `MergeQueueEntry` exists only on the GraphQL `PullRequest`.
|
|
10
|
+
*
|
|
11
|
+
* GitHub's own vocabulary turned out to be sharper than the neutral
|
|
12
|
+
* model's first draft. `MergeQueueEntryState` distinguishes
|
|
13
|
+
* `AWAITING_CHECKS` from `QUEUED`, and `MergeQueueEntry.solo` says
|
|
14
|
+
* whether the change is being tested by itself or batched with others.
|
|
15
|
+
* That last one is the difference between ejecting one change's checks
|
|
16
|
+
* and ejecting a batch's, which is the whole reason a caller asks.
|
|
17
|
+
*/
|
|
18
|
+
/** The GraphQL selection this module reads. */
|
|
19
|
+
export const QUEUE_QUERY = `query($owner:String!,$name:String!,$number:Int!){
|
|
20
|
+
repository(owner:$owner,name:$name){
|
|
21
|
+
pullRequest(number:$number){
|
|
22
|
+
isInMergeQueue
|
|
23
|
+
autoMergeRequest{enabledAt}
|
|
24
|
+
mergeQueueEntry{state position solo}
|
|
25
|
+
reviewDecision
|
|
26
|
+
mergeStateStatus
|
|
27
|
+
mergeable
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}`;
|
|
31
|
+
function record(value) {
|
|
32
|
+
return typeof value === "object" && value !== null
|
|
33
|
+
? value
|
|
34
|
+
: {};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Where GitHub says the change stands with landing.
|
|
38
|
+
*
|
|
39
|
+
* Read from the query the queue already runs, so it costs nothing extra. Three fields
|
|
40
|
+
* rather than one, because GitHub splits the question the same way this model does:
|
|
41
|
+
* `reviewDecision` is the people, `mergeStateStatus` is the checks and the base, and
|
|
42
|
+
* `mergeable` is whether the trees still agree.
|
|
43
|
+
*
|
|
44
|
+
* `BLOCKED` deliberately does not become `failingRequiredCheck`. It means a required
|
|
45
|
+
* status has not passed, which covers one that has not run as well as one that failed, and
|
|
46
|
+
* naming a check as failing when it merely has not started sends somebody to read a log
|
|
47
|
+
* that does not exist. The word itself is passed through instead.
|
|
48
|
+
*/
|
|
49
|
+
export function landabilityFrom(raw) {
|
|
50
|
+
const pull = record(record(record(record(raw).data).repository).pullRequest);
|
|
51
|
+
const decision = typeof pull.reviewDecision === "string" ? pull.reviewDecision : undefined;
|
|
52
|
+
const status = typeof pull.mergeStateStatus === "string"
|
|
53
|
+
? pull.mergeStateStatus
|
|
54
|
+
: undefined;
|
|
55
|
+
const mergeable = typeof pull.mergeable === "string" ? pull.mergeable : undefined;
|
|
56
|
+
if (decision === undefined &&
|
|
57
|
+
status === undefined &&
|
|
58
|
+
mergeable === undefined) {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
...(status === undefined ? {} : { reason: status.toLowerCase() }),
|
|
63
|
+
...(decision === undefined
|
|
64
|
+
? {}
|
|
65
|
+
: {
|
|
66
|
+
approved: decision === "APPROVED",
|
|
67
|
+
changesRequested: decision === "CHANGES_REQUESTED",
|
|
68
|
+
}),
|
|
69
|
+
...(mergeable === undefined
|
|
70
|
+
? {}
|
|
71
|
+
: { conflicted: mergeable === "CONFLICTING" }),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Whether an entry's state means the queue is still waiting on checks.
|
|
76
|
+
*
|
|
77
|
+
* `AWAITING_CHECKS` is GitHub testing the batch and not yet ready to
|
|
78
|
+
* land it. The others (`QUEUED`, `MERGEABLE`, `LOCKED`, `UNMERGEABLE`)
|
|
79
|
+
* all mean the entry is holding a place, which is the expensive posture.
|
|
80
|
+
*/
|
|
81
|
+
function awaitingChecks(state) {
|
|
82
|
+
return state === "AWAITING_CHECKS";
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Translate GitHub's answer into the neutral queue state.
|
|
86
|
+
*
|
|
87
|
+
* Three sources, in order of how much they cost to be wrong about.
|
|
88
|
+
* A merge queue entry is authoritative and detailed. Failing that, an
|
|
89
|
+
* auto-merge request means somebody has asked for this to land and the
|
|
90
|
+
* backend is waiting, which is the `waiting` posture rather than the
|
|
91
|
+
* `queued` one: nothing is batched, so nothing else gets ejected.
|
|
92
|
+
* Failing both, the change is not queued.
|
|
93
|
+
*/
|
|
94
|
+
export function queueStateFrom(raw) {
|
|
95
|
+
// The `data` envelope is part of the answer, not something a caller
|
|
96
|
+
// should have to strip: `gh api graphql` returns it unless it is given
|
|
97
|
+
// a `--jq`, and a reader that quietly accepted either shape would read
|
|
98
|
+
// an unwrapped answer as unqueued rather than saying so.
|
|
99
|
+
const pull = record(record(record(record(raw).data).repository).pullRequest);
|
|
100
|
+
const entry = pull.mergeQueueEntry;
|
|
101
|
+
if (entry !== null && entry !== undefined) {
|
|
102
|
+
const held = record(entry);
|
|
103
|
+
const state = typeof held.state === "string" ? held.state : undefined;
|
|
104
|
+
return {
|
|
105
|
+
posture: awaitingChecks(state) ? "waiting" : "queued",
|
|
106
|
+
...(typeof held.solo === "boolean" ? { solo: held.solo } : {}),
|
|
107
|
+
...(typeof held.position === "number" ? { position: held.position } : {}),
|
|
108
|
+
...(state ? { detail: `merge queue entry is ${state}` } : {}),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// A queue entry is the only thing that batches, so auto-merge on its
|
|
112
|
+
// own is the cheaper hazard: the checks already ran and will not run
|
|
113
|
+
// again, but nobody else's work is riding on this one.
|
|
114
|
+
if (record(pull.autoMergeRequest).enabledAt !== undefined) {
|
|
115
|
+
return {
|
|
116
|
+
posture: "waiting",
|
|
117
|
+
solo: true,
|
|
118
|
+
detail: "auto-merge is enabled and the backend is waiting on checks",
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
return { posture: "unqueued" };
|
|
122
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deriving a stack from GitHub, which records none.
|
|
3
|
+
*
|
|
4
|
+
* GitHub knows only each pull request's base and head branch
|
|
5
|
+
* names, so a stack has to be inferred by matching one
|
|
6
|
+
* request's base against another's head. That inference is
|
|
7
|
+
* wrong at the edges by construction: a merged parent
|
|
8
|
+
* disappears from the open listing and the chain simply ends,
|
|
9
|
+
* a renamed branch breaks the link, and two forks can use the
|
|
10
|
+
* same branch name. This is why every stack reports its
|
|
11
|
+
* provenance, and why this one always reports `derived`.
|
|
12
|
+
*
|
|
13
|
+
* The walk follows fan-out downwards, because a branch with two
|
|
14
|
+
* children is a real shape people build and reporting only one
|
|
15
|
+
* of them would be a lie of omission.
|
|
16
|
+
*/
|
|
17
|
+
import type { Exec } from "../../../exec/index.js";
|
|
18
|
+
import type { StackingFacet } from "../../provider.js";
|
|
19
|
+
/** Build the stacking facet. */
|
|
20
|
+
export declare function githubStacking(exec: Exec): StackingFacet;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deriving a stack from GitHub, which records none.
|
|
3
|
+
*
|
|
4
|
+
* GitHub knows only each pull request's base and head branch
|
|
5
|
+
* names, so a stack has to be inferred by matching one
|
|
6
|
+
* request's base against another's head. That inference is
|
|
7
|
+
* wrong at the edges by construction: a merged parent
|
|
8
|
+
* disappears from the open listing and the chain simply ends,
|
|
9
|
+
* a renamed branch breaks the link, and two forks can use the
|
|
10
|
+
* same branch name. This is why every stack reports its
|
|
11
|
+
* provenance, and why this one always reports `derived`.
|
|
12
|
+
*
|
|
13
|
+
* The walk follows fan-out downwards, because a branch with two
|
|
14
|
+
* children is a real shape people build and reporting only one
|
|
15
|
+
* of them would be a lie of omission.
|
|
16
|
+
*/
|
|
17
|
+
import { githubProposals } from "./proposals.js";
|
|
18
|
+
/** How far to walk in each direction before giving up. */
|
|
19
|
+
const MAX_DEPTH = 8;
|
|
20
|
+
/** Build the stacking facet. */
|
|
21
|
+
export function githubStacking(exec) {
|
|
22
|
+
const proposals = githubProposals(exec);
|
|
23
|
+
/** The single open change whose head is this branch. */
|
|
24
|
+
async function byHead(ref, branch) {
|
|
25
|
+
const found = await proposals.list?.(ref.repo, {
|
|
26
|
+
state: "open",
|
|
27
|
+
head: branch,
|
|
28
|
+
});
|
|
29
|
+
return found?.[0];
|
|
30
|
+
}
|
|
31
|
+
/** Every open change based on this branch. */
|
|
32
|
+
async function byBase(ref, branch) {
|
|
33
|
+
return ((await proposals.list?.(ref.repo, { state: "open", base: branch })) ?? []);
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
async stack(subject) {
|
|
37
|
+
if (!("id" in subject)) {
|
|
38
|
+
throw new Error("the GitHub provider derives a stack from a pull request, not a bare branch");
|
|
39
|
+
}
|
|
40
|
+
const cursorProposal = await proposals.fetch(subject);
|
|
41
|
+
// Upwards: follow base to the change whose head it is.
|
|
42
|
+
const seen = new Set([cursorProposal.head]);
|
|
43
|
+
const ancestors = [];
|
|
44
|
+
let climbing = cursorProposal.base;
|
|
45
|
+
for (let depth = 0; depth < MAX_DEPTH; depth++) {
|
|
46
|
+
const parent = await byHead(subject, climbing);
|
|
47
|
+
if (!parent || seen.has(parent.head))
|
|
48
|
+
break;
|
|
49
|
+
seen.add(parent.head);
|
|
50
|
+
ancestors.unshift(parent);
|
|
51
|
+
climbing = parent.base;
|
|
52
|
+
}
|
|
53
|
+
// Downwards: every change based on a branch we hold,
|
|
54
|
+
// breadth first, so a fan-out reports both sides.
|
|
55
|
+
const descendants = [];
|
|
56
|
+
let frontier = [cursorProposal.head];
|
|
57
|
+
for (let depth = 0; depth < MAX_DEPTH && frontier.length > 0; depth++) {
|
|
58
|
+
const next = [];
|
|
59
|
+
for (const branch of frontier) {
|
|
60
|
+
for (const child of await byBase(subject, branch)) {
|
|
61
|
+
if (seen.has(child.head))
|
|
62
|
+
continue;
|
|
63
|
+
seen.add(child.head);
|
|
64
|
+
descendants.push({ proposal: child, parent: branch });
|
|
65
|
+
next.push(child.head);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
frontier = next;
|
|
69
|
+
}
|
|
70
|
+
const ordered = [];
|
|
71
|
+
ancestors.forEach((proposal, index) => {
|
|
72
|
+
const parent = index === 0 ? undefined : ancestors[index - 1].head;
|
|
73
|
+
ordered.push({
|
|
74
|
+
ref: proposal.head,
|
|
75
|
+
...(parent ? { parent } : {}),
|
|
76
|
+
...(proposal.headCommit ? { headCommit: proposal.headCommit } : {}),
|
|
77
|
+
proposal,
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
const cursor = ordered.length;
|
|
81
|
+
const cursorParent = ancestors.at(-1)?.head;
|
|
82
|
+
ordered.push({
|
|
83
|
+
ref: cursorProposal.head,
|
|
84
|
+
...(cursorParent ? { parent: cursorParent } : {}),
|
|
85
|
+
...(cursorProposal.headCommit
|
|
86
|
+
? { headCommit: cursorProposal.headCommit }
|
|
87
|
+
: {}),
|
|
88
|
+
proposal: cursorProposal,
|
|
89
|
+
});
|
|
90
|
+
for (const { proposal, parent } of descendants) {
|
|
91
|
+
ordered.push({
|
|
92
|
+
ref: proposal.head,
|
|
93
|
+
parent,
|
|
94
|
+
...(proposal.headCommit ? { headCommit: proposal.headCommit } : {}),
|
|
95
|
+
proposal,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
const trunk = ancestors[0]?.base ?? cursorProposal.base;
|
|
99
|
+
return {
|
|
100
|
+
provenance: "derived",
|
|
101
|
+
trunk,
|
|
102
|
+
nodes: ordered,
|
|
103
|
+
cursor,
|
|
104
|
+
};
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a change stands with a merge queue, and what that costs.
|
|
3
|
+
*
|
|
4
|
+
* This exists because the substrate had the refusal and not the fact. An
|
|
5
|
+
* authoring intent could carry `enqueued: true` and be refused for it,
|
|
6
|
+
* but nothing ever read the queue from a provider, so the gate was
|
|
7
|
+
* unreachable and every mutation went through.
|
|
8
|
+
*/
|
|
9
|
+
/** How far along a queue a change is. */
|
|
10
|
+
export type QueuePosture = "unqueued" | "waiting" | "queued";
|
|
11
|
+
/** What the backend says about a change's place in a queue. */
|
|
12
|
+
export interface QueueState {
|
|
13
|
+
posture: QueuePosture;
|
|
14
|
+
/** Whether the backend is testing it alone rather than with others. */
|
|
15
|
+
solo?: boolean;
|
|
16
|
+
/** Place in the queue, 1-based, when the backend counts. */
|
|
17
|
+
position?: number;
|
|
18
|
+
/** What the backend said, verbatim, for a refusal to quote. */
|
|
19
|
+
detail?: string;
|
|
20
|
+
}
|
|
21
|
+
/** A refusal, in the shape the authoring gate wants. */
|
|
22
|
+
export interface QueueRefusal {
|
|
23
|
+
reason: string;
|
|
24
|
+
instead: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Why a mutation should not happen right now, or nothing.
|
|
28
|
+
*
|
|
29
|
+
* Two hazards, deliberately answered separately, because they have
|
|
30
|
+
* different fixes and a message covering both would name neither.
|
|
31
|
+
*
|
|
32
|
+
* A queued change ejects when it changes, and takes everything
|
|
33
|
+
* speculatively batched with it. That is the expensive one, and it is
|
|
34
|
+
* only expensive when the change is batched, so `solo` is respected: a
|
|
35
|
+
* refusal that claims hundreds of jobs for a change being tested alone
|
|
36
|
+
* teaches the reader to stop believing refusals.
|
|
37
|
+
*
|
|
38
|
+
* A waiting change has a subtler problem. The checks ran once, when it
|
|
39
|
+
* was marked ready, and a later commit does not retrigger them. So a
|
|
40
|
+
* mutation does not eject anything; it strands the change with results
|
|
41
|
+
* that describe code nobody has now.
|
|
42
|
+
*/
|
|
43
|
+
export declare function queueRefusal(queue: QueueState | undefined, providerId: string): QueueRefusal | undefined;
|