@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,20 +1,24 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { check_reuse, type CheckRecords } from '#scripts/gate/check-reuse'
|
|
4
|
-
import {
|
|
4
|
+
import { gate_labels } from '#scripts/gate/gate-labels'
|
|
5
5
|
import type { GateStepResult } from '#scripts/gate/gate-report'
|
|
6
6
|
import { gate_tree } from '#scripts/gate/gate-tree'
|
|
7
|
+
import { metrics_totals } from '#scripts/gate/metrics-totals'
|
|
7
8
|
import { project_checks } from '#scripts/gate/project-checks'
|
|
9
|
+
import { structural_checks } from '#scripts/gate/structural-checks'
|
|
8
10
|
import { type_check_step } from '#scripts/gate/type-check-step'
|
|
9
11
|
import type { JoshResult } from '#scripts/josh/josh-run'
|
|
12
|
+
import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
|
|
10
13
|
import { buffered_process, type BufferedProcessResult } from '#scripts/lib/buffered-process'
|
|
11
14
|
|
|
12
15
|
// The fast checks a detached `josh ship` runs in the agent's own turn, after the preflight (whatever it
|
|
13
|
-
// answered) and before the hand-off:a type error in a file the related-only checks never touched, an export nothing reads,
|
|
16
|
+
// answered) and before the hand-off: a type error in a file the related-only checks never touched, an export nothing reads,
|
|
14
17
|
// an unknown word, or a guard test (a SKILL.md pointer, a byte budget, the command list, a source with
|
|
15
18
|
// no colocated test, a bare issue citation) that only the full suite runs, would otherwise first
|
|
16
19
|
// surface after the detach and cost a relaunched session. They answer in seconds, so the same session
|
|
17
|
-
// fixes what they find and ships again.
|
|
20
|
+
// fixes what they find and ships again. A `--review` ship adds `test:pinned`, which probes the hunks
|
|
21
|
+
// its verdict cache does not hold (`run-ship-pre-detach-pinned.ts`).
|
|
18
22
|
//
|
|
19
23
|
// **Nothing moves out of the gate, and the gate reuses what these already answered**: a check that is
|
|
20
24
|
// the gate's own check passed silently here is recorded with the gate's per-check record
|
|
@@ -33,7 +37,10 @@ import { buffered_process, type BufferedProcessResult } from '#scripts/lib/buffe
|
|
|
33
37
|
// present run, and a consumer meets the static checks alone.
|
|
34
38
|
//
|
|
35
39
|
// In kit the metrics ratchet's totals join them: a feature grows a total almost every time, and here
|
|
36
|
-
// the session that grew the total writes the reason itself rather than a relaunched one
|
|
40
|
+
// the session that grew the total writes the reason itself rather than a relaunched one —
|
|
41
|
+
// `josh lint:related` has already reported the growth in the loop (`metrics-totals.ts`), so this is
|
|
42
|
+
// the stop for a growth that notice did not settle. A total the branch's approval already names is
|
|
43
|
+
// re-recorded at its growth here rather than stopped (`--rerecord`, joshuafolkken/kit#4716). The
|
|
37
44
|
// durations are left out: they read the gate ledger, stale before the detach, so they stay with the
|
|
38
45
|
// supervised gate.
|
|
39
46
|
|
|
@@ -53,9 +60,10 @@ const SUCCESS_EXIT_CODE = 0
|
|
|
53
60
|
const FAILURE_EXIT_CODE = 1
|
|
54
61
|
const SECTION_SEPARATOR = '\n\n'
|
|
55
62
|
const PASSED = 'pre-detach checks passed'
|
|
56
|
-
const
|
|
63
|
+
const UNPINNED = 'unpinned'
|
|
64
|
+
const { METRICS_RERECORD_COMMAND } = metrics_totals
|
|
57
65
|
const STATIC_CHECKS: ReadonlyArray<PreDetachCheck> = [
|
|
58
|
-
{ list: ['josh', 'exports:unused'], label:
|
|
66
|
+
{ list: ['josh', 'exports:unused'], label: gate_labels.EXPORTS_LABEL },
|
|
59
67
|
{ list: ['josh', 'cspell:dot'] },
|
|
60
68
|
]
|
|
61
69
|
const GUARD_TEST_TARGETS: ReadonlyArray<string> = [
|
|
@@ -63,13 +71,10 @@ const GUARD_TEST_TARGETS: ReadonlyArray<string> = [
|
|
|
63
71
|
'scripts/claude',
|
|
64
72
|
'scripts/rules',
|
|
65
73
|
'scripts/josh/josh-command-map.test.ts',
|
|
66
|
-
|
|
67
|
-
'tools/test/untested-sources.test.ts',
|
|
74
|
+
...structural_checks.STRUCTURAL_GUARD_TARGETS,
|
|
68
75
|
'tools/test/pure-files.test.ts',
|
|
69
76
|
]
|
|
70
|
-
|
|
71
|
-
// `scripts/claude` of shell helpers, say — and a filter that matches nothing would stop every ship.
|
|
72
|
-
const GUARD_TEST_COMMAND: ReadonlyArray<string> = ['josh', 'test:unit', '--passWithNoTests']
|
|
77
|
+
const { GUARD_TEST_COMMAND, failure_prefix, failure_section } = structural_checks
|
|
73
78
|
|
|
74
79
|
function present_targets(directory: string): ReadonlyArray<string> {
|
|
75
80
|
return GUARD_TEST_TARGETS.filter((target) => existsSync(path.join(directory, target)))
|
|
@@ -83,17 +88,16 @@ function guard_tests(directory: string): Array<PreDetachCheck> {
|
|
|
83
88
|
|
|
84
89
|
// The same kit-only rule as the gate's `is_kit_only` step: a consumer's kit has no `josh metrics`.
|
|
85
90
|
function kit_only(directory: string): Array<PreDetachCheck> {
|
|
86
|
-
return project_checks.is_kit_repository(directory) ? [{ list:
|
|
91
|
+
return project_checks.is_kit_repository(directory) ? [{ list: METRICS_RERECORD_COMMAND }] : []
|
|
87
92
|
}
|
|
88
93
|
|
|
89
94
|
async function command_lists(directory: string): Promise<Array<PreDetachCheck>> {
|
|
90
95
|
const type_check = await type_check_step.resolve_type_check_args(directory)
|
|
91
96
|
|
|
92
97
|
return [
|
|
93
|
-
{ list: type_check, label:
|
|
98
|
+
{ list: type_check, label: gate_labels.TYPE_CHECK_LABEL },
|
|
94
99
|
...STATIC_CHECKS,
|
|
95
100
|
...guard_tests(directory),
|
|
96
|
-
...kit_only(directory),
|
|
97
101
|
]
|
|
98
102
|
}
|
|
99
103
|
|
|
@@ -120,38 +124,88 @@ function gate_results(runs: ReadonlyArray<PreDetachRun>): Array<GateStepResult>
|
|
|
120
124
|
})
|
|
121
125
|
}
|
|
122
126
|
|
|
123
|
-
function verdict(
|
|
124
|
-
const failed =
|
|
127
|
+
function verdict(runs: ReadonlyArray<PreDetachRun>): JoshResult {
|
|
128
|
+
const failed = runs.filter(({ result }) => buffered_process.is_process_failed(result))
|
|
125
129
|
|
|
126
130
|
if (failed.length === 0) return { code: SUCCESS_EXIT_CODE, out: PASSED }
|
|
127
131
|
|
|
128
132
|
return {
|
|
129
133
|
code: FAILURE_EXIT_CODE,
|
|
130
|
-
out: failed
|
|
134
|
+
out: failed
|
|
135
|
+
.map(({ check, result }) => failure_section(check.list, result))
|
|
136
|
+
.join(SECTION_SEPARATOR),
|
|
131
137
|
}
|
|
132
138
|
}
|
|
133
139
|
|
|
140
|
+
// The `test:pinned` check a `--review` ship adds (`run-ship-pre-detach-pinned.ts`); none is asked by default.
|
|
141
|
+
type PinnedCheck = () => Promise<JoshResult>
|
|
142
|
+
|
|
143
|
+
async function not_asked(): Promise<JoshResult> {
|
|
144
|
+
return { code: SUCCESS_EXIT_CODE, out: PASSED }
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// The checks' answer, with the kinds a `stop` record names its red by: `pre-detach` for the static
|
|
148
|
+
// checks, `unpinned` for `test:pinned`, so `lane:stats` tells an unpinned stop apart
|
|
149
|
+
// (joshuafolkken/kit#5228).
|
|
150
|
+
interface PreDetachResult extends JoshResult {
|
|
151
|
+
preconditions?: ReadonlyArray<string>
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function joined(result: JoshResult, pinned: JoshResult): JoshResult {
|
|
155
|
+
if (pinned.code === SUCCESS_EXIT_CODE) return result
|
|
156
|
+
if (result.code === SUCCESS_EXIT_CODE) return pinned
|
|
157
|
+
|
|
158
|
+
return { code: FAILURE_EXIT_CODE, out: [result.out, pinned.out].join(SECTION_SEPARATOR) }
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function red_kinds(result: JoshResult, pinned: JoshResult): ReadonlyArray<string> {
|
|
162
|
+
return [
|
|
163
|
+
...(result.code === SUCCESS_EXIT_CODE ? [] : [lane_ledger_write.PRE_DETACH_STAGE]),
|
|
164
|
+
...(pinned.code === SUCCESS_EXIT_CODE ? [] : [UNPINNED]),
|
|
165
|
+
]
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// The pinned check's stop joins the others' rather than hiding them.
|
|
169
|
+
function with_pinned(result: JoshResult, pinned: JoshResult): PreDetachResult {
|
|
170
|
+
const preconditions = red_kinds(result, pinned)
|
|
171
|
+
const answer = joined(result, pinned)
|
|
172
|
+
|
|
173
|
+
return preconditions.length === 0 ? answer : { ...answer, preconditions }
|
|
174
|
+
}
|
|
175
|
+
|
|
134
176
|
// All run at once, buffered, and every failure is reported, so one ship shows all there is to fix.
|
|
135
|
-
// The tree is read before they start, so a record is written only for the tree they read.
|
|
177
|
+
// The tree is read before they start, so a record is written only for the tree they read. **The
|
|
178
|
+
// metrics totals run first, alone**: they may re-record the branch's approval file
|
|
179
|
+
// (`metrics-command.ts`), and a file written under the others would move the tree and leave the gate
|
|
180
|
+
// nothing to reuse (joshuafolkken/kit#4716).
|
|
136
181
|
async function checks(
|
|
137
182
|
directory: string = process.cwd(),
|
|
138
183
|
records: CheckRecords = check_reuse.DEFAULT_RECORDS,
|
|
139
|
-
|
|
184
|
+
pinned: PinnedCheck = not_asked,
|
|
185
|
+
): Promise<PreDetachResult> {
|
|
186
|
+
const metrics = await Promise.all(
|
|
187
|
+
kit_only(directory).map(async (check) => await run_in(directory, check)),
|
|
188
|
+
)
|
|
140
189
|
const [lists, tree] = await Promise.all([command_lists(directory), gate_tree.read_gate_tree()])
|
|
141
|
-
const runs = await Promise.all(
|
|
190
|
+
const [runs, pinned_result] = await Promise.all([
|
|
191
|
+
Promise.all(lists.map(async (check) => await run_in(directory, check))),
|
|
192
|
+
pinned(),
|
|
193
|
+
])
|
|
142
194
|
|
|
143
195
|
await check_reuse.record_green_checks(gate_results(runs), tree, records)
|
|
144
196
|
|
|
145
|
-
return verdict(runs
|
|
197
|
+
return with_pinned(verdict([...runs, ...metrics]), pinned_result)
|
|
146
198
|
}
|
|
147
199
|
|
|
148
200
|
const run_ship_pre_detach = {
|
|
149
201
|
GUARD_TEST_TARGETS,
|
|
150
|
-
|
|
202
|
+
METRICS_RERECORD_COMMAND,
|
|
151
203
|
PASSED,
|
|
152
204
|
STATIC_CHECKS,
|
|
205
|
+
UNPINNED,
|
|
153
206
|
checks,
|
|
207
|
+
failure_prefix,
|
|
154
208
|
}
|
|
155
209
|
|
|
156
|
-
export type { PreDetachCheck }
|
|
210
|
+
export type { PinnedCheck, PreDetachCheck, PreDetachResult }
|
|
157
211
|
export { run_ship_pre_detach }
|
|
@@ -13,7 +13,9 @@ import { acceptance_map_check } from '#scripts/review/acceptance-map-check'
|
|
|
13
13
|
import { live_evidence } from '#scripts/review/live-evidence'
|
|
14
14
|
import { removed_tests_check } from '#scripts/review/removed-tests-check'
|
|
15
15
|
import { run_ship_body_draft } from './run-ship-body-draft'
|
|
16
|
+
import { run_ship_lap } from './run-ship-lap'
|
|
16
17
|
import { run_ship_lock } from './run-ship-lock'
|
|
18
|
+
import { run_ship_planned } from './run-ship-planned'
|
|
17
19
|
import { run_ship_scoped } from './run-ship-scoped'
|
|
18
20
|
|
|
19
21
|
// `josh ship`'s first stage. The commit stage (`git -y`'s preflight) and the merge (`followup`'s
|
|
@@ -22,7 +24,8 @@ import { run_ship_scoped } from './run-ship-scoped'
|
|
|
22
24
|
// once.** No check is new: the classification, issue and branch answers
|
|
23
25
|
// are `git_preflight.problems_of`, and the evidence answer is `live_evidence.verdict_for` over the same
|
|
24
26
|
// changed paths and the body this ship will deliver — `--body-file` when given, else the ship body
|
|
25
|
-
// draft, else the open PR's.
|
|
27
|
+
// draft, else the open PR's. The `unplanned` answer is the branch's code files the lane's `lane:plan`
|
|
28
|
+
// record never listed (`run-ship-planned.ts`).
|
|
26
29
|
//
|
|
27
30
|
// The scoped pair runs last, met rather than stopped on (`run-ship-scoped.ts`), so the review and the
|
|
28
31
|
// gate start on a tree both checks are green on.
|
|
@@ -39,6 +42,7 @@ const PRECONDITION = {
|
|
|
39
42
|
REMOVED_TESTS: 'removed-tests',
|
|
40
43
|
LOCK: 'lock',
|
|
41
44
|
SCOPED: 'scoped',
|
|
45
|
+
UNPLANNED: run_ship_planned.PRECONDITION,
|
|
42
46
|
UNREADABLE: 'unreadable',
|
|
43
47
|
} as const
|
|
44
48
|
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}`
|
|
@@ -149,22 +153,30 @@ async function lock_problems(): Promise<Array<Unmet>> {
|
|
|
149
153
|
return of_kind(PRECONDITION.LOCK, await run_ship_lock.lock_problems())
|
|
150
154
|
}
|
|
151
155
|
|
|
156
|
+
async function planned_problems(): Promise<Array<Unmet>> {
|
|
157
|
+
return of_kind(PRECONDITION.UNPLANNED, await run_ship_planned.problems())
|
|
158
|
+
}
|
|
159
|
+
|
|
152
160
|
// The lock file is asked here too, so a drift stops the ship before the gate
|
|
153
161
|
// rather than being rewritten by the pre-push hook's install under the push.
|
|
154
162
|
async function asked_problems(request: PreflightRequest): Promise<Array<Unmet>> {
|
|
155
|
-
const [preflight, evidence, acceptance, removed, lock] = await Promise.all([
|
|
163
|
+
const [preflight, evidence, acceptance, removed, lock, planned] = await Promise.all([
|
|
156
164
|
caught(git_preflight.problems_of({ cli_input: request.title, will_open_pr: true })),
|
|
157
165
|
caught(evidence_problems(request.body_path)),
|
|
158
166
|
caught(acceptance_problems(request.body_path)),
|
|
159
167
|
caught(removed_test_problems(request.body_path)),
|
|
160
168
|
caught(lock_problems()),
|
|
169
|
+
caught(planned_problems()),
|
|
161
170
|
])
|
|
162
171
|
|
|
163
|
-
return [...preflight, ...evidence, ...acceptance, ...removed, ...lock]
|
|
172
|
+
return [...preflight, ...evidence, ...acceptance, ...removed, ...lock, ...planned]
|
|
164
173
|
}
|
|
165
174
|
|
|
166
175
|
async function stage(request: PreflightRequest): Promise<PreflightResult> {
|
|
167
|
-
const problems = await
|
|
176
|
+
const problems = await run_ship_lap.timed(
|
|
177
|
+
run_ship_lap.STEP.PRECONDITIONS,
|
|
178
|
+
async () => await asked_problems(request),
|
|
179
|
+
)
|
|
168
180
|
|
|
169
181
|
if (problems.length > 0) return refusal(problems)
|
|
170
182
|
|
|
@@ -1,7 +1,7 @@
|
|
|
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'
|
|
4
3
|
import { error_text } from '#scripts/lib/error-message'
|
|
4
|
+
import { review_round_reuse } from '#scripts/review/review-round-reuse'
|
|
5
5
|
import { run_hold } from '#scripts/run/hold/run-hold'
|
|
6
6
|
import { run_preflight } from '#scripts/run/run-preflight'
|
|
7
7
|
import { run_ship_stage, type ShipState } from './run-ship-stage'
|
|
@@ -31,8 +31,8 @@ async function or_false(is_true: () => Promise<boolean>): Promise<boolean> {
|
|
|
31
31
|
|
|
32
32
|
// A clean tree whose branch holds commits the default branch does not: the commit stage's output. A
|
|
33
33
|
// dirty tree is uncommitted work, whatever is already committed beneath it.
|
|
34
|
-
async function read_committed(): Promise<boolean> {
|
|
35
|
-
if (
|
|
34
|
+
async function read_committed(is_dirty: boolean): Promise<boolean> {
|
|
35
|
+
if (is_dirty) return false
|
|
36
36
|
|
|
37
37
|
const base = await git_command.default_branch_reference()
|
|
38
38
|
|
|
@@ -61,23 +61,31 @@ async function read_merged(branch_name: string): Promise<boolean> {
|
|
|
61
61
|
return (await git_command.commit_count_beyond(base, HEAD_REFERENCE)) === 0
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
//
|
|
65
|
-
// (joshuafolkken/kit#4221) — so the review stage re-runs instead of the followup failing again.
|
|
64
|
+
// A stale review re-runs the review stage instead of the followup failing again.
|
|
66
65
|
async function read_review_stale(): Promise<boolean> {
|
|
67
|
-
return await
|
|
66
|
+
return await review_round_reuse.is_stale_here()
|
|
68
67
|
}
|
|
69
68
|
|
|
70
69
|
const NOTHING_DONE: ShipState = { is_committed: false, is_pushed: false, is_merged: false }
|
|
71
70
|
|
|
72
71
|
async function read_branch_state(branch_name: string): Promise<ShipState> {
|
|
72
|
+
const is_dirty = await run_hold.is_tree_dirty()
|
|
73
73
|
const [is_committed, is_pushed, is_merged, is_review_stale] = await Promise.all([
|
|
74
|
-
or_false(read_committed),
|
|
74
|
+
or_false(async () => await read_committed(is_dirty)),
|
|
75
75
|
or_false(async () => await read_pushed(branch_name)),
|
|
76
76
|
or_false(async () => await read_merged(branch_name)),
|
|
77
77
|
read_review_stale(),
|
|
78
78
|
])
|
|
79
79
|
|
|
80
|
-
return { is_committed, is_pushed, is_merged, is_review_stale }
|
|
80
|
+
return { is_committed, is_pushed, is_merged, is_review_stale, is_dirty }
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Origin holds `HEAD` and nothing is left uncommitted: a line written to the tree now has no commit of
|
|
84
|
+
// the run's own to ride, so pushing it would restart the pull request's CI (joshuafolkken/kit#4907).
|
|
85
|
+
async function is_pushed_clean(): Promise<boolean> {
|
|
86
|
+
if (await run_hold.is_tree_dirty()) return false
|
|
87
|
+
|
|
88
|
+
return await or_false(async () => await read_pushed(await git_command.branch()))
|
|
81
89
|
}
|
|
82
90
|
|
|
83
91
|
// A branch that cannot be named leaves nothing to ask about, so it reads as nothing done.
|
|
@@ -109,6 +117,12 @@ async function record_target(issue: string): Promise<string | undefined> {
|
|
|
109
117
|
return repository === undefined ? undefined : run_ship_stage.record_path(repository, issue)
|
|
110
118
|
}
|
|
111
119
|
|
|
112
|
-
const run_ship_probe = {
|
|
120
|
+
const run_ship_probe = {
|
|
121
|
+
is_pushed_clean,
|
|
122
|
+
read_review_stale,
|
|
123
|
+
read_state,
|
|
124
|
+
record_target,
|
|
125
|
+
repository_directory,
|
|
126
|
+
}
|
|
113
127
|
|
|
114
128
|
export { run_ship_probe }
|
|
@@ -6,6 +6,8 @@ import { run_event_scope } from '#scripts/run/event/run-event-scope'
|
|
|
6
6
|
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
7
7
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
8
8
|
import { run_stalled } from '#scripts/run/park/run-stalled'
|
|
9
|
+
import { run_ship_stage } from './run-ship-stage'
|
|
10
|
+
import { run_ship_stop_text } from './run-ship-stop-text'
|
|
9
11
|
|
|
10
12
|
// How many times a stopped ship relaunches its lane child before the issue goes to a person. A child
|
|
11
13
|
// that keeps stopping — the same red check, a finding it cannot close — would otherwise relaunch
|
|
@@ -18,29 +20,56 @@ import { run_stalled } from '#scripts/run/park/run-stalled'
|
|
|
18
20
|
// The whole stream is read, not the run's carry scope: the count scopes itself by issue and dispatch,
|
|
19
21
|
// and a lane child shipping with no carry record (`lane:dispatch` outside a run, or a run already
|
|
20
22
|
// ended) would otherwise read no events and relaunch without a cap.
|
|
23
|
+
//
|
|
24
|
+
// **Each kind of stop has its own cap** (joshuafolkken/kit#4707): a review stop (round 1 or round 2)
|
|
25
|
+
// and a mechanical one (gate, sync, commit, followup, conflict) are counted apart, so the review's
|
|
26
|
+
// back-and-forth never spends the relaunches a red CI run needs. The kind is read off the stop's text
|
|
27
|
+
// (`run-ship-stop-text.ts`); a text with no stage reads as mechanical.
|
|
21
28
|
|
|
22
29
|
// One dispatch's own stops in the measured week reached five once and four or fewer otherwise, so four
|
|
23
30
|
// relaunches leave a ship that converges alone and stop the one that does not.
|
|
24
31
|
const MAX_SHIP_STOP_RELAUNCHES = 4
|
|
25
32
|
const PARK_CAUSE = 'ship-stop cap'
|
|
26
33
|
const { CHILD_LAUNCH, PARK, SHIP_STOP } = run_event_stream.EVENT_KIND
|
|
34
|
+
const STOP_KIND = { REVIEW: 'review', MECHANICAL: 'mechanical' } as const
|
|
35
|
+
const REVIEW_REASONS: ReadonlySet<string> = new Set([
|
|
36
|
+
run_ship_stage.STAGE.REVIEW,
|
|
37
|
+
run_ship_stage.STAGE.ROUND_TWO,
|
|
38
|
+
])
|
|
39
|
+
|
|
40
|
+
type StopKind = (typeof STOP_KIND)[keyof typeof STOP_KIND]
|
|
41
|
+
|
|
42
|
+
function kind_of(reason: string | undefined): StopKind {
|
|
43
|
+
return reason !== undefined && REVIEW_REASONS.has(reason)
|
|
44
|
+
? STOP_KIND.REVIEW
|
|
45
|
+
: STOP_KIND.MECHANICAL
|
|
46
|
+
}
|
|
27
47
|
|
|
28
|
-
function
|
|
48
|
+
function is_stop_of(event: RunEvent, kind: StopKind): boolean {
|
|
49
|
+
return event.kind === SHIP_STOP && kind_of(run_ship_stop_text.reason_of(event.text)) === kind
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function stops_since_dispatch(
|
|
53
|
+
events: ReadonlyArray<RunEvent>,
|
|
54
|
+
issue: string,
|
|
55
|
+
kind: StopKind,
|
|
56
|
+
): number {
|
|
29
57
|
const own = events.filter((event) => run_event_scope.issue_named(event) === issue)
|
|
30
58
|
const dispatched = own.findLastIndex((event) => event.kind === CHILD_LAUNCH)
|
|
31
59
|
|
|
32
|
-
return own.slice(dispatched + 1).filter((event) => event
|
|
60
|
+
return own.slice(dispatched + 1).filter((event) => is_stop_of(event, kind)).length
|
|
33
61
|
}
|
|
34
62
|
|
|
35
|
-
|
|
63
|
+
// `reason` is the current stop's; only the stops of its kind are counted.
|
|
64
|
+
async function is_over(issue: string, reason: string): Promise<boolean> {
|
|
36
65
|
const events = await run_event_stream_emit.all_events()
|
|
37
66
|
|
|
38
|
-
return stops_since_dispatch(events, issue) > MAX_SHIP_STOP_RELAUNCHES
|
|
67
|
+
return stops_since_dispatch(events, issue, kind_of(reason)) > MAX_SHIP_STOP_RELAUNCHES
|
|
39
68
|
}
|
|
40
69
|
|
|
41
70
|
function park_comment(issue: string, reason: string): string {
|
|
42
71
|
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.`,
|
|
72
|
+
`Parked by the \`josh ship\` supervisor: the ship stopped at \`${reason}\` after ${String(MAX_SHIP_STOP_RELAUNCHES)} relaunches of the lane child for ${kind_of(reason)} stops since its dispatch — the ${kind_of(reason)} stop cap was exceeded.`,
|
|
44
73
|
'',
|
|
45
74
|
`Read the stop with \`pnpm josh ship --log ${issue}\`, then ${run_stalled.next_step(issue)}.`,
|
|
46
75
|
].join('\n')
|
|
@@ -58,13 +87,20 @@ async function park(issue: string, reason: string): Promise<boolean> {
|
|
|
58
87
|
await run_event_stream_emit.emit(PARK, run_stalled.park_event(issue, PARK_CAUSE))
|
|
59
88
|
await telegram_notify.warn({
|
|
60
89
|
issue_title: `Ship stop cap reached ${cite}`,
|
|
61
|
-
body: `The lane child
|
|
90
|
+
body: `The lane child's ${kind_of(reason)} stops passed their cap of ${String(MAX_SHIP_STOP_RELAUNCHES)} relaunches since its dispatch, the last at ${reason}, so it was not relaunched and the issue is parked.`,
|
|
62
91
|
recovery: `Read pnpm josh ship --log ${issue}, then fix the cause and remove ${RUN_STALLED_LABEL} to offer it again.`,
|
|
63
92
|
})
|
|
64
93
|
|
|
65
94
|
return true
|
|
66
95
|
}
|
|
67
96
|
|
|
68
|
-
const run_ship_relaunch_cap = {
|
|
97
|
+
const run_ship_relaunch_cap = {
|
|
98
|
+
MAX_SHIP_STOP_RELAUNCHES,
|
|
99
|
+
STOP_KIND,
|
|
100
|
+
is_over,
|
|
101
|
+
kind_of,
|
|
102
|
+
park,
|
|
103
|
+
stops_since_dispatch,
|
|
104
|
+
}
|
|
69
105
|
|
|
70
106
|
export { run_ship_relaunch_cap }
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { detached_launch, type LaunchArgv } from '#scripts/run/detached-launch'
|
|
2
|
+
import { run_ship_detach } from './run-ship-detach'
|
|
3
|
+
|
|
4
|
+
// A supervisor's successor on new code (`run-ship-handover.ts`) is the same launch: it keeps the launch
|
|
5
|
+
// id, so every reader of the record — `ship:wait`, a lane's liveness, the overlap order by launch time —
|
|
6
|
+
// sees one ship throughout, and the successor's claim and result land on that record.
|
|
7
|
+
//
|
|
8
|
+
// **The record keeps naming this supervisor until the successor claims it**
|
|
9
|
+
// (`run_ship_detach.claim_identity`), so it is believed live throughout, and the successor's pid on it
|
|
10
|
+
// is the take-over's proof.
|
|
11
|
+
//
|
|
12
|
+
// **The successor is this very process's command line, re-invoked under the same runner**, as the wake
|
|
13
|
+
// supervisor re-invokes itself (`run-wake-session.ts`). Launched through `pnpm josh ship`, the spawned
|
|
14
|
+
// pid would be pnpm's while the claim names the node process under it, so no claim would ever match.
|
|
15
|
+
|
|
16
|
+
interface RelaunchRequest {
|
|
17
|
+
repository: string
|
|
18
|
+
number: string
|
|
19
|
+
cwd: string
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// The pid the ship record names.
|
|
23
|
+
function holder_pid(repository: string, number: string): number | undefined {
|
|
24
|
+
return run_ship_detach.read_record(repository, number)?.pid
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// The supervisor's own argv ends with its `"<title> #<N>"` title, which a lane's liveness pattern needs.
|
|
28
|
+
function successor_argv(): LaunchArgv {
|
|
29
|
+
return { command: process.execPath, args: [...process.execArgv, ...process.argv.slice(1)] }
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// The successor's pid, `undefined` where this process is no supervisor or none started.
|
|
33
|
+
function relaunch(request: RelaunchRequest): number | undefined {
|
|
34
|
+
const launch_id = process.env[run_ship_detach.LAUNCH_ID_KEY]
|
|
35
|
+
if (launch_id === undefined) return undefined
|
|
36
|
+
const result = detached_launch.launch(
|
|
37
|
+
{
|
|
38
|
+
argv: successor_argv(),
|
|
39
|
+
cwd: request.cwd,
|
|
40
|
+
log_path: run_ship_detach.log_path(request.repository, request.number),
|
|
41
|
+
env: run_ship_detach.supervisor_environment(launch_id),
|
|
42
|
+
},
|
|
43
|
+
console.error,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
return result.kind === 'launched' ? result.pid : undefined
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const run_ship_relaunch = { holder_pid, relaunch }
|
|
50
|
+
|
|
51
|
+
export { run_ship_relaunch }
|