@joshuafolkken/kit 1.1514.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/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/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- 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-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- 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 +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -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-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- 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 +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- 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 +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -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-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- 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 +85 -0
- 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/followup-review-gates.ts +81 -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 +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- 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 +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- 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/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- 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 +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- 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 +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- 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-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- 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 +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- 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 +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- 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 +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -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 +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- 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/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- 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-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -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-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -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 +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- 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-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- 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-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- 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-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- 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/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- 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/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -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 +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- 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-main.ts +12 -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-blobs.ts +221 -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 +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -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-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- 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 +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- 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 +54 -10
- 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-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- 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 +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-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 +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -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 +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- 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 +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- 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 +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/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-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -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 +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- 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 +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- 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 +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- 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 +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -3,6 +3,7 @@ import { setTimeout as sleep } from 'node:timers/promises'
|
|
|
3
3
|
import { agent_role_profile } from '#scripts/agent/agent-role-profile'
|
|
4
4
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
5
5
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
6
|
+
import { durable_state } from '#scripts/josh/durable-state'
|
|
6
7
|
import { process_identity } from '#scripts/josh/process-identity'
|
|
7
8
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
8
9
|
import { json_value } from '#scripts/lib/json-value'
|
|
@@ -33,7 +34,7 @@ import { z } from 'zod'
|
|
|
33
34
|
// probe cannot momentarily read is the opposite case: the pid is alive and was verified once, so it is
|
|
34
35
|
// kept running rather than read as a crash that would license a second supervisor.
|
|
35
36
|
|
|
36
|
-
const LOG_PREFIX =
|
|
37
|
+
const LOG_PREFIX = durable_state.PREFIX.SHIP_LOG
|
|
37
38
|
const PID_PREFIX = 'josh-ship-pid-'
|
|
38
39
|
const BODY_PREFIX = 'josh-ship-notify-'
|
|
39
40
|
const KEY_SEPARATOR = '-'
|
|
@@ -51,13 +52,14 @@ const SUPERVISED_VALUE = '1'
|
|
|
51
52
|
const LAUNCHED = 'launched'
|
|
52
53
|
const BUSY = 'busy'
|
|
53
54
|
const FAILED = 'failed'
|
|
54
|
-
const RESULT_PREFIX =
|
|
55
|
+
const RESULT_PREFIX = durable_state.PREFIX.SHIP_RESULT
|
|
55
56
|
const RECORD_POLL_MS = 25
|
|
56
57
|
const RECORD_WAIT_ATTEMPTS = 200
|
|
57
58
|
// How long a bare launched pid is believed before the supervisor must have claimed the record: far above
|
|
58
59
|
// a `pnpm josh ship` start-up, far below the lifetime a reused pid could otherwise be believed for.
|
|
59
60
|
const CLAIM_WINDOW_MS = 120_000
|
|
60
61
|
type ShipResult = 'running' | 'success' | 'failed' | 'abnormal'
|
|
62
|
+
type StartRead = (pid: number) => string | undefined
|
|
61
63
|
|
|
62
64
|
interface ShipRecord {
|
|
63
65
|
pid?: number | undefined
|
|
@@ -91,6 +93,7 @@ interface DetachRequest {
|
|
|
91
93
|
body: ReadonlyArray<string>
|
|
92
94
|
cites: ReadonlyArray<string>
|
|
93
95
|
is_review: boolean
|
|
96
|
+
unpinned_ok: ReadonlyArray<string>
|
|
94
97
|
repository: string
|
|
95
98
|
cwd: string
|
|
96
99
|
}
|
|
@@ -105,11 +108,11 @@ function key(prefix: string, request: Pick<DetachRequest, 'number' | 'repository
|
|
|
105
108
|
}
|
|
106
109
|
|
|
107
110
|
function log_path(repository: string, number: string): string {
|
|
108
|
-
return
|
|
111
|
+
return durable_state.path(`${LOG_PREFIX}${number}${KEY_SEPARATOR}`, repository, LOG_SUFFIX)
|
|
109
112
|
}
|
|
110
113
|
|
|
111
114
|
function result_path(repository: string, number: string): string {
|
|
112
|
-
return
|
|
115
|
+
return durable_state.path(`${RESULT_PREFIX}${number}${KEY_SEPARATOR}`, repository)
|
|
113
116
|
}
|
|
114
117
|
|
|
115
118
|
function read_record(repository: string, number: string): ShipRecord | undefined {
|
|
@@ -146,35 +149,43 @@ function is_within_claim_window(record: ShipRecord): boolean {
|
|
|
146
149
|
return record.launched_at !== undefined && Date.now() - record.launched_at < CLAIM_WINDOW_MS
|
|
147
150
|
}
|
|
148
151
|
|
|
149
|
-
function has_live_identity(pid: number, record: ShipRecord): boolean {
|
|
152
|
+
function has_live_identity(pid: number, record: ShipRecord, read: StartRead): boolean {
|
|
150
153
|
if (record.process_start === undefined) {
|
|
151
154
|
return is_within_claim_window(record) && process_identity.is_live_pid(pid)
|
|
152
155
|
}
|
|
153
156
|
|
|
154
|
-
return process_identity.is_same_process(pid, record.process_start) !== false
|
|
157
|
+
return process_identity.is_same_process(pid, record.process_start, read) !== false
|
|
155
158
|
}
|
|
156
159
|
|
|
157
|
-
function result_of(record: ShipRecord): ShipResult {
|
|
160
|
+
function result_of(record: ShipRecord, read: StartRead): ShipResult {
|
|
158
161
|
if (record.pid === undefined) {
|
|
159
|
-
const
|
|
162
|
+
const { launcher_pid, launcher_start } = record
|
|
163
|
+
const is_launcher = process_identity.is_same_process(launcher_pid, launcher_start, read)
|
|
160
164
|
|
|
161
165
|
return is_launcher === false ? 'abnormal' : 'running'
|
|
162
166
|
}
|
|
163
167
|
|
|
164
|
-
if (has_live_identity(record.pid, record)) return 'running'
|
|
168
|
+
if (has_live_identity(record.pid, record, read)) return 'running'
|
|
165
169
|
|
|
166
170
|
return record.result ?? 'abnormal'
|
|
167
171
|
}
|
|
168
172
|
|
|
173
|
+
// `read` answers each recorded process's start time: a reader holding one process snapshot passes its
|
|
174
|
+
// own, so the reading starts no `ps` (joshuafolkken/kit#4245).
|
|
169
175
|
function read_result(
|
|
170
176
|
repository: string,
|
|
171
177
|
number: string,
|
|
172
|
-
|
|
178
|
+
read: StartRead = process_identity.read_start,
|
|
179
|
+
): { launch_id: string; launched_at?: number | undefined; result: ShipResult } | undefined {
|
|
173
180
|
const record = read_record(repository, number)
|
|
174
181
|
|
|
175
182
|
return record === undefined
|
|
176
183
|
? undefined
|
|
177
|
-
: {
|
|
184
|
+
: {
|
|
185
|
+
launch_id: record.launch_id,
|
|
186
|
+
launched_at: record.launched_at,
|
|
187
|
+
result: result_of(record, read),
|
|
188
|
+
}
|
|
178
189
|
}
|
|
179
190
|
|
|
180
191
|
function current_record(repository: string, number: string): ShipRecord | undefined {
|
|
@@ -188,7 +199,9 @@ function current_record(repository: string, number: string): ShipRecord | undefi
|
|
|
188
199
|
function running_since(repository: string, number: string): number | undefined {
|
|
189
200
|
const record = read_record(repository, number)
|
|
190
201
|
|
|
191
|
-
return record !== undefined && result_of(record) === 'running'
|
|
202
|
+
return record !== undefined && result_of(record, process_identity.read_start) === 'running'
|
|
203
|
+
? record.launched_at
|
|
204
|
+
: undefined
|
|
192
205
|
}
|
|
193
206
|
|
|
194
207
|
function is_pending(record: ShipRecord | undefined): boolean {
|
|
@@ -266,6 +279,7 @@ function supervisor_argv(request: DetachRequest): LaunchArgv {
|
|
|
266
279
|
'josh',
|
|
267
280
|
'ship',
|
|
268
281
|
...review,
|
|
282
|
+
...request.unpinned_ok,
|
|
269
283
|
...notify_arguments(request),
|
|
270
284
|
...request.body,
|
|
271
285
|
...cites,
|
|
@@ -370,8 +384,11 @@ const run_ship_detach = {
|
|
|
370
384
|
last_launch,
|
|
371
385
|
log_path,
|
|
372
386
|
read_log,
|
|
387
|
+
read_record,
|
|
388
|
+
result_path,
|
|
373
389
|
running_since,
|
|
374
390
|
supervisor_argv,
|
|
391
|
+
supervisor_environment,
|
|
375
392
|
}
|
|
376
393
|
|
|
377
394
|
export type { DetachRequest, DetachResult }
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { fileURLToPath } from 'node:url'
|
|
2
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
3
|
+
import { process_identity } from '#scripts/josh/process-identity'
|
|
4
|
+
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
5
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
6
|
+
import { run_wake_code } from '#scripts/run/wake/run-wake-code'
|
|
7
|
+
import { run_wake_stop } from '#scripts/run/wake/run-wake-stop'
|
|
8
|
+
import { run_wake_takeover, type TakeoverPorts } from '#scripts/run/wake/run-wake-takeover'
|
|
9
|
+
import type { ShipSection } from './run-ship'
|
|
10
|
+
import { run_ship_detach } from './run-ship-detach'
|
|
11
|
+
import { run_ship_probe } from './run-ship-probe'
|
|
12
|
+
import { run_ship_relaunch } from './run-ship-relaunch'
|
|
13
|
+
import type { ShipArguments } from './run-ship-steps'
|
|
14
|
+
|
|
15
|
+
// A supervisor whose sync merged a change to its own code hands the ship to a successor on that code
|
|
16
|
+
// (joshuafolkken/kit#4849). The stages run in one process, so a review stage after a sync that pulled
|
|
17
|
+
// a fix to `scripts/review/` still judged on the code the supervisor started with.
|
|
18
|
+
//
|
|
19
|
+
// **The wake supervisor's mechanism, shared**: the loaded code is the import closure of the ship entry
|
|
20
|
+
// (`run-wake-code.ts`), and the successor's own claim on the ship record is the take-over's proof
|
|
21
|
+
// (`run-wake-takeover.ts`). A successor that dies or never claims leaves the record naming this
|
|
22
|
+
// supervisor, which runs the rest on the code it started with.
|
|
23
|
+
|
|
24
|
+
const ENTRY = fileURLToPath(new URL('run-ship-cli.ts', import.meta.url))
|
|
25
|
+
const ROOT = fileURLToPath(new URL('../../..', import.meta.url))
|
|
26
|
+
const HANDOVER_HEADER = '=== handover ==='
|
|
27
|
+
const SUCCESS_EXIT_CODE = 0
|
|
28
|
+
|
|
29
|
+
type CodeCheck = () => Promise<boolean>
|
|
30
|
+
|
|
31
|
+
async function never_stale(): Promise<boolean> {
|
|
32
|
+
return false
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Only a supervisor hands over: a ship in an agent's own turn ends with that turn, which reads the
|
|
36
|
+
// next command on the merged code anyway.
|
|
37
|
+
async function watch(): Promise<CodeCheck> {
|
|
38
|
+
if (!run_ship_detach.is_supervised()) return never_stale
|
|
39
|
+
|
|
40
|
+
return await run_wake_code.watch(run_wake_code.source_of(ROOT, ENTRY))
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function ports_of(repository: string, number: string): TakeoverPorts {
|
|
44
|
+
return {
|
|
45
|
+
holder_pid: () => run_ship_relaunch.holder_pid(repository, number),
|
|
46
|
+
is_alive: process_identity.is_live_pid,
|
|
47
|
+
stop: run_wake_stop.signal,
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Several lanes' supervisors hand over at once, so each note leads with its issue for `run:board`.
|
|
52
|
+
async function note(number: string, text: string): Promise<void> {
|
|
53
|
+
await run_event_stream_emit.emit(
|
|
54
|
+
run_event_stream.EVENT_KIND.NOTE,
|
|
55
|
+
`${issue_cite.plain(number)} ${text}`,
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function take_over(args: ShipArguments, repository: string): Promise<number | undefined> {
|
|
60
|
+
const pid = run_ship_relaunch.relaunch({ repository, number: args.number, cwd: process.cwd() })
|
|
61
|
+
if (pid === undefined) return undefined
|
|
62
|
+
const result = await run_wake_takeover.await_takeover(pid, ports_of(repository, args.number))
|
|
63
|
+
|
|
64
|
+
return result === 'taken' ? pid : undefined
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function handed_over(pid: number): ShipSection {
|
|
68
|
+
return {
|
|
69
|
+
header: HANDOVER_HEADER,
|
|
70
|
+
body: `code changed on main — process ${String(pid)} ships the rest on the new code`,
|
|
71
|
+
code: SUCCESS_EXIT_CODE,
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// The handover section where a successor took the ship over; `undefined` where the code is unchanged
|
|
76
|
+
// or no successor took it, and this supervisor runs the rest of the stages itself.
|
|
77
|
+
async function hand_over(
|
|
78
|
+
args: ShipArguments,
|
|
79
|
+
is_stale: CodeCheck,
|
|
80
|
+
): Promise<ShipSection | undefined> {
|
|
81
|
+
if (!(await is_stale())) return undefined
|
|
82
|
+
const repository = await run_ship_probe.repository_directory()
|
|
83
|
+
if (repository === undefined) return undefined
|
|
84
|
+
const pid = await take_over(args, repository)
|
|
85
|
+
|
|
86
|
+
if (pid === undefined) {
|
|
87
|
+
await note(
|
|
88
|
+
args.number,
|
|
89
|
+
`The ship supervisor's code changed on main, but no successor took the ship over, so process ${String(process.pid)} runs the rest on the code it started with.`,
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
return undefined
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
await note(
|
|
96
|
+
args.number,
|
|
97
|
+
`The ship supervisor's code changed on main, so process ${String(process.pid)} handed the ship to process ${String(pid)} on the new code.`,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
return handed_over(pid)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const run_ship_handover = { hand_over, watch }
|
|
104
|
+
|
|
105
|
+
export type { CodeCheck }
|
|
106
|
+
export { run_ship_handover }
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { setTimeout as delay } from 'node:timers/promises'
|
|
2
|
+
import { RETRY_PENDING_KEY, RETRY_PENDING_VALUE } from '#scripts/gh/git-gh-comments-unreadable'
|
|
3
|
+
import type { ShipSection } from './run-ship'
|
|
4
|
+
import type { Stage } from './run-ship-stage'
|
|
5
|
+
import { run_ship_stop_cause } from './run-ship-stop-cause'
|
|
6
|
+
|
|
7
|
+
// A stage that stopped on the infrastructure is run again in place, a bounded number of times, before
|
|
8
|
+
// the ship stops (joshuafolkken/kit#3998). Re-running a stage is what a resumed ship does already, so
|
|
9
|
+
// a retry repeats nothing a relaunched lane would not; it only skips the stop, the relaunch and the
|
|
10
|
+
// wait in between. Any other stop — a finding, a red check, a conflict — returns at once, and so does a
|
|
11
|
+
// review round's, a reviewer that did not finish included: a review is never re-run in place.
|
|
12
|
+
|
|
13
|
+
const MAX_INFRA_RETRIES = 2
|
|
14
|
+
const RETRY_DELAY_MS = 60_000
|
|
15
|
+
const RETRY_CAP = String(MAX_INFRA_RETRIES)
|
|
16
|
+
|
|
17
|
+
type Attempt = () => Promise<ShipSection>
|
|
18
|
+
|
|
19
|
+
interface RetryHooks {
|
|
20
|
+
wait: (milliseconds: number) => Promise<void>
|
|
21
|
+
note: (text: string) => void
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const DEFAULT_HOOKS: RetryHooks = {
|
|
25
|
+
wait: async (milliseconds) => {
|
|
26
|
+
await delay(milliseconds)
|
|
27
|
+
},
|
|
28
|
+
note: (text) => {
|
|
29
|
+
process.stderr.write(`${text}\n`)
|
|
30
|
+
},
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function is_retryable(stage: Stage, section: ShipSection): boolean {
|
|
34
|
+
if (section.code === 0 || run_ship_stop_cause.is_review(stage)) return false
|
|
35
|
+
|
|
36
|
+
return run_ship_stop_cause.cause_of(stage, section) === run_ship_stop_cause.CAUSE.INFRA
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// An attempt with a retry still left runs with `RETRY_PENDING_KEY` set, so its stop sends no
|
|
40
|
+
// confirmation; the final attempt runs without it and sends the one confirmation.
|
|
41
|
+
async function run_attempt(attempt: Attempt, retries_left: number): Promise<ShipSection> {
|
|
42
|
+
if (retries_left === 0) return await attempt()
|
|
43
|
+
|
|
44
|
+
process.env[RETRY_PENDING_KEY] = RETRY_PENDING_VALUE
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
return await attempt()
|
|
48
|
+
} finally {
|
|
49
|
+
Reflect.deleteProperty(process.env, RETRY_PENDING_KEY)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function retried(
|
|
54
|
+
stage: Stage,
|
|
55
|
+
attempt: Attempt,
|
|
56
|
+
hooks: RetryHooks = DEFAULT_HOOKS,
|
|
57
|
+
retries_left = MAX_INFRA_RETRIES,
|
|
58
|
+
): Promise<ShipSection> {
|
|
59
|
+
const section = await run_attempt(attempt, retries_left)
|
|
60
|
+
|
|
61
|
+
if (retries_left === 0 || !is_retryable(stage, section)) return section
|
|
62
|
+
|
|
63
|
+
const ordinal = String(MAX_INFRA_RETRIES - retries_left + 1)
|
|
64
|
+
|
|
65
|
+
hooks.note(`josh ship: ${stage} stopped on the infrastructure — retry ${ordinal}/${RETRY_CAP}`)
|
|
66
|
+
await hooks.wait(RETRY_DELAY_MS)
|
|
67
|
+
|
|
68
|
+
return await retried(stage, attempt, hooks, retries_left - 1)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const run_ship_infra_retry = { MAX_INFRA_RETRIES, RETRY_DELAY_MS, retried }
|
|
72
|
+
|
|
73
|
+
export type { RetryHooks }
|
|
74
|
+
export { run_ship_infra_retry }
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks'
|
|
2
|
+
import type { ShipLapRecord } from '#scripts/lane/lane-ledger-schema'
|
|
3
|
+
import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
|
|
4
|
+
|
|
5
|
+
// The inner steps of a `josh ship` stage, each timed into the lane ledger as a lap, so `lane:breakdown`
|
|
6
|
+
// names what a stage spent its minutes on (joshuafolkken/kit#5294). The stage and the issue are held
|
|
7
|
+
// for the stage's whole run (`within`), so a step deep inside it — the scoped pair the preflight, the
|
|
8
|
+
// review rounds and the gate share — is timed without either being passed down to it. A step run
|
|
9
|
+
// outside a ship stage (the followup's own gate) has no stage to belong to and is not timed.
|
|
10
|
+
|
|
11
|
+
interface LapScope {
|
|
12
|
+
issue: number
|
|
13
|
+
stage: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type LapSink = (lap: ShipLapRecord) => Promise<void>
|
|
17
|
+
|
|
18
|
+
// The names a lap is written under, read back by `lane:breakdown` and `lane:stats` as they are.
|
|
19
|
+
const STEP = {
|
|
20
|
+
PRECONDITIONS: 'preconditions',
|
|
21
|
+
SCOPED_PAIR: 'scoped pair',
|
|
22
|
+
GATE: 'josh gate',
|
|
23
|
+
OVERLAP_WAIT: 'overlap wait',
|
|
24
|
+
LOCAL_COMMIT: 'local commit',
|
|
25
|
+
MERGE: 'merge',
|
|
26
|
+
PUSH: 'push',
|
|
27
|
+
COMMIT: 'josh git',
|
|
28
|
+
} as const
|
|
29
|
+
|
|
30
|
+
const scope = new AsyncLocalStorage<LapScope>()
|
|
31
|
+
|
|
32
|
+
async function to_ledger(lap: ShipLapRecord): Promise<void> {
|
|
33
|
+
await lane_ledger_write.record_ship_lap(lap)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function within<T>(issue: string, stage: string, run: () => Promise<T>): Promise<T> {
|
|
37
|
+
return await scope.run({ issue: Number(issue), stage }, run)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// A step that threw still cost the stage its time, so it is timed either way; the append is
|
|
41
|
+
// best-effort (`lane-ledger-write.ts`), so it never replaces the step's own error.
|
|
42
|
+
async function timed<T>(
|
|
43
|
+
step: string,
|
|
44
|
+
run: () => Promise<T>,
|
|
45
|
+
sink: LapSink = to_ledger,
|
|
46
|
+
): Promise<T> {
|
|
47
|
+
const current = scope.getStore()
|
|
48
|
+
|
|
49
|
+
if (current === undefined) return await run()
|
|
50
|
+
|
|
51
|
+
const started_ms = performance.now()
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
return await run()
|
|
55
|
+
} finally {
|
|
56
|
+
await sink({ ...current, step, elapsed_ms: performance.now() - started_ms })
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const run_ship_lap = { STEP, timed, within }
|
|
61
|
+
|
|
62
|
+
export type { LapSink }
|
|
63
|
+
export { run_ship_lap }
|
|
@@ -1,5 +1,7 @@
|
|
|
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'
|
|
4
|
+
import type { Cause } from './run-ship-stop-cause'
|
|
3
5
|
|
|
4
6
|
// The command a relaunched lane child runs once it has fixed what stopped its detached ship.
|
|
5
7
|
// The stopped stage decides the command mechanically, so it is decided here, once, and the prompt
|
|
@@ -13,9 +15,9 @@ import type { ShipArguments } from './run-ship-steps'
|
|
|
13
15
|
//
|
|
14
16
|
// **Every route is a re-detach.** The prompt only ever reaches a lane child, and a lane child's commit
|
|
15
17
|
// and push belong to the detached ship (`scripts/rules/lane-background.ts`), so a `josh git -y` here could never
|
|
16
|
-
// run. The rounds are the supervisor's too: under `--review` it
|
|
17
|
-
//
|
|
18
|
-
//
|
|
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.
|
|
19
21
|
//
|
|
20
22
|
// **The re-run carries the stopped ship's own options.** A preflight that stopped on missing live
|
|
21
23
|
// evidence asks for `--body-file`, and `followup` delivers the body from it; a command naming only
|
|
@@ -29,33 +31,25 @@ const COMMAND = {
|
|
|
29
31
|
DETACH_REVIEW: 'pnpm josh ship --detach --review',
|
|
30
32
|
} as const
|
|
31
33
|
|
|
32
|
-
// A single quote cannot appear inside single quotes, so it closes the quote, escapes one, and reopens.
|
|
33
|
-
const ESCAPED_QUOTE = String.raw`'\''`
|
|
34
|
-
|
|
35
|
-
// A token of only these characters means the same to the shell quoted or not, so it is left bare.
|
|
36
|
-
const BARE_WORD = /^[\w%+,./:=@-]+$/u
|
|
37
|
-
|
|
38
34
|
// What a stopped ship is re-run with: its title, every option it was started with, and whether it
|
|
39
35
|
// carried `--review` — the one option a route decides rather than repeats.
|
|
40
36
|
interface ShipResume {
|
|
41
37
|
title: string
|
|
42
38
|
flags: ReadonlyArray<string>
|
|
43
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>
|
|
44
43
|
// The paths a merge of the default branch left unmerged.
|
|
45
44
|
conflicts?: ReadonlyArray<string>
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
//
|
|
49
|
-
|
|
50
|
-
return `'${title.split("'").join(ESCAPED_QUOTE)}'`
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function shell_word(token: string): string {
|
|
54
|
-
return BARE_WORD.test(token) ? token : quoted(token)
|
|
45
|
+
// The cause a stopped review round tagged its stop with (`run-ship-stop-cause.ts`).
|
|
46
|
+
cause?: Cause
|
|
47
|
+
// The issue changed after the recorded review's brief (`run-ship-probe.ts`).
|
|
48
|
+
is_review_stale?: boolean
|
|
55
49
|
}
|
|
56
50
|
|
|
57
51
|
// A supervised ship's notify tail is already file-form (`run-ship-detach.ts`), so every flag is a path
|
|
58
|
-
// 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.
|
|
59
53
|
function resume_of(args: ShipArguments): ShipResume {
|
|
60
54
|
const cites = args.cites.flatMap((cite) => ['--cite', cite])
|
|
61
55
|
|
|
@@ -63,28 +57,40 @@ function resume_of(args: ShipArguments): ShipResume {
|
|
|
63
57
|
title: args.title,
|
|
64
58
|
flags: [...args.notify, ...args.body, ...cites],
|
|
65
59
|
is_review: args.is_review,
|
|
60
|
+
unpinned_ok: args.unpinned_ok,
|
|
66
61
|
}
|
|
67
62
|
}
|
|
68
63
|
|
|
69
64
|
// The command prefix stays as written; only the stopped ship's own tokens are quoted where needed.
|
|
70
|
-
function ship_command(
|
|
71
|
-
|
|
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
|
+
)
|
|
72
73
|
|
|
73
74
|
return [command, ...words].join(' ')
|
|
74
75
|
}
|
|
75
76
|
|
|
77
|
+
function review_command(resume: ShipResume): string {
|
|
78
|
+
return ship_command(COMMAND.DETACH_REVIEW, resume, resume.unpinned_ok)
|
|
79
|
+
}
|
|
80
|
+
|
|
76
81
|
// After the merge-side stages, or after round 2 — which is final — the re-detach reviews nothing.
|
|
77
82
|
function detach_again(resume: ShipResume): string {
|
|
78
83
|
return `leave the fix uncommitted and run \`${ship_command(COMMAND.DETACH, resume)}\`.`
|
|
79
84
|
}
|
|
80
85
|
|
|
81
86
|
// Before round 2 the re-run takes the stopped ship's own shape: `--review` only when it carried it. A
|
|
82
|
-
// 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
|
|
83
89
|
// without `--review` was re-detached after round 2, which is final, so it reviews nothing.
|
|
84
90
|
function detach_as_started(resume: ShipResume): string {
|
|
85
|
-
const command = resume.is_review ?
|
|
91
|
+
const command = resume.is_review ? review_command(resume) : ship_command(COMMAND.DETACH, resume)
|
|
86
92
|
|
|
87
|
-
return `leave the fix uncommitted and run \`${
|
|
93
|
+
return `leave the fix uncommitted and run \`${command}\`.`
|
|
88
94
|
}
|
|
89
95
|
|
|
90
96
|
const AFTER_FIX: Record<Stage, (resume: ShipResume) => string> = {
|
|
@@ -98,6 +104,17 @@ const AFTER_FIX: Record<Stage, (resume: ShipResume) => string> = {
|
|
|
98
104
|
[STAGE.REPORT]: detach_again,
|
|
99
105
|
}
|
|
100
106
|
|
|
107
|
+
// Whatever stage stopped, a review that read the issue before its update is round 1's to redo: the
|
|
108
|
+
// supervisor reviews it again even on a committed tree (`run-ship-stage.ts`), and `josh followup`
|
|
109
|
+
// refuses the merge until it has (joshuafolkken/kit#4221).
|
|
110
|
+
function detach_review_again(resume: ShipResume): string {
|
|
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.`
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function after_fix(stage: Stage, resume: ShipResume): string {
|
|
115
|
+
return resume.is_review_stale === true ? detach_review_again(resume) : AFTER_FIX[stage](resume)
|
|
116
|
+
}
|
|
117
|
+
|
|
101
118
|
// A conflict names its paths, so the resumed session resolves them without
|
|
102
119
|
// reading the report or asking git which files are unmerged.
|
|
103
120
|
function conflict_step(conflicts: ReadonlyArray<string>): string {
|
|
@@ -116,11 +133,11 @@ function fix_step(issue: string, stage: Stage, is_excerpted: boolean): string {
|
|
|
116
133
|
function next_step(issue: string, stage: Stage, resume: ShipResume, is_excerpted = false): string {
|
|
117
134
|
const conflicts = resume.conflicts ?? []
|
|
118
135
|
|
|
119
|
-
if (conflicts.length > 0) return `${conflict_step(conflicts)} ${
|
|
136
|
+
if (conflicts.length > 0) return `${conflict_step(conflicts)} ${after_fix(stage, resume)}`
|
|
120
137
|
|
|
121
|
-
return `${fix_step(issue, stage, is_excerpted)}, then ${
|
|
138
|
+
return `${fix_step(issue, stage, is_excerpted)}, then ${after_fix(stage, resume)}`
|
|
122
139
|
}
|
|
123
140
|
|
|
124
|
-
const run_ship_next = { COMMAND, next_step,
|
|
141
|
+
const run_ship_next = { COMMAND, next_step, resume_of }
|
|
125
142
|
|
|
126
143
|
export { run_ship_next, type ShipResume }
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { changed_paths } from '#scripts/git/changed-paths'
|
|
2
2
|
import { git_diff_reads } from '#scripts/git/git-diff-reads'
|
|
3
|
+
import { git_merge_conflicts } from '#scripts/git/git-merge-conflicts'
|
|
3
4
|
import { git_spawn } from '#scripts/git/git-spawn'
|
|
5
|
+
import { main_merge_regenerate } from '#scripts/git/main-merge-regenerate'
|
|
4
6
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
5
7
|
import { lane_handoff } from '#scripts/lane/lane-handoff'
|
|
6
|
-
import {
|
|
8
|
+
import type { OverlapRecord } from '#scripts/lane/lane-ledger-schema'
|
|
9
|
+
import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
|
|
7
10
|
import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
|
|
8
11
|
import { poll } from '#scripts/lib/poll'
|
|
9
12
|
|
|
@@ -13,7 +16,7 @@ import { poll } from '#scripts/lib/poll'
|
|
|
13
16
|
// often as a `conflict` stop its child no longer had the context for.
|
|
14
17
|
//
|
|
15
18
|
// **The later ship waits for the earlier one rather than anything being pushed into a lane.** A lane
|
|
16
|
-
// whose actual change
|
|
19
|
+
// whose actual change conflicts with this one's and whose pull request is already open (its branch pushed,
|
|
17
20
|
// its detached ship still running) is waited on until that ship ends, merged or stopped; the sync that
|
|
18
21
|
// follows then merges a default branch that already holds it, so a conflict surfaces before this
|
|
19
22
|
// lane's gate rather than after its CI. Merging into the other lane's tree instead could not work: a
|
|
@@ -37,6 +40,13 @@ const NAME_ONLY_ARGUMENTS = [
|
|
|
37
40
|
'--no-relative',
|
|
38
41
|
'--no-renames',
|
|
39
42
|
]
|
|
43
|
+
// Only the regenerated entries: a rewritten one resolves some conflicts and refuses the rest, so its
|
|
44
|
+
// conflict is still waited on.
|
|
45
|
+
const REGENERATED_PATHS: ReadonlySet<string> = new Set(
|
|
46
|
+
main_merge_regenerate.RESOLVED_FILES.filter((entry) => 'command' in entry).map(
|
|
47
|
+
(entry) => entry.path,
|
|
48
|
+
),
|
|
49
|
+
)
|
|
40
50
|
|
|
41
51
|
interface OverlapOptions {
|
|
42
52
|
sleeper?: (duration_ms: number) => Promise<void>
|
|
@@ -102,6 +112,35 @@ async function is_open_ship(lane: LaneInfo, own: Launch): Promise<boolean> {
|
|
|
102
112
|
return await has_upstream(lane.directory)
|
|
103
113
|
}
|
|
104
114
|
|
|
115
|
+
async function lane_head(directory: string): Promise<string | undefined> {
|
|
116
|
+
try {
|
|
117
|
+
return await git_spawn.read(['-C', directory, 'rev-parse', 'HEAD'])
|
|
118
|
+
} catch {
|
|
119
|
+
return undefined
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Of the paths both lanes change, the ones merging the other lane's head into this lane's working
|
|
124
|
+
// tree would actually stop on (joshuafolkken/kit#4348) — the working tree, since this lane's change is
|
|
125
|
+
// not committed until after the sync: an identical addition merges cleanly, so only a real conflict
|
|
126
|
+
// is waited on. Only a shared path is tried: a lane forked from an older default branch also
|
|
127
|
+
// conflicts on files the default branch changed since, which this lane's sync takes from the default
|
|
128
|
+
// branch, not from that lane. A file `main:merge` regenerates is resolved by the sync either way, so
|
|
129
|
+
// it never counts. A merge that could not be tried falls back to every shared path, as the wait was
|
|
130
|
+
// decided before.
|
|
131
|
+
async function conflicting_paths(
|
|
132
|
+
lane: LaneInfo,
|
|
133
|
+
shared: ReadonlyArray<string>,
|
|
134
|
+
): Promise<Array<string>> {
|
|
135
|
+
const theirs = await lane_head(lane.directory)
|
|
136
|
+
const conflicted =
|
|
137
|
+
theirs === undefined
|
|
138
|
+
? undefined
|
|
139
|
+
: git_merge_conflicts.working_tree_conflicts(theirs, shared, process.cwd())
|
|
140
|
+
|
|
141
|
+
return (conflicted ?? shared).filter((file_path) => !REGENERATED_PATHS.has(file_path))
|
|
142
|
+
}
|
|
143
|
+
|
|
105
144
|
async function shared_paths(
|
|
106
145
|
lane: LaneInfo,
|
|
107
146
|
launch: Launch,
|
|
@@ -110,8 +149,11 @@ async function shared_paths(
|
|
|
110
149
|
if (!(await is_open_ship(lane, launch))) return []
|
|
111
150
|
|
|
112
151
|
const paths = await lane_paths(lane.directory)
|
|
152
|
+
const shared = paths.filter((file_path) => own.has(file_path))
|
|
153
|
+
|
|
154
|
+
if (shared.length === 0) return []
|
|
113
155
|
|
|
114
|
-
return
|
|
156
|
+
return await conflicting_paths(lane, shared)
|
|
115
157
|
}
|
|
116
158
|
|
|
117
159
|
async function other_lanes(issue: string): Promise<ReadonlyArray<LaneInfo>> {
|
|
@@ -120,8 +162,8 @@ async function other_lanes(issue: string): Promise<ReadonlyArray<LaneInfo>> {
|
|
|
120
162
|
return lanes.filter((lane) => lane.issue !== issue && !lane.is_stranded)
|
|
121
163
|
}
|
|
122
164
|
|
|
123
|
-
// Every other lane whose open pull request, shipped before this one,
|
|
124
|
-
// with the
|
|
165
|
+
// Every other lane whose open pull request, shipped before this one, conflicts with this lane's change,
|
|
166
|
+
// with the conflicting paths.
|
|
125
167
|
async function find_overlap(issue: string): Promise<Overlap> {
|
|
126
168
|
const own = new Set(await changed_paths.read_changed_paths(false))
|
|
127
169
|
const launch = own_launch(issue)
|
|
@@ -174,7 +216,7 @@ async function await_overlap(
|
|
|
174
216
|
const waited_ms = Date.now() - started
|
|
175
217
|
const record = { issue: Number(issue), lanes, paths: [...overlap.paths], waited_ms, is_cleared }
|
|
176
218
|
|
|
177
|
-
await
|
|
219
|
+
await lane_ledger_write.record_overlap(record, options.ledger)
|
|
178
220
|
|
|
179
221
|
return record
|
|
180
222
|
}
|
|
@@ -186,7 +228,7 @@ function note(record: OverlapRecord | undefined): string {
|
|
|
186
228
|
const lanes = record.lanes.map((lane) => session_cite.issue(lane)).join(', ')
|
|
187
229
|
const outcome = record.is_cleared ? 'waited for' : 'gave up waiting for'
|
|
188
230
|
|
|
189
|
-
return `${outcome} ${lanes}, whose open pull requests
|
|
231
|
+
return `${outcome} ${lanes}, whose open pull requests conflict on: ${record.paths.join(', ')}`
|
|
190
232
|
}
|
|
191
233
|
|
|
192
234
|
const run_ship_overlap = { MAX_WAIT_ATTEMPTS, await_overlap, note }
|