@joshuafolkken/kit 1.1784.0 → 1.2116.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/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/workflow-commands/SKILL.md +6 -6
- package/.claude/skills/workflow-commands/background-commands.md +8 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +3 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-park.md +5 -2
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -3
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +41 -32
- package/.claude/skills/workflow-commands/delegation.md +6 -6
- package/.claude/skills/workflow-commands/entry-sequence.md +2 -2
- package/.claude/skills/workflow-commands/followup.md +7 -5
- package/.claude/skills/workflow-commands/fullrun-steps.md +6 -6
- package/.claude/skills/workflow-commands/fullrun.md +1 -1
- package/.claude/skills/workflow-commands/issue-comments.md +9 -4
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/kickoff.md +2 -2
- package/.claude/skills/workflow-commands/observation-filing.md +1 -1
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -7
- package/.claude/skills/workflow-commands/prerequisite.md +3 -2
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +7 -5
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-pnpm/action.yml +9 -16
- package/.github/dependabot.yml +16 -0
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +155 -15
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +60 -45
- package/.vscode/settings.json +19 -0
- package/CLAUDE.md +5 -12
- package/SECURITY.md +2 -2
- package/dist/CLAUDE.md +5 -12
- package/dist/commands/document-read-cli.js +2 -1
- package/dist/commands/document-section-main.js +2 -1
- package/dist/commands/read-set-cli.js +194 -134
- package/dist/commands/run-prep-main.js +9694 -10173
- package/dist/commands/run-step-cli.js +22138 -18285
- package/dist/hooks/audit-provision.js +23 -5
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/{chunk-CWMBGKYW.js → chunk-5PM2JRGV.js} +2153 -856
- package/dist/hooks/{chunk-WR2KQAYZ.js → chunk-7SIUNQXK.js} +1207 -1470
- package/dist/hooks/{chunk-O2YBIDSI.js → chunk-CQD4LJE6.js} +1682 -1130
- package/dist/hooks/{chunk-VWWCFGWK.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/{chunk-XGBNSWEI.js → chunk-UJ3FPMMM.js} +132 -49
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +8 -8
- package/dist/hooks/format-edited.js +4 -5
- package/dist/hooks/inputs.json +386 -360
- package/dist/hooks/pretool-guard.js +7 -6
- package/dist/hooks/session-lang.js +101 -258
- package/dist/hooks/stop-guard.js +1744 -2576
- package/dist/josh.js +7133 -6368
- package/dist/version/index.js +161 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/package.json +16 -9
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +14 -11
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +40 -21
- package/prompts/collaboration-workflow/lane-instructions.md +3 -1
- package/prompts/collaboration-workflow/measurement.md +8 -1
- package/prompts/collaboration-workflow/operating-rules.md +11 -2
- package/prompts/collaboration-workflow/output-bounds.md +6 -2
- package/prompts/collaboration-workflow/plan-comment.md +1 -1
- package/prompts/collaboration-workflow/principles.md +9 -0
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
- package/prompts/collaboration-workflow/wip-cap.md +3 -1
- package/prompts/review-rubric.md +8 -0
- package/prompts/review.md +31 -22
- package/prompts/testing-guide.md +1 -0
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +20 -9
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-cli.ts +6 -1
- package/scripts/backlog/backlog-drive-hold.ts +3 -3
- package/scripts/backlog/backlog-drive-idle.ts +10 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -30
- package/scripts/backlog/backlog-drive-named.ts +28 -7
- package/scripts/backlog/backlog-drive-paused.ts +5 -4
- package/scripts/backlog/backlog-drive-restore.ts +11 -3
- package/scripts/backlog/backlog-drive.ts +21 -60
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next.ts +39 -49
- package/scripts/backlog/backlog-occupied.ts +2 -2
- package/scripts/backlog/backlog-overlap.ts +42 -8
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +19 -6
- package/scripts/backlog/backlog-pool.ts +50 -12
- package/scripts/backlog/backlog-rank.ts +60 -13
- package/scripts/backlog/backlog-stalled-detect.ts +2 -1
- package/scripts/backlog/backlog-waves.ts +17 -2
- package/scripts/backlog/backlogrun-launch.ts +7 -4
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-cli.ts +37 -16
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +2 -2
- package/scripts/delegation/duplicate-read-guard.ts +1 -0
- package/scripts/delegation/investigation-guard.ts +14 -2
- package/scripts/delegation/investigation-reads.ts +45 -23
- package/scripts/dependabot/dependabot-cooldown.ts +3 -2
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +17 -7
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-cli-argv.ts +2 -2
- package/scripts/epic/epic-fetch.ts +4 -2
- package/scripts/epic/epic-graph.ts +7 -2
- package/scripts/epic/epic-issue.ts +3 -1
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +13 -10
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +41 -11
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
- package/scripts/followup/git-pr-followup.ts +62 -27
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +2 -2
- package/scripts/gate/busy-average.ts +34 -2
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/command-memory.ts +1 -1
- package/scripts/gate/core-admission.ts +24 -6
- package/scripts/gate/core-budget-timing.ts +20 -6
- package/scripts/gate/core-budget.ts +40 -11
- package/scripts/gate/core-wait-record.ts +3 -2
- package/scripts/gate/core-wait.ts +25 -2
- package/scripts/gate/core-weights.ts +15 -7
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +14 -6
- package/scripts/gate/gate-plan.ts +103 -58
- package/scripts/gate/gate-report.ts +9 -7
- package/scripts/gate/gate-run-steps.ts +26 -3
- package/scripts/gate/gate-skip.ts +45 -6
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +2 -1
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/scoped-green.ts +68 -15
- package/scripts/gate/since-green.ts +14 -6
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/verification-gate.ts +51 -16
- package/scripts/gate/verification-inputs.ts +21 -6
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +23 -2
- package/scripts/gh/git-ai-review-scan.ts +1 -1
- package/scripts/gh/git-gh-api-path.ts +12 -3
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +4 -2
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +8 -2
- package/scripts/gh/git-gh-issue.ts +12 -5
- package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +3 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +21 -7
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +3 -0
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/git/base-tree.ts +30 -0
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +16 -1
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +66 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-schemas.ts +13 -0
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +53 -5
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +11 -2
- package/scripts/git/stash/stash-push-cli.ts +10 -0
- package/scripts/hooks/batch-guard.ts +40 -21
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +22 -2
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +14 -1
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +76 -10
- package/scripts/hooks/pretool-guard.ts +2 -0
- package/scripts/hooks/reserved-run.ts +14 -1
- package/scripts/hooks/run-hook.sh +23 -8
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +3 -15
- package/scripts/hooks/stop-guard.ts +7 -6
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +5 -1
- package/scripts/init/hook-launch.ts +4 -2
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-line.ts +19 -1
- package/scripts/issue/defect-rate-cli.ts +5 -102
- package/scripts/issue/defect-report.ts +4 -4
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +64 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-body-or-comment.ts +38 -4
- package/scripts/issue/issue-cite-cli.ts +1 -3
- package/scripts/issue/issue-classification.ts +1 -0
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-evidence-exit.ts +4 -2
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +111 -38
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +43 -6
- package/scripts/issue/issue-labels.ts +19 -2
- package/scripts/issue/issue-lint-cli.ts +27 -2
- package/scripts/issue/issue-measured-cli.ts +13 -35
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-not-before-label.ts +2 -2
- package/scripts/issue/issue-not-before.ts +4 -1
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +174 -43
- package/scripts/issue/issue-rank.ts +21 -4
- package/scripts/issue/issue-read-cli.ts +32 -6
- package/scripts/issue/issue-read.ts +37 -12
- package/scripts/issue/issue-sample-gate.ts +95 -74
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +12 -11
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +31 -1
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -12
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -70
- package/scripts/issue/plan-consumers-section.ts +22 -1
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/command-usage.ts +3 -2
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -82
- package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
- package/scripts/josh/josh-commands-ai.ts +5 -5
- package/scripts/josh/josh-commands-development.ts +59 -58
- package/scripts/josh/josh-commands-issue-write.ts +23 -4
- package/scripts/josh/josh-commands-issue.ts +32 -0
- package/scripts/josh/josh-commands-lane.ts +87 -4
- package/scripts/josh/josh-commands-lint.ts +16 -3
- package/scripts/josh/josh-commands-maintenance.ts +15 -0
- package/scripts/josh/josh-commands-review.ts +41 -6
- package/scripts/josh/josh-commands-ship.ts +56 -8
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-workflow.ts +1 -1
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +5 -3
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/stamp-file.ts +11 -2
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +5 -8
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-check-stats.ts +29 -8
- package/scripts/lane/lane-child-invocation.ts +9 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-close.ts +8 -3
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +2 -2
- package/scripts/lane/lane-gap-stats.ts +7 -6
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +119 -36
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +31 -177
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +176 -59
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +16 -7
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +4 -1
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-registry.ts +14 -1
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-sampler.ts +23 -4
- package/scripts/lane/lane-session-action.ts +93 -18
- package/scripts/lane/lane-session-broker.ts +49 -21
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-spent.ts +1 -1
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +13 -1
- package/scripts/lane/lane-state.ts +41 -9
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +21 -5
- package/scripts/lane/lane-stop-stats.ts +51 -19
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-transcript-calls.ts +67 -10
- package/scripts/lane/lane-transcript-stats.ts +44 -12
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +108 -31
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +45 -6
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/import-graph.ts +141 -11
- package/scripts/lint/lint-gate-scope.ts +2 -2
- package/scripts/lint/lint-parallel.ts +54 -6
- package/scripts/lint/lint-related.ts +154 -33
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/telegram-notify.ts +12 -3
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush.ts +32 -9
- package/scripts/overrides/overrides-check.ts +9 -1
- package/scripts/release/release-approval-prune.ts +7 -1
- package/scripts/repo/required-checks-logic.ts +4 -1
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +15 -1
- package/scripts/report/report-labels.ts +12 -1
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +26 -7
- package/scripts/report/report-lint.ts +2 -20
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +68 -19
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +14 -7
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +85 -22
- package/scripts/review/review-finding-ledger.ts +109 -7
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +11 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +4 -2
- package/scripts/review/review-record-cli.ts +177 -54
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +91 -29
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +24 -8
- package/scripts/review/review-stamps.ts +7 -3
- package/scripts/review/review-stop-log.ts +20 -6
- package/scripts/review/review-stops-cli.ts +2 -1
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/rules/agent-model.ts +1 -1
- package/scripts/rules/bash-triggers.ts +3 -3
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle.ts +1 -1
- package/scripts/rules/delivered-rules.ts +36 -17
- package/scripts/rules/destructive-command.ts +3 -11
- package/scripts/rules/direct-issue-comment.ts +34 -12
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +4 -24
- package/scripts/rules/early-heartbeat.ts +2 -0
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/guard-remedy.ts +14 -5
- package/scripts/rules/implementation-cut.ts +61 -28
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +9 -4
- package/scripts/rules/josh-git-bare.ts +1 -1
- package/scripts/rules/lane-background.ts +41 -13
- package/scripts/rules/lane-direct-tool.ts +107 -9
- package/scripts/rules/lane-interactive-ask.ts +4 -1
- package/scripts/rules/lane-park.ts +4 -2
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +1 -1
- package/scripts/rules/lane-switch-main.ts +4 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/permission-guards.ts +5 -1
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +67 -17
- package/scripts/rules/poll-loop.ts +72 -9
- package/scripts/rules/pr-merge.ts +5 -5
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +88 -24
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +5 -15
- package/scripts/rules/rule-value-cache.ts +53 -5
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +59 -11
- package/scripts/rules/rule-value.ts +17 -4
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +10 -2
- package/scripts/rules/stop-rule-rows.ts +1 -13
- package/scripts/rules/stop-rules.ts +33 -58
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +110 -23
- package/scripts/rules/timed-rerun.ts +1 -1
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +22 -7
- package/scripts/run/board/run-board-ending-reason.ts +6 -2
- package/scripts/run/board/run-board-fit.ts +24 -1
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-header.ts +8 -0
- package/scripts/run/board/run-board-labels.ts +11 -1
- package/scripts/run/board/run-board-lane-time.ts +1 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-notes.ts +7 -1
- package/scripts/run/board/run-board-operation.ts +4 -2
- package/scripts/run/board/run-board-phase.ts +2 -5
- package/scripts/run/board/run-board-plan.ts +1 -1
- package/scripts/run/board/run-board-read.ts +46 -1
- package/scripts/run/board/run-board-reason.ts +20 -8
- package/scripts/run/board/run-board-render-checks.ts +3 -2
- package/scripts/run/board/run-board-render-drawn.ts +11 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-lead.ts +9 -0
- package/scripts/run/board/run-board-render-legend.ts +19 -0
- package/scripts/run/board/run-board-render-tail.ts +1 -1
- package/scripts/run/board/run-board-render.ts +82 -18
- package/scripts/run/board/run-board-spin.ts +1 -3
- package/scripts/run/board/run-board-status.ts +2 -0
- package/scripts/run/board/run-board-tick.ts +39 -10
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +3 -2
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +52 -8
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-filed.ts +9 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +4 -0
- package/scripts/run/event/run-event-stream.ts +25 -3
- package/scripts/run/hold/run-stop-notify.ts +3 -8
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +66 -23
- package/scripts/run/merge/run-merge-outcome.ts +2 -0
- package/scripts/run/merge/run-merge-ship.ts +13 -3
- package/scripts/run/merge/run-merge-signals.ts +40 -23
- package/scripts/run/merge/run-merge-steps.ts +56 -36
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +41 -14
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +26 -6
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-prep.ts +1 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +5 -2
- package/scripts/run/ship/run-ship-args.ts +19 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +131 -39
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +10 -4
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +27 -26
- package/scripts/run/ship/run-ship-overlap.ts +8 -3
- package/scripts/run/ship/run-ship-place.ts +9 -2
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
- package/scripts/run/ship/run-ship-preflight.ts +16 -4
- package/scripts/run/ship/run-ship-probe.ts +23 -9
- package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-return.ts +103 -29
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +230 -59
- package/scripts/run/ship/run-ship-review.ts +171 -51
- package/scripts/run/ship/run-ship-reviewer.ts +138 -42
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +49 -13
- package/scripts/run/ship/run-ship-steps.ts +24 -4
- package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-sync.ts +171 -30
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +16 -2
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +6 -113
- package/scripts/run/wake/run-wake-code.ts +53 -11
- package/scripts/run/wake/run-wake-driver.ts +5 -3
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +5 -3
- package/scripts/run/wake/run-wake-ports.ts +11 -3
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake.ts +3 -2
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/project-config.ts +3 -2
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-provision-main.ts +9 -1
- package/scripts/security/security-audit-provision.ts +1 -1
- package/scripts/security/security-audit.ts +21 -1
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/split/split-assess.ts +12 -3
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +20 -2
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +208 -20
- package/scripts/test/test-pinned-main.ts +84 -18
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +258 -47
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +35 -11
- package/scripts/test/test-read-recording.ts +17 -5
- package/scripts/test/test-read-trace.ts +26 -8
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red.ts +34 -14
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +4 -1
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +43 -23
- package/scripts/test/test-related-scope.ts +99 -34
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +167 -83
- package/scripts/test/test-unit-guard.ts +28 -5
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-worker-share.ts +5 -4
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +12 -1
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +36 -5
- package/scripts/time-runtime/time-markers.ts +2 -2
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +17 -5
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/latest-corepack.ts +2 -0
- package/templates/gitignore +2 -0
- package/templates/workflows/ci.yml +41 -0
- package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
- package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
- package/dist/hooks/chunk-TUIFS5E7.js +0 -72
- package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/rules/filing-cap.ts +0 -139
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { shell_quote } from '#scripts/lib/shell-quote'
|
|
1
2
|
import { run_ship_stage, type Stage } from './run-ship-stage'
|
|
2
3
|
import type { ShipArguments } from './run-ship-steps'
|
|
3
4
|
import type { Cause } from './run-ship-stop-cause'
|
|
@@ -14,9 +15,9 @@ import type { Cause } from './run-ship-stop-cause'
|
|
|
14
15
|
//
|
|
15
16
|
// **Every route is a re-detach.** The prompt only ever reaches a lane child, and a lane child's commit
|
|
16
17
|
// and push belong to the detached ship (`scripts/rules/lane-background.ts`), so a `josh git -y` here could never
|
|
17
|
-
// run. The rounds are the supervisor's too: under `--review` it
|
|
18
|
-
//
|
|
19
|
-
//
|
|
18
|
+
// run. The rounds are the supervisor's too: under `--review` it reuses a round 1 recorded on a tree
|
|
19
|
+
// unmoved or moved only where round 2 reads, reviews only the delta from that record otherwise, and asks `review:round2` itself after the
|
|
20
|
+
// commit (`run-ship-review-steps.ts`), so the whole change is never reviewed again as round 1.
|
|
20
21
|
//
|
|
21
22
|
// **The re-run carries the stopped ship's own options.** A preflight that stopped on missing live
|
|
22
23
|
// evidence asks for `--body-file`, and `followup` delivers the body from it; a command naming only
|
|
@@ -30,18 +31,15 @@ const COMMAND = {
|
|
|
30
31
|
DETACH_REVIEW: 'pnpm josh ship --detach --review',
|
|
31
32
|
} as const
|
|
32
33
|
|
|
33
|
-
// A single quote cannot appear inside single quotes, so it closes the quote, escapes one, and reopens.
|
|
34
|
-
const ESCAPED_QUOTE = String.raw`'\''`
|
|
35
|
-
|
|
36
|
-
// A token of only these characters means the same to the shell quoted or not, so it is left bare.
|
|
37
|
-
const BARE_WORD = /^[\w%+,./:=@-]+$/u
|
|
38
|
-
|
|
39
34
|
// What a stopped ship is re-run with: its title, every option it was started with, and whether it
|
|
40
35
|
// carried `--review` — the one option a route decides rather than repeats.
|
|
41
36
|
interface ShipResume {
|
|
42
37
|
title: string
|
|
43
38
|
flags: ReadonlyArray<string>
|
|
44
39
|
is_review: boolean
|
|
40
|
+
// `--unpinned-ok "<reason>"` as started; `josh ship` refuses it without `--review`, so only a
|
|
41
|
+
// command that carries `--review` repeats it.
|
|
42
|
+
unpinned_ok?: ReadonlyArray<string>
|
|
45
43
|
// The paths a merge of the default branch left unmerged.
|
|
46
44
|
conflicts?: ReadonlyArray<string>
|
|
47
45
|
// The cause a stopped review round tagged its stop with (`run-ship-stop-cause.ts`).
|
|
@@ -50,17 +48,8 @@ interface ShipResume {
|
|
|
50
48
|
is_review_stale?: boolean
|
|
51
49
|
}
|
|
52
50
|
|
|
53
|
-
// Single quotes, so a `$` or a backtick in a title is never expanded by the shell that runs it.
|
|
54
|
-
function quoted(title: string): string {
|
|
55
|
-
return `'${title.split("'").join(ESCAPED_QUOTE)}'`
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function shell_word(token: string): string {
|
|
59
|
-
return BARE_WORD.test(token) ? token : quoted(token)
|
|
60
|
-
}
|
|
61
|
-
|
|
62
51
|
// A supervised ship's notify tail is already file-form (`run-ship-detach.ts`), so every flag is a path
|
|
63
|
-
// or an issue number and fits the prompt.
|
|
52
|
+
// or an issue number and fits the prompt; `shell_quote.word` quotes the `--unpinned-ok` reason.
|
|
64
53
|
function resume_of(args: ShipArguments): ShipResume {
|
|
65
54
|
const cites = args.cites.flatMap((cite) => ['--cite', cite])
|
|
66
55
|
|
|
@@ -68,28 +57,40 @@ function resume_of(args: ShipArguments): ShipResume {
|
|
|
68
57
|
title: args.title,
|
|
69
58
|
flags: [...args.notify, ...args.body, ...cites],
|
|
70
59
|
is_review: args.is_review,
|
|
60
|
+
unpinned_ok: args.unpinned_ok,
|
|
71
61
|
}
|
|
72
62
|
}
|
|
73
63
|
|
|
74
64
|
// The command prefix stays as written; only the stopped ship's own tokens are quoted where needed.
|
|
75
|
-
function ship_command(
|
|
76
|
-
|
|
65
|
+
function ship_command(
|
|
66
|
+
command: string,
|
|
67
|
+
resume: ShipResume,
|
|
68
|
+
review_flags: ReadonlyArray<string> = [],
|
|
69
|
+
): string {
|
|
70
|
+
const words = [...review_flags, ...resume.flags, resume.title].map((token) =>
|
|
71
|
+
shell_quote.word(token),
|
|
72
|
+
)
|
|
77
73
|
|
|
78
74
|
return [command, ...words].join(' ')
|
|
79
75
|
}
|
|
80
76
|
|
|
77
|
+
function review_command(resume: ShipResume): string {
|
|
78
|
+
return ship_command(COMMAND.DETACH_REVIEW, resume, resume.unpinned_ok)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
81
|
// After the merge-side stages, or after round 2 — which is final — the re-detach reviews nothing.
|
|
82
82
|
function detach_again(resume: ShipResume): string {
|
|
83
83
|
return `leave the fix uncommitted and run \`${ship_command(COMMAND.DETACH, resume)}\`.`
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
// Before round 2 the re-run takes the stopped ship's own shape: `--review` only when it carried it. A
|
|
87
|
-
// reviewing ship
|
|
87
|
+
// reviewing ship reviews only the fix delta from its recorded round 1 and decides round 2 after the
|
|
88
|
+
// commit; a ship started
|
|
88
89
|
// without `--review` was re-detached after round 2, which is final, so it reviews nothing.
|
|
89
90
|
function detach_as_started(resume: ShipResume): string {
|
|
90
|
-
const command = resume.is_review ?
|
|
91
|
+
const command = resume.is_review ? review_command(resume) : ship_command(COMMAND.DETACH, resume)
|
|
91
92
|
|
|
92
|
-
return `leave the fix uncommitted and run \`${
|
|
93
|
+
return `leave the fix uncommitted and run \`${command}\`.`
|
|
93
94
|
}
|
|
94
95
|
|
|
95
96
|
const AFTER_FIX: Record<Stage, (resume: ShipResume) => string> = {
|
|
@@ -107,7 +108,7 @@ const AFTER_FIX: Record<Stage, (resume: ShipResume) => string> = {
|
|
|
107
108
|
// supervisor reviews it again even on a committed tree (`run-ship-stage.ts`), and `josh followup`
|
|
108
109
|
// refuses the merge until it has (joshuafolkken/kit#4221).
|
|
109
110
|
function detach_review_again(resume: ShipResume): string {
|
|
110
|
-
return `leave the fix uncommitted and run \`${
|
|
111
|
+
return `leave the fix uncommitted and run \`${review_command(resume)}\` — the review read the issue before its update, so the supervisor reviews round 1 again.`
|
|
111
112
|
}
|
|
112
113
|
|
|
113
114
|
function after_fix(stage: Stage, resume: ShipResume): string {
|
|
@@ -137,6 +138,6 @@ function next_step(issue: string, stage: Stage, resume: ShipResume, is_excerpted
|
|
|
137
138
|
return `${fix_step(issue, stage, is_excerpted)}, then ${after_fix(stage, resume)}`
|
|
138
139
|
}
|
|
139
140
|
|
|
140
|
-
const run_ship_next = { COMMAND, next_step,
|
|
141
|
+
const run_ship_next = { COMMAND, next_step, resume_of }
|
|
141
142
|
|
|
142
143
|
export { run_ship_next, type ShipResume }
|
|
@@ -5,7 +5,8 @@ import { git_spawn } from '#scripts/git/git-spawn'
|
|
|
5
5
|
import { main_merge_regenerate } from '#scripts/git/main-merge-regenerate'
|
|
6
6
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
7
7
|
import { lane_handoff } from '#scripts/lane/lane-handoff'
|
|
8
|
-
import {
|
|
8
|
+
import type { OverlapRecord } from '#scripts/lane/lane-ledger-schema'
|
|
9
|
+
import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
|
|
9
10
|
import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
|
|
10
11
|
import { poll } from '#scripts/lib/poll'
|
|
11
12
|
|
|
@@ -39,8 +40,12 @@ const NAME_ONLY_ARGUMENTS = [
|
|
|
39
40
|
'--no-relative',
|
|
40
41
|
'--no-renames',
|
|
41
42
|
]
|
|
43
|
+
// Only the regenerated entries: a rewritten one resolves some conflicts and refuses the rest, so its
|
|
44
|
+
// conflict is still waited on.
|
|
42
45
|
const REGENERATED_PATHS: ReadonlySet<string> = new Set(
|
|
43
|
-
main_merge_regenerate.
|
|
46
|
+
main_merge_regenerate.RESOLVED_FILES.filter((entry) => 'command' in entry).map(
|
|
47
|
+
(entry) => entry.path,
|
|
48
|
+
),
|
|
44
49
|
)
|
|
45
50
|
|
|
46
51
|
interface OverlapOptions {
|
|
@@ -211,7 +216,7 @@ async function await_overlap(
|
|
|
211
216
|
const waited_ms = Date.now() - started
|
|
212
217
|
const record = { issue: Number(issue), lanes, paths: [...overlap.paths], waited_ms, is_cleared }
|
|
213
218
|
|
|
214
|
-
await
|
|
219
|
+
await lane_ledger_write.record_overlap(record, options.ledger)
|
|
215
220
|
|
|
216
221
|
return record
|
|
217
222
|
}
|
|
@@ -8,10 +8,15 @@ import { run_ship_stage, type Stage } from './run-ship-stage'
|
|
|
8
8
|
|
|
9
9
|
// **A followup stop past the lane limit waits for a place, then relaunches**: its lane held no place
|
|
10
10
|
// while it waited (`backlog-occupied.ts`), so the next launch may have taken it, and a child started at
|
|
11
|
-
// once
|
|
11
|
+
// once could run lanes past the limit (joshuafolkken/kit#4466). The stopped lane counts again while this
|
|
12
12
|
// supervisor waits, so the driver launches nothing into the place it waits for. An unreadable limit or
|
|
13
13
|
// lane count relaunches at once, and so does a place that does not free within the wait.
|
|
14
14
|
//
|
|
15
|
+
// **One relaunch may run a lane past the limit**: a followup relaunch is a few minutes' work on a lane
|
|
16
|
+
// about to merge, so it does not queue behind a fresh lane's whole run (joshuafolkken/kit#5172). The
|
|
17
|
+
// waiter counts in the lane use, so the lanes it sees at the limit plus one include itself, and a second
|
|
18
|
+
// waiter sees the first one's lane over that and waits.
|
|
19
|
+
//
|
|
15
20
|
// **Waiters queue in issue order rather than block each other**: every waiter counts in the lane use,
|
|
16
21
|
// so three of them past a limit of two would each see the lanes full and wait out the hour together. A
|
|
17
22
|
// waiter leaves out the waiters behind it, so the first ones that fit relaunch and the rest wait on them.
|
|
@@ -21,6 +26,8 @@ import { run_ship_stage, type Stage } from './run-ship-stage'
|
|
|
21
26
|
// An hour of lane counts, half a minute apart: about two lanes' median run (`lane:stats`).
|
|
22
27
|
const PLACE_POLL_MS = 30_000
|
|
23
28
|
const PLACE_POLLS = 120
|
|
29
|
+
// The one relaunch allowed past the lane limit.
|
|
30
|
+
const RELAUNCH_OVERSHOOT = 1
|
|
24
31
|
|
|
25
32
|
function is_behind(lane: LaneInfo, issue: string): boolean {
|
|
26
33
|
return lane.issue.localeCompare(issue, undefined, { numeric: true }) > 0
|
|
@@ -42,7 +49,7 @@ async function is_over_limit(issue: string): Promise<boolean> {
|
|
|
42
49
|
const use = await backlog_ready.lane_use()
|
|
43
50
|
const behind = await waiters_behind(issue)
|
|
44
51
|
|
|
45
|
-
return use.occupied - behind > lane_capacity.seated_limit(limit.limit)
|
|
52
|
+
return use.occupied - behind > lane_capacity.seated_limit(limit.limit) + RELAUNCH_OVERSHOOT
|
|
46
53
|
}
|
|
47
54
|
|
|
48
55
|
async function is_place_taken(issue: string): Promise<boolean> {
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { changed_paths } from '#scripts/git/changed-paths'
|
|
3
|
+
import { git_branch } from '#scripts/git/git-branch'
|
|
4
|
+
import { git_issue } from '#scripts/git/git-issue'
|
|
5
|
+
import { lane_plan, type LanePlan } from '#scripts/lane/lane-plan'
|
|
6
|
+
import { test_declared_logic } from '#scripts/test/test-declared-logic'
|
|
7
|
+
|
|
8
|
+
// `josh ship`'s `planned` precondition (joshuafolkken/kit#5152): the branch's code files that the
|
|
9
|
+
// lane's `lane:plan` record never listed. Nothing else compares a lane's edits with its plan, so an
|
|
10
|
+
// out-of-scope fix landed with no one noticing (joshuafolkken/kit#5122). Tests, documents and data
|
|
11
|
+
// files (a `cspell.config.yaml` term, a lock file) never count, and a branch with no plan record, or a
|
|
12
|
+
// yielded one — a `fullrun` a person drove — passes as before.
|
|
13
|
+
|
|
14
|
+
// The precondition's name in the preflight's answer and in a `stop` record's `preconditions`.
|
|
15
|
+
const PRECONDITION = 'unplanned'
|
|
16
|
+
const SEPARATOR = '/'
|
|
17
|
+
const NON_CODE_PREFIXES = ['docs/', '.josh/']
|
|
18
|
+
const CODE_EXTENSIONS = new Set(['.cjs', '.js', '.mjs', '.sh', '.svelte', '.ts'])
|
|
19
|
+
|
|
20
|
+
// A claim ending in `/` is a directory and holds every path under it — `backlog_overlap`'s reading.
|
|
21
|
+
function is_planned(claims: ReadonlyArray<string>, file: string): boolean {
|
|
22
|
+
return claims.some((claim) =>
|
|
23
|
+
claim.endsWith(SEPARATOR) ? file.startsWith(claim) : claim === file,
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function is_code(file: string): boolean {
|
|
28
|
+
return (
|
|
29
|
+
CODE_EXTENSIONS.has(path.extname(file)) &&
|
|
30
|
+
NON_CODE_PREFIXES.every((prefix) => !file.startsWith(prefix))
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// The code files of `changed` that `claims` does not hold.
|
|
35
|
+
function unplanned_of(
|
|
36
|
+
claims: ReadonlyArray<string>,
|
|
37
|
+
changed: ReadonlyArray<string>,
|
|
38
|
+
): Array<string> {
|
|
39
|
+
return test_declared_logic
|
|
40
|
+
.runtime_files(changed)
|
|
41
|
+
.filter((file) => is_code(file) && !is_planned(claims, file))
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// The two ways out, each named with its command: the re-run replaces the record, so it lists the
|
|
45
|
+
// planned paths as well as the new ones.
|
|
46
|
+
function problem_text(
|
|
47
|
+
issue: string,
|
|
48
|
+
claims: ReadonlyArray<string>,
|
|
49
|
+
files: ReadonlyArray<string>,
|
|
50
|
+
): string {
|
|
51
|
+
const replan = ['pnpm josh lane:plan', issue, ...claims, ...files].join(' ')
|
|
52
|
+
|
|
53
|
+
return `unplanned: ${files.join(', ')} — the lane's lane:plan record does not list these code files. In scope: run \`${replan}\` and comment the reason on the Issue in one line, then re-detach; if it answers \`yield\`, another lane holds the file — follow what it prints instead. Out of scope: revert the change and file it with \`pnpm josh issue:file\`.`
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// A yielded plan outlives its lane on purpose (`lane-plan.ts`) and cleared no edit, so it reads as none.
|
|
57
|
+
function held_claims(plan: LanePlan | undefined): ReadonlyArray<string> | undefined {
|
|
58
|
+
return plan?.yielded === true ? undefined : plan?.paths
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// The branch's unplanned code files and the text naming the two ways out, `undefined` where none is —
|
|
62
|
+
// read by the ship's preflight and, ahead of it, by `josh check:related` (joshuafolkken/kit#5203).
|
|
63
|
+
interface Unplanned {
|
|
64
|
+
issue: number
|
|
65
|
+
files: ReadonlyArray<string>
|
|
66
|
+
text: string
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async function unplanned(): Promise<Unplanned | undefined> {
|
|
70
|
+
const issue = git_issue.branch_number(await git_branch.current())
|
|
71
|
+
|
|
72
|
+
if (issue === undefined) return undefined
|
|
73
|
+
const claims = held_claims(lane_plan.read(Number(issue), process.cwd()))
|
|
74
|
+
|
|
75
|
+
if (claims === undefined) return undefined
|
|
76
|
+
const files = unplanned_of(claims, await changed_paths.read_changed_paths(false))
|
|
77
|
+
|
|
78
|
+
if (files.length === 0) return undefined
|
|
79
|
+
|
|
80
|
+
return { issue: Number(issue), files, text: problem_text(issue, claims, files) }
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function problems(): Promise<Array<string>> {
|
|
84
|
+
const found = await unplanned()
|
|
85
|
+
|
|
86
|
+
return found === undefined ? [] : [found.text]
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const run_ship_planned = { PRECONDITION, problems, unplanned, unplanned_of }
|
|
90
|
+
|
|
91
|
+
export { run_ship_planned }
|
|
92
|
+
export type { Unplanned }
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto'
|
|
2
|
+
import { check_reuse } from '#scripts/gate/check-reuse'
|
|
3
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
4
|
+
import type { JoshResult } from '#scripts/josh/josh-run'
|
|
5
|
+
import { buffered_process } from '#scripts/lib/buffered-process'
|
|
6
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
7
|
+
import { review_round_reuse } from '#scripts/review/review-round-reuse'
|
|
8
|
+
import { run_review_pinned } from '#scripts/run/review/run-review-pinned'
|
|
9
|
+
import { run_review_pinned_accepted } from '#scripts/run/review/run-review-pinned-accepted'
|
|
10
|
+
import { run_review_pinned_join } from '#scripts/run/review/run-review-pinned-join'
|
|
11
|
+
import { run_review_pinned_steps } from '#scripts/run/review/run-review-pinned-steps'
|
|
12
|
+
import { run_review_pinned_tree } from '#scripts/run/review/run-review-pinned-tree'
|
|
13
|
+
import { test_pinned } from '#scripts/test/test-pinned'
|
|
14
|
+
import { test_pinned_logic } from '#scripts/test/test-pinned-logic'
|
|
15
|
+
import { test_pinned_record, type PinnedSummary } from '#scripts/test/test-pinned-record'
|
|
16
|
+
import { run_ship_pre_detach, type PreDetachResult } from './run-ship-pre-detach'
|
|
17
|
+
import type { ShipArguments } from './run-ship-steps'
|
|
18
|
+
|
|
19
|
+
// `josh test:pinned` among the pre-detach checks of a `josh ship --review` (joshuafolkken/kit#4785). The
|
|
20
|
+
// child's `run:review` checked the tree it saw; a round-1 fix made after it reached no `test:pinned`
|
|
21
|
+
// until the supervisor's review stage stopped on it, after the detach. Here it stops in the
|
|
22
|
+
// foreground, with the text and the `--unpinned-ok` judgment `run:review --join` uses
|
|
23
|
+
// (`run-review-pinned.ts`).
|
|
24
|
+
//
|
|
25
|
+
// **On the tree `run:review` checked it runs no `test:pinned`**: it reads that background check's
|
|
26
|
+
// answer (`run-review-pinned-join.ts`). On another tree it waits that check out, so its verdicts
|
|
27
|
+
// reach the cache (joshuafolkken/kit#4895), then runs its own as a `josh` command, so it reserves its
|
|
28
|
+
// own cores (`DIRECT_UNIT_CLAIM`) beside the other checks, and it probes only the hunks whose stored
|
|
29
|
+
// verdict the per-checkout cache no longer holds (`test-pinned-cache-logic.ts`). Its answer comes
|
|
30
|
+
// back through the record `--record` leaves (`test-pinned-record.ts`). Under
|
|
31
|
+
// `--unpinned-ok "<reason>"` — given, or carried from this branch's record (`with_recorded_reason`) —
|
|
32
|
+
// it runs only when the supervisor reuses round 1 (`pinned_check`).
|
|
33
|
+
// Without `--review` nothing after the detach asks `test:pinned`, and `--unpinned-ok` is refused there
|
|
34
|
+
// (`run-ship-args.ts`), so the check is not asked.
|
|
35
|
+
|
|
36
|
+
const SUCCESS_EXIT_CODE = 0
|
|
37
|
+
const FAILURE_EXIT_CODE = 1
|
|
38
|
+
const SKIPPED_NOTE =
|
|
39
|
+
'test:pinned not run before the detach; round 1 lists the unpinned places under --unpinned-ok: '
|
|
40
|
+
const CARRIED_NOTE = 'josh ship: --unpinned-ok carried from an earlier run on this branch: '
|
|
41
|
+
|
|
42
|
+
type CheckOptions = Pick<ShipArguments, 'number' | 'unpinned_ok'>
|
|
43
|
+
type PinnedOptions = CheckOptions & Pick<ShipArguments, 'is_review'>
|
|
44
|
+
|
|
45
|
+
// A check that left no answer could not run, and fails open as the one `run:review` launches does.
|
|
46
|
+
// Its arguments follow the reason (`test_pinned_record.launch_argv`).
|
|
47
|
+
async function own_summary(reason: string | undefined): Promise<PinnedSummary> {
|
|
48
|
+
const token = randomUUID()
|
|
49
|
+
const argv = ['josh', ...test_pinned_record.launch_argv(token, reason, 'pre-detach')]
|
|
50
|
+
const result = await buffered_process.run_buffered_process(argv)
|
|
51
|
+
const answer = test_pinned_record.read(token)
|
|
52
|
+
|
|
53
|
+
test_pinned_record.clear(token)
|
|
54
|
+
|
|
55
|
+
return answer ?? test_pinned_record.not_run_summary(result.output)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function remaining_note(remaining: number | undefined): string {
|
|
59
|
+
const hunks =
|
|
60
|
+
remaining === undefined ? 'the remaining hunks' : `${String(remaining)} remaining hunks`
|
|
61
|
+
|
|
62
|
+
return `test:pinned: probing ${hunks} in the background — the next ship's pre-detach reads their verdicts\n`
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// **A stop at the first unpinned hunk leaves the rest probing in the background**
|
|
66
|
+
// (joshuafolkken/kit#5327): the ship still stops on it, and the next pre-detach joins that probe on
|
|
67
|
+
// this tree, or waits it out on a fixed one so its verdicts reach the cache and only the hunks the fix
|
|
68
|
+
// moved are probed again. A launch that failed or threw adds no note, and never fails the check.
|
|
69
|
+
async function is_rest_launched(): Promise<boolean> {
|
|
70
|
+
try {
|
|
71
|
+
const tree = await run_review_pinned_tree.key()
|
|
72
|
+
|
|
73
|
+
run_review_pinned_steps.clear()
|
|
74
|
+
|
|
75
|
+
return run_review_pinned_steps.launch_remaining(PROJECT_ROOT, tree).kind === 'launched'
|
|
76
|
+
} catch (error) {
|
|
77
|
+
error_text.trace_swallowed('run_ship_pre_detach_pinned.is_rest_launched', error)
|
|
78
|
+
|
|
79
|
+
return false
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async function continued(answer: PinnedSummary): Promise<PinnedSummary> {
|
|
84
|
+
if (answer.is_cut !== true || !(await is_rest_launched())) return answer
|
|
85
|
+
|
|
86
|
+
return { ...answer, text: `${answer.text}${remaining_note(answer.remaining)}` }
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// **The tree `run:review` checked is not checked twice** (joshuafolkken/kit#4888): its background
|
|
90
|
+
// check's answer is read, waited for while it still runs; only another tree, or a check that left no
|
|
91
|
+
// answer, runs one here. **A reason never judges a check that stopped at its first unpinned hunk**
|
|
92
|
+
// (joshuafolkken/kit#5153): the hunks it left are probed here before the reason accepts the list.
|
|
93
|
+
async function summary(reason: string | undefined): Promise<PinnedSummary> {
|
|
94
|
+
const answer = await run_review_pinned_join.answer_on_tree()
|
|
95
|
+
const is_whole = answer?.is_cut !== true || reason === undefined
|
|
96
|
+
|
|
97
|
+
return await continued(answer !== undefined && is_whole ? answer : await own_summary(reason))
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// The verdicts an earlier probe left for this very tree, read from the cache without a probe
|
|
101
|
+
// (joshuafolkken/kit#5078); `undefined` when a hunk moved since, or the tree could not be read.
|
|
102
|
+
async function held_summary(): Promise<PinnedSummary | undefined> {
|
|
103
|
+
try {
|
|
104
|
+
const report = await test_pinned.held_report(test_pinned_logic.DEFAULT_MAX_HUNKS)
|
|
105
|
+
|
|
106
|
+
return report === undefined ? undefined : test_pinned_record.summary_of(report)
|
|
107
|
+
} catch (error) {
|
|
108
|
+
error_text.trace_swallowed('run_ship_pre_detach_pinned.held_summary', error)
|
|
109
|
+
|
|
110
|
+
return undefined
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// **A re-ship with a new reason probes nothing the cache already answers** (joshuafolkken/kit#5078):
|
|
115
|
+
// the earlier probe's verdicts are judged under the reason, with no wait on a check elsewhere. A moved
|
|
116
|
+
// hunk falls to `summary`, whose run probes only the hunks the cache no longer holds.
|
|
117
|
+
async function summary_for(reason: string | undefined): Promise<PinnedSummary> {
|
|
118
|
+
const held = reason === undefined ? undefined : await held_summary()
|
|
119
|
+
|
|
120
|
+
return held ?? (await summary(reason))
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Whether the supervisor runs a fresh round 1, whose `run:review --join` lists and records the unpinned
|
|
124
|
+
// places under the reason. A reused round 1 — its delta left to round 2, or after the ship's own
|
|
125
|
+
// round 1 stopped, the lane's fix included — runs no `test:pinned` (`review-round-reuse.ts`). A question git could not answer probes.
|
|
126
|
+
async function is_listed_after_detach(number: string): Promise<boolean> {
|
|
127
|
+
try {
|
|
128
|
+
return !(await review_round_reuse.is_reusable_here(Number(number)))
|
|
129
|
+
} catch (error) {
|
|
130
|
+
error_text.trace_swallowed('run_ship_pre_detach_pinned.is_listed_after_detach', error)
|
|
131
|
+
|
|
132
|
+
return false
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// **A reason accepts any answer, so no probe is waited on** (joshuafolkken/kit#4833) when a fresh
|
|
137
|
+
// round 1 lists the places after the detach.
|
|
138
|
+
async function pinned_check(options: CheckOptions): Promise<JoshResult> {
|
|
139
|
+
const reason = run_review_pinned.ok_reason_of(options.unpinned_ok)
|
|
140
|
+
|
|
141
|
+
if (reason !== undefined && (await is_listed_after_detach(options.number))) {
|
|
142
|
+
return { code: SUCCESS_EXIT_CODE, out: `${SKIPPED_NOTE}${reason}\n` }
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const verdict = await run_review_pinned_accepted.judge(await summary_for(reason), reason)
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
code: verdict.kind === 'stop' ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE,
|
|
149
|
+
out: verdict.text,
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// **A ship with no `--review` reads no background probe, so it stops the one left running**
|
|
154
|
+
// (joshuafolkken/kit#5327) rather than leave it holding cores unread. A clear that throws never fails
|
|
155
|
+
// the ship.
|
|
156
|
+
function cleared(): void {
|
|
157
|
+
try {
|
|
158
|
+
run_review_pinned_steps.clear()
|
|
159
|
+
} catch (error) {
|
|
160
|
+
error_text.trace_swallowed('run_ship_pre_detach_pinned.cleared', error)
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// The pre-detach checks this ship runs, `test:pinned` among them under `--review`.
|
|
165
|
+
function checks_for(options: PinnedOptions): () => Promise<PreDetachResult> {
|
|
166
|
+
if (!options.is_review) {
|
|
167
|
+
return async () => {
|
|
168
|
+
cleared()
|
|
169
|
+
|
|
170
|
+
return await run_ship_pre_detach.checks()
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return async () =>
|
|
175
|
+
await run_ship_pre_detach.checks(process.cwd(), check_reuse.DEFAULT_RECORDS, async () => {
|
|
176
|
+
return await pinned_check(options)
|
|
177
|
+
})
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// **A reason an earlier run on this branch accepted is this ship's `--unpinned-ok`** when it gives
|
|
181
|
+
// none (joshuafolkken/kit#4974): the pre-detach check skips its probe under it, and the supervisor's
|
|
182
|
+
// round 1 and its relaunch carry it, so a place the record lacks is listed and recorded after the
|
|
183
|
+
// detach rather than stopping the ship there.
|
|
184
|
+
async function with_recorded_reason(args: ShipArguments): Promise<ShipArguments> {
|
|
185
|
+
if (!args.is_review || args.unpinned_ok.length > 0) return args
|
|
186
|
+
|
|
187
|
+
const reason = await run_review_pinned_accepted.recorded_reason()
|
|
188
|
+
|
|
189
|
+
if (reason === undefined) return args
|
|
190
|
+
console.info(`${CARRIED_NOTE}${reason}`)
|
|
191
|
+
|
|
192
|
+
return { ...args, unpinned_ok: [run_review_pinned.UNPINNED_OK_FLAG, reason] }
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const run_ship_pre_detach_pinned = { checks_for, pinned_check, with_recorded_reason }
|
|
196
|
+
|
|
197
|
+
export { run_ship_pre_detach_pinned }
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { lane_ledger } from '#scripts/lane/lane-ledger'
|
|
1
|
+
import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
|
|
3
2
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
4
3
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
5
|
-
import { run_ship_pre_detach } from './run-ship-pre-detach'
|
|
4
|
+
import { run_ship_pre_detach, type PreDetachResult } from './run-ship-pre-detach'
|
|
6
5
|
import { run_ship_stage, type Phase } from './run-ship-stage'
|
|
7
6
|
|
|
8
7
|
// The pre-detach checks, timed into the lane ledger and marked on the event stream as a ship stage
|
|
@@ -14,22 +13,22 @@ const SUCCESS_EXIT_CODE = 0
|
|
|
14
13
|
const { PHASE } = run_ship_stage
|
|
15
14
|
|
|
16
15
|
async function emit_phase(issue: string, phase: Phase): Promise<void> {
|
|
17
|
-
const text = run_ship_stage.event_text(issue,
|
|
16
|
+
const text = run_ship_stage.event_text(issue, lane_ledger_write.PRE_DETACH_STAGE, phase)
|
|
18
17
|
|
|
19
18
|
await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.SHIP_STAGE, text)
|
|
20
19
|
}
|
|
21
20
|
|
|
22
21
|
async function checks(
|
|
23
22
|
issue: string,
|
|
24
|
-
run: () => Promise<
|
|
25
|
-
): Promise<
|
|
23
|
+
run: () => Promise<PreDetachResult> = run_ship_pre_detach.checks,
|
|
24
|
+
): Promise<PreDetachResult> {
|
|
26
25
|
await emit_phase(issue, PHASE.START)
|
|
27
26
|
const started_ms = performance.now()
|
|
28
27
|
const result = await run()
|
|
29
28
|
const elapsed_ms = performance.now() - started_ms
|
|
30
29
|
|
|
31
|
-
await
|
|
32
|
-
stage:
|
|
30
|
+
await lane_ledger_write.record_stage({
|
|
31
|
+
stage: lane_ledger_write.PRE_DETACH_STAGE,
|
|
33
32
|
elapsed_ms,
|
|
34
33
|
issue: Number(issue),
|
|
35
34
|
})
|