@joshuafolkken/kit 1.1514.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +5 -5
- 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 +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- 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 +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -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 +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -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 +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- 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 +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +53 -6
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +30 -7
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +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 +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +8 -6
- 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/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 +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +27 -24
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-write.ts +67 -29
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +2 -2
- package/scripts/git/main-merge.ts +25 -9
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +0 -8
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -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/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +1 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +2 -10
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- 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 +157 -158
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +103 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-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 +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +2 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +81 -15
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +8 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +80 -2
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +9 -1
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +82 -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 +116 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -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 +207 -265
- 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 +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +6 -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 +34 -8
- 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 +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +42 -24
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +61 -149
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +97 -10
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +4 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-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-CDY4NFQG.js +0 -15
- 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-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-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/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/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
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
-
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
4
3
|
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
5
4
|
import { lane_ledger } from '#scripts/lane/lane-ledger'
|
|
6
|
-
import {
|
|
5
|
+
import { review_stop_log } from '#scripts/review/review-stop-log'
|
|
7
6
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
8
7
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
9
8
|
import { run_ship, type ShipSection } from './run-ship'
|
|
9
|
+
import { run_ship_args } from './run-ship-args'
|
|
10
|
+
import { run_ship_body_draft } from './run-ship-body-draft'
|
|
10
11
|
import { run_ship_detach } from './run-ship-detach'
|
|
11
|
-
import {
|
|
12
|
+
import { run_ship_infra_retry } from './run-ship-infra-retry'
|
|
13
|
+
import { run_ship_pre_detach_timed } from './run-ship-pre-detach-timed'
|
|
12
14
|
import { run_ship_probe } from './run-ship-probe'
|
|
13
15
|
import { run_ship_return } from './run-ship-return'
|
|
14
16
|
import { run_ship_stage, type Phase, type ShipState, type Stage } from './run-ship-stage'
|
|
15
17
|
import { run_ship_steps, type ShipArguments, type Step } from './run-ship-steps'
|
|
18
|
+
import { run_ship_stop_cause } from './run-ship-stop-cause'
|
|
16
19
|
|
|
17
20
|
// `josh ship "<title> #<N>"` — one call for the fixed commit-to-report region a run ships a change on.
|
|
18
21
|
// It runs `gate`, `git -y`, `followup` and `run:tail` internally, so no round trip re-bills a lane's
|
|
@@ -38,51 +41,17 @@ import { run_ship_steps, type ShipArguments, type Step } from './run-ship-steps'
|
|
|
38
41
|
// the agent ends at the hand-off instead of relaunching itself for the gate, a supervised ship that stops
|
|
39
42
|
// hands the stage back (`run-ship-return.ts`), and `--log <N>` prints the report it stopped on.
|
|
40
43
|
//
|
|
41
|
-
// The
|
|
42
|
-
// number is read off its tail for `run:tail`. Any further positionals are follow-up citations filed
|
|
43
|
-
// this run (`fullrun-steps.md` routes branch-2 filing before `ship`), forwarded to `run:tail` after the
|
|
44
|
-
// closed issue so `issue:cite` reports them too. A notify body — `--notify-message` or the
|
|
45
|
-
// shell-body-safe `--notify-message-file` — is forwarded to `followup` alone; the completion prose is
|
|
46
|
-
// composed before this command and passed straight through.
|
|
44
|
+
// The command line it takes is read in `run-ship-args.ts`.
|
|
47
45
|
|
|
48
46
|
const ARGV_OFFSET = 2
|
|
49
47
|
const SUCCESS_EXIT_CODE = 0
|
|
50
48
|
const FAILURE_EXIT_CODE = 1
|
|
51
|
-
const FIRST = 0
|
|
52
|
-
const NUMBER_GROUP = 1
|
|
53
|
-
const EXTRA_CITE_START = 1
|
|
54
|
-
// The issue reference at the tail of the title — `git -y` and `followup` read the whole string, and
|
|
55
|
-
// `run:tail` needs the number alone.
|
|
56
|
-
const TRAILING_ISSUE_PATTERN = /#([1-9]\d*)\s*$/u
|
|
57
|
-
// Both body forms `followup` documents, forwarded verbatim: the inline `--notify-message` and the
|
|
58
|
-
// shell-body-safe `--notify-message-file` a body naming a command or path must use (`followup.md`).
|
|
59
|
-
const NOTIFY_OPTIONS = ['notify-message', 'notify-message-file'] as const
|
|
60
|
-
// The PR body carrying the live-execution evidence `followup` gates the merge
|
|
61
|
-
// on, forwarded to `git -y` as a path because it holds commands and their output.
|
|
62
|
-
const BODY_FILE_OPTION = 'body-file'
|
|
63
49
|
const USAGE =
|
|
64
50
|
'Usage: josh ship "<title> #<N>" [<follow-up-N> ...] [--cite <N> ...] [--review] [--detach] [--body-file <path>] [--notify-message <text> | --notify-message-file <path>] | josh ship --log <N>'
|
|
65
51
|
const NO_LOG_NOTE = 'no detached ship supervisor log for this issue'
|
|
66
52
|
const LANE_CHILD_DETACH_NOTE =
|
|
67
53
|
'lane child: shipping through the detached supervisor (--detach implied), so the end of this turn cannot kill it'
|
|
68
54
|
|
|
69
|
-
type NotifyValues = Partial<Record<(typeof NOTIFY_OPTIONS)[number], string>>
|
|
70
|
-
|
|
71
|
-
const OPTIONS = {
|
|
72
|
-
[NOTIFY_OPTIONS[0]]: { type: 'string' },
|
|
73
|
-
[NOTIFY_OPTIONS[1]]: { type: 'string' },
|
|
74
|
-
[BODY_FILE_OPTION]: { type: 'string' },
|
|
75
|
-
review: { type: 'boolean' },
|
|
76
|
-
// Hand the region to a detached supervisor (`run-ship-detach.ts`), print the
|
|
77
|
-
// report a stopped supervisor left, and carry follow-up citations as options so the supervisor's
|
|
78
|
-
// command line still ends with its title.
|
|
79
|
-
detach: { type: 'boolean' },
|
|
80
|
-
log: { type: 'string' },
|
|
81
|
-
cite: { type: 'string', multiple: true },
|
|
82
|
-
} as const
|
|
83
|
-
|
|
84
|
-
type ShipCommand = { kind: 'ship'; args: ShipArguments } | { kind: 'log'; number: string }
|
|
85
|
-
|
|
86
55
|
// What a resumed ship knows before its first stage: the record's path (absent outside a repository),
|
|
87
56
|
// the stages it says completed, and the repository's actual state (`run-ship-stage.ts` decides from it).
|
|
88
57
|
// `started` opens with the stages the record says this attempt started — a supervisor that ended
|
|
@@ -94,87 +63,7 @@ interface ShipContext {
|
|
|
94
63
|
started: Array<string>
|
|
95
64
|
}
|
|
96
65
|
|
|
97
|
-
|
|
98
|
-
// path-based body reaches `followup` exactly as passed.
|
|
99
|
-
function notify_arguments(values: NotifyValues): ReadonlyArray<string> {
|
|
100
|
-
return NOTIFY_OPTIONS.flatMap((option) => {
|
|
101
|
-
const value = values[option]
|
|
102
|
-
|
|
103
|
-
return value === undefined ? [] : [`--${option}`, value]
|
|
104
|
-
})
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
function body_arguments(path: string | undefined): ReadonlyArray<string> {
|
|
108
|
-
return path === undefined ? [] : [`--${BODY_FILE_OPTION}`, path]
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
const { PHASE } = run_ship_stage
|
|
112
|
-
|
|
113
|
-
function issue_number(title: string): string | undefined {
|
|
114
|
-
return TRAILING_ISSUE_PATTERN.exec(title)?.[NUMBER_GROUP]
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
interface ParsedValues extends NotifyValues {
|
|
118
|
-
[BODY_FILE_OPTION]?: string
|
|
119
|
-
review?: boolean
|
|
120
|
-
detach?: boolean
|
|
121
|
-
log?: string
|
|
122
|
-
cite?: Array<string>
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// A follow-up citation passed as a trailing positional is a bare issue number, so a stray flag is
|
|
126
|
-
// refused rather than forwarded to the wrong step.
|
|
127
|
-
function ship_args(
|
|
128
|
-
title: string,
|
|
129
|
-
rest: ReadonlyArray<string>,
|
|
130
|
-
values: ParsedValues,
|
|
131
|
-
): ShipArguments | undefined {
|
|
132
|
-
const number = issue_number(title)
|
|
133
|
-
const cites = [...rest, ...(values.cite ?? [])]
|
|
134
|
-
|
|
135
|
-
if (number === undefined || cites.some((token) => !issue_number_shape.is_issue_number(token))) {
|
|
136
|
-
return undefined
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
return {
|
|
140
|
-
title,
|
|
141
|
-
number,
|
|
142
|
-
notify: notify_arguments(values),
|
|
143
|
-
body: body_arguments(values[BODY_FILE_OPTION]),
|
|
144
|
-
body_path: values[BODY_FILE_OPTION],
|
|
145
|
-
cites,
|
|
146
|
-
is_review: values.review === true,
|
|
147
|
-
is_detach: values.detach === true,
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// `--log <N>` stands alone: a bare issue number and nothing to ship.
|
|
152
|
-
function log_command(number: string, positionals: ReadonlyArray<string>): ShipCommand | undefined {
|
|
153
|
-
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(number) && positionals.length === 0
|
|
154
|
-
? { kind: 'log', number }
|
|
155
|
-
: undefined
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
function command_of(
|
|
159
|
-
values: ParsedValues,
|
|
160
|
-
positionals: ReadonlyArray<string>,
|
|
161
|
-
): ShipCommand | undefined {
|
|
162
|
-
if (values.log !== undefined) return log_command(values.log, positionals)
|
|
163
|
-
|
|
164
|
-
const title = positionals[FIRST]
|
|
165
|
-
const args =
|
|
166
|
-
title === undefined ? undefined : ship_args(title, positionals.slice(EXTRA_CITE_START), values)
|
|
167
|
-
|
|
168
|
-
return args === undefined ? undefined : { kind: 'ship', args }
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// Numbers-only tail and a strict parse, so a title with no `#<N>` or a stray flag is refused rather
|
|
172
|
-
// than shipped past the wrong step.
|
|
173
|
-
function parse(argv: ReadonlyArray<string>): ShipCommand | undefined {
|
|
174
|
-
const parsed = cli_flags.arguments_of(argv, OPTIONS)
|
|
175
|
-
|
|
176
|
-
return parsed === undefined ? undefined : command_of(parsed.values, parsed.positionals)
|
|
177
|
-
}
|
|
66
|
+
const { PHASE, STAGE } = run_ship_stage
|
|
178
67
|
|
|
179
68
|
// Every stage that ran is timed into the lane ledger, failed ones included — a stage that stopped the
|
|
180
69
|
// ship cost the lane its time as well. The append is local and best-effort, so it adds no wait.
|
|
@@ -186,15 +75,26 @@ async function record_timed(step: Step, issue: string, elapsed_ms: number): Prom
|
|
|
186
75
|
await lane_ledger.record_stage({ stage: step.stage, elapsed_ms, issue: Number(issue) })
|
|
187
76
|
}
|
|
188
77
|
|
|
189
|
-
async function
|
|
78
|
+
async function run_once(step: Step, args: ShipArguments, state: ShipState): Promise<ShipSection> {
|
|
190
79
|
const started_ms = performance.now()
|
|
191
80
|
const result = await step.run(args, state)
|
|
192
81
|
const elapsed_ms = performance.now() - started_ms
|
|
193
82
|
|
|
194
83
|
if (result.is_skipped !== true) await record_timed(step, args.number, elapsed_ms)
|
|
195
|
-
const section = { header: step.header, body: result.out, code: result.code }
|
|
196
84
|
|
|
197
|
-
return
|
|
85
|
+
return run_ship.section_of(step.header, result)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// A stage that stopped on the infrastructure runs again in place before it stops the ship. A retry
|
|
89
|
+
// re-reads the state, as a resumed ship does: a commit whose push failed is not made a second time.
|
|
90
|
+
async function run_step(step: Step, args: ShipArguments, state: ShipState): Promise<ShipSection> {
|
|
91
|
+
const first = [state]
|
|
92
|
+
|
|
93
|
+
return await run_ship_infra_retry.retried(step.stage, async () => {
|
|
94
|
+
const current = first.pop() ?? (await run_ship_probe.read_state())
|
|
95
|
+
|
|
96
|
+
return await run_once(step, args, current)
|
|
97
|
+
})
|
|
198
98
|
}
|
|
199
99
|
|
|
200
100
|
async function emit_phase(
|
|
@@ -237,6 +137,12 @@ async function settle(
|
|
|
237
137
|
})
|
|
238
138
|
}
|
|
239
139
|
|
|
140
|
+
// A function of its own so the write does not sit after an `await`, where `require-atomic-updates`
|
|
141
|
+
// reads it as a possible race — the reason `held-mark.ts` gives `set_held_mark`.
|
|
142
|
+
function set_state(context: ShipContext, state: ShipState): void {
|
|
143
|
+
context.state = state
|
|
144
|
+
}
|
|
145
|
+
|
|
240
146
|
// One stage: passed over when the record and the state say it is done, run and recorded otherwise.
|
|
241
147
|
async function run_stage(
|
|
242
148
|
step: Step,
|
|
@@ -257,6 +163,8 @@ async function run_stage(
|
|
|
257
163
|
const section = await run_step(step, args, context.state)
|
|
258
164
|
|
|
259
165
|
await settle(step, args, context, section.code)
|
|
166
|
+
// A review may fix the tree and refreshes the brief, so the stages after it read the state anew.
|
|
167
|
+
if (step.stage === STAGE.REVIEW) set_state(context, await run_ship_probe.read_state())
|
|
260
168
|
|
|
261
169
|
return section
|
|
262
170
|
}
|
|
@@ -270,19 +178,22 @@ async function open_context(args: ShipArguments): Promise<ShipContext> {
|
|
|
270
178
|
const done = target === undefined ? new Set<string>() : run_ship_stage.read_done(target)
|
|
271
179
|
const started = target === undefined ? [] : [...run_ship_stage.read_started(target)]
|
|
272
180
|
|
|
181
|
+
// A supervisor that died mid-followup left its wait marked; this one waits on nothing yet.
|
|
182
|
+
record(target, (path) => {
|
|
183
|
+
run_ship_stage.clear_waits(path)
|
|
184
|
+
})
|
|
185
|
+
|
|
273
186
|
return { target, done, state, started }
|
|
274
187
|
}
|
|
275
188
|
|
|
276
189
|
// Every stop goes to the lane ledger — supervised, in an agent's own turn, or a lane child's preflight
|
|
277
|
-
// before the hand-off — so `lane:stats` can say how long a ship stayed stopped for each reason.
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
conflicts?: ReadonlyArray<string>,
|
|
282
|
-
): Promise<void> {
|
|
283
|
-
const reason = run_ship_stage.stop_reason(stage, conflicts)
|
|
190
|
+
// before the hand-off — so `lane:stats` can say how long a ship stayed stopped for each reason. A review
|
|
191
|
+
// stop's deciding findings also go, whole, to the durable stop log `review:stops` reads.
|
|
192
|
+
async function record_stop(args: ShipArguments, stage: Stage, failed?: ShipSection): Promise<void> {
|
|
193
|
+
const issue = Number(args.number)
|
|
284
194
|
|
|
285
|
-
await lane_ledger.record_stop(
|
|
195
|
+
await lane_ledger.record_stop(run_ship_stop_cause.record_of(issue, stage, failed))
|
|
196
|
+
review_stop_log.record({ issue, stage, findings: run_ship_stop_cause.details_of(stage, failed) })
|
|
286
197
|
}
|
|
287
198
|
|
|
288
199
|
// A detached supervisor hands the stopped stage back (`run-ship-return.ts`); a
|
|
@@ -296,7 +207,7 @@ async function stopped(
|
|
|
296
207
|
): Promise<ReadonlyArray<ShipSection>> {
|
|
297
208
|
const failed = sections.at(-1)
|
|
298
209
|
|
|
299
|
-
await record_stop(args, step.stage, failed
|
|
210
|
+
await record_stop(args, step.stage, failed)
|
|
300
211
|
|
|
301
212
|
if (run_ship_detach.is_supervised()) {
|
|
302
213
|
record(context.target, run_ship_stage.end_attempt)
|
|
@@ -372,23 +283,35 @@ function should_detach(args: ShipArguments): boolean {
|
|
|
372
283
|
return !run_ship_detach.is_supervised() && lane_child_marker.is_child_of(process.cwd())
|
|
373
284
|
}
|
|
374
285
|
|
|
286
|
+
// The preflight stop's unmet kinds, with `pre-detach` added when those checks went red beside it.
|
|
287
|
+
function with_checks(stop: ShipSection, checks: ShipSection): ShipSection {
|
|
288
|
+
if (checks.code === SUCCESS_EXIT_CODE) return stop
|
|
289
|
+
|
|
290
|
+
return { ...stop, preconditions: [...(stop.preconditions ?? []), lane_ledger.PRE_DETACH_STAGE] }
|
|
291
|
+
}
|
|
292
|
+
|
|
375
293
|
// The preflight is deterministic and fast, so it runs here, in the agent's own turn, before the
|
|
376
294
|
// hand-off — a stop it finds is fixed by the same session instead of relaunching one from the
|
|
377
295
|
// supervisor. Only the slow stages go to the supervisor, which re-asks the preflight itself. The fast
|
|
378
296
|
// checks (`run-ship-pre-detach.ts`) follow it here for the same reason; they are not a stage, so the
|
|
379
|
-
// supervisor's gate runs them again rather than passing over them.
|
|
297
|
+
// supervisor's gate runs them again rather than passing over them. They run even when the preflight
|
|
298
|
+
// refused, so one ship reports every failure there is to fix (joshuafolkken/kit#4305); the preflight's
|
|
299
|
+
// refusal still comes before its own scoped pair, the one heavy check here.
|
|
300
|
+
//
|
|
301
|
+
// **The refusal is printed last**: a lane child reading the report through `tail` saw only the red
|
|
302
|
+
// metrics or type check after it, fixed those, and shipped into the same refusal again — every repeated
|
|
303
|
+
// preflight stop of joshuafolkken/kit#4478. The stop records the pre-detach checks' red beside the
|
|
304
|
+
// unmet kinds, so the ledger shows which refusals came with one.
|
|
380
305
|
async function pre_detach_sections(args: ShipArguments): Promise<ReadonlyArray<ShipSection>> {
|
|
381
306
|
const preflight = await run_stage(run_ship_steps.PREFLIGHT_STEP, args, await open_context(args))
|
|
307
|
+
const result = await run_ship_pre_detach_timed.checks(args.number)
|
|
308
|
+
const checks = { header: run_ship.PRE_DETACH_HEADER, body: result.out, code: result.code }
|
|
382
309
|
|
|
383
310
|
if (preflight.code !== SUCCESS_EXIT_CODE) {
|
|
384
|
-
await record_stop(args, run_ship_steps.PREFLIGHT_STEP.stage)
|
|
385
|
-
|
|
386
|
-
return [preflight]
|
|
311
|
+
await record_stop(args, run_ship_steps.PREFLIGHT_STEP.stage, with_checks(preflight, checks))
|
|
387
312
|
}
|
|
388
313
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
return [preflight, { header: run_ship.PRE_DETACH_HEADER, body: result.out, code: result.code }]
|
|
314
|
+
return [checks, preflight]
|
|
392
315
|
}
|
|
393
316
|
|
|
394
317
|
async function detach_after_preflight(args: ShipArguments): Promise<number> {
|
|
@@ -437,7 +360,7 @@ async function run_ship_command(args: ShipArguments): Promise<number> {
|
|
|
437
360
|
}
|
|
438
361
|
|
|
439
362
|
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
440
|
-
const command = parse(argv)
|
|
363
|
+
const command = run_ship_args.parse(argv)
|
|
441
364
|
|
|
442
365
|
if (command === undefined) {
|
|
443
366
|
console.error(USAGE)
|
|
@@ -447,7 +370,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
447
370
|
|
|
448
371
|
return command.kind === 'log'
|
|
449
372
|
? await print_log(command.number)
|
|
450
|
-
: await run_ship_command(command.args)
|
|
373
|
+
: await run_ship_command(await run_ship_body_draft.with_draft(command.args))
|
|
451
374
|
}
|
|
452
375
|
|
|
453
376
|
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
@@ -58,6 +58,7 @@ const RECORD_WAIT_ATTEMPTS = 200
|
|
|
58
58
|
// a `pnpm josh ship` start-up, far below the lifetime a reused pid could otherwise be believed for.
|
|
59
59
|
const CLAIM_WINDOW_MS = 120_000
|
|
60
60
|
type ShipResult = 'running' | 'success' | 'failed' | 'abnormal'
|
|
61
|
+
type StartRead = (pid: number) => string | undefined
|
|
61
62
|
|
|
62
63
|
interface ShipRecord {
|
|
63
64
|
pid?: number | undefined
|
|
@@ -146,35 +147,43 @@ function is_within_claim_window(record: ShipRecord): boolean {
|
|
|
146
147
|
return record.launched_at !== undefined && Date.now() - record.launched_at < CLAIM_WINDOW_MS
|
|
147
148
|
}
|
|
148
149
|
|
|
149
|
-
function has_live_identity(pid: number, record: ShipRecord): boolean {
|
|
150
|
+
function has_live_identity(pid: number, record: ShipRecord, read: StartRead): boolean {
|
|
150
151
|
if (record.process_start === undefined) {
|
|
151
152
|
return is_within_claim_window(record) && process_identity.is_live_pid(pid)
|
|
152
153
|
}
|
|
153
154
|
|
|
154
|
-
return process_identity.is_same_process(pid, record.process_start) !== false
|
|
155
|
+
return process_identity.is_same_process(pid, record.process_start, read) !== false
|
|
155
156
|
}
|
|
156
157
|
|
|
157
|
-
function result_of(record: ShipRecord): ShipResult {
|
|
158
|
+
function result_of(record: ShipRecord, read: StartRead): ShipResult {
|
|
158
159
|
if (record.pid === undefined) {
|
|
159
|
-
const
|
|
160
|
+
const { launcher_pid, launcher_start } = record
|
|
161
|
+
const is_launcher = process_identity.is_same_process(launcher_pid, launcher_start, read)
|
|
160
162
|
|
|
161
163
|
return is_launcher === false ? 'abnormal' : 'running'
|
|
162
164
|
}
|
|
163
165
|
|
|
164
|
-
if (has_live_identity(record.pid, record)) return 'running'
|
|
166
|
+
if (has_live_identity(record.pid, record, read)) return 'running'
|
|
165
167
|
|
|
166
168
|
return record.result ?? 'abnormal'
|
|
167
169
|
}
|
|
168
170
|
|
|
171
|
+
// `read` answers each recorded process's start time: a reader holding one process snapshot passes its
|
|
172
|
+
// own, so the reading starts no `ps` (joshuafolkken/kit#4245).
|
|
169
173
|
function read_result(
|
|
170
174
|
repository: string,
|
|
171
175
|
number: string,
|
|
172
|
-
|
|
176
|
+
read: StartRead = process_identity.read_start,
|
|
177
|
+
): { launch_id: string; launched_at?: number | undefined; result: ShipResult } | undefined {
|
|
173
178
|
const record = read_record(repository, number)
|
|
174
179
|
|
|
175
180
|
return record === undefined
|
|
176
181
|
? undefined
|
|
177
|
-
: {
|
|
182
|
+
: {
|
|
183
|
+
launch_id: record.launch_id,
|
|
184
|
+
launched_at: record.launched_at,
|
|
185
|
+
result: result_of(record, read),
|
|
186
|
+
}
|
|
178
187
|
}
|
|
179
188
|
|
|
180
189
|
function current_record(repository: string, number: string): ShipRecord | undefined {
|
|
@@ -188,7 +197,9 @@ function current_record(repository: string, number: string): ShipRecord | undefi
|
|
|
188
197
|
function running_since(repository: string, number: string): number | undefined {
|
|
189
198
|
const record = read_record(repository, number)
|
|
190
199
|
|
|
191
|
-
return record !== undefined && result_of(record) === 'running'
|
|
200
|
+
return record !== undefined && result_of(record, process_identity.read_start) === 'running'
|
|
201
|
+
? record.launched_at
|
|
202
|
+
: undefined
|
|
192
203
|
}
|
|
193
204
|
|
|
194
205
|
function is_pending(record: ShipRecord | undefined): boolean {
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { setTimeout as delay } from 'node:timers/promises'
|
|
2
|
+
import type { ShipSection } from './run-ship'
|
|
3
|
+
import type { Stage } from './run-ship-stage'
|
|
4
|
+
import { run_ship_stop_cause } from './run-ship-stop-cause'
|
|
5
|
+
|
|
6
|
+
// A stage that stopped on the infrastructure is run again in place, a bounded number of times, before
|
|
7
|
+
// the ship stops (joshuafolkken/kit#3998). Re-running a stage is what a resumed ship does already, so
|
|
8
|
+
// a retry repeats nothing a relaunched lane would not; it only skips the stop, the relaunch and the
|
|
9
|
+
// wait in between. Any other stop — a finding, a red check, a conflict — returns at once, and so does a
|
|
10
|
+
// review round's, a reviewer that did not finish included: a review is never re-run in place.
|
|
11
|
+
|
|
12
|
+
const MAX_INFRA_RETRIES = 2
|
|
13
|
+
const RETRY_DELAY_MS = 60_000
|
|
14
|
+
const RETRY_CAP = String(MAX_INFRA_RETRIES)
|
|
15
|
+
|
|
16
|
+
type Attempt = () => Promise<ShipSection>
|
|
17
|
+
|
|
18
|
+
interface RetryHooks {
|
|
19
|
+
wait: (milliseconds: number) => Promise<void>
|
|
20
|
+
note: (text: string) => void
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const DEFAULT_HOOKS: RetryHooks = {
|
|
24
|
+
wait: async (milliseconds) => {
|
|
25
|
+
await delay(milliseconds)
|
|
26
|
+
},
|
|
27
|
+
note: (text) => {
|
|
28
|
+
process.stderr.write(`${text}\n`)
|
|
29
|
+
},
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function is_retryable(stage: Stage, section: ShipSection): boolean {
|
|
33
|
+
if (section.code === 0 || run_ship_stop_cause.is_review(stage)) return false
|
|
34
|
+
|
|
35
|
+
return run_ship_stop_cause.cause_of(stage, section) === run_ship_stop_cause.CAUSE.INFRA
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function retried(
|
|
39
|
+
stage: Stage,
|
|
40
|
+
attempt: Attempt,
|
|
41
|
+
hooks: RetryHooks = DEFAULT_HOOKS,
|
|
42
|
+
retries_left = MAX_INFRA_RETRIES,
|
|
43
|
+
): Promise<ShipSection> {
|
|
44
|
+
const section = await attempt()
|
|
45
|
+
|
|
46
|
+
if (retries_left === 0 || !is_retryable(stage, section)) return section
|
|
47
|
+
|
|
48
|
+
const ordinal = String(MAX_INFRA_RETRIES - retries_left + 1)
|
|
49
|
+
|
|
50
|
+
hooks.note(`josh ship: ${stage} stopped on the infrastructure — retry ${ordinal}/${RETRY_CAP}`)
|
|
51
|
+
await hooks.wait(RETRY_DELAY_MS)
|
|
52
|
+
|
|
53
|
+
return await retried(stage, attempt, hooks, retries_left - 1)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const run_ship_infra_retry = { MAX_INFRA_RETRIES, RETRY_DELAY_MS, retried }
|
|
57
|
+
|
|
58
|
+
export type { RetryHooks }
|
|
59
|
+
export { run_ship_infra_retry }
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { run_ship_stage, type Stage } from './run-ship-stage'
|
|
2
2
|
import type { ShipArguments } from './run-ship-steps'
|
|
3
|
+
import type { Cause } from './run-ship-stop-cause'
|
|
3
4
|
|
|
4
5
|
// The command a relaunched lane child runs once it has fixed what stopped its detached ship.
|
|
5
6
|
// The stopped stage decides the command mechanically, so it is decided here, once, and the prompt
|
|
@@ -43,6 +44,10 @@ interface ShipResume {
|
|
|
43
44
|
is_review: boolean
|
|
44
45
|
// The paths a merge of the default branch left unmerged.
|
|
45
46
|
conflicts?: ReadonlyArray<string>
|
|
47
|
+
// The cause a stopped review round tagged its stop with (`run-ship-stop-cause.ts`).
|
|
48
|
+
cause?: Cause
|
|
49
|
+
// The issue changed after the recorded review's brief (`run-ship-probe.ts`).
|
|
50
|
+
is_review_stale?: boolean
|
|
46
51
|
}
|
|
47
52
|
|
|
48
53
|
// Single quotes, so a `$` or a backtick in a title is never expanded by the shell that runs it.
|
|
@@ -98,6 +103,17 @@ const AFTER_FIX: Record<Stage, (resume: ShipResume) => string> = {
|
|
|
98
103
|
[STAGE.REPORT]: detach_again,
|
|
99
104
|
}
|
|
100
105
|
|
|
106
|
+
// Whatever stage stopped, a review that read the issue before its update is round 1's to redo: the
|
|
107
|
+
// supervisor reviews it again even on a committed tree (`run-ship-stage.ts`), and `josh followup`
|
|
108
|
+
// refuses the merge until it has (joshuafolkken/kit#4221).
|
|
109
|
+
function detach_review_again(resume: ShipResume): string {
|
|
110
|
+
return `leave the fix uncommitted and run \`${ship_command(COMMAND.DETACH_REVIEW, resume)}\` — the review read the issue before its update, so the supervisor reviews round 1 again.`
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function after_fix(stage: Stage, resume: ShipResume): string {
|
|
114
|
+
return resume.is_review_stale === true ? detach_review_again(resume) : AFTER_FIX[stage](resume)
|
|
115
|
+
}
|
|
116
|
+
|
|
101
117
|
// A conflict names its paths, so the resumed session resolves them without
|
|
102
118
|
// reading the report or asking git which files are unmerged.
|
|
103
119
|
function conflict_step(conflicts: ReadonlyArray<string>): string {
|
|
@@ -116,9 +132,9 @@ function fix_step(issue: string, stage: Stage, is_excerpted: boolean): string {
|
|
|
116
132
|
function next_step(issue: string, stage: Stage, resume: ShipResume, is_excerpted = false): string {
|
|
117
133
|
const conflicts = resume.conflicts ?? []
|
|
118
134
|
|
|
119
|
-
if (conflicts.length > 0) return `${conflict_step(conflicts)} ${
|
|
135
|
+
if (conflicts.length > 0) return `${conflict_step(conflicts)} ${after_fix(stage, resume)}`
|
|
120
136
|
|
|
121
|
-
return `${fix_step(issue, stage, is_excerpted)}, then ${
|
|
137
|
+
return `${fix_step(issue, stage, is_excerpted)}, then ${after_fix(stage, resume)}`
|
|
122
138
|
}
|
|
123
139
|
|
|
124
140
|
const run_ship_next = { COMMAND, next_step, quoted, resume_of }
|
|
@@ -1,6 +1,8 @@
|
|
|
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
8
|
import { lane_ledger, type OverlapRecord } from '#scripts/lane/lane-ledger'
|
|
@@ -13,7 +15,7 @@ import { poll } from '#scripts/lib/poll'
|
|
|
13
15
|
// often as a `conflict` stop its child no longer had the context for.
|
|
14
16
|
//
|
|
15
17
|
// **The later ship waits for the earlier one rather than anything being pushed into a lane.** A lane
|
|
16
|
-
// whose actual change
|
|
18
|
+
// whose actual change conflicts with this one's and whose pull request is already open (its branch pushed,
|
|
17
19
|
// its detached ship still running) is waited on until that ship ends, merged or stopped; the sync that
|
|
18
20
|
// follows then merges a default branch that already holds it, so a conflict surfaces before this
|
|
19
21
|
// lane's gate rather than after its CI. Merging into the other lane's tree instead could not work: a
|
|
@@ -37,6 +39,9 @@ const NAME_ONLY_ARGUMENTS = [
|
|
|
37
39
|
'--no-relative',
|
|
38
40
|
'--no-renames',
|
|
39
41
|
]
|
|
42
|
+
const REGENERATED_PATHS: ReadonlySet<string> = new Set(
|
|
43
|
+
main_merge_regenerate.REGENERATED_FILES.map((entry) => entry.path),
|
|
44
|
+
)
|
|
40
45
|
|
|
41
46
|
interface OverlapOptions {
|
|
42
47
|
sleeper?: (duration_ms: number) => Promise<void>
|
|
@@ -102,6 +107,35 @@ async function is_open_ship(lane: LaneInfo, own: Launch): Promise<boolean> {
|
|
|
102
107
|
return await has_upstream(lane.directory)
|
|
103
108
|
}
|
|
104
109
|
|
|
110
|
+
async function lane_head(directory: string): Promise<string | undefined> {
|
|
111
|
+
try {
|
|
112
|
+
return await git_spawn.read(['-C', directory, 'rev-parse', 'HEAD'])
|
|
113
|
+
} catch {
|
|
114
|
+
return undefined
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Of the paths both lanes change, the ones merging the other lane's head into this lane's working
|
|
119
|
+
// tree would actually stop on (joshuafolkken/kit#4348) — the working tree, since this lane's change is
|
|
120
|
+
// not committed until after the sync: an identical addition merges cleanly, so only a real conflict
|
|
121
|
+
// is waited on. Only a shared path is tried: a lane forked from an older default branch also
|
|
122
|
+
// conflicts on files the default branch changed since, which this lane's sync takes from the default
|
|
123
|
+
// branch, not from that lane. A file `main:merge` regenerates is resolved by the sync either way, so
|
|
124
|
+
// it never counts. A merge that could not be tried falls back to every shared path, as the wait was
|
|
125
|
+
// decided before.
|
|
126
|
+
async function conflicting_paths(
|
|
127
|
+
lane: LaneInfo,
|
|
128
|
+
shared: ReadonlyArray<string>,
|
|
129
|
+
): Promise<Array<string>> {
|
|
130
|
+
const theirs = await lane_head(lane.directory)
|
|
131
|
+
const conflicted =
|
|
132
|
+
theirs === undefined
|
|
133
|
+
? undefined
|
|
134
|
+
: git_merge_conflicts.working_tree_conflicts(theirs, shared, process.cwd())
|
|
135
|
+
|
|
136
|
+
return (conflicted ?? shared).filter((file_path) => !REGENERATED_PATHS.has(file_path))
|
|
137
|
+
}
|
|
138
|
+
|
|
105
139
|
async function shared_paths(
|
|
106
140
|
lane: LaneInfo,
|
|
107
141
|
launch: Launch,
|
|
@@ -110,8 +144,11 @@ async function shared_paths(
|
|
|
110
144
|
if (!(await is_open_ship(lane, launch))) return []
|
|
111
145
|
|
|
112
146
|
const paths = await lane_paths(lane.directory)
|
|
147
|
+
const shared = paths.filter((file_path) => own.has(file_path))
|
|
148
|
+
|
|
149
|
+
if (shared.length === 0) return []
|
|
113
150
|
|
|
114
|
-
return
|
|
151
|
+
return await conflicting_paths(lane, shared)
|
|
115
152
|
}
|
|
116
153
|
|
|
117
154
|
async function other_lanes(issue: string): Promise<ReadonlyArray<LaneInfo>> {
|
|
@@ -120,8 +157,8 @@ async function other_lanes(issue: string): Promise<ReadonlyArray<LaneInfo>> {
|
|
|
120
157
|
return lanes.filter((lane) => lane.issue !== issue && !lane.is_stranded)
|
|
121
158
|
}
|
|
122
159
|
|
|
123
|
-
// Every other lane whose open pull request, shipped before this one,
|
|
124
|
-
// with the
|
|
160
|
+
// Every other lane whose open pull request, shipped before this one, conflicts with this lane's change,
|
|
161
|
+
// with the conflicting paths.
|
|
125
162
|
async function find_overlap(issue: string): Promise<Overlap> {
|
|
126
163
|
const own = new Set(await changed_paths.read_changed_paths(false))
|
|
127
164
|
const launch = own_launch(issue)
|
|
@@ -186,7 +223,7 @@ function note(record: OverlapRecord | undefined): string {
|
|
|
186
223
|
const lanes = record.lanes.map((lane) => session_cite.issue(lane)).join(', ')
|
|
187
224
|
const outcome = record.is_cleared ? 'waited for' : 'gave up waiting for'
|
|
188
225
|
|
|
189
|
-
return `${outcome} ${lanes}, whose open pull requests
|
|
226
|
+
return `${outcome} ${lanes}, whose open pull requests conflict on: ${record.paths.join(', ')}`
|
|
190
227
|
}
|
|
191
228
|
|
|
192
229
|
const run_ship_overlap = { MAX_WAIT_ATTEMPTS, await_overlap, note }
|