@joshuafolkken/kit 1.1471.0 → 1.1784.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/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -3,10 +3,16 @@ import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
|
3
3
|
import { git_pr } from '#scripts/gh/git-pr'
|
|
4
4
|
import { changed_paths } from '#scripts/git/changed-paths'
|
|
5
5
|
import { git_branch } from '#scripts/git/git-branch'
|
|
6
|
-
import {
|
|
6
|
+
import { git_issue } from '#scripts/git/git-issue'
|
|
7
|
+
import { git_preflight, type Unmet } from '#scripts/git/git-preflight'
|
|
7
8
|
import type { JoshResult } from '#scripts/josh/josh-run'
|
|
8
9
|
import { error_text } from '#scripts/lib/error-message'
|
|
10
|
+
import { report_format_reference } from '#scripts/report/report-format-reference'
|
|
11
|
+
import { acceptance_map } from '#scripts/review/acceptance-map'
|
|
12
|
+
import { acceptance_map_check } from '#scripts/review/acceptance-map-check'
|
|
9
13
|
import { live_evidence } from '#scripts/review/live-evidence'
|
|
14
|
+
import { removed_tests_check } from '#scripts/review/removed-tests-check'
|
|
15
|
+
import { run_ship_body_draft } from './run-ship-body-draft'
|
|
10
16
|
import { run_ship_lock } from './run-ship-lock'
|
|
11
17
|
import { run_ship_scoped } from './run-ship-scoped'
|
|
12
18
|
|
|
@@ -15,25 +21,58 @@ import { run_ship_scoped } from './run-ship-scoped'
|
|
|
15
21
|
// **Every precondition decidable before the review is asked here, and all of them are reported at
|
|
16
22
|
// once.** No check is new: the classification, issue and branch answers
|
|
17
23
|
// are `git_preflight.problems_of`, and the evidence answer is `live_evidence.verdict_for` over the same
|
|
18
|
-
// changed paths and the body this ship will deliver — `--body-file` when given, else the
|
|
24
|
+
// changed paths and the body this ship will deliver — `--body-file` when given, else the ship body
|
|
25
|
+
// draft, else the open PR's.
|
|
19
26
|
//
|
|
20
27
|
// The scoped pair runs last, met rather than stopped on (`run-ship-scoped.ts`), so the review and the
|
|
21
28
|
// gate start on a tree both checks are green on.
|
|
29
|
+
//
|
|
30
|
+
// A stop names the kinds of the preconditions it found unmet, beside the git preflight's own, so the
|
|
31
|
+
// lane ledger can count which one stops ships (joshuafolkken/kit#4166).
|
|
22
32
|
|
|
23
33
|
const SUCCESS_EXIT_CODE = 0
|
|
24
34
|
const FAILURE_EXIT_CODE = 1
|
|
25
|
-
const
|
|
26
|
-
const
|
|
35
|
+
const UNREADABLE = Symbol('unreadable body')
|
|
36
|
+
const PRECONDITION = {
|
|
37
|
+
LIVE_EVIDENCE: 'live-evidence',
|
|
38
|
+
ACCEPTANCE_MAP: 'acceptance-map',
|
|
39
|
+
REMOVED_TESTS: 'removed-tests',
|
|
40
|
+
LOCK: 'lock',
|
|
41
|
+
SCOPED: 'scoped',
|
|
42
|
+
UNREADABLE: 'unreadable',
|
|
43
|
+
} as const
|
|
44
|
+
const EVIDENCE_PROBLEM = `This change touches runtime code, but the body this ship delivers has no ${live_evidence.EVIDENCE_HEADING} section: run the acceptance criteria for real and write it into the ship body draft run:prep wrote (josh ship reads it when --body-file is omitted), or pass the body with --body-file <path>. Write it ${live_evidence.EVIDENCE_FORMAT}`
|
|
45
|
+
const EVIDENCE_PENDING = `This change touches runtime code and no PR is open yet: write the ${live_evidence.EVIDENCE_HEADING} section into the ship body draft run:prep wrote (or a file handed to josh ship with --body-file <path>), or the ship refuses. Write it ${live_evidence.EVIDENCE_FORMAT}`
|
|
46
|
+
|
|
47
|
+
// The draft `josh ship` reads when `--body-file` is omitted, named so the run fills that file in.
|
|
48
|
+
function acceptance_pending_text(draft_path: string): string {
|
|
49
|
+
return `Fill in this ${acceptance_map.MAP_HEADING} section in the ship body draft ${draft_path} — josh ship reads it when --body-file is omitted — replacing each pending row's ending with what met or deferred it (format: ${report_format_reference.pointer(report_format_reference.ACCEPTANCE_MAP_HEADING)}), and write ${live_evidence.EVIDENCE_HEADING} there before the ship, or the ship refuses:`
|
|
50
|
+
}
|
|
27
51
|
|
|
28
52
|
interface PreflightRequest {
|
|
29
53
|
title: string
|
|
30
54
|
body_path: string | undefined
|
|
31
55
|
}
|
|
32
56
|
|
|
57
|
+
// `preconditions` names the kinds a stopped stage found unmet, each once, in the order they were asked.
|
|
58
|
+
interface PreflightResult extends JoshResult {
|
|
59
|
+
preconditions?: ReadonlyArray<string>
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// The body the next ship delivers: `--body-file`, else the run's ship body draft, else the open PR's.
|
|
33
63
|
async function body_text(body_path: string | undefined): Promise<string | undefined> {
|
|
34
64
|
if (body_path !== undefined) return await readFile(body_path, 'utf8')
|
|
65
|
+
const branch = await git_branch.current()
|
|
66
|
+
const issue = git_issue.branch_number(branch)
|
|
67
|
+
const draft = issue === undefined ? undefined : await run_ship_body_draft.existing(issue)
|
|
68
|
+
|
|
69
|
+
if (draft !== undefined) return await readFile(draft, 'utf8')
|
|
35
70
|
|
|
36
|
-
return await git_gh_command.pr_get_body(
|
|
71
|
+
return await git_gh_command.pr_get_body(branch)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function of_kind(kind: string, problems: ReadonlyArray<string>): Array<Unmet> {
|
|
75
|
+
return problems.map((problem) => ({ kind, problem }))
|
|
37
76
|
}
|
|
38
77
|
|
|
39
78
|
// `no_body_problem` answers a runtime change with no body to read at all — no `--body-file` and no open
|
|
@@ -41,7 +80,7 @@ async function body_text(body_path: string | undefined): Promise<string | undefi
|
|
|
41
80
|
async function evidence_problems(
|
|
42
81
|
body_path: string | undefined,
|
|
43
82
|
no_body_problem: string = EVIDENCE_PROBLEM,
|
|
44
|
-
): Promise<Array<
|
|
83
|
+
): Promise<Array<Unmet>> {
|
|
45
84
|
const [paths, body] = await Promise.all([
|
|
46
85
|
changed_paths.read_changed_paths(false),
|
|
47
86
|
body_text(body_path),
|
|
@@ -49,73 +88,165 @@ async function evidence_problems(
|
|
|
49
88
|
|
|
50
89
|
if (live_evidence.verdict_for(paths, body) !== 'required') return []
|
|
51
90
|
|
|
52
|
-
return [
|
|
91
|
+
return of_kind(PRECONDITION.LIVE_EVIDENCE, [
|
|
92
|
+
body === undefined ? no_body_problem : EVIDENCE_PROBLEM,
|
|
93
|
+
])
|
|
53
94
|
}
|
|
54
95
|
|
|
55
|
-
function refusal(problems: ReadonlyArray<
|
|
56
|
-
const lines = problems.map((problem) => ` - ${problem}`)
|
|
96
|
+
function refusal(problems: ReadonlyArray<Unmet>): PreflightResult {
|
|
97
|
+
const lines = problems.map(({ problem }) => ` - ${problem}`)
|
|
57
98
|
const head = `${String(problems.length)} pull-request precondition(s) unmet before the review and the gate:`
|
|
99
|
+
const preconditions = [...new Set(problems.map(({ kind }) => kind))]
|
|
58
100
|
|
|
59
|
-
return { code: FAILURE_EXIT_CODE, out: [head, ...lines].join('\n') }
|
|
101
|
+
return { code: FAILURE_EXIT_CODE, out: [head, ...lines].join('\n'), preconditions }
|
|
60
102
|
}
|
|
61
103
|
|
|
62
104
|
// The reads here run in the ship's own process, where the commit stage's ran in a `git -y` child: a
|
|
63
105
|
// throw — a `--body-file` path that does not exist, a git read that failed — would escape `ship()`
|
|
64
106
|
// past the stop a supervised ship hands back on, so it is reported as one more unmet precondition.
|
|
65
107
|
// Each side is caught on its own, so one side's failed read never hides what the other side found.
|
|
66
|
-
async function caught(problems: Promise<Array<
|
|
108
|
+
async function caught(problems: Promise<Array<Unmet>>): Promise<Array<Unmet>> {
|
|
67
109
|
try {
|
|
68
110
|
return await problems
|
|
69
111
|
} catch (error) {
|
|
70
|
-
return [error_text.message_of(error)]
|
|
112
|
+
return of_kind(PRECONDITION.UNREADABLE, [error_text.message_of(error)])
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async function readable_body(
|
|
117
|
+
body_path: string | undefined,
|
|
118
|
+
): Promise<string | undefined | typeof UNREADABLE> {
|
|
119
|
+
try {
|
|
120
|
+
return await body_text(body_path)
|
|
121
|
+
} catch {
|
|
122
|
+
return UNREADABLE
|
|
71
123
|
}
|
|
72
124
|
}
|
|
73
125
|
|
|
126
|
+
// `followup`'s acceptance-map refusal, asked of the body this ship will deliver. A branch with no issue
|
|
127
|
+
// number is `git_preflight`'s problem to name, and an unreadable body the evidence side's.
|
|
128
|
+
async function acceptance_problems(body_path: string | undefined): Promise<Array<Unmet>> {
|
|
129
|
+
const issue = git_issue.branch_number(await git_branch.current())
|
|
130
|
+
const body = await readable_body(body_path)
|
|
131
|
+
|
|
132
|
+
if (issue === undefined || body === UNREADABLE) return []
|
|
133
|
+
const problem = await acceptance_map_check.body_refusal(issue, body)
|
|
134
|
+
|
|
135
|
+
return problem === undefined ? [] : of_kind(PRECONDITION.ACCEPTANCE_MAP, [problem])
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// `followup`'s removed-test refusal, asked of the body this ship will deliver.
|
|
139
|
+
async function removed_test_problems(body_path: string | undefined): Promise<Array<Unmet>> {
|
|
140
|
+
const body = await readable_body(body_path)
|
|
141
|
+
|
|
142
|
+
if (body === UNREADABLE) return []
|
|
143
|
+
const problem = await removed_tests_check.body_refusal(body)
|
|
144
|
+
|
|
145
|
+
return problem === undefined ? [] : of_kind(PRECONDITION.REMOVED_TESTS, [problem])
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async function lock_problems(): Promise<Array<Unmet>> {
|
|
149
|
+
return of_kind(PRECONDITION.LOCK, await run_ship_lock.lock_problems())
|
|
150
|
+
}
|
|
151
|
+
|
|
74
152
|
// The lock file is asked here too, so a drift stops the ship before the gate
|
|
75
153
|
// rather than being rewritten by the pre-push hook's install under the push.
|
|
76
|
-
async function asked_problems(request: PreflightRequest): Promise<Array<
|
|
77
|
-
const [preflight, evidence, lock] = await Promise.all([
|
|
154
|
+
async function asked_problems(request: PreflightRequest): Promise<Array<Unmet>> {
|
|
155
|
+
const [preflight, evidence, acceptance, removed, lock] = await Promise.all([
|
|
78
156
|
caught(git_preflight.problems_of({ cli_input: request.title, will_open_pr: true })),
|
|
79
157
|
caught(evidence_problems(request.body_path)),
|
|
80
|
-
caught(
|
|
158
|
+
caught(acceptance_problems(request.body_path)),
|
|
159
|
+
caught(removed_test_problems(request.body_path)),
|
|
160
|
+
caught(lock_problems()),
|
|
81
161
|
])
|
|
82
162
|
|
|
83
|
-
return [...preflight, ...evidence, ...lock]
|
|
163
|
+
return [...preflight, ...evidence, ...acceptance, ...removed, ...lock]
|
|
84
164
|
}
|
|
85
165
|
|
|
86
|
-
async function stage(request: PreflightRequest): Promise<
|
|
166
|
+
async function stage(request: PreflightRequest): Promise<PreflightResult> {
|
|
87
167
|
const problems = await asked_problems(request)
|
|
88
168
|
|
|
89
169
|
if (problems.length > 0) return refusal(problems)
|
|
90
170
|
|
|
91
171
|
const scoped = await run_ship_scoped.scoped_pair()
|
|
92
172
|
|
|
93
|
-
|
|
173
|
+
if (scoped.code === SUCCESS_EXIT_CODE) return { code: SUCCESS_EXIT_CODE, out: 'ready' }
|
|
174
|
+
|
|
175
|
+
return { ...scoped, preconditions: [PRECONDITION.SCOPED] }
|
|
94
176
|
}
|
|
95
177
|
|
|
96
|
-
async function classification_problems(issue_number: string): Promise<Array<
|
|
178
|
+
async function classification_problems(issue_number: string): Promise<Array<Unmet>> {
|
|
97
179
|
await git_pr.release_classification(issue_number, await git_branch.current())
|
|
98
180
|
|
|
99
181
|
return []
|
|
100
182
|
}
|
|
101
183
|
|
|
102
|
-
//
|
|
103
|
-
//
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
184
|
+
// Only a body still to be written is handed every row as pending: a draft or an open PR's body keeps
|
|
185
|
+
// the refusal, which names just the rows missing, stale or deferred to an issue that does not exist.
|
|
186
|
+
async function pending_map(
|
|
187
|
+
issue_number: string,
|
|
188
|
+
body: string | undefined,
|
|
189
|
+
): Promise<string | undefined> {
|
|
190
|
+
if (body !== undefined) return undefined
|
|
191
|
+
|
|
192
|
+
return acceptance_map.skeleton(await git_gh_command.issue_get_body(issue_number))
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// The rows land in the ship body draft as well as in the report (joshuafolkken/kit#4168).
|
|
196
|
+
async function pending_text(issue_number: string, map: string): Promise<string> {
|
|
197
|
+
const draft = await run_ship_body_draft.prepare(issue_number, map)
|
|
198
|
+
|
|
199
|
+
return `${acceptance_pending_text(draft)}\n${map}`
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// A refusal of a draft already written names it again, so a later `run:step` still points at the file.
|
|
203
|
+
async function draft_refusal_text(issue_number: string, problem: string): Promise<string> {
|
|
204
|
+
const draft = await run_ship_body_draft.existing(issue_number)
|
|
205
|
+
|
|
206
|
+
return draft === undefined ? problem : `${acceptance_pending_text(draft)}\n${problem}`
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// The acceptance-map refusal asked early carries the rows to write, identifiers included, built by
|
|
210
|
+
// `acceptance_map.skeleton` — the one builder `josh pr` uses too (joshuafolkken/kit#4244). An Issue
|
|
211
|
+
// with no criteria to build rows from keeps the refusal's own wording.
|
|
212
|
+
async function acceptance_pending(issue_number: string): Promise<Array<Unmet>> {
|
|
213
|
+
const body = await body_text(undefined)
|
|
214
|
+
const problem = await acceptance_map_check.body_refusal(issue_number, body)
|
|
215
|
+
|
|
216
|
+
if (problem === undefined) return []
|
|
217
|
+
const map = await pending_map(issue_number, body)
|
|
218
|
+
const pending =
|
|
219
|
+
map === undefined
|
|
220
|
+
? await draft_refusal_text(issue_number, problem)
|
|
221
|
+
: await pending_text(issue_number, map)
|
|
222
|
+
|
|
223
|
+
return of_kind(PRECONDITION.ACCEPTANCE_MAP, [pending])
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// **The same refusals, asked before the ship rather than by it**: a missing classification, missing
|
|
227
|
+
// evidence or an unmapped acceptance criterion is known long before the ship, yet refused there at the
|
|
228
|
+
// run's largest context. `run:prep` (and so `run:entry`)
|
|
229
|
+
// and `run:step` print this, so the Issue body and the PR body are met while they are cheap. Nothing
|
|
230
|
+
// here replaces `stage`: the ship and `followup` still refuse on all of them. Before the PR exists the
|
|
231
|
+
// evidence can only live in the file the ship will be handed, so it is asked for as that file, not
|
|
232
|
+
// reported as a body that already failed.
|
|
109
233
|
async function ahead(issue_number: string): Promise<Array<string>> {
|
|
110
|
-
const [classification, evidence] = await Promise.all([
|
|
234
|
+
const [classification, evidence, acceptance] = await Promise.all([
|
|
111
235
|
caught(classification_problems(issue_number)),
|
|
112
236
|
caught(evidence_problems(undefined, EVIDENCE_PENDING)),
|
|
237
|
+
caught(acceptance_pending(issue_number)),
|
|
113
238
|
])
|
|
114
239
|
|
|
115
|
-
return [...classification, ...evidence]
|
|
240
|
+
return [...classification, ...evidence, ...acceptance].map(({ problem }) => problem)
|
|
116
241
|
}
|
|
117
242
|
|
|
118
|
-
const run_ship_preflight = {
|
|
243
|
+
const run_ship_preflight = {
|
|
244
|
+
EVIDENCE_PENDING,
|
|
245
|
+
EVIDENCE_PROBLEM,
|
|
246
|
+
acceptance_pending_text,
|
|
247
|
+
ahead,
|
|
248
|
+
stage,
|
|
249
|
+
}
|
|
119
250
|
|
|
120
|
-
export type { PreflightRequest }
|
|
251
|
+
export type { PreflightRequest, PreflightResult }
|
|
121
252
|
export { run_ship_preflight }
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { git_command } from '#scripts/git/git-command'
|
|
2
2
|
import { git_worktree } from '#scripts/git/git-worktree'
|
|
3
|
+
import { issue_watch_gate } from '#scripts/issue/issue-watch-gate'
|
|
3
4
|
import { error_text } from '#scripts/lib/error-message'
|
|
4
5
|
import { run_hold } from '#scripts/run/hold/run-hold'
|
|
5
6
|
import { run_preflight } from '#scripts/run/run-preflight'
|
|
@@ -60,16 +61,23 @@ async function read_merged(branch_name: string): Promise<boolean> {
|
|
|
60
61
|
return (await git_command.commit_count_beyond(base, HEAD_REFERENCE)) === 0
|
|
61
62
|
}
|
|
62
63
|
|
|
64
|
+
// The issue changed after the recorded review was briefed — the refusal `josh followup` would make
|
|
65
|
+
// (joshuafolkken/kit#4221) — so the review stage re-runs instead of the followup failing again.
|
|
66
|
+
async function read_review_stale(): Promise<boolean> {
|
|
67
|
+
return await or_false(async () => (await issue_watch_gate.review_refusal_here()) !== undefined)
|
|
68
|
+
}
|
|
69
|
+
|
|
63
70
|
const NOTHING_DONE: ShipState = { is_committed: false, is_pushed: false, is_merged: false }
|
|
64
71
|
|
|
65
72
|
async function read_branch_state(branch_name: string): Promise<ShipState> {
|
|
66
|
-
const [is_committed, is_pushed, is_merged] = await Promise.all([
|
|
73
|
+
const [is_committed, is_pushed, is_merged, is_review_stale] = await Promise.all([
|
|
67
74
|
or_false(read_committed),
|
|
68
75
|
or_false(async () => await read_pushed(branch_name)),
|
|
69
76
|
or_false(async () => await read_merged(branch_name)),
|
|
77
|
+
read_review_stale(),
|
|
70
78
|
])
|
|
71
79
|
|
|
72
|
-
return { is_committed, is_pushed, is_merged }
|
|
80
|
+
return { is_committed, is_pushed, is_merged, is_review_stale }
|
|
73
81
|
}
|
|
74
82
|
|
|
75
83
|
// A branch that cannot be named leaves nothing to ask about, so it reads as nothing done.
|
|
@@ -101,6 +109,6 @@ async function record_target(issue: string): Promise<string | undefined> {
|
|
|
101
109
|
return repository === undefined ? undefined : run_ship_stage.record_path(repository, issue)
|
|
102
110
|
}
|
|
103
111
|
|
|
104
|
-
const run_ship_probe = { read_state, record_target, repository_directory }
|
|
112
|
+
const run_ship_probe = { read_review_stale, read_state, record_target, repository_directory }
|
|
105
113
|
|
|
106
114
|
export { run_ship_probe }
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
2
|
+
import { RUN_STALLED_LABEL } from '#scripts/issue/issue-labels'
|
|
3
|
+
import { issue_park } from '#scripts/issue/issue-park'
|
|
4
|
+
import { telegram_notify } from '#scripts/notify/telegram-notify'
|
|
5
|
+
import { run_event_scope } from '#scripts/run/event/run-event-scope'
|
|
6
|
+
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
7
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
8
|
+
import { run_stalled } from '#scripts/run/park/run-stalled'
|
|
9
|
+
|
|
10
|
+
// How many times a stopped ship relaunches its lane child before the issue goes to a person. A child
|
|
11
|
+
// that keeps stopping — the same red check, a finding it cannot close — would otherwise relaunch
|
|
12
|
+
// without end, one ship's cost each time, with nobody told (joshuafolkken/kit#3999).
|
|
13
|
+
//
|
|
14
|
+
// **The count is the issue's `ship-stop` events since its last fresh dispatch**: a relaunch into the
|
|
15
|
+
// lane emits no `child-launch`, a dispatch does, so a re-dispatched issue starts a new budget. The
|
|
16
|
+
// current stop is emitted before the count is read, so it is part of it. Past the cap the issue is
|
|
17
|
+
// parked with `run:stalled`, which every offer and the lane broker already refuse to start.
|
|
18
|
+
// The whole stream is read, not the run's carry scope: the count scopes itself by issue and dispatch,
|
|
19
|
+
// and a lane child shipping with no carry record (`lane:dispatch` outside a run, or a run already
|
|
20
|
+
// ended) would otherwise read no events and relaunch without a cap.
|
|
21
|
+
|
|
22
|
+
// One dispatch's own stops in the measured week reached five once and four or fewer otherwise, so four
|
|
23
|
+
// relaunches leave a ship that converges alone and stop the one that does not.
|
|
24
|
+
const MAX_SHIP_STOP_RELAUNCHES = 4
|
|
25
|
+
const PARK_CAUSE = 'ship-stop cap'
|
|
26
|
+
const { CHILD_LAUNCH, PARK, SHIP_STOP } = run_event_stream.EVENT_KIND
|
|
27
|
+
|
|
28
|
+
function stops_since_dispatch(events: ReadonlyArray<RunEvent>, issue: string): number {
|
|
29
|
+
const own = events.filter((event) => run_event_scope.issue_named(event) === issue)
|
|
30
|
+
const dispatched = own.findLastIndex((event) => event.kind === CHILD_LAUNCH)
|
|
31
|
+
|
|
32
|
+
return own.slice(dispatched + 1).filter((event) => event.kind === SHIP_STOP).length
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async function is_over(issue: string): Promise<boolean> {
|
|
36
|
+
const events = await run_event_stream_emit.all_events()
|
|
37
|
+
|
|
38
|
+
return stops_since_dispatch(events, issue) > MAX_SHIP_STOP_RELAUNCHES
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function park_comment(issue: string, reason: string): string {
|
|
42
|
+
return [
|
|
43
|
+
`Parked by the \`josh ship\` supervisor: the ship stopped at \`${reason}\` after ${String(MAX_SHIP_STOP_RELAUNCHES)} relaunches of the lane child since its dispatch.`,
|
|
44
|
+
'',
|
|
45
|
+
`Read the stop with \`pnpm josh ship --log ${issue}\`, then ${run_stalled.next_step(issue)}.`,
|
|
46
|
+
].join('\n')
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// The label is what keeps the issue from being re-dispatched; without it the stop stays a plain stop,
|
|
50
|
+
// which `run:merge` books as an unanswered ship stop under its own outage cap.
|
|
51
|
+
async function park(issue: string, reason: string): Promise<boolean> {
|
|
52
|
+
const park_write = await issue_park.apply(issue, RUN_STALLED_LABEL, park_comment(issue, reason))
|
|
53
|
+
|
|
54
|
+
if (!park_write.is_labelled) return false
|
|
55
|
+
|
|
56
|
+
const cite = issue_cite.plain(issue)
|
|
57
|
+
|
|
58
|
+
await run_event_stream_emit.emit(PARK, run_stalled.park_event(issue, PARK_CAUSE))
|
|
59
|
+
await telegram_notify.warn({
|
|
60
|
+
issue_title: `Ship stop cap reached ${cite}`,
|
|
61
|
+
body: `The lane child stopped at ${reason} more than ${String(MAX_SHIP_STOP_RELAUNCHES)} times since its dispatch, so it was not relaunched and the issue is parked.`,
|
|
62
|
+
recovery: `Read pnpm josh ship --log ${issue}, then fix the cause and remove ${RUN_STALLED_LABEL} to offer it again.`,
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
return true
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const run_ship_relaunch_cap = { MAX_SHIP_STOP_RELAUNCHES, is_over, park, stops_since_dispatch }
|
|
69
|
+
|
|
70
|
+
export { run_ship_relaunch_cap }
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises'
|
|
2
|
+
import { git_branch } from '#scripts/git/git-branch'
|
|
3
|
+
import { git_command } from '#scripts/git/git-command'
|
|
4
|
+
import { removed_tests } from '#scripts/review/removed-tests'
|
|
5
|
+
import { removed_tests_check } from '#scripts/review/removed-tests-check'
|
|
6
|
+
import { run_ship_body_draft } from './run-ship-body-draft'
|
|
7
|
+
|
|
8
|
+
// **The tests a change removed, shown where a run passes before `josh ship`** — the end of a green
|
|
9
|
+
// `josh test:related`. Their disposition rows were first asked at the ship's preflight, after the
|
|
10
|
+
// pre-detach checks had run, and every lane that renamed a test stopped there and shipped again
|
|
11
|
+
// (joshuafolkken/kit#4563). The removed titles are `removed_tests_check.read()`'s, and the pending
|
|
12
|
+
// rows go into the branch's ship body draft, so the run only replaces each ending; the preflight still
|
|
13
|
+
// refuses a row left pending.
|
|
14
|
+
|
|
15
|
+
async function draft_of_branch(): Promise<string | undefined> {
|
|
16
|
+
const issue_number = git_branch.issue_from_branch(await git_command.branch())
|
|
17
|
+
|
|
18
|
+
if (issue_number === undefined) return undefined
|
|
19
|
+
|
|
20
|
+
return await run_ship_body_draft.existing(String(issue_number))
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async function body_of(draft: string | undefined): Promise<string> {
|
|
24
|
+
return draft === undefined ? '' : await readFile(draft, 'utf8')
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// An unreadable base lists nothing here — the preflight refuses on it — and outside a repository it
|
|
28
|
+
// keeps the branch, which git could not answer, from being asked at all.
|
|
29
|
+
async function removed_titles(): Promise<ReadonlyArray<string>> {
|
|
30
|
+
return (await removed_tests_check.read()) ?? []
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function where(draft: string | undefined): string {
|
|
34
|
+
return draft === undefined
|
|
35
|
+
? 'Put these rows into the pull request body'
|
|
36
|
+
: `Pending rows for them are in the ship body draft ${draft}`
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function notice(titles: ReadonlyArray<string>, draft: string | undefined): string {
|
|
40
|
+
return [
|
|
41
|
+
`Removed tests — this change removes ${String(titles.length)} test(s) the ship body does not dispose of yet. ${where(draft)}; replace each ending, ${removed_tests.ROW_FORMAT}, or the \`josh ship\` preflight refuses:`,
|
|
42
|
+
...titles.map((title) => ` - ${title}`),
|
|
43
|
+
].join('\n')
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function surface(): Promise<void> {
|
|
47
|
+
const removed = await removed_titles()
|
|
48
|
+
|
|
49
|
+
if (removed.length === 0) return
|
|
50
|
+
const draft = await draft_of_branch()
|
|
51
|
+
const body = await body_of(draft)
|
|
52
|
+
const titles = removed_tests.undisposed(removed, body)
|
|
53
|
+
|
|
54
|
+
if (titles.length === 0) return
|
|
55
|
+
if (draft !== undefined) await writeFile(draft, removed_tests.with_pending_rows(body, titles))
|
|
56
|
+
console.info(notice(titles, draft))
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const run_ship_removed_rows = { surface }
|
|
60
|
+
|
|
61
|
+
export { run_ship_removed_rows }
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { setTimeout as sleep } from 'node:timers/promises'
|
|
1
2
|
import { agent_role_profile } from '#scripts/agent/agent-role-profile'
|
|
2
3
|
import { lane_child_invocation, type ShipStop } from '#scripts/lane/lane-child-invocation'
|
|
3
4
|
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
@@ -6,8 +7,15 @@ import { lane_relaunch } from '#scripts/lane/lane-relaunch'
|
|
|
6
7
|
import { lane_session_broker } from '#scripts/lane/lane-session-broker'
|
|
7
8
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
8
9
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
9
|
-
import type {
|
|
10
|
+
import type { ShipSection } from './run-ship'
|
|
11
|
+
import { run_ship_next, type ShipResume } from './run-ship-next'
|
|
12
|
+
import { run_ship_place } from './run-ship-place'
|
|
13
|
+
import { run_ship_probe } from './run-ship-probe'
|
|
14
|
+
import { run_ship_relaunch_cap } from './run-ship-relaunch-cap'
|
|
10
15
|
import { run_ship_stage, type Stage } from './run-ship-stage'
|
|
16
|
+
import type { ShipArguments } from './run-ship-steps'
|
|
17
|
+
import { run_ship_stop_cause } from './run-ship-stop-cause'
|
|
18
|
+
import { run_ship_stop_context } from './run-ship-stop-context'
|
|
11
19
|
import { run_ship_stop_text } from './run-ship-stop-text'
|
|
12
20
|
|
|
13
21
|
// How a detached `josh ship` supervisor hands a stopped stage back. The agent
|
|
@@ -22,16 +30,26 @@ import { run_ship_stop_text } from './run-ship-stop-text'
|
|
|
22
30
|
// effort because a fix is judgement. It is started before the supervisor exits, so the parent's
|
|
23
31
|
// liveness poll never sees the lane empty. An OpenAI lane is left to its own supervisor, which starts
|
|
24
32
|
// no successor without a cut, so its parent books the stop exactly as it books any ended child.
|
|
33
|
+
// The relaunches are capped: past the cap the issue is parked and a person told instead.
|
|
25
34
|
//
|
|
26
35
|
// A ship run in an agent's own turn is not supervised and hands nothing back: its report is already in
|
|
27
36
|
// front of the agent that ran it.
|
|
28
37
|
|
|
29
38
|
const OPENAI_PROVIDER = 'openai'
|
|
39
|
+
// A minute of polling, long enough for the supervisor's 5-second lane scan to reopen a server.
|
|
40
|
+
const SERVING_POLL_MS = 1000
|
|
41
|
+
const SERVING_POLLS = 60
|
|
30
42
|
|
|
31
|
-
type ReturnOutcome = 'relaunched' | 'recorded'
|
|
43
|
+
type ReturnOutcome = 'relaunched' | 'recorded' | 'parked' | 'redispatch'
|
|
32
44
|
|
|
33
|
-
|
|
34
|
-
|
|
45
|
+
// The failed stage's output, and its standard output alone where the stage kept it apart.
|
|
46
|
+
type StageOutput = Pick<ShipSection, 'body' | 'out'>
|
|
47
|
+
|
|
48
|
+
function stop_text(issue: string, stage: Stage, resume: ShipResume, output: StageOutput): string {
|
|
49
|
+
const reason = run_ship_stage.stop_reason(stage, resume.conflicts)
|
|
50
|
+
const cause = run_ship_stop_cause.cause_of(stage, { ...resume, ...output })
|
|
51
|
+
|
|
52
|
+
return run_ship_stop_text.format(issue, reason, cause)
|
|
35
53
|
}
|
|
36
54
|
|
|
37
55
|
function can_relaunch(lane: LaneInfo | undefined): lane is LaneInfo {
|
|
@@ -65,38 +83,128 @@ function relaunched(lane: LaneInfo, stop: ShipStop): ReturnOutcome {
|
|
|
65
83
|
// **A served lane's child is relaunched by its broker, not from here**: this supervisor descends from the
|
|
66
84
|
// child's Bash tool, which Claude Code starts without the token, so a child started here could not sign
|
|
67
85
|
// in where the token is the only credential (joshuafolkken/kit#3817).
|
|
68
|
-
async function
|
|
69
|
-
|
|
70
|
-
|
|
86
|
+
async function ask_broker(lane: LaneInfo, stop: ShipStop): Promise<boolean> {
|
|
87
|
+
const answer = await lane_session_broker.request(lane.directory, lane.issue, {
|
|
88
|
+
kind: 'relaunch',
|
|
89
|
+
stop,
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
if (!answer.is_success) note(`the lane broker did not start the lane child — ${answer.reason}`)
|
|
93
|
+
|
|
94
|
+
return answer.is_success
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// The session of a broker serving the lane within the wait, other than `previous` — one that stopped
|
|
98
|
+
// serving is reopened by the supervisor's next lane scan (`claude-lane-broker.ts`).
|
|
99
|
+
async function await_server(lane: LaneInfo, previous?: string): Promise<string | undefined> {
|
|
100
|
+
for (let polled = 0; polled < SERVING_POLLS; polled += 1) {
|
|
101
|
+
const session = lane_session_broker.serving_session(lane.directory, lane.issue)
|
|
102
|
+
if (session !== undefined && session !== previous) return session
|
|
103
|
+
|
|
104
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each check waits on the scan the previous one missed
|
|
105
|
+
await sleep(SERVING_POLL_MS)
|
|
71
106
|
}
|
|
72
107
|
|
|
73
|
-
|
|
108
|
+
return undefined
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// **A relaunch the broker failed is asked once more, of a new broker only, then handed to the driver**: a
|
|
112
|
+
// stop left recorded waited hours for the stall detector (joshuafolkken/kit#4344). The broker that failed
|
|
113
|
+
// may still be starting the first relaunch, so asking it again could start a second child beside it.
|
|
114
|
+
// Once this supervisor exits, the driver's next poll reads the stop as unanswered and re-dispatches the
|
|
115
|
+
// issue (`run-merge-ship.ts`).
|
|
116
|
+
async function brokered(lane: LaneInfo, stop: ShipStop, server: string): Promise<ReturnOutcome> {
|
|
117
|
+
if (await ask_broker(lane, stop)) return 'relaunched'
|
|
118
|
+
|
|
119
|
+
const next = await await_server(lane, server)
|
|
120
|
+
|
|
121
|
+
if (next !== undefined && (await ask_broker(lane, stop))) return 'relaunched'
|
|
122
|
+
|
|
123
|
+
note('the lane child could not be relaunched: the driver re-dispatches the issue')
|
|
124
|
+
|
|
125
|
+
return 'redispatch'
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// A child that stopped more often than the cap allows is parked instead of relaunched
|
|
129
|
+
// (`run-ship-relaunch-cap.ts`); a park the label refused leaves the stop recorded, as before.
|
|
130
|
+
async function parked(issue: string, stage: Stage, resume: ShipResume): Promise<ReturnOutcome> {
|
|
131
|
+
const reason = run_ship_stage.stop_reason(stage, resume.conflicts)
|
|
132
|
+
|
|
133
|
+
if (await run_ship_relaunch_cap.park(issue, reason)) return 'parked'
|
|
134
|
+
|
|
135
|
+
note('the lane child was not relaunched past the ship-stop cap, and the park label was refused')
|
|
74
136
|
|
|
75
137
|
return 'recorded'
|
|
76
138
|
}
|
|
77
139
|
|
|
78
|
-
|
|
140
|
+
// `output` is the failed stage's own output: the relaunched child's prompt carries the body's tail, and
|
|
141
|
+
// the stop is classified on its standard output (`run-ship-stop-cause.ts`).
|
|
142
|
+
async function stopped(
|
|
79
143
|
issue: string,
|
|
80
144
|
stage: Stage,
|
|
81
145
|
resume: ShipResume,
|
|
146
|
+
output: StageOutput,
|
|
82
147
|
): Promise<ReturnOutcome> {
|
|
83
148
|
await run_event_stream_emit.emit(
|
|
84
149
|
run_event_stream.EVENT_KIND.SHIP_STOP,
|
|
85
|
-
stop_text(issue, stage, resume),
|
|
150
|
+
stop_text(issue, stage, resume, output),
|
|
86
151
|
)
|
|
87
152
|
|
|
88
153
|
const lane = await lane_to_relaunch(issue)
|
|
89
154
|
|
|
90
155
|
if (lane === undefined) return 'recorded'
|
|
91
156
|
|
|
92
|
-
|
|
157
|
+
if (await run_ship_relaunch_cap.is_over(issue)) return await parked(issue, stage, resume)
|
|
158
|
+
// A followup stop waits for a lane place, keeping the ship-stop prompt and the relaunch cap a driver
|
|
159
|
+
// re-dispatch would lose (`run-ship-place.ts`).
|
|
160
|
+
await run_ship_place.await_place(lane, stage)
|
|
161
|
+
|
|
162
|
+
const context = await run_ship_stop_context.build(issue, output.body)
|
|
163
|
+
const stop = { stage, ...resume, context }
|
|
164
|
+
// **A broker that stopped serving before the stop is waited for**: one that died during the review left
|
|
165
|
+
// the lane unserved at the stop, and a child started here cannot sign in on a token (joshuafolkken/kit#4344).
|
|
166
|
+
const server = await await_server(lane)
|
|
167
|
+
|
|
168
|
+
return server === undefined ? relaunched(lane, stop) : await brokered(lane, stop, server)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
async function return_control(
|
|
172
|
+
issue: string,
|
|
173
|
+
stage: Stage,
|
|
174
|
+
resume: ShipResume,
|
|
175
|
+
output: string,
|
|
176
|
+
): Promise<ReturnOutcome> {
|
|
177
|
+
return await stopped(issue, stage, resume, { body: output })
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
type FailedSection = Pick<ShipSection, 'body' | 'out' | 'conflicts' | 'cause'>
|
|
181
|
+
|
|
182
|
+
// The section's conflicts and the cause its review round tagged, only where it has them.
|
|
183
|
+
function stopped_resume(resume: ShipResume, failed: FailedSection | undefined): ShipResume {
|
|
184
|
+
const { conflicts, cause } = failed ?? {}
|
|
185
|
+
|
|
186
|
+
return {
|
|
187
|
+
...resume,
|
|
188
|
+
...(conflicts !== undefined && { conflicts }),
|
|
189
|
+
...(cause !== undefined && { cause }),
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// The stopped ship's arguments and its failed section, as `stopped` takes them: the section's conflicts
|
|
194
|
+
// and tagged cause ride on the resume, its body and standard output are the stage's output. A stale
|
|
195
|
+
// review rides on it too, so the relaunched child re-detaches with `--review` (joshuafolkken/kit#4221).
|
|
196
|
+
async function hand_back(
|
|
197
|
+
args: ShipArguments,
|
|
198
|
+
stage: Stage,
|
|
199
|
+
failed: FailedSection | undefined,
|
|
200
|
+
): Promise<ReturnOutcome> {
|
|
201
|
+
const is_review_stale = await run_ship_probe.read_review_stale()
|
|
202
|
+
const resume = { ...run_ship_next.resume_of(args), is_review_stale }
|
|
93
203
|
|
|
94
|
-
return
|
|
95
|
-
? await brokered(lane, stop)
|
|
96
|
-
: relaunched(lane, stop)
|
|
204
|
+
return await stopped(args.number, stage, stopped_resume(resume, failed), failed ?? { body: '' })
|
|
97
205
|
}
|
|
98
206
|
|
|
99
|
-
const run_ship_return = { return_control }
|
|
207
|
+
const run_ship_return = { hand_back, return_control }
|
|
100
208
|
|
|
101
209
|
export type { ReturnOutcome }
|
|
102
210
|
export { run_ship_return }
|