@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,455 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading and writing the conversation on a GitHub change.
|
|
3
|
+
*
|
|
4
|
+
* Three of GitHub's habits are absorbed here rather than
|
|
5
|
+
* leaked. It calls the two sides of a diff LEFT and RIGHT,
|
|
6
|
+
* which is a display convention, so the neutral old and new
|
|
7
|
+
* are translated at this boundary. It keeps review threads in
|
|
8
|
+
* GraphQL and reactions in REST, with different id systems, so
|
|
9
|
+
* message ids are minted with a prefix saying which route they
|
|
10
|
+
* belong to. And it pages review threads a hundred at a time,
|
|
11
|
+
* so the reader keeps asking until GitHub says there is no
|
|
12
|
+
* more; stopping at the first page silently loses the tail of
|
|
13
|
+
* a long review.
|
|
14
|
+
*/
|
|
15
|
+
import { unlink, writeFile } from "node:fs/promises";
|
|
16
|
+
import { tmpdir } from "node:os";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import { run } from "../../../exec/index.js";
|
|
19
|
+
import { GHOST, ownerRepoFromKey } from "./claims.js";
|
|
20
|
+
/** Message id prefixes, naming which REST route owns the id. */
|
|
21
|
+
const REVIEW_COMMENT = "rc:";
|
|
22
|
+
const ISSUE_COMMENT = "ic:";
|
|
23
|
+
/** How many threads to ask for per page. GitHub's own cap. */
|
|
24
|
+
const THREAD_PAGE_SIZE = 100;
|
|
25
|
+
const THREADS_QUERY = `query PrReviewThreads($owner: String!, $repo: String!, $number: Int!, $after: String) {
|
|
26
|
+
repository(owner: $owner, name: $repo) {
|
|
27
|
+
pullRequest(number: $number) {
|
|
28
|
+
reviewThreads(first: ${THREAD_PAGE_SIZE}, after: $after) {
|
|
29
|
+
pageInfo { hasNextPage endCursor }
|
|
30
|
+
nodes {
|
|
31
|
+
id
|
|
32
|
+
isResolved
|
|
33
|
+
resolvedBy { login name }
|
|
34
|
+
isOutdated
|
|
35
|
+
subjectType
|
|
36
|
+
path
|
|
37
|
+
line
|
|
38
|
+
startLine
|
|
39
|
+
diffSide
|
|
40
|
+
comments(first: 50) {
|
|
41
|
+
nodes {
|
|
42
|
+
id
|
|
43
|
+
databaseId
|
|
44
|
+
author { login }
|
|
45
|
+
body
|
|
46
|
+
createdAt
|
|
47
|
+
url
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}`;
|
|
55
|
+
const REPLY_MUTATION = `mutation AddThreadReply($threadId: ID!, $body: String!) {
|
|
56
|
+
addPullRequestReviewThreadReply(input: {
|
|
57
|
+
pullRequestReviewThreadId: $threadId
|
|
58
|
+
body: $body
|
|
59
|
+
}) {
|
|
60
|
+
comment { id url }
|
|
61
|
+
}
|
|
62
|
+
}`;
|
|
63
|
+
const RESOLVE_MUTATION = `mutation ResolveThread($threadId: ID!) {
|
|
64
|
+
resolveReviewThread(input: { threadId: $threadId }) {
|
|
65
|
+
thread { id isResolved }
|
|
66
|
+
}
|
|
67
|
+
}`;
|
|
68
|
+
const UNRESOLVE_MUTATION = `mutation UnresolveThread($threadId: ID!) {
|
|
69
|
+
unresolveReviewThread(input: { threadId: $threadId }) {
|
|
70
|
+
thread { id isResolved }
|
|
71
|
+
}
|
|
72
|
+
}`;
|
|
73
|
+
/** GitHub's review event for each neutral verdict. */
|
|
74
|
+
const REVIEW_EVENT = {
|
|
75
|
+
approve: "APPROVE",
|
|
76
|
+
"request-changes": "REQUEST_CHANGES",
|
|
77
|
+
comment: "COMMENT",
|
|
78
|
+
};
|
|
79
|
+
/** The neutral verdict for each of GitHub's review states. */
|
|
80
|
+
function verdictOf(state) {
|
|
81
|
+
if (state === "APPROVED")
|
|
82
|
+
return "approve";
|
|
83
|
+
if (state === "CHANGES_REQUESTED")
|
|
84
|
+
return "request-changes";
|
|
85
|
+
return "comment";
|
|
86
|
+
}
|
|
87
|
+
/** Reaction names GitHub accepts, which match the model's. */
|
|
88
|
+
const REACTION_NAMES = [
|
|
89
|
+
"+1",
|
|
90
|
+
"-1",
|
|
91
|
+
"laugh",
|
|
92
|
+
"confused",
|
|
93
|
+
"heart",
|
|
94
|
+
"hooray",
|
|
95
|
+
"rocket",
|
|
96
|
+
"eyes",
|
|
97
|
+
];
|
|
98
|
+
function slugOf(repo) {
|
|
99
|
+
const owned = ownerRepoFromKey(repo.key);
|
|
100
|
+
if (!owned)
|
|
101
|
+
throw new Error(`${repo.key} is not a GitHub repo key`);
|
|
102
|
+
return `${owned.owner}/${owned.repo}`;
|
|
103
|
+
}
|
|
104
|
+
function record(value) {
|
|
105
|
+
return typeof value === "object" && value !== null
|
|
106
|
+
? value
|
|
107
|
+
: {};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Walk into a response, refusing rather than defaulting.
|
|
111
|
+
*
|
|
112
|
+
* `record` above answers `{}` for anything it does not recognize,
|
|
113
|
+
* which is right for a field that may be absent and wrong for the
|
|
114
|
+
* envelope itself. Walked with it, a renamed field, a schema change
|
|
115
|
+
* or a partial error payload all arrive as a change with no threads
|
|
116
|
+
* on it, and that is the worst way a read can fail: the person
|
|
117
|
+
* concludes nobody commented and moves on, with nothing anywhere
|
|
118
|
+
* saying the question went unanswered.
|
|
119
|
+
*
|
|
120
|
+
* Absence is the test, not emptiness. A change with no comments is
|
|
121
|
+
* ordinary and answers with the field present and its list empty, so
|
|
122
|
+
* only a missing key is a refusal.
|
|
123
|
+
*/
|
|
124
|
+
function into(value, path, what) {
|
|
125
|
+
let at = value;
|
|
126
|
+
const walked = [];
|
|
127
|
+
for (const key of path) {
|
|
128
|
+
if (typeof at !== "object" || at === null || !(key in at)) {
|
|
129
|
+
const missing = [...walked, key].join(".");
|
|
130
|
+
throw new Error(`GitHub answered ${what} without ${missing}. Reading on would ` +
|
|
131
|
+
"report nothing found, which is indistinguishable from a change " +
|
|
132
|
+
"that genuinely has none.");
|
|
133
|
+
}
|
|
134
|
+
at = at[key];
|
|
135
|
+
walked.push(key);
|
|
136
|
+
}
|
|
137
|
+
return record(at);
|
|
138
|
+
}
|
|
139
|
+
function str(value) {
|
|
140
|
+
return typeof value === "string" ? value : undefined;
|
|
141
|
+
}
|
|
142
|
+
function list(value) {
|
|
143
|
+
return Array.isArray(value) ? value : [];
|
|
144
|
+
}
|
|
145
|
+
/** The counted reactions on a REST comment. */
|
|
146
|
+
function reactionsOf(value) {
|
|
147
|
+
const raw = record(value);
|
|
148
|
+
const counts = [];
|
|
149
|
+
for (const name of REACTION_NAMES) {
|
|
150
|
+
const count = raw[name];
|
|
151
|
+
if (typeof count === "number" && count > 0) {
|
|
152
|
+
counts.push({ reaction: name, count });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return counts;
|
|
156
|
+
}
|
|
157
|
+
/** A top-level comment, in the neutral shape. */
|
|
158
|
+
function messageFromIssueComment(raw) {
|
|
159
|
+
const reactions = reactionsOf(raw.reactions);
|
|
160
|
+
return {
|
|
161
|
+
id: `${ISSUE_COMMENT}${String(raw.id ?? "")}`,
|
|
162
|
+
author: { id: str(record(raw.user).login) ?? GHOST },
|
|
163
|
+
body: str(raw.body) ?? "",
|
|
164
|
+
...(str(raw.created_at) ? { createdAt: str(raw.created_at) } : {}),
|
|
165
|
+
...(str(raw.html_url) ? { url: str(raw.html_url) } : {}),
|
|
166
|
+
...(reactions.length > 0 ? { reactions } : {}),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/** A thread comment from GraphQL, keyed for the REST routes. */
|
|
170
|
+
function messageFromThreadComment(raw) {
|
|
171
|
+
const databaseId = raw.databaseId;
|
|
172
|
+
const id = typeof databaseId === "number"
|
|
173
|
+
? `${REVIEW_COMMENT}${databaseId}`
|
|
174
|
+
: (str(raw.id) ?? "");
|
|
175
|
+
return {
|
|
176
|
+
id,
|
|
177
|
+
author: { id: str(record(raw.author).login) ?? GHOST },
|
|
178
|
+
body: str(raw.body) ?? "",
|
|
179
|
+
...(str(raw.createdAt) ? { createdAt: str(raw.createdAt) } : {}),
|
|
180
|
+
...(str(raw.url) ? { url: str(raw.url) } : {}),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/** The anchor a thread carries, when it still has one. */
|
|
184
|
+
function anchorOf(raw) {
|
|
185
|
+
const path = str(raw.path);
|
|
186
|
+
if (!path)
|
|
187
|
+
return undefined;
|
|
188
|
+
// A remark about the whole file says so, and GitHub answers `line: 1` for
|
|
189
|
+
// one anyway. Reading the line first made a file-level remark come back as
|
|
190
|
+
// a remark on the first line: we would post one, read it back, and report
|
|
191
|
+
// it somewhere it was never aimed. Nobody would notice from the listing,
|
|
192
|
+
// since line 1 of a file is a plausible place to have said something.
|
|
193
|
+
if (str(raw.subjectType) === "FILE")
|
|
194
|
+
return { subject: "file", path };
|
|
195
|
+
const line = raw.line;
|
|
196
|
+
if (typeof line !== "number") {
|
|
197
|
+
// GitHub nulls the line when a force-push strands the
|
|
198
|
+
// thread; the file is all that is left of the anchor.
|
|
199
|
+
return { subject: "file", path };
|
|
200
|
+
}
|
|
201
|
+
const startLine = raw.startLine;
|
|
202
|
+
const blob = str(raw.diffSide) === "LEFT" ? "old" : "new";
|
|
203
|
+
return {
|
|
204
|
+
subject: "line",
|
|
205
|
+
path,
|
|
206
|
+
blob,
|
|
207
|
+
line,
|
|
208
|
+
...(typeof startLine === "number" && startLine !== line
|
|
209
|
+
? { startLine }
|
|
210
|
+
: {}),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* A person, from a GraphQL actor node, or nobody.
|
|
215
|
+
*
|
|
216
|
+
* Nobody rather than the ghost user: an absent actor here means the field was not
|
|
217
|
+
* selected or the thread is open, and naming a placeholder would assert somebody acted.
|
|
218
|
+
*/
|
|
219
|
+
function actorFrom(raw) {
|
|
220
|
+
const login = str(record(raw).login);
|
|
221
|
+
if (login === undefined)
|
|
222
|
+
return undefined;
|
|
223
|
+
const name = str(record(raw).name);
|
|
224
|
+
return { id: login, ...(name === undefined ? {} : { name }) };
|
|
225
|
+
}
|
|
226
|
+
function threadFrom(raw) {
|
|
227
|
+
const anchor = anchorOf(raw);
|
|
228
|
+
const closedBy = actorFrom(raw.resolvedBy);
|
|
229
|
+
return {
|
|
230
|
+
id: str(raw.id) ?? "",
|
|
231
|
+
resolved: raw.isResolved === true,
|
|
232
|
+
// Who closed it. The follow-up view reads this to say a thread was
|
|
233
|
+
// resolved by somebody other than you, which is the attribution that
|
|
234
|
+
// whole feature exists to give, and it was asking for a field the query
|
|
235
|
+
// never selected, so every follow-up degraded to "resolved with no
|
|
236
|
+
// reply" and never named anyone.
|
|
237
|
+
...(closedBy === undefined ? {} : { resolvedBy: closedBy }),
|
|
238
|
+
stale: raw.isOutdated === true,
|
|
239
|
+
...(anchor ? { anchor } : {}),
|
|
240
|
+
comments: list(record(raw.comments).nodes).map((node) => messageFromThreadComment(record(node))),
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/** GitHub's wire shape for one anchored comment. */
|
|
244
|
+
function wireComment(anchor, body) {
|
|
245
|
+
// GitHub has nowhere to attach a remark about the change
|
|
246
|
+
// itself, so the plan spills those into the review body long
|
|
247
|
+
// before here. Reaching this with one is a bug in the plan,
|
|
248
|
+
// and saying so beats posting a comment against no path.
|
|
249
|
+
if (anchor.subject === "change") {
|
|
250
|
+
throw new Error("a remark about the whole change cannot be an anchored comment");
|
|
251
|
+
}
|
|
252
|
+
if (anchor.subject === "file") {
|
|
253
|
+
return { path: anchor.path, body, subject_type: "file" };
|
|
254
|
+
}
|
|
255
|
+
const side = anchor.blob === "old" ? "LEFT" : "RIGHT";
|
|
256
|
+
return {
|
|
257
|
+
path: anchor.path,
|
|
258
|
+
body,
|
|
259
|
+
line: anchor.line,
|
|
260
|
+
side,
|
|
261
|
+
...(anchor.startLine !== undefined && anchor.startLine !== anchor.line
|
|
262
|
+
? { start_line: anchor.startLine, start_side: side }
|
|
263
|
+
: {}),
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
/** Which REST route a message id belongs to. */
|
|
267
|
+
function reactionRoute(slug, message) {
|
|
268
|
+
if (message.id.startsWith(REVIEW_COMMENT)) {
|
|
269
|
+
const id = message.id.slice(REVIEW_COMMENT.length);
|
|
270
|
+
return `repos/${slug}/pulls/comments/${id}/reactions`;
|
|
271
|
+
}
|
|
272
|
+
if (message.id.startsWith(ISSUE_COMMENT)) {
|
|
273
|
+
const id = message.id.slice(ISSUE_COMMENT.length);
|
|
274
|
+
return `repos/${slug}/issues/comments/${id}/reactions`;
|
|
275
|
+
}
|
|
276
|
+
throw new Error(`cannot tell what kind of comment ${message.id} is, so it cannot be reacted to`);
|
|
277
|
+
}
|
|
278
|
+
/** Build the conversation facet. */
|
|
279
|
+
export function githubConversation(exec) {
|
|
280
|
+
async function api(args, what) {
|
|
281
|
+
const stdout = await run(exec, "gh", ["api", ...args], what);
|
|
282
|
+
return (stdout.trim() ? JSON.parse(stdout) : {});
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Read a REST list in full.
|
|
286
|
+
*
|
|
287
|
+
* GitHub answers a list request with thirty records and says
|
|
288
|
+
* nothing about the rest, so a plain read of a busy pull
|
|
289
|
+
* request quietly loses its tail, which is where the recent
|
|
290
|
+
* argument is. `--paginate` walks every page and merges them
|
|
291
|
+
* into one array; asking for a hundred at a time is what
|
|
292
|
+
* keeps that from being a dozen round trips.
|
|
293
|
+
*/
|
|
294
|
+
async function apiList(route, what) {
|
|
295
|
+
const joiner = route.includes("?") ? "&" : "?";
|
|
296
|
+
return api(["--paginate", `${route}${joiner}per_page=100`], what);
|
|
297
|
+
}
|
|
298
|
+
async function graphql(query, variables, what) {
|
|
299
|
+
const args = ["graphql", "-f", `query=${query}`];
|
|
300
|
+
for (const [name, value] of Object.entries(variables)) {
|
|
301
|
+
// gh uses -F for numbers and -f for raw strings.
|
|
302
|
+
args.push(typeof value === "number" ? "-F" : "-f", `${name}=${value}`);
|
|
303
|
+
}
|
|
304
|
+
return api(args, what);
|
|
305
|
+
}
|
|
306
|
+
/** Post a JSON payload through a temp file. */
|
|
307
|
+
async function postJson(route, payload, what) {
|
|
308
|
+
const file = join(tmpdir(), `pi-review-${Date.now()}-${Math.random()}.json`);
|
|
309
|
+
try {
|
|
310
|
+
await writeFile(file, JSON.stringify(payload), "utf8");
|
|
311
|
+
const raw = await api(["--method", "POST", route, "--input", file], what);
|
|
312
|
+
const answer = record(raw);
|
|
313
|
+
return {
|
|
314
|
+
...(answer.id !== undefined ? { id: String(answer.id) } : {}),
|
|
315
|
+
...(str(answer.html_url) ? { url: str(answer.html_url) } : {}),
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
finally {
|
|
319
|
+
// A leftover temp file is harmless; failing to clean one
|
|
320
|
+
// up must not fail the operation that succeeded.
|
|
321
|
+
await unlink(file).catch(() => { });
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return {
|
|
325
|
+
async reviews(ref) {
|
|
326
|
+
const raw = await apiList(`repos/${slugOf(ref.repo)}/pulls/${ref.id}/reviews`, `reading reviews on pull request ${ref.id}`);
|
|
327
|
+
return list(raw).map((entry) => {
|
|
328
|
+
const review = record(entry);
|
|
329
|
+
const state = str(review.state) ?? "COMMENTED";
|
|
330
|
+
return {
|
|
331
|
+
id: String(review.id ?? ""),
|
|
332
|
+
author: { id: str(record(review.user).login) ?? GHOST },
|
|
333
|
+
verdict: verdictOf(state),
|
|
334
|
+
nativeVerdict: state,
|
|
335
|
+
body: str(review.body) ?? "",
|
|
336
|
+
...(str(review.submitted_at)
|
|
337
|
+
? { submittedAt: str(review.submitted_at) }
|
|
338
|
+
: {}),
|
|
339
|
+
...(str(review.html_url) ? { url: str(review.html_url) } : {}),
|
|
340
|
+
};
|
|
341
|
+
});
|
|
342
|
+
},
|
|
343
|
+
async threads(ref) {
|
|
344
|
+
const owned = ownerRepoFromKey(ref.repo.key);
|
|
345
|
+
if (!owned)
|
|
346
|
+
throw new Error(`${ref.repo.key} is not a GitHub repo key`);
|
|
347
|
+
const threads = [];
|
|
348
|
+
let after;
|
|
349
|
+
// Keep asking. A long review has more than one page, and
|
|
350
|
+
// the tail is exactly where the unresolved threads are.
|
|
351
|
+
for (;;) {
|
|
352
|
+
const raw = await graphql(THREADS_QUERY, {
|
|
353
|
+
owner: owned.owner,
|
|
354
|
+
repo: owned.repo,
|
|
355
|
+
number: Number.parseInt(ref.id, 10),
|
|
356
|
+
...(after ? { after } : {}),
|
|
357
|
+
}, `reading threads on pull request ${ref.id}`);
|
|
358
|
+
const page = into(raw, ["data", "repository", "pullRequest", "reviewThreads"], `threads on pull request ${ref.id}`);
|
|
359
|
+
for (const node of list(page.nodes)) {
|
|
360
|
+
threads.push(threadFrom(record(node)));
|
|
361
|
+
}
|
|
362
|
+
const info = record(page.pageInfo);
|
|
363
|
+
const cursor = str(info.endCursor);
|
|
364
|
+
if (info.hasNextPage !== true || !cursor)
|
|
365
|
+
break;
|
|
366
|
+
after = cursor;
|
|
367
|
+
}
|
|
368
|
+
return threads;
|
|
369
|
+
},
|
|
370
|
+
async messages(ref) {
|
|
371
|
+
const raw = await apiList(`repos/${slugOf(ref.repo)}/issues/${ref.id}/comments`, `reading comments on pull request ${ref.id}`);
|
|
372
|
+
return list(raw).map((entry) => messageFromIssueComment(record(entry)));
|
|
373
|
+
},
|
|
374
|
+
async postReview(ref, review) {
|
|
375
|
+
return postJson(`repos/${slugOf(ref.repo)}/pulls/${ref.id}/reviews`, {
|
|
376
|
+
event: REVIEW_EVENT[review.verdict],
|
|
377
|
+
body: review.body,
|
|
378
|
+
comments: review.comments.map((comment) => wireComment(comment.anchor, comment.body)),
|
|
379
|
+
}, `posting a review on pull request ${ref.id}`);
|
|
380
|
+
},
|
|
381
|
+
/**
|
|
382
|
+
* One anchored remark, posted on its own rather than in a review.
|
|
383
|
+
*
|
|
384
|
+
* This is where a remark about a whole file has to go. The batch route
|
|
385
|
+
* refuses one with `0.position (Expected value to not be null)` and
|
|
386
|
+
* rejects the entire review with it, so a single file-level remark used
|
|
387
|
+
* to cost every other remark beside it; adding `subject_type` to the
|
|
388
|
+
* batch is refused too, as `0.subjectType (Field is not defined on
|
|
389
|
+
* DraftPullRequestReviewComment)`. This route takes the same comment
|
|
390
|
+
* without complaint.
|
|
391
|
+
*
|
|
392
|
+
* It needs a commit to hang the comment from, which a review does not,
|
|
393
|
+
* so the change is read first to learn its head.
|
|
394
|
+
*/
|
|
395
|
+
async commentOn(ref, anchor, body) {
|
|
396
|
+
const change = record(await api([`repos/${slugOf(ref.repo)}/pulls/${ref.id}`], `reading pull request ${ref.id} for the commit to anchor a comment to`));
|
|
397
|
+
const head = str(record(change.head).sha);
|
|
398
|
+
if (!head) {
|
|
399
|
+
throw new Error(`GitHub did not say what commit pull request ${ref.id} is at, and a comment posted on its own has to name one.`);
|
|
400
|
+
}
|
|
401
|
+
return postJson(`repos/${slugOf(ref.repo)}/pulls/${ref.id}/comments`, { ...wireComment(anchor, body), commit_id: head }, `posting a remark on ${anchor.subject === "file" ? anchor.path : "a line"} in pull request ${ref.id}`);
|
|
402
|
+
},
|
|
403
|
+
async reply(_ref, thread, body) {
|
|
404
|
+
const raw = await graphql(REPLY_MUTATION, { threadId: thread.id, body }, `replying to thread ${thread.id}`);
|
|
405
|
+
const comment = record(record(record(record(raw).data).addPullRequestReviewThreadReply)
|
|
406
|
+
.comment);
|
|
407
|
+
return {
|
|
408
|
+
...(str(comment.id) ? { id: str(comment.id) } : {}),
|
|
409
|
+
...(str(comment.url) ? { url: str(comment.url) } : {}),
|
|
410
|
+
};
|
|
411
|
+
},
|
|
412
|
+
async resolve(_ref, thread) {
|
|
413
|
+
await graphql(RESOLVE_MUTATION, { threadId: thread.id }, `resolving thread ${thread.id}`);
|
|
414
|
+
},
|
|
415
|
+
async unresolve(_ref, thread) {
|
|
416
|
+
await graphql(UNRESOLVE_MUTATION, { threadId: thread.id }, `reopening thread ${thread.id}`);
|
|
417
|
+
},
|
|
418
|
+
async comment(ref, body) {
|
|
419
|
+
const raw = await api([
|
|
420
|
+
"--method",
|
|
421
|
+
"POST",
|
|
422
|
+
`repos/${slugOf(ref.repo)}/issues/${ref.id}/comments`,
|
|
423
|
+
"-f",
|
|
424
|
+
`body=${body}`,
|
|
425
|
+
], `commenting on pull request ${ref.id}`);
|
|
426
|
+
const answer = record(raw);
|
|
427
|
+
return {
|
|
428
|
+
...(answer.id !== undefined ? { id: String(answer.id) } : {}),
|
|
429
|
+
...(str(answer.html_url) ? { url: str(answer.html_url) } : {}),
|
|
430
|
+
};
|
|
431
|
+
},
|
|
432
|
+
async react(ref, subject, reaction) {
|
|
433
|
+
await api([
|
|
434
|
+
"--method",
|
|
435
|
+
"POST",
|
|
436
|
+
reactionRoute(slugOf(ref.repo), subject),
|
|
437
|
+
"-f",
|
|
438
|
+
`content=${reaction}`,
|
|
439
|
+
], `reacting to ${subject.id}`);
|
|
440
|
+
},
|
|
441
|
+
async viewer() {
|
|
442
|
+
// The login, which is how every other GitHub payload names an
|
|
443
|
+
// author, so a comparison against a comment's author is comparing
|
|
444
|
+
// like with like. The display name is carried for a listing and
|
|
445
|
+
// never used to decide identity.
|
|
446
|
+
const answer = await api(["user"], "asking who you are");
|
|
447
|
+
const login = str(answer.login);
|
|
448
|
+
if (login === undefined) {
|
|
449
|
+
throw new Error("GitHub did not say who you are, so a question about your own remarks cannot be answered about the right person");
|
|
450
|
+
}
|
|
451
|
+
const name = str(answer.name);
|
|
452
|
+
return { id: login, ...(name === undefined ? {} : { name }) };
|
|
453
|
+
},
|
|
454
|
+
};
|
|
455
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fields two GitHub readers both need.
|
|
3
|
+
*
|
|
4
|
+
* There are two places that turn a REST pull request into a
|
|
5
|
+
* {@link Proposal}: the proposals facet, which reads changes, and the
|
|
6
|
+
* authoring facet, which reads back the change it just wrote. They are
|
|
7
|
+
* near-duplicates and predate this file, and merging them is a real
|
|
8
|
+
* refactor rather than a detail of adding a field.
|
|
9
|
+
*
|
|
10
|
+
* What this file refuses to do is make the duplication worse. A reader
|
|
11
|
+
* added to one and forgotten in the other means a label that appears
|
|
12
|
+
* when you fetch a change and vanishes when you edit it, which reads as
|
|
13
|
+
* the edit having removed it.
|
|
14
|
+
*/
|
|
15
|
+
import type { Actor } from "../../change.js";
|
|
16
|
+
/**
|
|
17
|
+
* Labels and assignees, when GitHub reported them.
|
|
18
|
+
*
|
|
19
|
+
* Both are carried on the pull request representation itself, so reading
|
|
20
|
+
* them costs nothing extra even though writing them takes a separate
|
|
21
|
+
* call to the issue routes.
|
|
22
|
+
*
|
|
23
|
+
* Each field is present only when GitHub sent the array. An empty array
|
|
24
|
+
* and an absent field are different facts: the first says this change
|
|
25
|
+
* has no labels, the second says nobody looked.
|
|
26
|
+
*/
|
|
27
|
+
export declare function labelsAndAssignees(raw: Record<string, unknown>): {
|
|
28
|
+
labels?: string[];
|
|
29
|
+
assignees?: Actor[];
|
|
30
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fields two GitHub readers both need.
|
|
3
|
+
*
|
|
4
|
+
* There are two places that turn a REST pull request into a
|
|
5
|
+
* {@link Proposal}: the proposals facet, which reads changes, and the
|
|
6
|
+
* authoring facet, which reads back the change it just wrote. They are
|
|
7
|
+
* near-duplicates and predate this file, and merging them is a real
|
|
8
|
+
* refactor rather than a detail of adding a field.
|
|
9
|
+
*
|
|
10
|
+
* What this file refuses to do is make the duplication worse. A reader
|
|
11
|
+
* added to one and forgotten in the other means a label that appears
|
|
12
|
+
* when you fetch a change and vanishes when you edit it, which reads as
|
|
13
|
+
* the edit having removed it.
|
|
14
|
+
*/
|
|
15
|
+
/** Every string in an array of records under one key. */
|
|
16
|
+
function names(value, key) {
|
|
17
|
+
if (!Array.isArray(value))
|
|
18
|
+
return undefined;
|
|
19
|
+
const found = [];
|
|
20
|
+
for (const entry of value) {
|
|
21
|
+
if (typeof entry !== "object" || entry === null)
|
|
22
|
+
continue;
|
|
23
|
+
const held = entry[key];
|
|
24
|
+
if (typeof held === "string" && held !== "")
|
|
25
|
+
found.push(held);
|
|
26
|
+
}
|
|
27
|
+
return found;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Labels and assignees, when GitHub reported them.
|
|
31
|
+
*
|
|
32
|
+
* Both are carried on the pull request representation itself, so reading
|
|
33
|
+
* them costs nothing extra even though writing them takes a separate
|
|
34
|
+
* call to the issue routes.
|
|
35
|
+
*
|
|
36
|
+
* Each field is present only when GitHub sent the array. An empty array
|
|
37
|
+
* and an absent field are different facts: the first says this change
|
|
38
|
+
* has no labels, the second says nobody looked.
|
|
39
|
+
*/
|
|
40
|
+
export function labelsAndAssignees(raw) {
|
|
41
|
+
const labels = names(raw.labels, "name");
|
|
42
|
+
const logins = names(raw.assignees, "login");
|
|
43
|
+
return {
|
|
44
|
+
...(labels ? { labels } : {}),
|
|
45
|
+
...(logins ? { assignees: logins.map((id) => ({ id })) } : {}),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The GitHub provider.
|
|
3
|
+
*
|
|
4
|
+
* Reaches GitHub through the `gh` CLI, which is where the
|
|
5
|
+
* authentication already lives. Capabilities are declared from
|
|
6
|
+
* what GitHub actually does rather than what would be
|
|
7
|
+
* convenient: it flags a stranded anchor instead of pinning
|
|
8
|
+
* one, it cannot thread a reply onto a top-level comment, and
|
|
9
|
+
* it records no stack at all, so any stack it reports is
|
|
10
|
+
* derived and says so.
|
|
11
|
+
*/
|
|
12
|
+
import type { ProviderDeps } from "../../../exec/index.js";
|
|
13
|
+
import type { ReviewProvider } from "../../provider.js";
|
|
14
|
+
/** Build the GitHub provider. */
|
|
15
|
+
export declare function createGitHubProvider(deps: ProviderDeps): ReviewProvider;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The GitHub provider.
|
|
3
|
+
*
|
|
4
|
+
* Reaches GitHub through the `gh` CLI, which is where the
|
|
5
|
+
* authentication already lives. Capabilities are declared from
|
|
6
|
+
* what GitHub actually does rather than what would be
|
|
7
|
+
* convenient: it flags a stranded anchor instead of pinning
|
|
8
|
+
* one, it cannot thread a reply onto a top-level comment, and
|
|
9
|
+
* it records no stack at all, so any stack it reports is
|
|
10
|
+
* derived and says so.
|
|
11
|
+
*/
|
|
12
|
+
import { githubAuthoring } from "./authoring.js";
|
|
13
|
+
import { claimGitHubReference, claimGitHubRepo, GITHUB_PROVIDER_ID, } from "./claims.js";
|
|
14
|
+
import { githubConversation } from "./conversation.js";
|
|
15
|
+
import { githubProposals } from "./proposals.js";
|
|
16
|
+
import { githubStacking } from "./stacking.js";
|
|
17
|
+
/**
|
|
18
|
+
* Claim priority. A generalist: any backend that specializes
|
|
19
|
+
* in a repo GitHub also mirrors should be asked first.
|
|
20
|
+
*/
|
|
21
|
+
const GITHUB_PRIORITY = 100;
|
|
22
|
+
/** The reactions GitHub accepts, in its own order. */
|
|
23
|
+
const GITHUB_REACTIONS = [
|
|
24
|
+
"+1",
|
|
25
|
+
"-1",
|
|
26
|
+
"laugh",
|
|
27
|
+
"confused",
|
|
28
|
+
"heart",
|
|
29
|
+
"hooray",
|
|
30
|
+
"rocket",
|
|
31
|
+
"eyes",
|
|
32
|
+
];
|
|
33
|
+
/** What GitHub can do, which does not vary by repo. */
|
|
34
|
+
function githubCapabilities() {
|
|
35
|
+
return {
|
|
36
|
+
proposals: { fetchAsRef: true, checks: true, list: true },
|
|
37
|
+
stacking: { provenance: "derived", fanOut: true },
|
|
38
|
+
conversation: {
|
|
39
|
+
anchoredBatchReview: true,
|
|
40
|
+
// On its own, not in a review. The batch route refuses a
|
|
41
|
+
// file-level comment and rejects the whole review with it, and
|
|
42
|
+
// declaring this as a bare `true` beside `anchoredBatchReview:
|
|
43
|
+
// true` said the pair was possible when only each half was.
|
|
44
|
+
fileLevelComments: "standalone",
|
|
45
|
+
multiLineRanges: true,
|
|
46
|
+
unresolve: true,
|
|
47
|
+
reactions: GITHUB_REACTIONS,
|
|
48
|
+
// A reply must target a review thread; issue comments
|
|
49
|
+
// have no thread to hang from.
|
|
50
|
+
topLevelThreading: false,
|
|
51
|
+
// A force-push strands a thread and GitHub marks it,
|
|
52
|
+
// rather than keeping the anchor's commit reachable.
|
|
53
|
+
staleness: "flagged",
|
|
54
|
+
selfVerdicts: ["comment"],
|
|
55
|
+
},
|
|
56
|
+
authoring: {
|
|
57
|
+
propose: true,
|
|
58
|
+
// One change at a time. GitHub has no notion of a stack, so
|
|
59
|
+
// there is nothing to submit as one.
|
|
60
|
+
proposeStack: false,
|
|
61
|
+
reviewersAt: "any-time",
|
|
62
|
+
// A base is a field on the change here, so retargeting one
|
|
63
|
+
// change moves that change and nothing else.
|
|
64
|
+
retarget: "change",
|
|
65
|
+
setDraft: true,
|
|
66
|
+
close: true,
|
|
67
|
+
reopen: true,
|
|
68
|
+
merge: true,
|
|
69
|
+
labels: true,
|
|
70
|
+
assignees: true,
|
|
71
|
+
// A login, not an email. The REST routes take `assignees` as an
|
|
72
|
+
// array of logins and answer 422 for anything else, and an email
|
|
73
|
+
// address is not derivable from a login here: the address on a
|
|
74
|
+
// commit belongs to the commit, not to the account.
|
|
75
|
+
identifies: "login",
|
|
76
|
+
// True because Actions runs can be reposted, not because every
|
|
77
|
+
// check on a GitHub change can be. A check contributed by some
|
|
78
|
+
// other app has no run behind it, and the implementation
|
|
79
|
+
// declines by name rather than pretending it started one.
|
|
80
|
+
rerunChecks: true,
|
|
81
|
+
// This said false, on the belief that a merge queue was
|
|
82
|
+
// something a backend layered on top of GitHub added. GitHub
|
|
83
|
+
// has its own: `MergeQueueEntry` is on the GraphQL pull
|
|
84
|
+
// request, it reports a position and whether the change is
|
|
85
|
+
// being tested `solo`, and pushing to a queued change ejects
|
|
86
|
+
// it the same way. Saying false here made the queue gate dead
|
|
87
|
+
// on GitHub as well as unreachable everywhere.
|
|
88
|
+
//
|
|
89
|
+
// Declaring true is not the same as refusing: the proposals
|
|
90
|
+
// facet reports the posture, and a change with no queue entry
|
|
91
|
+
// reads as unqueued and is permitted. The gate bites only when
|
|
92
|
+
// there is really something to eject.
|
|
93
|
+
refusesWhileEnqueued: true,
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** Build the GitHub provider. */
|
|
98
|
+
export function createGitHubProvider(deps) {
|
|
99
|
+
return {
|
|
100
|
+
id: GITHUB_PROVIDER_ID,
|
|
101
|
+
priority: GITHUB_PRIORITY,
|
|
102
|
+
claimReference: claimGitHubReference,
|
|
103
|
+
claimRepo: claimGitHubRepo,
|
|
104
|
+
capabilities: githubCapabilities,
|
|
105
|
+
proposals: githubProposals(deps.exec),
|
|
106
|
+
conversation: githubConversation(deps.exec),
|
|
107
|
+
stacking: githubStacking(deps.exec),
|
|
108
|
+
authoring: githubAuthoring(deps.exec),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
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 type { Exec } from "../../../exec/index.js";
|
|
12
|
+
import type { ProposalsFacet } from "../../provider.js";
|
|
13
|
+
/** Build the proposals facet. */
|
|
14
|
+
export declare function githubProposals(exec: Exec): ProposalsFacet;
|