@joshuafolkken/kit 1.1471.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { access, rm, writeFile } from 'node:fs/promises'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { git_command } from '#scripts/git/git-command'
|
|
4
|
+
import { acceptance_map } from '#scripts/review/acceptance-map'
|
|
5
|
+
import { live_evidence } from '#scripts/review/live-evidence'
|
|
6
|
+
import { removed_tests } from '#scripts/review/removed-tests'
|
|
7
|
+
import type { ShipArguments } from './run-ship-steps'
|
|
8
|
+
|
|
9
|
+
// **The pull-request body a run fills in before `josh ship`, written where ship reads it.** The
|
|
10
|
+
// acceptance-map and live-evidence refusals stopped about one ship per merge: their rows were printed
|
|
11
|
+
// at `run:prep`, long before the ship, and the lane child's ship carried no `--body-file` at all
|
|
12
|
+
// (joshuafolkken/kit#4168). The rows now land in a file in the work tree's own git directory — outside
|
|
13
|
+
// the tree, so no check sees it as a change — and `josh ship` reads it when `--body-file` is omitted,
|
|
14
|
+
// handing it to the preflight, `git -y` and a detached supervisor alike (`with_draft`).
|
|
15
|
+
// Nothing is satisfied for the run: each row still carries its pending ending and the evidence section is empty, so
|
|
16
|
+
// the same refusals stand until the run writes them.
|
|
17
|
+
|
|
18
|
+
// The PR body carrying the live-execution evidence `followup` gates the merge
|
|
19
|
+
// on, forwarded to `git -y` as a path because it holds commands and their output.
|
|
20
|
+
const BODY_FILE_OPTION = 'body-file' as const
|
|
21
|
+
const DRAFT_PREFIX = 'josh-ship-body-'
|
|
22
|
+
const DRAFT_SUFFIX = '.md'
|
|
23
|
+
const EXISTS_CODE = 'EEXIST'
|
|
24
|
+
const NO_GIT_DIRECTORY = 'no git directory to hold the ship body draft'
|
|
25
|
+
|
|
26
|
+
async function path_of(issue_number: string): Promise<string> {
|
|
27
|
+
const [git_directory] = await git_command.git_directories()
|
|
28
|
+
|
|
29
|
+
if (git_directory === undefined) throw new Error(NO_GIT_DIRECTORY)
|
|
30
|
+
|
|
31
|
+
return path.join(git_directory, `${DRAFT_PREFIX}${issue_number}${DRAFT_SUFFIX}`)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function is_exists_error(error: unknown): boolean {
|
|
35
|
+
return error instanceof Error && 'code' in error && error.code === EXISTS_CODE
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// The formats the preflight refuses on, as comments a rendered body hides: lanes that wrote the rows and
|
|
39
|
+
// the evidence in shapes of their own met them only at the refusal (joshuafolkken/kit#4478). They sit
|
|
40
|
+
// above the evidence heading, so their backticks are never read as that section's command.
|
|
41
|
+
const FORMAT_HINTS: ReadonlyArray<string> = [
|
|
42
|
+
acceptance_map.ROW_FORMAT,
|
|
43
|
+
live_evidence.EVIDENCE_FORMAT,
|
|
44
|
+
`when the change removes or renames a test, ${removed_tests.ROW_FORMAT}`,
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
function hint_line(format: string): string {
|
|
48
|
+
return `<!-- ${format} -->`
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function draft_text(acceptance_rows: string): string {
|
|
52
|
+
const hints = FORMAT_HINTS.map((format) => hint_line(format)).join('\n')
|
|
53
|
+
|
|
54
|
+
return `${acceptance_rows}\n\n${hints}\n\n${live_evidence.EVIDENCE_HEADING}\n`
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Written once: a draft the run has already filled in is never replaced by pending rows.
|
|
58
|
+
async function prepare(issue_number: string, acceptance_rows: string): Promise<string> {
|
|
59
|
+
const target = await path_of(issue_number)
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
await writeFile(target, draft_text(acceptance_rows), { flag: 'wx' })
|
|
63
|
+
} catch (error) {
|
|
64
|
+
if (!is_exists_error(error)) throw error
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return target
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async function existing(issue_number: string): Promise<string | undefined> {
|
|
71
|
+
const target = await path_of(issue_number)
|
|
72
|
+
|
|
73
|
+
try {
|
|
74
|
+
await access(target)
|
|
75
|
+
|
|
76
|
+
return target
|
|
77
|
+
} catch {
|
|
78
|
+
return undefined
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Removed once the pull request merged: keyed by issue number alone, a draft left in a git directory
|
|
83
|
+
// no lane close prunes (the main checkout's `.git`) would hand a reopened issue's ship the old body.
|
|
84
|
+
async function remove(issue_number: string): Promise<void> {
|
|
85
|
+
await rm(await path_of(issue_number), { force: true })
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function body_arguments(body_path: string | undefined): ReadonlyArray<string> {
|
|
89
|
+
return body_path === undefined ? [] : [`--${BODY_FILE_OPTION}`, body_path]
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// The ship's `--body-file`, or the draft when it was omitted and one exists.
|
|
93
|
+
async function with_draft(args: ShipArguments): Promise<ShipArguments> {
|
|
94
|
+
if (args.body_path !== undefined) return args
|
|
95
|
+
const draft = await existing(args.number)
|
|
96
|
+
|
|
97
|
+
return draft === undefined ? args : { ...args, body: body_arguments(draft), body_path: draft }
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const run_ship_body_draft = {
|
|
101
|
+
BODY_FILE_OPTION,
|
|
102
|
+
body_arguments,
|
|
103
|
+
existing,
|
|
104
|
+
path_of,
|
|
105
|
+
prepare,
|
|
106
|
+
remove,
|
|
107
|
+
with_draft,
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export { run_ship_body_draft }
|
|
@@ -1,19 +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 {
|
|
12
|
+
import { run_ship_infra_retry } from './run-ship-infra-retry'
|
|
13
|
+
import { run_ship_pre_detach_timed } from './run-ship-pre-detach-timed'
|
|
13
14
|
import { run_ship_probe } from './run-ship-probe'
|
|
14
15
|
import { run_ship_return } from './run-ship-return'
|
|
15
16
|
import { run_ship_stage, type Phase, type ShipState, type Stage } from './run-ship-stage'
|
|
16
17
|
import { run_ship_steps, type ShipArguments, type Step } from './run-ship-steps'
|
|
18
|
+
import { run_ship_stop_cause } from './run-ship-stop-cause'
|
|
17
19
|
|
|
18
20
|
// `josh ship "<title> #<N>"` — one call for the fixed commit-to-report region a run ships a change on.
|
|
19
21
|
// It runs `gate`, `git -y`, `followup` and `run:tail` internally, so no round trip re-bills a lane's
|
|
@@ -39,51 +41,17 @@ import { run_ship_steps, type ShipArguments, type Step } from './run-ship-steps'
|
|
|
39
41
|
// the agent ends at the hand-off instead of relaunching itself for the gate, a supervised ship that stops
|
|
40
42
|
// hands the stage back (`run-ship-return.ts`), and `--log <N>` prints the report it stopped on.
|
|
41
43
|
//
|
|
42
|
-
// The
|
|
43
|
-
// number is read off its tail for `run:tail`. Any further positionals are follow-up citations filed
|
|
44
|
-
// this run (`fullrun-steps.md` routes branch-2 filing before `ship`), forwarded to `run:tail` after the
|
|
45
|
-
// closed issue so `issue:cite` reports them too. A notify body — `--notify-message` or the
|
|
46
|
-
// shell-body-safe `--notify-message-file` — is forwarded to `followup` alone; the completion prose is
|
|
47
|
-
// composed before this command and passed straight through.
|
|
44
|
+
// The command line it takes is read in `run-ship-args.ts`.
|
|
48
45
|
|
|
49
46
|
const ARGV_OFFSET = 2
|
|
50
47
|
const SUCCESS_EXIT_CODE = 0
|
|
51
48
|
const FAILURE_EXIT_CODE = 1
|
|
52
|
-
const FIRST = 0
|
|
53
|
-
const NUMBER_GROUP = 1
|
|
54
|
-
const EXTRA_CITE_START = 1
|
|
55
|
-
// The issue reference at the tail of the title — `git -y` and `followup` read the whole string, and
|
|
56
|
-
// `run:tail` needs the number alone.
|
|
57
|
-
const TRAILING_ISSUE_PATTERN = /#([1-9]\d*)\s*$/u
|
|
58
|
-
// Both body forms `followup` documents, forwarded verbatim: the inline `--notify-message` and the
|
|
59
|
-
// shell-body-safe `--notify-message-file` a body naming a command or path must use (`followup.md`).
|
|
60
|
-
const NOTIFY_OPTIONS = ['notify-message', 'notify-message-file'] as const
|
|
61
|
-
// The PR body carrying the live-execution evidence `followup` gates the merge
|
|
62
|
-
// on, forwarded to `git -y` as a path because it holds commands and their output.
|
|
63
|
-
const BODY_FILE_OPTION = 'body-file'
|
|
64
49
|
const USAGE =
|
|
65
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>'
|
|
66
51
|
const NO_LOG_NOTE = 'no detached ship supervisor log for this issue'
|
|
67
52
|
const LANE_CHILD_DETACH_NOTE =
|
|
68
53
|
'lane child: shipping through the detached supervisor (--detach implied), so the end of this turn cannot kill it'
|
|
69
54
|
|
|
70
|
-
type NotifyValues = Partial<Record<(typeof NOTIFY_OPTIONS)[number], string>>
|
|
71
|
-
|
|
72
|
-
const OPTIONS = {
|
|
73
|
-
[NOTIFY_OPTIONS[0]]: { type: 'string' },
|
|
74
|
-
[NOTIFY_OPTIONS[1]]: { type: 'string' },
|
|
75
|
-
[BODY_FILE_OPTION]: { type: 'string' },
|
|
76
|
-
review: { type: 'boolean' },
|
|
77
|
-
// Hand the region to a detached supervisor (`run-ship-detach.ts`), print the
|
|
78
|
-
// report a stopped supervisor left, and carry follow-up citations as options so the supervisor's
|
|
79
|
-
// command line still ends with its title.
|
|
80
|
-
detach: { type: 'boolean' },
|
|
81
|
-
log: { type: 'string' },
|
|
82
|
-
cite: { type: 'string', multiple: true },
|
|
83
|
-
} as const
|
|
84
|
-
|
|
85
|
-
type ShipCommand = { kind: 'ship'; args: ShipArguments } | { kind: 'log'; number: string }
|
|
86
|
-
|
|
87
55
|
// What a resumed ship knows before its first stage: the record's path (absent outside a repository),
|
|
88
56
|
// the stages it says completed, and the repository's actual state (`run-ship-stage.ts` decides from it).
|
|
89
57
|
// `started` opens with the stages the record says this attempt started — a supervisor that ended
|
|
@@ -95,87 +63,7 @@ interface ShipContext {
|
|
|
95
63
|
started: Array<string>
|
|
96
64
|
}
|
|
97
65
|
|
|
98
|
-
|
|
99
|
-
// path-based body reaches `followup` exactly as passed.
|
|
100
|
-
function notify_arguments(values: NotifyValues): ReadonlyArray<string> {
|
|
101
|
-
return NOTIFY_OPTIONS.flatMap((option) => {
|
|
102
|
-
const value = values[option]
|
|
103
|
-
|
|
104
|
-
return value === undefined ? [] : [`--${option}`, value]
|
|
105
|
-
})
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
function body_arguments(path: string | undefined): ReadonlyArray<string> {
|
|
109
|
-
return path === undefined ? [] : [`--${BODY_FILE_OPTION}`, path]
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
const { PHASE } = run_ship_stage
|
|
113
|
-
|
|
114
|
-
function issue_number(title: string): string | undefined {
|
|
115
|
-
return TRAILING_ISSUE_PATTERN.exec(title)?.[NUMBER_GROUP]
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
interface ParsedValues extends NotifyValues {
|
|
119
|
-
[BODY_FILE_OPTION]?: string
|
|
120
|
-
review?: boolean
|
|
121
|
-
detach?: boolean
|
|
122
|
-
log?: string
|
|
123
|
-
cite?: Array<string>
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// A follow-up citation passed as a trailing positional is a bare issue number, so a stray flag is
|
|
127
|
-
// refused rather than forwarded to the wrong step.
|
|
128
|
-
function ship_args(
|
|
129
|
-
title: string,
|
|
130
|
-
rest: ReadonlyArray<string>,
|
|
131
|
-
values: ParsedValues,
|
|
132
|
-
): ShipArguments | undefined {
|
|
133
|
-
const number = issue_number(title)
|
|
134
|
-
const cites = [...rest, ...(values.cite ?? [])]
|
|
135
|
-
|
|
136
|
-
if (number === undefined || cites.some((token) => !issue_number_shape.is_issue_number(token))) {
|
|
137
|
-
return undefined
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
return {
|
|
141
|
-
title,
|
|
142
|
-
number,
|
|
143
|
-
notify: notify_arguments(values),
|
|
144
|
-
body: body_arguments(values[BODY_FILE_OPTION]),
|
|
145
|
-
body_path: values[BODY_FILE_OPTION],
|
|
146
|
-
cites,
|
|
147
|
-
is_review: values.review === true,
|
|
148
|
-
is_detach: values.detach === true,
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// `--log <N>` stands alone: a bare issue number and nothing to ship.
|
|
153
|
-
function log_command(number: string, positionals: ReadonlyArray<string>): ShipCommand | undefined {
|
|
154
|
-
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(number) && positionals.length === 0
|
|
155
|
-
? { kind: 'log', number }
|
|
156
|
-
: undefined
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
function command_of(
|
|
160
|
-
values: ParsedValues,
|
|
161
|
-
positionals: ReadonlyArray<string>,
|
|
162
|
-
): ShipCommand | undefined {
|
|
163
|
-
if (values.log !== undefined) return log_command(values.log, positionals)
|
|
164
|
-
|
|
165
|
-
const title = positionals[FIRST]
|
|
166
|
-
const args =
|
|
167
|
-
title === undefined ? undefined : ship_args(title, positionals.slice(EXTRA_CITE_START), values)
|
|
168
|
-
|
|
169
|
-
return args === undefined ? undefined : { kind: 'ship', args }
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// Numbers-only tail and a strict parse, so a title with no `#<N>` or a stray flag is refused rather
|
|
173
|
-
// than shipped past the wrong step.
|
|
174
|
-
function parse(argv: ReadonlyArray<string>): ShipCommand | undefined {
|
|
175
|
-
const parsed = cli_flags.arguments_of(argv, OPTIONS)
|
|
176
|
-
|
|
177
|
-
return parsed === undefined ? undefined : command_of(parsed.values, parsed.positionals)
|
|
178
|
-
}
|
|
66
|
+
const { PHASE, STAGE } = run_ship_stage
|
|
179
67
|
|
|
180
68
|
// Every stage that ran is timed into the lane ledger, failed ones included — a stage that stopped the
|
|
181
69
|
// ship cost the lane its time as well. The append is local and best-effort, so it adds no wait.
|
|
@@ -187,15 +75,26 @@ async function record_timed(step: Step, issue: string, elapsed_ms: number): Prom
|
|
|
187
75
|
await lane_ledger.record_stage({ stage: step.stage, elapsed_ms, issue: Number(issue) })
|
|
188
76
|
}
|
|
189
77
|
|
|
190
|
-
async function
|
|
78
|
+
async function run_once(step: Step, args: ShipArguments, state: ShipState): Promise<ShipSection> {
|
|
191
79
|
const started_ms = performance.now()
|
|
192
80
|
const result = await step.run(args, state)
|
|
193
81
|
const elapsed_ms = performance.now() - started_ms
|
|
194
82
|
|
|
195
83
|
if (result.is_skipped !== true) await record_timed(step, args.number, elapsed_ms)
|
|
196
|
-
const section = { header: step.header, body: result.out, code: result.code }
|
|
197
84
|
|
|
198
|
-
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
|
+
})
|
|
199
98
|
}
|
|
200
99
|
|
|
201
100
|
async function emit_phase(
|
|
@@ -238,6 +137,12 @@ async function settle(
|
|
|
238
137
|
})
|
|
239
138
|
}
|
|
240
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
|
+
|
|
241
146
|
// One stage: passed over when the record and the state say it is done, run and recorded otherwise.
|
|
242
147
|
async function run_stage(
|
|
243
148
|
step: Step,
|
|
@@ -258,6 +163,8 @@ async function run_stage(
|
|
|
258
163
|
const section = await run_step(step, args, context.state)
|
|
259
164
|
|
|
260
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())
|
|
261
168
|
|
|
262
169
|
return section
|
|
263
170
|
}
|
|
@@ -271,19 +178,22 @@ async function open_context(args: ShipArguments): Promise<ShipContext> {
|
|
|
271
178
|
const done = target === undefined ? new Set<string>() : run_ship_stage.read_done(target)
|
|
272
179
|
const started = target === undefined ? [] : [...run_ship_stage.read_started(target)]
|
|
273
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
|
+
|
|
274
186
|
return { target, done, state, started }
|
|
275
187
|
}
|
|
276
188
|
|
|
277
189
|
// Every stop goes to the lane ledger — supervised, in an agent's own turn, or a lane child's preflight
|
|
278
|
-
// before the hand-off — so `lane:stats` can say how long a ship stayed stopped for each reason.
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
conflicts?: ReadonlyArray<string>,
|
|
283
|
-
): Promise<void> {
|
|
284
|
-
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)
|
|
285
194
|
|
|
286
|
-
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) })
|
|
287
197
|
}
|
|
288
198
|
|
|
289
199
|
// A detached supervisor hands the stopped stage back (`run-ship-return.ts`); a
|
|
@@ -295,19 +205,13 @@ async function stopped(
|
|
|
295
205
|
step: Step,
|
|
296
206
|
context: ShipContext,
|
|
297
207
|
): Promise<ReadonlyArray<ShipSection>> {
|
|
298
|
-
const
|
|
208
|
+
const failed = sections.at(-1)
|
|
299
209
|
|
|
300
|
-
await record_stop(args, step.stage,
|
|
210
|
+
await record_stop(args, step.stage, failed)
|
|
301
211
|
|
|
302
212
|
if (run_ship_detach.is_supervised()) {
|
|
303
|
-
const resume = run_ship_next.resume_of(args)
|
|
304
|
-
|
|
305
213
|
record(context.target, run_ship_stage.end_attempt)
|
|
306
|
-
await run_ship_return.
|
|
307
|
-
args.number,
|
|
308
|
-
step.stage,
|
|
309
|
-
conflicts === undefined ? resume : { ...resume, conflicts },
|
|
310
|
-
)
|
|
214
|
+
await run_ship_return.hand_back(args, step.stage, failed)
|
|
311
215
|
}
|
|
312
216
|
|
|
313
217
|
return sections
|
|
@@ -379,23 +283,35 @@ function should_detach(args: ShipArguments): boolean {
|
|
|
379
283
|
return !run_ship_detach.is_supervised() && lane_child_marker.is_child_of(process.cwd())
|
|
380
284
|
}
|
|
381
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
|
+
|
|
382
293
|
// The preflight is deterministic and fast, so it runs here, in the agent's own turn, before the
|
|
383
294
|
// hand-off — a stop it finds is fixed by the same session instead of relaunching one from the
|
|
384
|
-
// supervisor. Only the slow stages go to the supervisor, which re-asks the preflight itself. The
|
|
385
|
-
//
|
|
386
|
-
// supervisor's gate runs them again rather than passing over them.
|
|
295
|
+
// supervisor. Only the slow stages go to the supervisor, which re-asks the preflight itself. The fast
|
|
296
|
+
// checks (`run-ship-pre-detach.ts`) follow it here for the same reason; they are not a stage, so the
|
|
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.
|
|
387
305
|
async function pre_detach_sections(args: ShipArguments): Promise<ReadonlyArray<ShipSection>> {
|
|
388
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 }
|
|
389
309
|
|
|
390
310
|
if (preflight.code !== SUCCESS_EXIT_CODE) {
|
|
391
|
-
await record_stop(args, run_ship_steps.PREFLIGHT_STEP.stage)
|
|
392
|
-
|
|
393
|
-
return [preflight]
|
|
311
|
+
await record_stop(args, run_ship_steps.PREFLIGHT_STEP.stage, with_checks(preflight, checks))
|
|
394
312
|
}
|
|
395
313
|
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
return [preflight, { header: run_ship.PRE_DETACH_HEADER, body: result.out, code: result.code }]
|
|
314
|
+
return [checks, preflight]
|
|
399
315
|
}
|
|
400
316
|
|
|
401
317
|
async function detach_after_preflight(args: ShipArguments): Promise<number> {
|
|
@@ -444,7 +360,7 @@ async function run_ship_command(args: ShipArguments): Promise<number> {
|
|
|
444
360
|
}
|
|
445
361
|
|
|
446
362
|
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
447
|
-
const command = parse(argv)
|
|
363
|
+
const command = run_ship_args.parse(argv)
|
|
448
364
|
|
|
449
365
|
if (command === undefined) {
|
|
450
366
|
console.error(USAGE)
|
|
@@ -454,7 +370,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
454
370
|
|
|
455
371
|
return command.kind === 'log'
|
|
456
372
|
? await print_log(command.number)
|
|
457
|
-
: await run_ship_command(command.args)
|
|
373
|
+
: await run_ship_command(await run_ship_body_draft.with_draft(command.args))
|
|
458
374
|
}
|
|
459
375
|
|
|
460
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 {
|
|
@@ -183,6 +192,16 @@ function current_record(repository: string, number: string): ShipRecord | undefi
|
|
|
183
192
|
return record?.launch_id === process.env[LAUNCH_ID_KEY] ? record : undefined
|
|
184
193
|
}
|
|
185
194
|
|
|
195
|
+
// When the ship for `number` that is still running was launched — `undefined` where none is running or
|
|
196
|
+
// its record carries no launch time. `run-ship-overlap.ts` orders two running ships by it.
|
|
197
|
+
function running_since(repository: string, number: string): number | undefined {
|
|
198
|
+
const record = read_record(repository, number)
|
|
199
|
+
|
|
200
|
+
return record !== undefined && result_of(record, process_identity.read_start) === 'running'
|
|
201
|
+
? record.launched_at
|
|
202
|
+
: undefined
|
|
203
|
+
}
|
|
204
|
+
|
|
186
205
|
function is_pending(record: ShipRecord | undefined): boolean {
|
|
187
206
|
return record !== undefined && record.pid === undefined
|
|
188
207
|
}
|
|
@@ -362,6 +381,7 @@ const run_ship_detach = {
|
|
|
362
381
|
last_launch,
|
|
363
382
|
log_path,
|
|
364
383
|
read_log,
|
|
384
|
+
running_since,
|
|
365
385
|
supervisor_argv,
|
|
366
386
|
}
|
|
367
387
|
|
|
@@ -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,19 +103,38 @@ 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 {
|
|
104
120
|
return `Resolve the conflict with origin/main in ${conflicts.join(', ')} (the merge is left in progress: remove the conflict markers in those files), then`
|
|
105
121
|
}
|
|
106
122
|
|
|
123
|
+
// A prompt that already carries the failed output points at it; only one without has the
|
|
124
|
+
// session read the stopped report first.
|
|
125
|
+
function fix_step(issue: string, stage: Stage, is_excerpted: boolean): string {
|
|
126
|
+
if (is_excerpted) return `Fix the ${stage} failure shown in the output below`
|
|
127
|
+
|
|
128
|
+
return `Read the stopped report with \`${COMMAND.LOG} ${issue}\`, fix the ${stage} failure`
|
|
129
|
+
}
|
|
130
|
+
|
|
107
131
|
// Two lines' worth: read the stopped report, then the one command that resumes after the fix.
|
|
108
|
-
function next_step(issue: string, stage: Stage, resume: ShipResume): string {
|
|
132
|
+
function next_step(issue: string, stage: Stage, resume: ShipResume, is_excerpted = false): string {
|
|
109
133
|
const conflicts = resume.conflicts ?? []
|
|
110
134
|
|
|
111
|
-
if (conflicts.length > 0) return `${conflict_step(conflicts)} ${
|
|
135
|
+
if (conflicts.length > 0) return `${conflict_step(conflicts)} ${after_fix(stage, resume)}`
|
|
112
136
|
|
|
113
|
-
return
|
|
137
|
+
return `${fix_step(issue, stage, is_excerpted)}, then ${after_fix(stage, resume)}`
|
|
114
138
|
}
|
|
115
139
|
|
|
116
140
|
const run_ship_next = { COMMAND, next_step, quoted, resume_of }
|