@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,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Running a plan, honestly.
|
|
3
|
+
*
|
|
4
|
+
* Publishing a review is several requests, and the interesting
|
|
5
|
+
* case is the one where some of them work. A posted review
|
|
6
|
+
* with one failed reply is not a failure to report as "could
|
|
7
|
+
* not publish", because the review is now on the change and
|
|
8
|
+
* saying otherwise would have someone post it twice. So every
|
|
9
|
+
* operation reports its own outcome, execution continues past
|
|
10
|
+
* a failure, and the caller learns exactly which items landed.
|
|
11
|
+
*/
|
|
12
|
+
/** The message an unusable error becomes. */
|
|
13
|
+
function messageOf(error) {
|
|
14
|
+
return error instanceof Error ? error.message : String(error);
|
|
15
|
+
}
|
|
16
|
+
/** Every operation failed for the same reason. */
|
|
17
|
+
function allFailed(plan, error) {
|
|
18
|
+
return {
|
|
19
|
+
ok: false,
|
|
20
|
+
outcomes: plan.ops.map((op) => ({
|
|
21
|
+
op,
|
|
22
|
+
ok: false,
|
|
23
|
+
itemIds: op.itemIds,
|
|
24
|
+
error,
|
|
25
|
+
})),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Perform one operation. Returns what the provider handed
|
|
30
|
+
* back, or throws for the caller to record.
|
|
31
|
+
*/
|
|
32
|
+
async function perform(op, provider, change) {
|
|
33
|
+
const conversation = provider.conversation;
|
|
34
|
+
if (!conversation) {
|
|
35
|
+
throw new Error(`the ${provider.id} provider has no conversation facet`);
|
|
36
|
+
}
|
|
37
|
+
if (op.kind === "review") {
|
|
38
|
+
return conversation.postReview(change, {
|
|
39
|
+
verdict: op.verdict,
|
|
40
|
+
body: op.body,
|
|
41
|
+
comments: op.comments,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
if (op.kind === "comment") {
|
|
45
|
+
return conversation.comment(change, op.body);
|
|
46
|
+
}
|
|
47
|
+
if (op.kind === "commentOn") {
|
|
48
|
+
if (!conversation.commentOn) {
|
|
49
|
+
// The planner only makes one of these for a provider declaring
|
|
50
|
+
// `fileLevelComments: "standalone"`, which is a promise of this
|
|
51
|
+
// method, so reaching here means the declaration was wrong. Said
|
|
52
|
+
// plainly rather than swallowed: the remark is in the draft still,
|
|
53
|
+
// and publishing again after the provider is fixed will send it.
|
|
54
|
+
throw new Error(`the ${provider.id} provider says a remark about a whole file has to be posted on its own, and then offers no way to post one`);
|
|
55
|
+
}
|
|
56
|
+
return conversation.commentOn(change, op.comment.anchor, op.comment.body);
|
|
57
|
+
}
|
|
58
|
+
if (op.kind === "reply") {
|
|
59
|
+
return conversation.reply(change, op.thread, op.body);
|
|
60
|
+
}
|
|
61
|
+
if (op.kind === "resolve") {
|
|
62
|
+
await conversation.resolve(change, op.thread);
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
if (op.kind === "unresolve") {
|
|
66
|
+
if (!conversation.unresolve) {
|
|
67
|
+
throw new Error(`the ${provider.id} provider cannot reopen a resolved thread`);
|
|
68
|
+
}
|
|
69
|
+
await conversation.unresolve(change, op.thread);
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
if (!conversation.react) {
|
|
73
|
+
throw new Error(`the ${provider.id} provider cannot post reactions`);
|
|
74
|
+
}
|
|
75
|
+
await conversation.react(change, op.subject, op.reaction);
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Run a compiled plan against a provider.
|
|
80
|
+
*
|
|
81
|
+
* Operations run in the order the plan puts them and a
|
|
82
|
+
* failure does not stop the ones after it, because the
|
|
83
|
+
* alternative is a review posted with half its replies
|
|
84
|
+
* missing and no record of which half.
|
|
85
|
+
*/
|
|
86
|
+
export async function publishPlan(plan, provider) {
|
|
87
|
+
if (plan.ops.length === 0)
|
|
88
|
+
return { ok: true, outcomes: [] };
|
|
89
|
+
if (plan.target.kind !== "proposal") {
|
|
90
|
+
return allFailed(plan, "this target is not hosted anywhere, so there is no change " +
|
|
91
|
+
"to publish to; render the review as a document instead");
|
|
92
|
+
}
|
|
93
|
+
if (!provider.conversation) {
|
|
94
|
+
return allFailed(plan, `the ${provider.id} provider has no conversation facet`);
|
|
95
|
+
}
|
|
96
|
+
const change = plan.target.change;
|
|
97
|
+
const outcomes = [];
|
|
98
|
+
for (const op of plan.ops) {
|
|
99
|
+
try {
|
|
100
|
+
const posted = await perform(op, provider, change);
|
|
101
|
+
outcomes.push({
|
|
102
|
+
op,
|
|
103
|
+
ok: true,
|
|
104
|
+
itemIds: op.itemIds,
|
|
105
|
+
...(posted ? { posted } : {}),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
outcomes.push({
|
|
110
|
+
op,
|
|
111
|
+
ok: false,
|
|
112
|
+
itemIds: op.itemIds,
|
|
113
|
+
error: messageOf(error),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return { ok: outcomes.every((entry) => entry.ok), outcomes };
|
|
118
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A review with nowhere to post, written down.
|
|
3
|
+
*
|
|
4
|
+
* Reviewing a stack of branches nobody has proposed is a real
|
|
5
|
+
* activity, and the fact that no server will accept the result
|
|
6
|
+
* does not make the result worthless. So a draft can always
|
|
7
|
+
* become a document: the summary, the remarks grouped by the
|
|
8
|
+
* file they are about, and the verdict recorded the way git
|
|
9
|
+
* records a verdict, as a trailer.
|
|
10
|
+
*
|
|
11
|
+
* The trailer vocabulary is borrowed rather than invented.
|
|
12
|
+
* `Reviewed-by` is what a reviewer stamps on work they accept
|
|
13
|
+
* and `Nacked-by` is the long-standing way to record an
|
|
14
|
+
* objection; a review that takes no position gets no trailer,
|
|
15
|
+
* because that is what taking no position means.
|
|
16
|
+
*/
|
|
17
|
+
import type { Actor } from "../change.js";
|
|
18
|
+
import type { DraftState } from "./state.js";
|
|
19
|
+
/** Who is reviewing, and anything else the document needs. */
|
|
20
|
+
export interface RenderOptions {
|
|
21
|
+
/** The reviewer, for the verdict trailer. */
|
|
22
|
+
author?: Actor;
|
|
23
|
+
}
|
|
24
|
+
/** A review, written out. */
|
|
25
|
+
export interface ReviewDocument {
|
|
26
|
+
title: string;
|
|
27
|
+
markdown: string;
|
|
28
|
+
/** Trailers recording the verdict, ready to append. */
|
|
29
|
+
trailers: string[];
|
|
30
|
+
}
|
|
31
|
+
/** Render a draft as a document. */
|
|
32
|
+
export declare function renderDraft(state: DraftState, options?: RenderOptions): ReviewDocument;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A review with nowhere to post, written down.
|
|
3
|
+
*
|
|
4
|
+
* Reviewing a stack of branches nobody has proposed is a real
|
|
5
|
+
* activity, and the fact that no server will accept the result
|
|
6
|
+
* does not make the result worthless. So a draft can always
|
|
7
|
+
* become a document: the summary, the remarks grouped by the
|
|
8
|
+
* file they are about, and the verdict recorded the way git
|
|
9
|
+
* records a verdict, as a trailer.
|
|
10
|
+
*
|
|
11
|
+
* The trailer vocabulary is borrowed rather than invented.
|
|
12
|
+
* `Reviewed-by` is what a reviewer stamps on work they accept
|
|
13
|
+
* and `Nacked-by` is the long-standing way to record an
|
|
14
|
+
* objection; a review that takes no position gets no trailer,
|
|
15
|
+
* because that is what taking no position means.
|
|
16
|
+
*/
|
|
17
|
+
import { anchorPath } from "../anchor.js";
|
|
18
|
+
import { bullet } from "./continuation.js";
|
|
19
|
+
/** How to name what was reviewed. */
|
|
20
|
+
function describeTarget(target) {
|
|
21
|
+
if (target.kind === "proposal") {
|
|
22
|
+
return `${target.change.repo.key} ${target.change.id}`;
|
|
23
|
+
}
|
|
24
|
+
if (target.kind === "range") {
|
|
25
|
+
return `${target.base}..${target.head}`;
|
|
26
|
+
}
|
|
27
|
+
return target.refs.join(", ");
|
|
28
|
+
}
|
|
29
|
+
/** Where in a file a remark points. */
|
|
30
|
+
function describeLocation(anchor) {
|
|
31
|
+
if (anchor.subject === "change")
|
|
32
|
+
return "the change as a whole";
|
|
33
|
+
if (anchor.subject === "file")
|
|
34
|
+
return "the file as a whole";
|
|
35
|
+
const lines = anchor.startLine && anchor.startLine !== anchor.line
|
|
36
|
+
? `${anchor.startLine}-${anchor.line}`
|
|
37
|
+
: `${anchor.line}`;
|
|
38
|
+
return `line ${lines} (${anchor.blob})`;
|
|
39
|
+
}
|
|
40
|
+
/** Findings in file order, each file keeping its own order. */
|
|
41
|
+
function groupByFile(findings) {
|
|
42
|
+
const grouped = new Map();
|
|
43
|
+
for (const finding of findings) {
|
|
44
|
+
// A remark about the change names no file, so it groups
|
|
45
|
+
// under a heading of its own rather than under one.
|
|
46
|
+
const path = anchorPath(finding.anchor) ?? "the change as a whole";
|
|
47
|
+
const existing = grouped.get(path);
|
|
48
|
+
if (existing)
|
|
49
|
+
existing.push(finding);
|
|
50
|
+
else
|
|
51
|
+
grouped.set(path, [finding]);
|
|
52
|
+
}
|
|
53
|
+
return grouped;
|
|
54
|
+
}
|
|
55
|
+
/** How the reviewer is named in a trailer. */
|
|
56
|
+
function nameFor(author) {
|
|
57
|
+
return author.name ? `${author.name} <${author.id}>` : author.id;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The trailers recording a verdict. Approval and objection
|
|
61
|
+
* both have long-standing spellings; taking no position has
|
|
62
|
+
* no trailer, which is the point of taking no position.
|
|
63
|
+
*/
|
|
64
|
+
function verdictTrailers(state, author) {
|
|
65
|
+
if (!author || !state.verdict)
|
|
66
|
+
return [];
|
|
67
|
+
if (state.verdict === "approve")
|
|
68
|
+
return [`Reviewed-by: ${nameFor(author)}`];
|
|
69
|
+
if (state.verdict === "request-changes") {
|
|
70
|
+
return [`Nacked-by: ${nameFor(author)}`];
|
|
71
|
+
}
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
/** Render a draft as a document. */
|
|
75
|
+
export function renderDraft(state, options) {
|
|
76
|
+
const subject = describeTarget(state.target);
|
|
77
|
+
const title = `Review of ${subject}`;
|
|
78
|
+
const trailers = verdictTrailers(state, options?.author);
|
|
79
|
+
const sections = [`# ${title}`];
|
|
80
|
+
if (state.summary)
|
|
81
|
+
sections.push(state.summary);
|
|
82
|
+
const findings = state.items.filter((item) => item.kind === "finding");
|
|
83
|
+
for (const [path, forFile] of groupByFile(findings)) {
|
|
84
|
+
const remarks = forFile.map((finding) => bullet(describeLocation(finding.anchor), finding.body));
|
|
85
|
+
sections.push(`## ${path}`, remarks.join("\n"));
|
|
86
|
+
}
|
|
87
|
+
const replies = state.items.filter((item) => item.kind === "reply");
|
|
88
|
+
if (replies.length > 0) {
|
|
89
|
+
const lines = replies.map((item) => item.kind === "reply"
|
|
90
|
+
? bullet(`in reply to ${item.thread.id}`, item.body)
|
|
91
|
+
: "");
|
|
92
|
+
sections.push("## Replies", lines.join("\n"));
|
|
93
|
+
}
|
|
94
|
+
if (findings.length === 0 && replies.length === 0 && !state.summary) {
|
|
95
|
+
sections.push("No remarks.");
|
|
96
|
+
}
|
|
97
|
+
if (trailers.length > 0)
|
|
98
|
+
sections.push(trailers.join("\n"));
|
|
99
|
+
return { title, markdown: `${sections.join("\n\n")}\n`, trailers };
|
|
100
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a review session accumulates.
|
|
3
|
+
*
|
|
4
|
+
* A person's review is not what a forge calls a review. It
|
|
5
|
+
* mixes new anchored remarks with replies into threads
|
|
6
|
+
* somebody else started, resolutions, reactions and a
|
|
7
|
+
* verdict, and no backend accepts that mixture as one
|
|
8
|
+
* operation. So the mixture is held here, addressable and
|
|
9
|
+
* serializable, and the work of turning it into whatever the
|
|
10
|
+
* backend will accept happens later, once and visibly.
|
|
11
|
+
*
|
|
12
|
+
* The state is plain data and every operation returns a new
|
|
13
|
+
* one. That is what lets a draft be persisted after each
|
|
14
|
+
* change, rendered without a provider, and tested without
|
|
15
|
+
* either.
|
|
16
|
+
*/
|
|
17
|
+
import type { Anchor } from "../anchor.js";
|
|
18
|
+
import type { ReviewTarget } from "../change.js";
|
|
19
|
+
import type { Message, Reaction, Thread, Verdict } from "../conversation.js";
|
|
20
|
+
/** A new anchored remark. */
|
|
21
|
+
export interface FindingItem {
|
|
22
|
+
kind: "finding";
|
|
23
|
+
id: string;
|
|
24
|
+
anchor: Anchor;
|
|
25
|
+
body: string;
|
|
26
|
+
}
|
|
27
|
+
/** A reply into a thread that already exists. */
|
|
28
|
+
export interface ReplyItem {
|
|
29
|
+
kind: "reply";
|
|
30
|
+
id: string;
|
|
31
|
+
/** The whole thread: providers key replies differently. */
|
|
32
|
+
thread: Thread;
|
|
33
|
+
body: string;
|
|
34
|
+
}
|
|
35
|
+
/** A resolution of a thread that already exists. */
|
|
36
|
+
export interface ResolutionItem {
|
|
37
|
+
kind: "resolution";
|
|
38
|
+
id: string;
|
|
39
|
+
thread: Thread;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* A reopening of a thread that is currently resolved.
|
|
43
|
+
*
|
|
44
|
+
* Mirrors the resolution rather than adding a flag to it, so the plan
|
|
45
|
+
* compiler branches on a kind the way it does for every other item, and
|
|
46
|
+
* so a draft can express everything `review_say` can. It could close a
|
|
47
|
+
* thread and not open one, and that asymmetry is the shape of bug this
|
|
48
|
+
* work came out of.
|
|
49
|
+
*/
|
|
50
|
+
export interface UnresolutionItem {
|
|
51
|
+
kind: "unresolution";
|
|
52
|
+
id: string;
|
|
53
|
+
thread: Thread;
|
|
54
|
+
}
|
|
55
|
+
/** A reaction to a message. */
|
|
56
|
+
export interface ReactionItem {
|
|
57
|
+
kind: "reaction";
|
|
58
|
+
id: string;
|
|
59
|
+
subject: Message;
|
|
60
|
+
reaction: Reaction;
|
|
61
|
+
}
|
|
62
|
+
/** One thing the review will do. */
|
|
63
|
+
export type DraftItem = FindingItem | ReplyItem | ResolutionItem | UnresolutionItem | ReactionItem;
|
|
64
|
+
/** A review being composed. */
|
|
65
|
+
export interface DraftState {
|
|
66
|
+
id: string;
|
|
67
|
+
target: ReviewTarget;
|
|
68
|
+
items: DraftItem[];
|
|
69
|
+
verdict?: Verdict;
|
|
70
|
+
/** The summary that accompanies the verdict. */
|
|
71
|
+
summary?: string;
|
|
72
|
+
createdAt: string;
|
|
73
|
+
updatedAt: string;
|
|
74
|
+
/**
|
|
75
|
+
* Highest item number handed out so far. Ids stay stable
|
|
76
|
+
* across removals, so this only ever climbs.
|
|
77
|
+
*/
|
|
78
|
+
lastNumber: number;
|
|
79
|
+
}
|
|
80
|
+
/** A fresh draft about a target. */
|
|
81
|
+
export declare function emptyDraft(id: string, target: ReviewTarget): DraftState;
|
|
82
|
+
/** Add a new anchored remark. */
|
|
83
|
+
export declare function addFinding(state: DraftState, finding: {
|
|
84
|
+
anchor: Anchor;
|
|
85
|
+
body: string;
|
|
86
|
+
}): DraftState;
|
|
87
|
+
/** Add a reply into an existing thread. */
|
|
88
|
+
export declare function addReply(state: DraftState, thread: Thread, body: string): DraftState;
|
|
89
|
+
/** Mark an existing thread to be resolved. */
|
|
90
|
+
export declare function addResolution(state: DraftState, thread: Thread): DraftState;
|
|
91
|
+
/** Mark an existing thread to be reopened. */
|
|
92
|
+
export declare function addUnresolution(state: DraftState, thread: Thread): DraftState;
|
|
93
|
+
/** React to a message. */
|
|
94
|
+
export declare function addReaction(state: DraftState, subject: Message, reaction: Reaction): DraftState;
|
|
95
|
+
/** Choose the verdict and its summary. */
|
|
96
|
+
export declare function setVerdict(state: DraftState, verdict: Verdict, summary?: string): DraftState;
|
|
97
|
+
/** Drop an item by id. Ignores an id that is not there. */
|
|
98
|
+
export declare function removeItem(state: DraftState, id: string): DraftState;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a review session accumulates.
|
|
3
|
+
*
|
|
4
|
+
* A person's review is not what a forge calls a review. It
|
|
5
|
+
* mixes new anchored remarks with replies into threads
|
|
6
|
+
* somebody else started, resolutions, reactions and a
|
|
7
|
+
* verdict, and no backend accepts that mixture as one
|
|
8
|
+
* operation. So the mixture is held here, addressable and
|
|
9
|
+
* serializable, and the work of turning it into whatever the
|
|
10
|
+
* backend will accept happens later, once and visibly.
|
|
11
|
+
*
|
|
12
|
+
* The state is plain data and every operation returns a new
|
|
13
|
+
* one. That is what lets a draft be persisted after each
|
|
14
|
+
* change, rendered without a provider, and tested without
|
|
15
|
+
* either.
|
|
16
|
+
*/
|
|
17
|
+
/** A fresh draft about a target. */
|
|
18
|
+
export function emptyDraft(id, target) {
|
|
19
|
+
const now = new Date().toISOString();
|
|
20
|
+
return {
|
|
21
|
+
id,
|
|
22
|
+
target,
|
|
23
|
+
items: [],
|
|
24
|
+
createdAt: now,
|
|
25
|
+
updatedAt: now,
|
|
26
|
+
lastNumber: 0,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Append an item, handing it the next number. Numbers are
|
|
31
|
+
* never reused, so a finding a person referred to by number
|
|
32
|
+
* keeps that number even after an earlier one is dropped.
|
|
33
|
+
*/
|
|
34
|
+
function append(state, build) {
|
|
35
|
+
const next = state.lastNumber + 1;
|
|
36
|
+
return {
|
|
37
|
+
...state,
|
|
38
|
+
items: [...state.items, build(String(next))],
|
|
39
|
+
lastNumber: next,
|
|
40
|
+
updatedAt: new Date().toISOString(),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** Add a new anchored remark. */
|
|
44
|
+
export function addFinding(state, finding) {
|
|
45
|
+
return append(state, (id) => ({
|
|
46
|
+
kind: "finding",
|
|
47
|
+
id,
|
|
48
|
+
anchor: finding.anchor,
|
|
49
|
+
body: finding.body,
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
/** Add a reply into an existing thread. */
|
|
53
|
+
export function addReply(state, thread, body) {
|
|
54
|
+
return append(state, (id) => ({ kind: "reply", id, thread, body }));
|
|
55
|
+
}
|
|
56
|
+
/** Mark an existing thread to be resolved. */
|
|
57
|
+
export function addResolution(state, thread) {
|
|
58
|
+
return append(state, (id) => ({ kind: "resolution", id, thread }));
|
|
59
|
+
}
|
|
60
|
+
/** Mark an existing thread to be reopened. */
|
|
61
|
+
export function addUnresolution(state, thread) {
|
|
62
|
+
return append(state, (id) => ({ kind: "unresolution", id, thread }));
|
|
63
|
+
}
|
|
64
|
+
/** React to a message. */
|
|
65
|
+
export function addReaction(state, subject, reaction) {
|
|
66
|
+
return append(state, (id) => ({ kind: "reaction", id, subject, reaction }));
|
|
67
|
+
}
|
|
68
|
+
/** Choose the verdict and its summary. */
|
|
69
|
+
export function setVerdict(state, verdict, summary) {
|
|
70
|
+
return {
|
|
71
|
+
...state,
|
|
72
|
+
verdict,
|
|
73
|
+
summary,
|
|
74
|
+
updatedAt: new Date().toISOString(),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** Drop an item by id. Ignores an id that is not there. */
|
|
78
|
+
export function removeItem(state, id) {
|
|
79
|
+
const items = state.items.filter((item) => item.id !== id);
|
|
80
|
+
if (items.length === state.items.length)
|
|
81
|
+
return state;
|
|
82
|
+
return { ...state, items, updatedAt: new Date().toISOString() };
|
|
83
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where drafts live between sessions.
|
|
3
|
+
*
|
|
4
|
+
* A review is composed over hours, sometimes across a
|
|
5
|
+
* restart, and the substrate owns that storage rather than
|
|
6
|
+
* leaving each consumer to invent its own. One flat directory
|
|
7
|
+
* of JSON files, each holding a whole draft: legible to a
|
|
8
|
+
* person who goes looking, cheap to list, and with no index to
|
|
9
|
+
* fall out of step with the files it describes.
|
|
10
|
+
*/
|
|
11
|
+
import type { ReviewTarget } from "../change.js";
|
|
12
|
+
import type { Verdict } from "../conversation.js";
|
|
13
|
+
import type { DraftState } from "./state.js";
|
|
14
|
+
/** Enough of a draft to choose between them. */
|
|
15
|
+
export interface DraftSummary {
|
|
16
|
+
id: string;
|
|
17
|
+
target: ReviewTarget;
|
|
18
|
+
/** How many things the review will do. */
|
|
19
|
+
itemCount: number;
|
|
20
|
+
verdict?: Verdict;
|
|
21
|
+
updatedAt: string;
|
|
22
|
+
}
|
|
23
|
+
/** Durable home for drafts. */
|
|
24
|
+
export interface DraftStore {
|
|
25
|
+
save(state: DraftState): Promise<void>;
|
|
26
|
+
load(id: string): Promise<DraftState | undefined>;
|
|
27
|
+
/** Newest first. */
|
|
28
|
+
list(): Promise<DraftSummary[]>;
|
|
29
|
+
forTarget(target: ReviewTarget): Promise<DraftSummary[]>;
|
|
30
|
+
remove(id: string): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
/** Open a store rooted at a directory. */
|
|
33
|
+
export declare function createDraftStore(root: string): DraftStore;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where drafts live between sessions.
|
|
3
|
+
*
|
|
4
|
+
* A review is composed over hours, sometimes across a
|
|
5
|
+
* restart, and the substrate owns that storage rather than
|
|
6
|
+
* leaving each consumer to invent its own. One flat directory
|
|
7
|
+
* of JSON files, each holding a whole draft: legible to a
|
|
8
|
+
* person who goes looking, cheap to list, and with no index to
|
|
9
|
+
* fall out of step with the files it describes.
|
|
10
|
+
*/
|
|
11
|
+
import { mkdir, readdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { targetKey } from "../keys.js";
|
|
14
|
+
/**
|
|
15
|
+
* File name for a draft. The id is folded to something safe
|
|
16
|
+
* so an id carrying a slash or a pair of dots cannot name a
|
|
17
|
+
* path outside the store.
|
|
18
|
+
*/
|
|
19
|
+
function fileFor(id) {
|
|
20
|
+
const safe = id.replace(/[^A-Za-z0-9._-]/g, "_").replace(/^\.+/, "_");
|
|
21
|
+
return `${safe}.json`;
|
|
22
|
+
}
|
|
23
|
+
/** Read and parse one draft, or nothing if it is unreadable. */
|
|
24
|
+
async function readDraft(path) {
|
|
25
|
+
try {
|
|
26
|
+
const text = await readFile(path, "utf8");
|
|
27
|
+
const parsed = JSON.parse(text);
|
|
28
|
+
if (!isDraftState(parsed))
|
|
29
|
+
return undefined;
|
|
30
|
+
return parsed;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// A missing file is the common case, and a half-written
|
|
34
|
+
// or hand-edited one should not take the listing down.
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Whether parsed JSON has the shape of a draft. */
|
|
39
|
+
function isDraftState(value) {
|
|
40
|
+
if (typeof value !== "object" || value === null)
|
|
41
|
+
return false;
|
|
42
|
+
const candidate = value;
|
|
43
|
+
return (typeof candidate.id === "string" &&
|
|
44
|
+
typeof candidate.updatedAt === "string" &&
|
|
45
|
+
Array.isArray(candidate.items) &&
|
|
46
|
+
typeof candidate.target === "object" &&
|
|
47
|
+
candidate.target !== null);
|
|
48
|
+
}
|
|
49
|
+
/** The summary of a draft. */
|
|
50
|
+
function summarize(state) {
|
|
51
|
+
return {
|
|
52
|
+
id: state.id,
|
|
53
|
+
target: state.target,
|
|
54
|
+
itemCount: state.items.length,
|
|
55
|
+
...(state.verdict ? { verdict: state.verdict } : {}),
|
|
56
|
+
updatedAt: state.updatedAt,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** Open a store rooted at a directory. */
|
|
60
|
+
export function createDraftStore(root) {
|
|
61
|
+
async function everyDraft() {
|
|
62
|
+
let names;
|
|
63
|
+
try {
|
|
64
|
+
names = await readdir(root);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Nothing has been saved yet, so there is no directory.
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
const drafts = await Promise.all(names
|
|
71
|
+
.filter((name) => name.endsWith(".json"))
|
|
72
|
+
.map((name) => readDraft(join(root, name))));
|
|
73
|
+
return drafts.filter((draft) => draft !== undefined);
|
|
74
|
+
}
|
|
75
|
+
async function summaries() {
|
|
76
|
+
const drafts = await everyDraft();
|
|
77
|
+
return drafts
|
|
78
|
+
.map(summarize)
|
|
79
|
+
.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
async save(state) {
|
|
83
|
+
await mkdir(root, { recursive: true });
|
|
84
|
+
const path = join(root, fileFor(state.id));
|
|
85
|
+
await writeFile(path, `${JSON.stringify(state, null, "\t")}\n`, "utf8");
|
|
86
|
+
},
|
|
87
|
+
async load(id) {
|
|
88
|
+
return readDraft(join(root, fileFor(id)));
|
|
89
|
+
},
|
|
90
|
+
list: summaries,
|
|
91
|
+
async forTarget(target) {
|
|
92
|
+
const key = targetKey(target);
|
|
93
|
+
const all = await summaries();
|
|
94
|
+
return all.filter((entry) => targetKey(entry.target) === key);
|
|
95
|
+
},
|
|
96
|
+
async remove(id) {
|
|
97
|
+
await rm(join(root, fileFor(id)), { force: true });
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a checkout and the repo in play are two different places.
|
|
3
|
+
*
|
|
4
|
+
* The comparison only. Each caller phrases its own sentence, because
|
|
5
|
+
* the same fact means different things: proposing a branch into
|
|
6
|
+
* another repo cannot work at all, while listing another repo's
|
|
7
|
+
* changes works perfectly and answers the wrong question.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Both names when the checkout's remote and the repo key disagree, or
|
|
11
|
+
* undefined when they agree or when there is nothing to compare.
|
|
12
|
+
*
|
|
13
|
+
* Silent where silence is right: a local repo names no remote it
|
|
14
|
+
* could have meant instead, a checkout with no origin gives nothing
|
|
15
|
+
* to compare, and a trailing `.git`, a trailing slash or a difference
|
|
16
|
+
* of case are spellings rather than differences.
|
|
17
|
+
*
|
|
18
|
+
* The remote comes back without its credential, because this pair is
|
|
19
|
+
* only ever built to be said out loud. A remote that authenticates
|
|
20
|
+
* inline puts a token where a username goes, and a refusal naming it
|
|
21
|
+
* would print that token into the transcript, into any log kept of
|
|
22
|
+
* it, and into whatever the person reading it pastes somewhere else.
|
|
23
|
+
*/
|
|
24
|
+
export declare function repoElsewhere(checkoutRemote: string | undefined, repoKey: string): {
|
|
25
|
+
checkout: string;
|
|
26
|
+
repo: string;
|
|
27
|
+
} | undefined;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a checkout and the repo in play are two different places.
|
|
3
|
+
*
|
|
4
|
+
* The comparison only. Each caller phrases its own sentence, because
|
|
5
|
+
* the same fact means different things: proposing a branch into
|
|
6
|
+
* another repo cannot work at all, while listing another repo's
|
|
7
|
+
* changes works perfectly and answers the wrong question.
|
|
8
|
+
*/
|
|
9
|
+
import { withoutCredentials } from "../remote/index.js";
|
|
10
|
+
/**
|
|
11
|
+
* Both names when the checkout's remote and the repo key disagree, or
|
|
12
|
+
* undefined when they agree or when there is nothing to compare.
|
|
13
|
+
*
|
|
14
|
+
* Silent where silence is right: a local repo names no remote it
|
|
15
|
+
* could have meant instead, a checkout with no origin gives nothing
|
|
16
|
+
* to compare, and a trailing `.git`, a trailing slash or a difference
|
|
17
|
+
* of case are spellings rather than differences.
|
|
18
|
+
*
|
|
19
|
+
* The remote comes back without its credential, because this pair is
|
|
20
|
+
* only ever built to be said out loud. A remote that authenticates
|
|
21
|
+
* inline puts a token where a username goes, and a refusal naming it
|
|
22
|
+
* would print that token into the transcript, into any log kept of
|
|
23
|
+
* it, and into whatever the person reading it pastes somewhere else.
|
|
24
|
+
*/
|
|
25
|
+
export function repoElsewhere(checkoutRemote, repoKey) {
|
|
26
|
+
// A key is provider:slug, and a slug may contain a colon of its
|
|
27
|
+
// own, so the split is on the first one with the rest rejoined.
|
|
28
|
+
const slug = repoKey.split(":").slice(1).join(":");
|
|
29
|
+
if (slug === "" || repoKey.startsWith("local:"))
|
|
30
|
+
return undefined;
|
|
31
|
+
if (!checkoutRemote || checkoutRemote === "")
|
|
32
|
+
return undefined;
|
|
33
|
+
const tidied = withoutCredentials(checkoutRemote)
|
|
34
|
+
.replace(/\.git$/, "")
|
|
35
|
+
.replace(/\/$/, "");
|
|
36
|
+
if (tidied.toLowerCase().includes(slug.toLowerCase()))
|
|
37
|
+
return undefined;
|
|
38
|
+
return { checkout: tidied, repo: repoKey };
|
|
39
|
+
}
|