@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
|
@@ -4,16 +4,18 @@ import { git_command } from '#scripts/git/git-command'
|
|
|
4
4
|
import { main_merge, type MergeOutcome } from '#scripts/git/main-merge'
|
|
5
5
|
import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
6
6
|
import { error_text } from '#scripts/lib/error-message'
|
|
7
|
+
import { run_ship_overlap } from './run-ship-overlap'
|
|
7
8
|
import { run_ship_scoped } from './run-ship-scoped'
|
|
9
|
+
import type { Cause } from './run-ship-stop-cause'
|
|
8
10
|
|
|
9
11
|
// `josh ship` keeps the branch current with the default branch itself: a default branch that moves
|
|
10
12
|
// while the pull request opens and CI runs would otherwise stop the followup as `interrupted`, though
|
|
11
13
|
// merging the default branch again usually resolves it.
|
|
12
14
|
//
|
|
13
15
|
// So the merge happens mechanically: once before the commit (`sync_stage`), and once when
|
|
14
|
-
// the followup fails on a pull request GitHub reports `DIRTY` (`followup_stage`).
|
|
15
|
-
//
|
|
16
|
-
// resumed session goes straight to them.
|
|
16
|
+
// the followup fails on a pull request GitHub reports `DIRTY` (`followup_stage`). A conflict only on
|
|
17
|
+
// generated files is regenerated by the merge itself (`main-merge-regenerate.ts`); any other conflict
|
|
18
|
+
// stops the ship as `conflict`, naming the unmerged paths so the resumed session goes straight to them.
|
|
17
19
|
|
|
18
20
|
const should_forward_stderr = true
|
|
19
21
|
const SUCCESS_EXIT_CODE = 0
|
|
@@ -28,10 +30,14 @@ const MERGED_PREFIX = 'merged '
|
|
|
28
30
|
|
|
29
31
|
// A stage's result, plus the paths a stopped merge left unmerged — carried to the stop prompt.
|
|
30
32
|
// `is_skipped` marks a stage that found nothing to do — a review round with nothing to review, a gate
|
|
31
|
-
// that reused a green record — so its few seconds are not timed as a run of it.
|
|
33
|
+
// that reused a green record — so its few seconds are not timed as a run of it. `preconditions` names
|
|
34
|
+
// the kinds of the preconditions a stopped preflight found unmet (`run-ship-preflight.ts`). `cause` is the
|
|
35
|
+
// one a stopped review round tagged its stop with (`run-ship-stop-cause.ts`).
|
|
32
36
|
interface StepResult extends JoshResult {
|
|
33
37
|
is_skipped?: boolean
|
|
34
38
|
conflicts?: ReadonlyArray<string>
|
|
39
|
+
preconditions?: ReadonlyArray<string>
|
|
40
|
+
cause?: Cause
|
|
35
41
|
}
|
|
36
42
|
|
|
37
43
|
async function josh(argv: ReadonlyArray<string>): Promise<JoshResult> {
|
|
@@ -66,12 +72,19 @@ function sync_note(outcome: Exclude<MergeOutcome, { kind: 'conflict' }>): string
|
|
|
66
72
|
// touches, and once that work is committed the followup merges again on a clean tree. A merge that changed
|
|
67
73
|
// the tree is checked by the gate stage that follows, so the commit never carries
|
|
68
74
|
// an unchecked merge and the gate's record names the merge base the push carries.
|
|
69
|
-
|
|
75
|
+
//
|
|
76
|
+
// The merge waits first for any lane whose open pull request changes the same paths
|
|
77
|
+
// (`run-ship-overlap.ts`), so it brings that pull request in before the gate rather than meeting it
|
|
78
|
+
// as `DIRTY` after CI.
|
|
79
|
+
async function sync_stage(issue: string): Promise<StepResult> {
|
|
80
|
+
const waited = run_ship_overlap.note(await run_ship_overlap.await_overlap(issue))
|
|
70
81
|
const outcome = await merge_outcome()
|
|
71
82
|
|
|
72
|
-
if (outcome.kind === 'conflict') return conflict_result(outcome.files,
|
|
83
|
+
if (outcome.kind === 'conflict') return conflict_result(outcome.files, waited)
|
|
84
|
+
|
|
85
|
+
const out = [waited, sync_note(outcome)].filter((line) => line !== '').join('\n')
|
|
73
86
|
|
|
74
|
-
return { code: SUCCESS_EXIT_CODE, out
|
|
87
|
+
return { code: SUCCESS_EXIT_CODE, out }
|
|
75
88
|
}
|
|
76
89
|
|
|
77
90
|
// Any read that fails answers "not conflicting": the followup failure then stands as it was.
|
|
@@ -109,21 +122,53 @@ async function merge_again(title: string, failed: JoshResult): Promise<StepResul
|
|
|
109
122
|
return await push_merged(title)
|
|
110
123
|
}
|
|
111
124
|
|
|
112
|
-
|
|
125
|
+
// Whether the ship waits on the merge alone, for its stage record (`run_ship_stage.mark_merge_waiting`).
|
|
126
|
+
type WaitMark = (is_merge_waiting: boolean) => void
|
|
127
|
+
|
|
128
|
+
function ignore_wait(): void {
|
|
129
|
+
// A ship with no stage record has no lane place to free.
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// The wait is marked only while `josh followup` runs: the merge again and its gate run unmarked, so a
|
|
133
|
+
// lane gating here still holds its place (joshuafolkken/kit#4466).
|
|
134
|
+
async function marked_followup(
|
|
113
135
|
title: string,
|
|
114
136
|
notify: ReadonlyArray<string>,
|
|
115
|
-
|
|
137
|
+
mark: WaitMark,
|
|
138
|
+
): Promise<JoshResult> {
|
|
139
|
+
mark(true)
|
|
140
|
+
|
|
141
|
+
try {
|
|
142
|
+
return await josh(['followup', title, ...notify])
|
|
143
|
+
} finally {
|
|
144
|
+
mark(false)
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async function followup_attempt(
|
|
149
|
+
title: string,
|
|
150
|
+
notify: ReadonlyArray<string>,
|
|
151
|
+
mark: WaitMark,
|
|
152
|
+
retries: number,
|
|
116
153
|
): Promise<StepResult> {
|
|
117
|
-
const result = await
|
|
154
|
+
const result = await marked_followup(title, notify, mark)
|
|
118
155
|
|
|
119
156
|
if (result.code === SUCCESS_EXIT_CODE || retries >= MAX_MERGE_RETRIES) return result
|
|
120
157
|
|
|
121
158
|
const stop = await merge_again(title, result)
|
|
122
159
|
|
|
123
|
-
return stop ?? (await
|
|
160
|
+
return stop ?? (await followup_attempt(title, notify, mark, retries + 1))
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
async function followup_stage(
|
|
164
|
+
title: string,
|
|
165
|
+
notify: ReadonlyArray<string>,
|
|
166
|
+
mark: WaitMark = ignore_wait,
|
|
167
|
+
): Promise<StepResult> {
|
|
168
|
+
return await followup_attempt(title, notify, mark, 0)
|
|
124
169
|
}
|
|
125
170
|
|
|
126
171
|
const run_ship_sync = { CONFLICT_NOTE, MAX_MERGE_RETRIES, followup_stage, sync_stage }
|
|
127
172
|
|
|
128
|
-
export type { StepResult }
|
|
173
|
+
export type { StepResult, WaitMark }
|
|
129
174
|
export { run_ship_sync }
|
|
@@ -10,6 +10,9 @@
|
|
|
10
10
|
// composite ends at the failure, and the report names the step that failed so the run reads only it.
|
|
11
11
|
|
|
12
12
|
import { run_section, type Section } from '#scripts/run/run-section'
|
|
13
|
+
import { run_tail } from '#scripts/run/run-tail'
|
|
14
|
+
import type { Cause } from './run-ship-stop-cause'
|
|
15
|
+
import type { StepResult } from './run-ship-sync'
|
|
13
16
|
|
|
14
17
|
const PREFLIGHT_HEADER = '=== preflight ==='
|
|
15
18
|
const PRE_DETACH_HEADER = '=== pre-detach checks ==='
|
|
@@ -26,14 +29,38 @@ const STOPPED_PREFIX = 'stopped at: '
|
|
|
26
29
|
const SKIPPED_BODY = 'skipped — already done'
|
|
27
30
|
|
|
28
31
|
type ShipSection = Section & {
|
|
32
|
+
// The stage's standard output alone, the text an infrastructure stop is read on.
|
|
33
|
+
out?: string
|
|
29
34
|
// The paths a stopped merge left unmerged, handed to the stop prompt.
|
|
30
35
|
conflicts?: ReadonlyArray<string>
|
|
36
|
+
// The kinds of the preconditions a stopped preflight found unmet, recorded with the stop.
|
|
37
|
+
preconditions?: ReadonlyArray<string>
|
|
38
|
+
// The cause a stopped review round tagged its stop with, recorded with the stop.
|
|
39
|
+
cause?: Cause
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// A stage's result under its header, carrying the conflicts, the preconditions and the cause only where
|
|
43
|
+
// it has them.
|
|
44
|
+
function section_of(header: string, result: StepResult): ShipSection {
|
|
45
|
+
const { conflicts, preconditions, cause } = result
|
|
46
|
+
|
|
47
|
+
return {
|
|
48
|
+
header,
|
|
49
|
+
body: run_tail.section_body(result.out, result.err, result.code),
|
|
50
|
+
code: result.code,
|
|
51
|
+
out: result.out,
|
|
52
|
+
...(conflicts !== undefined && { conflicts }),
|
|
53
|
+
...(preconditions !== undefined && { preconditions }),
|
|
54
|
+
...(cause !== undefined && { cause }),
|
|
55
|
+
}
|
|
31
56
|
}
|
|
32
57
|
|
|
33
58
|
// The step that stopped the ship, or `undefined` when every executed step was green. Because the
|
|
34
|
-
// composite breaks at the first failure, this is the last section whenever one exists.
|
|
59
|
+
// composite breaks at the first failure, this is the last section whenever one exists. The pre-detach
|
|
60
|
+
// report runs on past a red check and prints the preflight refusal last (joshuafolkken/kit#4478), so
|
|
61
|
+
// the last failed section is the one named.
|
|
35
62
|
function failed_section(sections: ReadonlyArray<ShipSection>): ShipSection | undefined {
|
|
36
|
-
return sections.
|
|
63
|
+
return sections.findLast((section) => section.code !== run_section.SUCCESS_EXIT_CODE)
|
|
37
64
|
}
|
|
38
65
|
|
|
39
66
|
// The executed steps under their headers, closed with the name of the step that stopped the run so the
|
|
@@ -64,6 +91,7 @@ const run_ship = {
|
|
|
64
91
|
exit_code: run_section.exit_code_of,
|
|
65
92
|
failed_section,
|
|
66
93
|
format_report,
|
|
94
|
+
section_of,
|
|
67
95
|
}
|
|
68
96
|
|
|
69
97
|
export type { ShipSection }
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { backlog_drive_restore } from '#scripts/backlog/backlog-drive-restore'
|
|
4
2
|
import { issue_merged } from '#scripts/issue/issue-merged'
|
|
5
3
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
@@ -49,6 +47,4 @@ async function sweep(): Promise<void> {
|
|
|
49
47
|
|
|
50
48
|
const run_tidy_cli = { sweep }
|
|
51
49
|
|
|
52
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await sweep()
|
|
53
|
-
|
|
54
50
|
export { run_tidy_cli }
|
|
@@ -3,6 +3,7 @@ import { git_stash } from '#scripts/git/stash/git-stash'
|
|
|
3
3
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
4
4
|
import { lane_close } from '#scripts/lane/lane-close'
|
|
5
5
|
import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
|
|
6
|
+
import { lane_residents } from '#scripts/lane/lane-residents'
|
|
6
7
|
import { error_text } from '#scripts/lib/error-message'
|
|
7
8
|
import { run_hold } from '#scripts/run/hold/run-hold'
|
|
8
9
|
import { run_tidy, type Outcome, type Verdict } from './run-tidy'
|
|
@@ -72,6 +73,8 @@ async function lane_verdict(lane: LaneInfo, hold_path: string): Promise<Verdict>
|
|
|
72
73
|
async function close(issue: string, hold_path: string): Promise<Verdict> {
|
|
73
74
|
const outcome = await lane_close.close_lane(issue)
|
|
74
75
|
|
|
76
|
+
lane_residents.report(outcome.residents, session_cite.issue(issue))
|
|
77
|
+
|
|
75
78
|
if (outcome.kind !== CLOSED_KIND) return run_tidy.keep(INCOMPLETE_REASON)
|
|
76
79
|
|
|
77
80
|
run_hold.release_hold(hold_path)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { run_tidy_cli } from './run-tidy-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh run:tidy` entry, kept apart from `run-tidy-cli.ts` because `run:hold` imports that one: a
|
|
6
|
+
// bundle is one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186). The sweep takes no arguments and never sets an exit code.
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await run_tidy_cli.sweep()
|
|
@@ -1,25 +1,24 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { randomUUID } from 'node:crypto'
|
|
3
1
|
import { fileURLToPath } from 'node:url'
|
|
4
2
|
import type { AgentProfile, AgentProvider } from '#scripts/agent/agent-role-profile'
|
|
5
3
|
import { backlog_budget } from '#scripts/backlog/backlog-budget'
|
|
4
|
+
import { lane_session_broker } from '#scripts/lane/lane-session-broker'
|
|
6
5
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
6
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
7
7
|
import { telegram_notify } from '#scripts/notify/telegram-notify'
|
|
8
8
|
import { run_carry, type CarryRead } from '#scripts/run/carry/run-carry'
|
|
9
|
-
import { run_event_setup } from '#scripts/run/event/run-event-setup'
|
|
10
9
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
11
10
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
12
|
-
import { run_headless } from '#scripts/run/run-headless'
|
|
13
11
|
import { run_stranded_detect, type WatchedRun } from '#scripts/run/run-stranded-detect'
|
|
14
12
|
import { run_wake, type WakeStopReason, type WakeTidyResult } from './run-wake'
|
|
15
13
|
import { run_wake_await } from './run-wake-await'
|
|
14
|
+
import { run_wake_code } from './run-wake-code'
|
|
16
15
|
import { run_wake_describe, type WakeContext } from './run-wake-describe'
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import { run_wake_loop, type LoopPorts, type LoopStop } from './run-wake-loop'
|
|
16
|
+
import { run_wake_loop, type LoopStop } from './run-wake-loop'
|
|
17
|
+
import { run_wake_ports } from './run-wake-ports'
|
|
20
18
|
import { run_wake_session, type LaunchResult } from './run-wake-session'
|
|
21
19
|
import { run_wake_stop } from './run-wake-stop'
|
|
22
20
|
import { run_wake_supervise } from './run-wake-supervise'
|
|
21
|
+
import { run_wake_takeover, type TakeoverResult } from './run-wake-takeover'
|
|
23
22
|
|
|
24
23
|
// `josh run:wake --start | --list | --stop | --loop` — the supervisor that continues a cut
|
|
25
24
|
// `backlogrun` or `queue` without a person retyping the keyword. **Which invocations it may continue
|
|
@@ -29,24 +28,22 @@ import { run_wake_supervise } from './run-wake-supervise'
|
|
|
29
28
|
// The stdout/stderr split is the contract every `run:*` command shares: exactly one verdict token on
|
|
30
29
|
// stdout on every path, the reason and the advice on stderr, so a loop branches on one token.
|
|
31
30
|
//
|
|
32
|
-
// **`--start` and `--loop` are two halves of one thing.** `--start` spawns
|
|
31
|
+
// **`--start` and `--loop` are two halves of one thing.** `--start` spawns the command's entry detached
|
|
33
32
|
// with `--loop` and returns immediately, which is what leaves the supervisor outside the conversation;
|
|
34
33
|
// `--loop` is the body, and running it in the foreground is how a person watches what it does.
|
|
35
34
|
|
|
36
35
|
const SUCCESS_EXIT_CODE = 0
|
|
37
36
|
const FAILURE_EXIT_CODE = 1
|
|
38
|
-
const ARGV_OFFSET = 2
|
|
39
37
|
const ONE_GROUP = 1
|
|
40
|
-
|
|
41
|
-
//
|
|
42
|
-
// supervisor.
|
|
43
|
-
const INTERVAL_PATTERN = /^[1-9]\d*$/u
|
|
38
|
+
// The interval is whole and positive (`cli_flags.to_positive`): a zero interval is a busy loop against
|
|
39
|
+
// the temp directory, not a faster supervisor.
|
|
44
40
|
// **Bounded above as well as below, and for the same reason.** `setTimeout` clamps any delay past
|
|
45
41
|
// 2^31−1 ms to *one millisecond*, so a number large enough to look like "poll rarely" produces exactly
|
|
46
42
|
// the busy loop the lower bound exists to prevent. An hour is far past any useful polling interval and
|
|
47
43
|
// nowhere near the clamp.
|
|
48
44
|
const MAX_INTERVAL_SECONDS = 3600
|
|
49
|
-
|
|
45
|
+
// The command's entry, not this module: the guard that runs `main` lives in `run-wake-main.ts`.
|
|
46
|
+
const SCRIPT_PATH = fileURLToPath(new URL('run-wake-main.ts', import.meta.url))
|
|
50
47
|
|
|
51
48
|
const STARTED_VERDICT = 'started'
|
|
52
49
|
const RUNNING_VERDICT = 'running'
|
|
@@ -57,13 +54,6 @@ const NONE_VERDICT = 'none'
|
|
|
57
54
|
const UNKNOWN_VERDICT = 'unknown'
|
|
58
55
|
const FAILED_VERDICT = 'failed'
|
|
59
56
|
|
|
60
|
-
// **The note covers both ways `wake_argv` answers `undefined`**, because it cannot tell them apart and
|
|
61
|
-
// a message that named only the first would accuse a legitimate invocation of carrying unsafe text.
|
|
62
|
-
// The second is the one a person actually meets: a `queue` whose references carry a `owner/repo#`
|
|
63
|
-
// prefix is a grammar this supervisor does not rebuild, and `queue.md` → "The session boundary" is why
|
|
64
|
-
// such a queue begins no record in the first place.
|
|
65
|
-
const UNSAFE_INVOCATION_NOTE =
|
|
66
|
-
'the carried invocation is not one this supervisor can continue — it is neither a backlogrun nor a queue it can rebuild, or it carries text that may not be passed to a command line'
|
|
67
57
|
// The command rather than one entry point: the supervisor continues a `queue` as readily as a
|
|
68
58
|
// `backlogrun`, and a warning that named the wrong one would send the reader looking at a run that is
|
|
69
59
|
// not the one that stopped.
|
|
@@ -82,12 +72,21 @@ const WARNING_RECOVERY = `Check the wake command, then restart with \`pnpm josh
|
|
|
82
72
|
const STOP_BODIES: Record<WakeStopReason, string | undefined> = {
|
|
83
73
|
ended: undefined,
|
|
84
74
|
stopped: undefined,
|
|
75
|
+
reload: undefined,
|
|
85
76
|
failed: 'The supervisor could not continue the run and has stopped.',
|
|
86
77
|
unreadable:
|
|
87
78
|
'The carry record could not be read, so the supervisor stopped rather than guess at it.',
|
|
88
79
|
}
|
|
89
80
|
const NO_PROFILE_NOTE = 'the scheduler profile could not be resolved'
|
|
81
|
+
const RELOAD_FAILED_NOTE =
|
|
82
|
+
"The supervisor's code changed, but the supervisor to replace it did not start"
|
|
83
|
+
const TAKEOVER_NOTES: Record<Exclude<TakeoverResult, 'taken'>, string> = {
|
|
84
|
+
died: 'it exited before it claimed the run',
|
|
85
|
+
unclaimed: 'it did not claim the run in time, so it was stopped',
|
|
86
|
+
}
|
|
90
87
|
const SUPERSEDED_RESULT: WakeTidyResult = 'superseded'
|
|
88
|
+
const REMOVED_RESULT: WakeTidyResult = 'removed'
|
|
89
|
+
const STOPPED_STOP: LoopStop = { reason: 'stopped', note: undefined }
|
|
91
90
|
const SUPERSEDED_NOTE =
|
|
92
91
|
'another supervisor now holds the record, so it was left alone; this loop is the superseded one'
|
|
93
92
|
|
|
@@ -115,17 +114,15 @@ function usage(): number {
|
|
|
115
114
|
return FAILURE_EXIT_CODE
|
|
116
115
|
}
|
|
117
116
|
|
|
118
|
-
|
|
119
|
-
console.error(`wake: ${note}`)
|
|
120
|
-
}
|
|
117
|
+
const { note_to_stderr } = run_wake_ports
|
|
121
118
|
|
|
122
119
|
function to_interval_ms(value: string | boolean | undefined): number | undefined {
|
|
123
120
|
if (typeof value !== 'string') return backlog_budget.OFFER_INTERVAL_MS
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
const seconds = Number(value)
|
|
121
|
+
const seconds = cli_flags.to_positive(value)
|
|
127
122
|
|
|
128
|
-
return seconds
|
|
123
|
+
return seconds === undefined || seconds > MAX_INTERVAL_SECONDS
|
|
124
|
+
? undefined
|
|
125
|
+
: seconds * MS_PER_SECOND
|
|
129
126
|
}
|
|
130
127
|
|
|
131
128
|
// Exactly one verb, never a guessed order between two.
|
|
@@ -154,56 +151,6 @@ function refuse_without_carry(kind: CarryRead['kind']): number {
|
|
|
154
151
|
return report(NONE_VERDICT, FAILURE_EXIT_CODE)
|
|
155
152
|
}
|
|
156
153
|
|
|
157
|
-
// **A session that started is said on the stream.** The driver's `waiting on judgment` is the moment it
|
|
158
|
-
// asked; from here a session is at work on the answer, until the supervisor's next hand-off.
|
|
159
|
-
function say_session_running(context: WakeContext): void {
|
|
160
|
-
run_event_setup.emit_to(context.event_target, run_event_setup.STAGE.SESSION, new Date())
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
function wake_session(
|
|
164
|
-
context: WakeContext,
|
|
165
|
-
invocation: string,
|
|
166
|
-
profile: AgentProfile,
|
|
167
|
-
session: { id: string; material: string },
|
|
168
|
-
): LaunchResult {
|
|
169
|
-
const built = run_wake_session.wake_argv(invocation, profile, context.worktree, session)
|
|
170
|
-
|
|
171
|
-
if (built === undefined) return { kind: 'failed', note: UNSAFE_INVOCATION_NOTE }
|
|
172
|
-
if (built.kind === 'rejected') return { kind: 'failed', note: built.note }
|
|
173
|
-
|
|
174
|
-
// The headless mark is what lets the stop hook hold this session's turn open while its lanes run —
|
|
175
|
-
// under `claude -p` a turn-end is the process's end (`run-headless.ts`).
|
|
176
|
-
const environment = run_headless.environment()
|
|
177
|
-
const target = { cwd: context.worktree, env: environment, log_path: context.log_target }
|
|
178
|
-
const result = run_wake_session.launch({ argv: built.argv, ...target, profile }, note_to_stderr)
|
|
179
|
-
|
|
180
|
-
if (result.kind === 'launched') say_session_running(context)
|
|
181
|
-
|
|
182
|
-
return result
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// **A record this supervisor owns itself is not a session at work.** A failed driver leaves the record
|
|
186
|
-
// adopted for this process, so reading that owner as live would have every restarted pass wait on
|
|
187
|
-
// itself and never drive again.
|
|
188
|
-
function ports_for(context: WakeContext, profile: AgentProfile): LoopPorts {
|
|
189
|
-
return {
|
|
190
|
-
read_carry: () => run_carry.read_carry(context.carry_target),
|
|
191
|
-
is_owner_live: (read) => read.kind === 'carried' && run_carry.is_held_by_another(read.carry),
|
|
192
|
-
has_work: async () => true,
|
|
193
|
-
new_session_id: () => randomUUID(),
|
|
194
|
-
hand_off: () => {
|
|
195
|
-
run_wake_handoff.hand_off(context.carry_target)
|
|
196
|
-
},
|
|
197
|
-
drive: async () => await run_wake_driver.drive(context.carry_target),
|
|
198
|
-
wake: (invocation, session_id, material) =>
|
|
199
|
-
wake_session(context, invocation, profile, { id: session_id, material }),
|
|
200
|
-
sleep: async (milliseconds) => {
|
|
201
|
-
await new Promise((resolve) => setTimeout(resolve, milliseconds))
|
|
202
|
-
},
|
|
203
|
-
now: () => new Date(),
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
154
|
// The log is named in the warning rather than only in `--list`, because the person reading a warning
|
|
208
155
|
// at three in the morning is the one who needs to know where to look next.
|
|
209
156
|
function log_hint(context: WakeContext): string {
|
|
@@ -256,7 +203,7 @@ async function record_failure(
|
|
|
256
203
|
}
|
|
257
204
|
|
|
258
205
|
// **Only a failed wake exits non-zero; `unreadable` warns but exits zero.** The
|
|
259
|
-
// verdict-and-exit-code table in `docs/josh-commands-
|
|
206
|
+
// verdict-and-exit-code table in `docs/josh-commands-run.md` → `run:wake` is a contract callers branch on,
|
|
260
207
|
// and what that one needs is the notification, not a different exit code.
|
|
261
208
|
function exit_code_of(reason: WakeStopReason): number {
|
|
262
209
|
return reason === run_wake_loop.FAILED_REASON ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
|
|
@@ -317,8 +264,12 @@ function start_for_launch(git_directory: string, provider: AgentProvider): Launc
|
|
|
317
264
|
return launch_supervisor(context_of(git_directory), undefined, resolved.profile)
|
|
318
265
|
}
|
|
319
266
|
|
|
320
|
-
function spawn_supervisor(
|
|
321
|
-
|
|
267
|
+
function spawn_supervisor(
|
|
268
|
+
context: WakeContext,
|
|
269
|
+
interval: string | undefined,
|
|
270
|
+
profile: AgentProfile | undefined,
|
|
271
|
+
): number {
|
|
272
|
+
const result = launch_supervisor(context, interval, profile)
|
|
322
273
|
|
|
323
274
|
if (result.kind === 'failed') {
|
|
324
275
|
console.error(`Could not start the supervisor: ${result.note}`)
|
|
@@ -346,7 +297,15 @@ function start(context: WakeContext, interval: string | undefined): number {
|
|
|
346
297
|
return report(RUNNING_VERDICT)
|
|
347
298
|
}
|
|
348
299
|
|
|
349
|
-
return spawn_supervisor(context, interval)
|
|
300
|
+
return spawn_supervisor(context, interval, run_wake_session.scheduler_profile())
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// The supervisor `josh backlogrun --restart` starts in place of the one it stopped, on that one's
|
|
304
|
+
// profile, so the shell the restart was typed in does not choose it; the shell's where none was running.
|
|
305
|
+
function restart_supervisor(git_directory: string, profile: AgentProfile | undefined): number {
|
|
306
|
+
const chosen = profile ?? run_wake_session.scheduler_profile()
|
|
307
|
+
|
|
308
|
+
return spawn_supervisor(context_of(git_directory), undefined, chosen)
|
|
350
309
|
}
|
|
351
310
|
|
|
352
311
|
// **The loop removes its record on the way out, and only its own.** A loop that ended after its record
|
|
@@ -357,8 +316,78 @@ function start(context: WakeContext, interval: string | undefined): number {
|
|
|
357
316
|
// replaced would leave no trace of that anywhere. Which of the two happened is `tidy_own_wake`'s
|
|
358
317
|
// answer rather than a second read taken here — the branch that decides it belongs beside the record,
|
|
359
318
|
// where it is tested, not in a CLI that would have to re-derive it.
|
|
360
|
-
function tidy_up(target: string):
|
|
361
|
-
|
|
319
|
+
function tidy_up(target: string): WakeTidyResult {
|
|
320
|
+
const tidied = run_wake.tidy_own_wake(target)
|
|
321
|
+
|
|
322
|
+
if (tidied === SUPERSEDED_RESULT) note_to_stderr(SUPERSEDED_NOTE)
|
|
323
|
+
|
|
324
|
+
return tidied
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// **No reload while a lane's request is being answered**: ending the broker closes every lane's server
|
|
328
|
+
// but waits out the slowest request, a review up to its limit, leaving the run unwatched and the other
|
|
329
|
+
// lanes unserved meanwhile. The check is skipped, not taken, so the moved commit is still read as
|
|
330
|
+
// stale at the first idle pass.
|
|
331
|
+
function code_check(is_stale: () => Promise<boolean>): () => Promise<boolean> {
|
|
332
|
+
return async () => !lane_session_broker.is_answering() && (await is_stale())
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function reload_failed(note: string): LoopStop {
|
|
336
|
+
return { reason: run_wake_loop.FAILED_REASON, note: `${RELOAD_FAILED_NOTE}: ${note}` }
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// A record removed by `--stop` or taken over while the loop ended is not this loop's to hand on.
|
|
340
|
+
function as_not_handed_on(stop: LoopStop): LoopStop {
|
|
341
|
+
return stop.reason === run_wake_loop.RELOAD_REASON ? STOPPED_STOP : stop
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// **The successor starts only once this supervisor's broker has closed and its record is gone**
|
|
345
|
+
// (joshuafolkken/kit#4509): two brokers for one lane overwrite each other's response
|
|
346
|
+
// (`claude-lane-broker.ts`), and a record still held by a live process refuses the successor's claim.
|
|
347
|
+
// The lanes and the carry record are left as `backlogrun --restart` leaves them: untouched, for the
|
|
348
|
+
// successor to adopt. A successor that did not start leaves the run unwatched, so it fails as a warning.
|
|
349
|
+
async function reload(
|
|
350
|
+
context: WakeContext,
|
|
351
|
+
interval_ms: number,
|
|
352
|
+
profile: AgentProfile,
|
|
353
|
+
): Promise<LoopStop> {
|
|
354
|
+
const interval = String(Math.round(interval_ms / MS_PER_SECOND))
|
|
355
|
+
const result = launch_supervisor(context, interval, profile)
|
|
356
|
+
|
|
357
|
+
if (result.kind === 'failed') return reload_failed(result.note)
|
|
358
|
+
|
|
359
|
+
const ports = run_wake_takeover.ports_of(context.wake_target)
|
|
360
|
+
const takeover = await run_wake_takeover.await_takeover(result.pid, ports)
|
|
361
|
+
|
|
362
|
+
if (takeover !== 'taken') return reload_failed(TAKEOVER_NOTES[takeover])
|
|
363
|
+
|
|
364
|
+
await run_event_stream_emit.emit(
|
|
365
|
+
run_event_stream.EVENT_KIND.NOTE,
|
|
366
|
+
`The supervisor's code changed on main, so process ${String(process.pid)} handed the run to process ${String(result.pid)} on the new code.`,
|
|
367
|
+
)
|
|
368
|
+
|
|
369
|
+
return { reason: run_wake_loop.RELOAD_REASON, note: undefined }
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
async function supervised(
|
|
373
|
+
context: WakeContext,
|
|
374
|
+
interval_ms: number,
|
|
375
|
+
profile: AgentProfile,
|
|
376
|
+
): Promise<LoopStop> {
|
|
377
|
+
const source = run_wake_code.source_of(context.worktree, SCRIPT_PATH)
|
|
378
|
+
const is_stale = code_check(await run_wake_code.watch(source))
|
|
379
|
+
const ports = run_wake_ports.ports_for(context, profile, is_stale)
|
|
380
|
+
const stop = await run_wake_supervise.supervise({
|
|
381
|
+
context,
|
|
382
|
+
ports,
|
|
383
|
+
interval_ms,
|
|
384
|
+
note: note_to_stderr,
|
|
385
|
+
})
|
|
386
|
+
|
|
387
|
+
if (tidy_up(context.wake_target) !== REMOVED_RESULT) return as_not_handed_on(stop)
|
|
388
|
+
if (stop.reason !== run_wake_loop.RELOAD_REASON) return stop
|
|
389
|
+
|
|
390
|
+
return await reload(context, interval_ms, profile)
|
|
362
391
|
}
|
|
363
392
|
|
|
364
393
|
// A failed pass is restarted while the carry record is still resumable (`run-wake-restart.ts`), so
|
|
@@ -376,15 +405,7 @@ async function loop(context: WakeContext, interval_ms: number): Promise<number>
|
|
|
376
405
|
if (claimed.kind === 'running') return report(RUNNING_VERDICT)
|
|
377
406
|
if (claimed.kind === 'refused') return refuse_without_carry(claimed.carry_kind)
|
|
378
407
|
|
|
379
|
-
const
|
|
380
|
-
const stop = await run_wake_supervise.supervise({
|
|
381
|
-
context,
|
|
382
|
-
ports,
|
|
383
|
-
interval_ms,
|
|
384
|
-
note: note_to_stderr,
|
|
385
|
-
})
|
|
386
|
-
|
|
387
|
-
tidy_up(context.wake_target)
|
|
408
|
+
const stop = await supervised(context, interval_ms, claimed.wake.profile ?? profile)
|
|
388
409
|
|
|
389
410
|
return await finish(stop, context, claimed.carry.started_at)
|
|
390
411
|
}
|
|
@@ -436,28 +457,26 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
436
457
|
return await dispatch(values, context, interval_ms)
|
|
437
458
|
}
|
|
438
459
|
|
|
439
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
440
|
-
process.exitCode = await run(argv)
|
|
441
|
-
}
|
|
442
|
-
|
|
443
460
|
const run_wake_cli = {
|
|
444
461
|
FAILED_VERDICT,
|
|
445
462
|
NONE_VERDICT,
|
|
446
463
|
RUNNING_VERDICT,
|
|
464
|
+
SCRIPT_PATH,
|
|
447
465
|
STALE_VERDICT,
|
|
448
466
|
STOPPED_VERDICT,
|
|
449
467
|
SUPERVISING_VERDICT,
|
|
450
468
|
UNKNOWN_VERDICT,
|
|
451
469
|
USAGE,
|
|
452
470
|
finish,
|
|
453
|
-
|
|
471
|
+
RELOAD_FAILED_NOTE,
|
|
454
472
|
record_failure,
|
|
473
|
+
reload,
|
|
474
|
+
restart_supervisor,
|
|
455
475
|
run,
|
|
456
476
|
start_for_launch,
|
|
457
477
|
stop_body,
|
|
478
|
+
supervised,
|
|
458
479
|
warning_body,
|
|
459
480
|
}
|
|
460
481
|
|
|
461
|
-
if (process.argv[1] === SCRIPT_PATH) await main(process.argv.slice(ARGV_OFFSET))
|
|
462
|
-
|
|
463
482
|
export { run_wake_cli }
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { git_command } from '#scripts/git/git-command'
|
|
2
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
3
|
+
import { import_graph } from '#scripts/lint/import-graph'
|
|
4
|
+
|
|
5
|
+
// Whether the supervisor still runs the code on disk (joshuafolkken/kit#4509). A supervisor keeps the
|
|
6
|
+
// code it started with for its whole life, while the lanes' ships run each new main — so a change to
|
|
7
|
+
// what the supervisor serves them, the broker's request format above all, stops every lane that asks.
|
|
8
|
+
//
|
|
9
|
+
// **The code is the entry's import closure, not the tree**: a merge that touched only files the
|
|
10
|
+
// supervisor never imports changes nothing it runs, and restarting on it would only cost a broker gap.
|
|
11
|
+
// The closure is hashed as the lint cache hashes it (`import-graph.ts`).
|
|
12
|
+
//
|
|
13
|
+
// **The closure is re-hashed only once the commit has moved**: hashing it reads every file it reaches,
|
|
14
|
+
// and on most passes nothing has merged since the last one.
|
|
15
|
+
|
|
16
|
+
interface CodeSource {
|
|
17
|
+
// The commit the checkout sits on; `undefined` where it cannot be read.
|
|
18
|
+
head: () => Promise<string | undefined>
|
|
19
|
+
// The hash of the entry's import closure; `undefined` where it cannot be computed.
|
|
20
|
+
closure: () => Promise<string | undefined>
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface CodeState {
|
|
24
|
+
head: string | undefined
|
|
25
|
+
loaded: string | undefined
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// **A hash that cannot be computed is never stale**: a supervisor that cannot tell keeps running, as
|
|
29
|
+
// it did before this check existed, rather than restarting on every pass.
|
|
30
|
+
function is_changed(loaded: string | undefined, current: string | undefined): boolean {
|
|
31
|
+
if (loaded === undefined || current === undefined) return false
|
|
32
|
+
|
|
33
|
+
return loaded !== current
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function is_stale(state: CodeState, source: CodeSource): Promise<boolean> {
|
|
37
|
+
const head = await source.head()
|
|
38
|
+
if (head === state.head) return false
|
|
39
|
+
|
|
40
|
+
state.head = head
|
|
41
|
+
|
|
42
|
+
return is_changed(state.loaded, await source.closure())
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// The baseline is read when the watch starts — at the supervisor's start, as close to the moment its
|
|
46
|
+
// modules were loaded as a reading can be.
|
|
47
|
+
async function watch(source: CodeSource): Promise<() => Promise<boolean>> {
|
|
48
|
+
const state: CodeState = { head: await source.head(), loaded: await source.closure() }
|
|
49
|
+
|
|
50
|
+
return async () => await is_stale(state, source)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function read_head(): Promise<string | undefined> {
|
|
54
|
+
try {
|
|
55
|
+
return await git_command.head_commit()
|
|
56
|
+
} catch (error) {
|
|
57
|
+
error_text.trace_swallowed('run_wake_code.read_head', error)
|
|
58
|
+
|
|
59
|
+
return undefined
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// A fresh graph each time: one graph caches the content it read, so it would answer the old hash.
|
|
64
|
+
async function read_closure(root: string, entry: string): Promise<string | undefined> {
|
|
65
|
+
try {
|
|
66
|
+
const graph = await import_graph.create(root)
|
|
67
|
+
|
|
68
|
+
return graph?.closure_hash(entry)
|
|
69
|
+
} catch (error) {
|
|
70
|
+
error_text.trace_swallowed('run_wake_code.read_closure', error)
|
|
71
|
+
|
|
72
|
+
return undefined
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function source_of(root: string, entry: string): CodeSource {
|
|
77
|
+
return { head: read_head, closure: async () => await read_closure(root, entry) }
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const run_wake_code = { source_of, watch }
|
|
81
|
+
|
|
82
|
+
export type { CodeSource }
|
|
83
|
+
export { run_wake_code }
|