@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,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remembering the trees a session cut, so the next session can find them.
|
|
3
|
+
*
|
|
4
|
+
* The broker held its trees in an array, which is correct for exactly as long as
|
|
5
|
+
* the process lives. A worktree outlives the process by design, so the next
|
|
6
|
+
* session opened with the trees still on disk, git still tracking them, and
|
|
7
|
+
* every verb answering "no held tree": not merely a listing that forgot, but
|
|
8
|
+
* commits stranded in a directory the tool could no longer reach, releasable
|
|
9
|
+
* only through the `git worktree` call the guide tells you never to make.
|
|
10
|
+
*
|
|
11
|
+
* No test could see it. A test builds a broker and uses it, which is one
|
|
12
|
+
* process; the fault needs two.
|
|
13
|
+
*
|
|
14
|
+
* The directory stays the source of truth for whether a tree exists, and this
|
|
15
|
+
* only supplies the identity a directory name cannot faithfully carry. When the
|
|
16
|
+
* two disagree the directory wins, because somebody who deletes a tree by hand
|
|
17
|
+
* has said something and a stale record has not.
|
|
18
|
+
*
|
|
19
|
+
* A record also says who cut it, which is a later addition and the reason
|
|
20
|
+
* anything is ever reclaimed. Without it "remembered" and "held" were one set,
|
|
21
|
+
* so every tree ever cut answered "something still holds it" forever: measured
|
|
22
|
+
* at 59 records and 649MB on one machine, growing by a snapshot per review
|
|
23
|
+
* round.
|
|
24
|
+
*/
|
|
25
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync, } from "node:fs";
|
|
26
|
+
import { join } from "node:path";
|
|
27
|
+
import { askedOnce, isOwner, ownerNow, ownerStanding, sameProcess, systemFacts, } from "../process/index.js";
|
|
28
|
+
/**
|
|
29
|
+
* The holders a record names, ignoring anything malformed.
|
|
30
|
+
*
|
|
31
|
+
* Checks that it is an array before filtering it. A record is a file
|
|
32
|
+
* anybody can edit, and `owners: {}` on one of them would otherwise
|
|
33
|
+
* throw out of here and take tidy and reclaim down with it: one bad
|
|
34
|
+
* file, and the whole cleanup path stops for every repo.
|
|
35
|
+
*/
|
|
36
|
+
function named(tree) {
|
|
37
|
+
const owners = tree.owners;
|
|
38
|
+
if (!Array.isArray(owners))
|
|
39
|
+
return [];
|
|
40
|
+
return owners.filter(isOwner);
|
|
41
|
+
}
|
|
42
|
+
/** Whether two records name one process. */
|
|
43
|
+
function sameOwner(one, two) {
|
|
44
|
+
return one.pid === two.pid && sameProcess(one.startedAt, two.startedAt);
|
|
45
|
+
}
|
|
46
|
+
/** Whether a record read back off disk says enough to be useful. */
|
|
47
|
+
function usable(written) {
|
|
48
|
+
return (typeof written.path === "string" &&
|
|
49
|
+
typeof written.providerId === "string" &&
|
|
50
|
+
typeof written.identity?.key === "string");
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Remember trees in a directory of small files, one per tree.
|
|
54
|
+
*
|
|
55
|
+
* A file per tree rather than one index, for the same reason the attachment
|
|
56
|
+
* store is shaped this way: two sessions cutting trees at once both write, and
|
|
57
|
+
* the loser of a read-modify-write race on a single index is a tree nobody can
|
|
58
|
+
* find. Separate files cannot collide, since the name is the tree's own key.
|
|
59
|
+
*/
|
|
60
|
+
export function createTreeMemory(dir) {
|
|
61
|
+
const fileFor = (key) => join(dir, `${key.replaceAll("/", "-")}.json`);
|
|
62
|
+
function all() {
|
|
63
|
+
if (!existsSync(dir))
|
|
64
|
+
return [];
|
|
65
|
+
return readdirSync(dir)
|
|
66
|
+
.filter((name) => name.endsWith(".json"))
|
|
67
|
+
.flatMap((name) => {
|
|
68
|
+
const at = join(dir, name);
|
|
69
|
+
try {
|
|
70
|
+
const written = JSON.parse(readFileSync(at, "utf8"));
|
|
71
|
+
// A record we cannot read is worse than no record, because it
|
|
72
|
+
// would mean a tree reported with a broken identity. Skip it
|
|
73
|
+
// and leave it alone: deleting somebody's file to tidy a
|
|
74
|
+
// listing is not this function's decision.
|
|
75
|
+
return usable(written)
|
|
76
|
+
? [{ at, held: written }]
|
|
77
|
+
: [];
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Unreadable or half-written, which a concurrent write can
|
|
81
|
+
// produce. The tree is still on disk and still reachable by
|
|
82
|
+
// path; only its identity is lost, and next cut rewrites it.
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
remember(held) {
|
|
89
|
+
mkdirSync(dir, { recursive: true });
|
|
90
|
+
writeFileSync(fileFor(held.identity.key), JSON.stringify(held, null, 2), "utf8");
|
|
91
|
+
},
|
|
92
|
+
async rememberHeldByUs(held, facts = systemFacts) {
|
|
93
|
+
// Stamped here rather than by the caller, so a tree cannot be
|
|
94
|
+
// written down without the identity that lets it be released
|
|
95
|
+
// later. The owner is this process: whoever asks the broker for a
|
|
96
|
+
// tree is the session that will be holding it.
|
|
97
|
+
const us = await ownerNow(facts);
|
|
98
|
+
if (us === undefined) {
|
|
99
|
+
// The machine will not say when we started, so we cannot write
|
|
100
|
+
// an identity anybody could check later. Recording the tree
|
|
101
|
+
// without one is right: it reads as unattributable, which is
|
|
102
|
+
// held, and a tree wrongly held costs disk where a tree
|
|
103
|
+
// wrongly reclaimed costs work.
|
|
104
|
+
this.remember(held);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
// Added to whoever else holds it rather than replacing them. A
|
|
108
|
+
// snapshot is shareable, so two sessions can hold one tree, and
|
|
109
|
+
// the one that wrote last is not the only one that would miss it.
|
|
110
|
+
// Dead holders are left to be filtered on the way out rather than
|
|
111
|
+
// probed here, since this is on the path of every cut.
|
|
112
|
+
const before = (this.recall().find((tree) => tree.path === held.path)?.owners ??
|
|
113
|
+
held.owners ??
|
|
114
|
+
[]).filter((one) => isOwner(one) && !sameOwner(one, us));
|
|
115
|
+
this.remember({ ...held, owners: [...before, us] });
|
|
116
|
+
},
|
|
117
|
+
forget(path) {
|
|
118
|
+
for (const { at, held } of all()) {
|
|
119
|
+
if (held.path === path)
|
|
120
|
+
rmSync(at, { force: true });
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
recall() {
|
|
124
|
+
const found = [];
|
|
125
|
+
for (const { at, held } of all()) {
|
|
126
|
+
// The directory is the truth. A record whose tree has been
|
|
127
|
+
// removed by hand is dropped and its record with it, which is
|
|
128
|
+
// how somebody who cleaned up by hand stops being nagged about
|
|
129
|
+
// it forever.
|
|
130
|
+
if (existsSync(held.path)) {
|
|
131
|
+
found.push(held);
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
rmSync(at, { force: true });
|
|
135
|
+
}
|
|
136
|
+
return found;
|
|
137
|
+
},
|
|
138
|
+
unattributed() {
|
|
139
|
+
return this.recall().filter((tree) => named(tree).length === 0);
|
|
140
|
+
},
|
|
141
|
+
async otherHolders(path, facts = systemFacts) {
|
|
142
|
+
const tree = this.recall().find((one) => one.path === path);
|
|
143
|
+
if (tree === undefined)
|
|
144
|
+
return [];
|
|
145
|
+
const once = askedOnce(facts);
|
|
146
|
+
const us = await ownerNow(once);
|
|
147
|
+
const others = [];
|
|
148
|
+
for (const owner of named(tree)) {
|
|
149
|
+
if (us !== undefined && sameOwner(owner, us))
|
|
150
|
+
continue;
|
|
151
|
+
if ((await ownerStanding(owner, once)) !== "gone")
|
|
152
|
+
others.push(owner);
|
|
153
|
+
}
|
|
154
|
+
return others;
|
|
155
|
+
},
|
|
156
|
+
async forgetUsAsHolder(path, facts = systemFacts) {
|
|
157
|
+
const tree = this.recall().find((one) => one.path === path);
|
|
158
|
+
if (tree === undefined)
|
|
159
|
+
return;
|
|
160
|
+
const us = await ownerNow(facts);
|
|
161
|
+
if (us === undefined)
|
|
162
|
+
return;
|
|
163
|
+
this.remember({
|
|
164
|
+
...tree,
|
|
165
|
+
owners: named(tree).filter((owner) => !sameOwner(owner, us)),
|
|
166
|
+
});
|
|
167
|
+
},
|
|
168
|
+
async heldNow(facts = systemFacts) {
|
|
169
|
+
const held = [];
|
|
170
|
+
// One question per process, not per record. Every reviewer of
|
|
171
|
+
// one round shares a session, so the same handful of pids
|
|
172
|
+
// recurs across the whole directory: without this, tidy forked
|
|
173
|
+
// `ps` once per record, serially, which is 59 spawns on the
|
|
174
|
+
// machine this was found on.
|
|
175
|
+
//
|
|
176
|
+
// The fact is cached, never the verdict. A standing compares
|
|
177
|
+
// the pid's real start time against the one a given record
|
|
178
|
+
// wrote down, so it belongs to the record and not to the pid:
|
|
179
|
+
// held per pid, one stale record answers for a live session
|
|
180
|
+
// wearing the same number, which is the exact confusion this
|
|
181
|
+
// module exists to prevent.
|
|
182
|
+
const once = askedOnce(facts);
|
|
183
|
+
for (const tree of this.recall()) {
|
|
184
|
+
const owners = named(tree);
|
|
185
|
+
// Nobody recorded means nobody can say, and every record
|
|
186
|
+
// written before owners existed is one of these. Reading it as
|
|
187
|
+
// nobody's would offer a live session's trees for reclaiming on
|
|
188
|
+
// the first run of this code, which is worse than the leak it
|
|
189
|
+
// fixes.
|
|
190
|
+
if (owners.length === 0) {
|
|
191
|
+
held.push(tree);
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
// Any one of them is enough. A shared snapshot outlives the
|
|
195
|
+
// first holder to finish with it.
|
|
196
|
+
const stands = await Promise.all(owners.map((owner) => ownerStanding(owner, once)));
|
|
197
|
+
if (stands.some((one) => one !== "gone"))
|
|
198
|
+
held.push(tree);
|
|
199
|
+
}
|
|
200
|
+
return held;
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asking whether anybody objects before publishing a branch.
|
|
3
|
+
*
|
|
4
|
+
* This exists because of one seam. Publishing a branch is a working-layer
|
|
5
|
+
* action, and the reason not to publish is often a hosting-layer fact: on a
|
|
6
|
+
* backend with a merge queue, pushing to an enqueued branch ejects it and
|
|
7
|
+
* everything speculatively batched with it, and re-running the checks for the
|
|
8
|
+
* rest is measured in hundreds of jobs. The working layer cannot see that, and
|
|
9
|
+
* teaching it to would mean giving it a route to the review contract, which is
|
|
10
|
+
* the coupling this whole substrate exists to avoid.
|
|
11
|
+
*
|
|
12
|
+
* So it asks instead. Anything that knows something about a branch can object,
|
|
13
|
+
* and the objection carries its own words: the layer that knows why is the layer
|
|
14
|
+
* that explains it. Nothing here knows what a queue is.
|
|
15
|
+
*
|
|
16
|
+
* Silence means nobody objected, which is not the same as safe. That is the
|
|
17
|
+
* honest reading and it is why this is an objection rather than an approval: a
|
|
18
|
+
* check that nothing answers must not turn a push into a refusal, or a session
|
|
19
|
+
* with no hosting provider loaded could never publish anything.
|
|
20
|
+
*/
|
|
21
|
+
/** What is about to be published. */
|
|
22
|
+
export interface PublishIntent {
|
|
23
|
+
/** The repo, keyed the way the working layer keys one. */
|
|
24
|
+
repoKey: string;
|
|
25
|
+
/** The branch about to be pushed. */
|
|
26
|
+
branch: string;
|
|
27
|
+
/** Where it is being pushed from, for anything that needs to look. */
|
|
28
|
+
treePath: string;
|
|
29
|
+
/** True when the push would replace commits the remote already has. */
|
|
30
|
+
replacing: boolean;
|
|
31
|
+
}
|
|
32
|
+
/** Somebody's reason not to publish. */
|
|
33
|
+
export interface Objection {
|
|
34
|
+
/** Who is objecting, so a reader knows which system is worried. */
|
|
35
|
+
from: string;
|
|
36
|
+
/** Why, in words a person can act on. */
|
|
37
|
+
reason: string;
|
|
38
|
+
/** What to do instead, when there is a sensible alternative. */
|
|
39
|
+
instead?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Whether this stops the push or merely says something about it.
|
|
42
|
+
*
|
|
43
|
+
* The distinction is not politeness, it is the difference between a guard
|
|
44
|
+
* people keep and a guard people disable. A backend that knows a change is
|
|
45
|
+
* queued can block; a backend that only knows it *would* refuse a queued
|
|
46
|
+
* change, without being able to say whether this one is queued, has a real
|
|
47
|
+
* thing to tell you and no business stopping every push you make. Blocking
|
|
48
|
+
* on a suspicion would refuse every push on such a backend, and a guard
|
|
49
|
+
* that refuses everything protects nothing once it is turned off.
|
|
50
|
+
*
|
|
51
|
+
* Defaults to blocking, since an objection whose author did not think about
|
|
52
|
+
* this is more likely to be a genuine one.
|
|
53
|
+
*/
|
|
54
|
+
blocking?: boolean;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* An objection collector, handed to whoever might have one.
|
|
58
|
+
*
|
|
59
|
+
* A function rather than a return value because the bus fans out: several
|
|
60
|
+
* listeners may each have something to say, and the last one to answer must not
|
|
61
|
+
* overwrite the first.
|
|
62
|
+
*/
|
|
63
|
+
export interface PublishReview {
|
|
64
|
+
intent: PublishIntent;
|
|
65
|
+
object(objection: Objection): void;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Emitted before a branch is published, so anything that knows a reason to stop
|
|
69
|
+
* can say so.
|
|
70
|
+
*
|
|
71
|
+
* Advisory by construction. A listener that throws, hangs or says nothing does
|
|
72
|
+
* not prevent a push, because the alternative is a working layer that stops
|
|
73
|
+
* working when an unrelated extension has a bad day.
|
|
74
|
+
*/
|
|
75
|
+
export declare const WORK_PUBLISH_CHECK = "work:publish:check:v1";
|
|
76
|
+
/**
|
|
77
|
+
* Read a set of objections as one refusal, or nothing.
|
|
78
|
+
*
|
|
79
|
+
* Every objection is named and kept. Summarizing several into one would drop
|
|
80
|
+
* whichever the reader most needed, and two systems objecting for two reasons is
|
|
81
|
+
* a fact about the push rather than a formatting problem.
|
|
82
|
+
*/
|
|
83
|
+
export declare function refusalFrom(objections: readonly Objection[]): string | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* What was said that did not stop the push, to print beside what happened.
|
|
86
|
+
*
|
|
87
|
+
* Said after the fact rather than before it, because that is what a caution is:
|
|
88
|
+
* it decorates the outcome instead of becoming one. Printed at all because the
|
|
89
|
+
* alternative is a backend that knows something useful and has no way to say it
|
|
90
|
+
* without also blocking.
|
|
91
|
+
*/
|
|
92
|
+
export declare function cautionsFrom(objections: readonly Objection[]): readonly string[];
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asking whether anybody objects before publishing a branch.
|
|
3
|
+
*
|
|
4
|
+
* This exists because of one seam. Publishing a branch is a working-layer
|
|
5
|
+
* action, and the reason not to publish is often a hosting-layer fact: on a
|
|
6
|
+
* backend with a merge queue, pushing to an enqueued branch ejects it and
|
|
7
|
+
* everything speculatively batched with it, and re-running the checks for the
|
|
8
|
+
* rest is measured in hundreds of jobs. The working layer cannot see that, and
|
|
9
|
+
* teaching it to would mean giving it a route to the review contract, which is
|
|
10
|
+
* the coupling this whole substrate exists to avoid.
|
|
11
|
+
*
|
|
12
|
+
* So it asks instead. Anything that knows something about a branch can object,
|
|
13
|
+
* and the objection carries its own words: the layer that knows why is the layer
|
|
14
|
+
* that explains it. Nothing here knows what a queue is.
|
|
15
|
+
*
|
|
16
|
+
* Silence means nobody objected, which is not the same as safe. That is the
|
|
17
|
+
* honest reading and it is why this is an objection rather than an approval: a
|
|
18
|
+
* check that nothing answers must not turn a push into a refusal, or a session
|
|
19
|
+
* with no hosting provider loaded could never publish anything.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Emitted before a branch is published, so anything that knows a reason to stop
|
|
23
|
+
* can say so.
|
|
24
|
+
*
|
|
25
|
+
* Advisory by construction. A listener that throws, hangs or says nothing does
|
|
26
|
+
* not prevent a push, because the alternative is a working layer that stops
|
|
27
|
+
* working when an unrelated extension has a bad day.
|
|
28
|
+
*/
|
|
29
|
+
export const WORK_PUBLISH_CHECK = "work:publish:check:v1";
|
|
30
|
+
/**
|
|
31
|
+
* Read a set of objections as one refusal, or nothing.
|
|
32
|
+
*
|
|
33
|
+
* Every objection is named and kept. Summarizing several into one would drop
|
|
34
|
+
* whichever the reader most needed, and two systems objecting for two reasons is
|
|
35
|
+
* a fact about the push rather than a formatting problem.
|
|
36
|
+
*/
|
|
37
|
+
export function refusalFrom(objections) {
|
|
38
|
+
const blocking = objections.filter((one) => one.blocking !== false);
|
|
39
|
+
if (blocking.length === 0)
|
|
40
|
+
return undefined;
|
|
41
|
+
if (blocking.length === 1) {
|
|
42
|
+
const [only] = blocking;
|
|
43
|
+
return [
|
|
44
|
+
`${only.from} says not to publish this yet. ${only.reason}`,
|
|
45
|
+
...(only.instead === undefined ? [] : ["", only.instead]),
|
|
46
|
+
].join("\n");
|
|
47
|
+
}
|
|
48
|
+
return [
|
|
49
|
+
`${blocking.length} systems say not to publish this yet.`,
|
|
50
|
+
...blocking.flatMap((one) => [
|
|
51
|
+
"",
|
|
52
|
+
`${one.from}: ${one.reason}`,
|
|
53
|
+
...(one.instead === undefined ? [] : [` ${one.instead}`]),
|
|
54
|
+
]),
|
|
55
|
+
].join("\n");
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* What was said that did not stop the push, to print beside what happened.
|
|
59
|
+
*
|
|
60
|
+
* Said after the fact rather than before it, because that is what a caution is:
|
|
61
|
+
* it decorates the outcome instead of becoming one. Printed at all because the
|
|
62
|
+
* alternative is a backend that knows something useful and has no way to say it
|
|
63
|
+
* without also blocking.
|
|
64
|
+
*/
|
|
65
|
+
export function cautionsFrom(objections) {
|
|
66
|
+
return objections
|
|
67
|
+
.filter((one) => one.blocking === false)
|
|
68
|
+
.map((one) => [
|
|
69
|
+
`${one.from}: ${one.reason}`,
|
|
70
|
+
...(one.instead === undefined ? [] : [one.instead]),
|
|
71
|
+
].join(" "));
|
|
72
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Choosing which provider cuts a tree.
|
|
3
|
+
*
|
|
4
|
+
* This replaces two brokers that sorted their providers in
|
|
5
|
+
* opposite directions. One took the smallest priority number,
|
|
6
|
+
* documented as "built-ins live at 100; downstream
|
|
7
|
+
* specialisations use smaller numbers to take over". The other
|
|
8
|
+
* took the largest, documented as "higher-priority providers are
|
|
9
|
+
* consulted first". Both downstream World providers were correct
|
|
10
|
+
* under their own broker while holding the same constant name at
|
|
11
|
+
* 50 and at 100.
|
|
12
|
+
*
|
|
13
|
+
* Unifying them on either direction would silently invert one, and
|
|
14
|
+
* silently is the operative word: losing does not raise anything,
|
|
15
|
+
* because the general provider still produces a tree. It would
|
|
16
|
+
* just be a plain git worktree where a `dev tree` was wanted,
|
|
17
|
+
* which works well enough to go unnoticed.
|
|
18
|
+
*
|
|
19
|
+
* So the number is not a priority. A provider says how *specific*
|
|
20
|
+
* it is, and more specific wins. "Priority" genuinely reads both
|
|
21
|
+
* ways in English, since priority 1 can mean first or last;
|
|
22
|
+
* "specificity" does not, because a provider for one repo is
|
|
23
|
+
* plainly more specific than one for any repo.
|
|
24
|
+
*/
|
|
25
|
+
import type { RepoLocator } from "../review/index.js";
|
|
26
|
+
/** What choosing needs to know about a provider. */
|
|
27
|
+
export interface TreeProviderInfo {
|
|
28
|
+
/** Stable identifier, used when reporting the choice. */
|
|
29
|
+
id: string;
|
|
30
|
+
/**
|
|
31
|
+
* How narrow this provider's remit is. Higher wins. A
|
|
32
|
+
* provider serving any repo declares 0; one serving a
|
|
33
|
+
* particular repo declares more.
|
|
34
|
+
*/
|
|
35
|
+
specificity: number;
|
|
36
|
+
/**
|
|
37
|
+
* Whether this provider serves the given repo. Cheap and
|
|
38
|
+
* synchronous: it is asked about every provider on every
|
|
39
|
+
* choice.
|
|
40
|
+
*/
|
|
41
|
+
appliesTo(repo: RepoLocator): boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Which provider serves a repo.
|
|
45
|
+
*
|
|
46
|
+
* Three outcomes, because the caller has to say something
|
|
47
|
+
* different about each: use it, tell somebody nothing is
|
|
48
|
+
* configured, or tell somebody two things are configured to do the
|
|
49
|
+
* same job.
|
|
50
|
+
*/
|
|
51
|
+
export type TreeProviderChoice<P> =
|
|
52
|
+
/** Exactly one provider is the most specific that applies. */
|
|
53
|
+
{
|
|
54
|
+
kind: "chosen";
|
|
55
|
+
provider: P;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Several apply and are equally specific, so which one serves
|
|
59
|
+
* is arbitrary. Reported rather than resolved: picking by
|
|
60
|
+
* registration order hides a configuration mistake behind a
|
|
61
|
+
* tree that looks fine.
|
|
62
|
+
*/
|
|
63
|
+
| {
|
|
64
|
+
kind: "ambiguous";
|
|
65
|
+
providers: readonly P[];
|
|
66
|
+
}
|
|
67
|
+
/** Nothing applies. */
|
|
68
|
+
| {
|
|
69
|
+
kind: "none";
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Choose the provider that serves a repo.
|
|
73
|
+
*
|
|
74
|
+
* Ties are reported with the contenders named and in a stable
|
|
75
|
+
* order, so the same misconfiguration reads the same way whichever
|
|
76
|
+
* order the providers happened to register in. A tie below the
|
|
77
|
+
* winner is not a tie at all and is ignored.
|
|
78
|
+
*/
|
|
79
|
+
export declare function chooseTreeProvider<P extends TreeProviderInfo>(providers: readonly P[], repo: RepoLocator): TreeProviderChoice<P>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Choosing which provider cuts a tree.
|
|
3
|
+
*
|
|
4
|
+
* This replaces two brokers that sorted their providers in
|
|
5
|
+
* opposite directions. One took the smallest priority number,
|
|
6
|
+
* documented as "built-ins live at 100; downstream
|
|
7
|
+
* specialisations use smaller numbers to take over". The other
|
|
8
|
+
* took the largest, documented as "higher-priority providers are
|
|
9
|
+
* consulted first". Both downstream World providers were correct
|
|
10
|
+
* under their own broker while holding the same constant name at
|
|
11
|
+
* 50 and at 100.
|
|
12
|
+
*
|
|
13
|
+
* Unifying them on either direction would silently invert one, and
|
|
14
|
+
* silently is the operative word: losing does not raise anything,
|
|
15
|
+
* because the general provider still produces a tree. It would
|
|
16
|
+
* just be a plain git worktree where a `dev tree` was wanted,
|
|
17
|
+
* which works well enough to go unnoticed.
|
|
18
|
+
*
|
|
19
|
+
* So the number is not a priority. A provider says how *specific*
|
|
20
|
+
* it is, and more specific wins. "Priority" genuinely reads both
|
|
21
|
+
* ways in English, since priority 1 can mean first or last;
|
|
22
|
+
* "specificity" does not, because a provider for one repo is
|
|
23
|
+
* plainly more specific than one for any repo.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Choose the provider that serves a repo.
|
|
27
|
+
*
|
|
28
|
+
* Ties are reported with the contenders named and in a stable
|
|
29
|
+
* order, so the same misconfiguration reads the same way whichever
|
|
30
|
+
* order the providers happened to register in. A tie below the
|
|
31
|
+
* winner is not a tie at all and is ignored.
|
|
32
|
+
*/
|
|
33
|
+
export function chooseTreeProvider(providers, repo) {
|
|
34
|
+
const applicable = providers.filter((candidate) => candidate.appliesTo(repo));
|
|
35
|
+
if (applicable.length === 0)
|
|
36
|
+
return { kind: "none" };
|
|
37
|
+
const narrowest = Math.max(...applicable.map((c) => c.specificity));
|
|
38
|
+
const contenders = applicable
|
|
39
|
+
.filter((candidate) => candidate.specificity === narrowest)
|
|
40
|
+
.sort((a, b) => a.id.localeCompare(b.id));
|
|
41
|
+
const [only] = contenders;
|
|
42
|
+
if (only && contenders.length === 1)
|
|
43
|
+
return { kind: "chosen", provider: only };
|
|
44
|
+
return { kind: "ambiguous", providers: contenders };
|
|
45
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cutting trees with plain git.
|
|
3
|
+
*
|
|
4
|
+
* The general case, so that the broker works before anything
|
|
5
|
+
* downstream registers. A repo with a checkout on disk gets a git
|
|
6
|
+
* worktree beside the state directory, detached at a commit for a
|
|
7
|
+
* snapshot or on its branch for a worktree.
|
|
8
|
+
*
|
|
9
|
+
* It deliberately does not clone. A repo known only by a remote is
|
|
10
|
+
* refused with the remote named, because a clone of an unasked-for
|
|
11
|
+
* repo can be enormous and quietly spending ten minutes on one is a
|
|
12
|
+
* surprising thing for a tool to do on its own. Saying what is
|
|
13
|
+
* needed leaves the choice with whoever knows how big it is; a
|
|
14
|
+
* downstream provider that knows a particular repo can serve it
|
|
15
|
+
* without asking.
|
|
16
|
+
*/
|
|
17
|
+
import { type Exec } from "../../exec/index.js";
|
|
18
|
+
import type { TreeProvider } from "../broker.js";
|
|
19
|
+
/**
|
|
20
|
+
* A tree provider backed by `git worktree`.
|
|
21
|
+
*
|
|
22
|
+
* Applies to every repo, since git is what the general case means.
|
|
23
|
+
* Anything more specific outranks it by declaring a higher
|
|
24
|
+
* specificity.
|
|
25
|
+
*/
|
|
26
|
+
export declare function createGitTreeProvider(deps: {
|
|
27
|
+
exec: Exec;
|
|
28
|
+
stateDir: string;
|
|
29
|
+
}): TreeProvider;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cutting trees with plain git.
|
|
3
|
+
*
|
|
4
|
+
* The general case, so that the broker works before anything
|
|
5
|
+
* downstream registers. A repo with a checkout on disk gets a git
|
|
6
|
+
* worktree beside the state directory, detached at a commit for a
|
|
7
|
+
* snapshot or on its branch for a worktree.
|
|
8
|
+
*
|
|
9
|
+
* It deliberately does not clone. A repo known only by a remote is
|
|
10
|
+
* refused with the remote named, because a clone of an unasked-for
|
|
11
|
+
* repo can be enormous and quietly spending ten minutes on one is a
|
|
12
|
+
* surprising thing for a tool to do on its own. Saying what is
|
|
13
|
+
* needed leaves the choice with whoever knows how big it is; a
|
|
14
|
+
* downstream provider that knows a particular repo can serve it
|
|
15
|
+
* without asking.
|
|
16
|
+
*/
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import { run } from "../../exec/index.js";
|
|
19
|
+
import { withoutCredentials } from "../../remote/index.js";
|
|
20
|
+
import { displayPath } from "../../ui/path.js";
|
|
21
|
+
import { treeIdentity, treeSource } from "../tree.js";
|
|
22
|
+
/** The built-in provider's id, and the general case's specificity. */
|
|
23
|
+
const ID = "git-worktree";
|
|
24
|
+
const GENERAL = 0;
|
|
25
|
+
/**
|
|
26
|
+
* A tree provider backed by `git worktree`.
|
|
27
|
+
*
|
|
28
|
+
* Applies to every repo, since git is what the general case means.
|
|
29
|
+
* Anything more specific outranks it by declaring a higher
|
|
30
|
+
* specificity.
|
|
31
|
+
*/
|
|
32
|
+
export function createGitTreeProvider(deps) {
|
|
33
|
+
return {
|
|
34
|
+
id: ID,
|
|
35
|
+
specificity: GENERAL,
|
|
36
|
+
appliesTo: () => true,
|
|
37
|
+
async ensure(request) {
|
|
38
|
+
const source = treeSource(request.repo);
|
|
39
|
+
if (source.kind === "unknown") {
|
|
40
|
+
throw new Error(`Nothing is known about where ${request.repo.key} lives, locally or by remote, so there is nowhere to cut a tree from.`);
|
|
41
|
+
}
|
|
42
|
+
if (source.kind === "clone") {
|
|
43
|
+
throw new Error(`${request.repo.key} is known only as ${withoutCredentials(source.remoteUrl)}, and cloning a repo you did not ask for can take a very long time. Clone it yourself, or register a provider that knows this repo.`);
|
|
44
|
+
}
|
|
45
|
+
const path = join(deps.stateDir, treeIdentity(request).key);
|
|
46
|
+
// Already there is the ordinary case, not a failure. `ensure` means
|
|
47
|
+
// make sure it exists, a snapshot is shareable between readers by
|
|
48
|
+
// design, and the broker holding one only remembers for as long as
|
|
49
|
+
// the session does while the directory outlives it. So the second
|
|
50
|
+
// session to review a commit found the tree its predecessor cut and
|
|
51
|
+
// died on `fatal: already exists`, then fell back to letting
|
|
52
|
+
// reviewers read the working checkout.
|
|
53
|
+
const standing = await deps.exec("git", [
|
|
54
|
+
"-C",
|
|
55
|
+
path,
|
|
56
|
+
"rev-parse",
|
|
57
|
+
"HEAD",
|
|
58
|
+
]);
|
|
59
|
+
if (standing.code === 0) {
|
|
60
|
+
const head = standing.stdout.trim();
|
|
61
|
+
// A snapshot's commit is part of its identity, so a tree under
|
|
62
|
+
// this name standing anywhere else is not the thing being asked
|
|
63
|
+
// for. Refuse rather than hand it over: silently reviewing a
|
|
64
|
+
// different commit is the one outcome nobody could detect.
|
|
65
|
+
if (request.intent === "snapshot" && head !== request.commit) {
|
|
66
|
+
throw new Error(`A tree for ${request.repo.key} already sits at ${displayPath(path)} but stands at ${head} rather than ${request.commit}. Release it before pinning a snapshot there.`);
|
|
67
|
+
}
|
|
68
|
+
return { path };
|
|
69
|
+
}
|
|
70
|
+
const at = request.intent === "snapshot"
|
|
71
|
+
? ["--detach", path, request.commit]
|
|
72
|
+
: [path, request.branch];
|
|
73
|
+
await run(deps.exec, "git", ["-C", source.path, "worktree", "add", ...at], `Cutting a tree for ${request.purpose}`);
|
|
74
|
+
return { path };
|
|
75
|
+
},
|
|
76
|
+
async release(held) {
|
|
77
|
+
// Scoped to the tree itself, which is the one repo guaranteed
|
|
78
|
+
// to know about it. Without a -C this ran against whatever
|
|
79
|
+
// repo the process happened to be sitting in, and git then
|
|
80
|
+
// reports that the path is not a working tree, which is true
|
|
81
|
+
// of that repo and beside the point. A worktree's .git file
|
|
82
|
+
// names its main repo, so asking from inside is enough and
|
|
83
|
+
// needs no source path carried on the held tree.
|
|
84
|
+
await run(deps.exec, "git", ["-C", held.path, "worktree", "remove", held.path], `Releasing the tree at ${displayPath(held.path)}`);
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Publishing a branch, which is the step between committing and proposing.
|
|
3
|
+
*
|
|
4
|
+
* It was missing, and its absence was the one place this surface made you
|
|
5
|
+
* leave it: `work record` committed, `review_offer propose` needed the branch
|
|
6
|
+
* on the remote, and nothing in between was a tool. Every other seam here is
|
|
7
|
+
* something you can call.
|
|
8
|
+
*
|
|
9
|
+
* Two rules are built in rather than offered. A first push sets upstream,
|
|
10
|
+
* because a branch that pushes without one has to be told its own name every
|
|
11
|
+
* time afterwards and eventually gets told the wrong one. And a force is
|
|
12
|
+
* always a lease: `--force` overwrites whatever arrived while you were
|
|
13
|
+
* rebasing, which on a shared branch is somebody else's work, and the honest
|
|
14
|
+
* version of "I know what is there" is to say what you think is there and be
|
|
15
|
+
* refused when you are wrong.
|
|
16
|
+
*/
|
|
17
|
+
import type { Exec } from "../exec/index.js";
|
|
18
|
+
/** Where a branch went, or why it did not. */
|
|
19
|
+
export type PushOutcome = {
|
|
20
|
+
kind: "published";
|
|
21
|
+
branch: string;
|
|
22
|
+
remote: string;
|
|
23
|
+
/** True when this push is what gave the branch its upstream. */
|
|
24
|
+
tracked: boolean;
|
|
25
|
+
/** True when the push replaced commits the remote already had. */
|
|
26
|
+
replaced: boolean;
|
|
27
|
+
} | {
|
|
28
|
+
kind: "already-there";
|
|
29
|
+
branch: string;
|
|
30
|
+
remote: string;
|
|
31
|
+
} | {
|
|
32
|
+
kind: "refused";
|
|
33
|
+
branch?: string;
|
|
34
|
+
reason: string;
|
|
35
|
+
};
|
|
36
|
+
/** How to publish. */
|
|
37
|
+
export interface PushOptions {
|
|
38
|
+
/**
|
|
39
|
+
* Replace what the remote has, refusing if it moved since you last
|
|
40
|
+
* fetched. Needed after a rebase, and never a bare force.
|
|
41
|
+
*/
|
|
42
|
+
replace?: boolean;
|
|
43
|
+
/** Which remote. Defaults to the branch's upstream, then to origin. */
|
|
44
|
+
remote?: string;
|
|
45
|
+
}
|
|
46
|
+
/** Publishing the work in a tree. */
|
|
47
|
+
export interface WorkPublisher {
|
|
48
|
+
push(treePath: string, options?: PushOptions): Promise<PushOutcome>;
|
|
49
|
+
}
|
|
50
|
+
/** Publish with plain git. */
|
|
51
|
+
export declare function createGitPublisher(deps: {
|
|
52
|
+
exec: Exec;
|
|
53
|
+
}): WorkPublisher;
|