@joshuafolkken/kit 1.1514.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +5 -5
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +53 -6
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +30 -7
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +8 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +27 -24
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-write.ts +67 -29
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +2 -2
- package/scripts/git/main-merge.ts +25 -9
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +0 -8
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +1 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +2 -10
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +157 -158
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +103 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +2 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +81 -15
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +8 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +80 -2
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +9 -1
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +82 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +116 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +207 -265
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +6 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +34 -8
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +42 -24
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +61 -149
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +97 -10
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +4 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,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 }
|
|
@@ -11,6 +11,11 @@ const DETAILS_TAIL_LENGTH = 2048
|
|
|
11
11
|
const TRUNCATION_MARK = '... '
|
|
12
12
|
// The prefix `backlog-drive-cli.ts` gives the exception it catches.
|
|
13
13
|
const ERROR_PREFIX = 'error '
|
|
14
|
+
// **The driver is bounded so the supervisor reaches its pass boundary between dispatches**
|
|
15
|
+
// (joshuafolkken/kit#4509): unbounded, `backlog:drive` dispatches, collects and merges lanes in its own
|
|
16
|
+
// loop until a judgment hand-off, and the code check at the pass boundary would wait for that.
|
|
17
|
+
const WINDOW_MINUTES = '5'
|
|
18
|
+
const WINDOW_VERDICT = 'window'
|
|
14
19
|
|
|
15
20
|
function driver_args(invocation: string): ReadonlyArray<string> | undefined {
|
|
16
21
|
const rebuilt = run_invocation.rebuild(invocation)
|
|
@@ -21,6 +26,8 @@ function driver_args(invocation: string): ReadonlyArray<string> | undefined {
|
|
|
21
26
|
'backlog:drive',
|
|
22
27
|
'--owner',
|
|
23
28
|
String(process.pid),
|
|
29
|
+
'--window',
|
|
30
|
+
WINDOW_MINUTES,
|
|
24
31
|
...rebuilt.split(' ').slice(1 + named_count),
|
|
25
32
|
]
|
|
26
33
|
}
|
|
@@ -141,11 +148,11 @@ function claim_record(target: string, invocation: string): boolean {
|
|
|
141
148
|
}
|
|
142
149
|
|
|
143
150
|
// **A verdict with nothing to judge is re-driven here, never handed to a session.** A woken session
|
|
144
|
-
// met with `
|
|
145
|
-
//
|
|
146
|
-
//
|
|
147
|
-
//
|
|
148
|
-
const RERUN_VERDICTS: ReadonlyArray<string> = ['
|
|
151
|
+
// met with `merge busy` or `merge retry` could only cut and hand the loop back for the same driver to
|
|
152
|
+
// run again — a model round trip, at a cache write each, that decides nothing. The record is already
|
|
153
|
+
// this process's, so the rerun needs no fresh claim; the limit keeps a driver that never settles from
|
|
154
|
+
// holding the supervisor past its own checks.
|
|
155
|
+
const RERUN_VERDICTS: ReadonlyArray<string> = ['merge busy', 'merge retry']
|
|
149
156
|
const RERUN_LIMIT = 10
|
|
150
157
|
const RERUN_PAUSE_MS = 60_000
|
|
151
158
|
|
|
@@ -157,18 +164,21 @@ async function pause(ms: number): Promise<void> {
|
|
|
157
164
|
})
|
|
158
165
|
}
|
|
159
166
|
|
|
160
|
-
function
|
|
167
|
+
function is_verdict(result: JoshResult, entries: ReadonlyArray<string>): boolean {
|
|
161
168
|
const verdict = result.out.split('\n', 1)[FIRST_LINE] ?? ''
|
|
162
169
|
|
|
163
170
|
return (
|
|
164
171
|
result.code === SUCCESS &&
|
|
165
|
-
|
|
172
|
+
entries.some((entry) => verdict === entry || verdict.startsWith(`${entry} `))
|
|
166
173
|
)
|
|
167
174
|
}
|
|
168
175
|
|
|
169
176
|
// A record that was removed during the pause answers `undefined`: its stale verdict must not reach a
|
|
170
177
|
// session, so the supervisor's own next pass re-reads the record and ends the run as `ended` or
|
|
171
178
|
// `stopped`; a rerun would only fail on it and report the run as `failed`.
|
|
179
|
+
//
|
|
180
|
+
// **A spent window answers `undefined` too**, so the supervisor's next pass checks its code before it
|
|
181
|
+
// drives again; the restarted driver adopts the lanes still in flight.
|
|
172
182
|
async function run_driver(
|
|
173
183
|
target: string,
|
|
174
184
|
args: ReadonlyArray<string>,
|
|
@@ -176,7 +186,8 @@ async function run_driver(
|
|
|
176
186
|
remaining: number,
|
|
177
187
|
): Promise<JoshResult | undefined> {
|
|
178
188
|
const result = await josh_command.josh_run(args, true)
|
|
179
|
-
if (
|
|
189
|
+
if (is_verdict(result, [WINDOW_VERDICT])) return undefined
|
|
190
|
+
if (remaining === 0 || !is_verdict(result, RERUN_VERDICTS)) return result
|
|
180
191
|
|
|
181
192
|
await wait(RERUN_PAUSE_MS)
|
|
182
193
|
if (run_carry.read_carry(target).kind !== 'carried') return undefined
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
1
2
|
import type { CarryRead } from '#scripts/run/carry/run-carry'
|
|
2
3
|
import {
|
|
3
4
|
run_wake,
|
|
@@ -22,8 +23,10 @@ import type { LaunchResult } from './run-wake-session'
|
|
|
22
23
|
|
|
23
24
|
const STOPPED_REASON: WakeStopReason = 'stopped'
|
|
24
25
|
const FAILED_REASON: WakeStopReason = 'failed'
|
|
26
|
+
const RELOAD_REASON: WakeStopReason = 'reload'
|
|
25
27
|
const NO_ATTEMPTS = 0
|
|
26
28
|
const STOPPED_BY_PERSON: LoopStop = { reason: STOPPED_REASON, note: undefined }
|
|
29
|
+
const CODE_CHANGED: LoopStop = { reason: RELOAD_REASON, note: undefined }
|
|
27
30
|
|
|
28
31
|
interface LoopPorts {
|
|
29
32
|
// The carry record, re-read every pass rather than cached: it is written by the parent loop of a
|
|
@@ -47,10 +50,15 @@ interface LoopPorts {
|
|
|
47
50
|
wake: (invocation: string, session_id: string, material: string) => LaunchResult
|
|
48
51
|
sleep: (milliseconds: number) => Promise<void>
|
|
49
52
|
now: () => Date
|
|
53
|
+
// Closes again a lane a process outlived, once the process is gone (`lane_close.retry_closes`).
|
|
54
|
+
retry_closes: () => Promise<void>
|
|
55
|
+
// Whether the code this process loaded differs from the code on disk now (`run-wake-code.ts`).
|
|
56
|
+
is_code_stale: () => Promise<boolean>
|
|
50
57
|
}
|
|
51
58
|
|
|
52
|
-
// `released`: the carry record ended while the driver paused,
|
|
53
|
-
// next pass decides from the record
|
|
59
|
+
// `released`: the carry record ended while the driver paused, or the driver's window was spent, so
|
|
60
|
+
// there is nothing to hand on and the next pass decides from the record whether the run ends, reloads
|
|
61
|
+
// or drives on.
|
|
54
62
|
type DriveResult =
|
|
55
63
|
| { kind: 'finished' }
|
|
56
64
|
| { kind: 'released' }
|
|
@@ -151,15 +159,37 @@ async function decide_pass(wake: RunWake, ports: LoopPorts): Promise<WakeDecisio
|
|
|
151
159
|
return run_wake.decide({ ...input, has_work: await ports.has_work(input.read) })
|
|
152
160
|
}
|
|
153
161
|
|
|
162
|
+
// A lane whose close a process outlived ends once the process is gone (joshuafolkken/kit#4300). A
|
|
163
|
+
// failed retry is the next pass's to try again, never a reason to stop the run.
|
|
164
|
+
async function retry_closes(ports: LoopPorts): Promise<void> {
|
|
165
|
+
try {
|
|
166
|
+
await ports.retry_closes()
|
|
167
|
+
} catch (error) {
|
|
168
|
+
error_text.trace_swallowed('run_wake_loop.retry_closes', error)
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
154
172
|
// The record is re-read at the top of every pass rather than carried in a variable, so a `--stop` that
|
|
155
173
|
// removed it ends the loop at the next interval and a `--list` reads what the loop actually wrote.
|
|
156
174
|
// One pass: decide, act, write the result back. `undefined` means carry on to the next interval.
|
|
175
|
+
//
|
|
176
|
+
// **A pass boundary is where the supervisor reloads its code** (joshuafolkken/kit#4509): no driver
|
|
177
|
+
// is running and no session is being launched, so a successor on the new code takes over without
|
|
178
|
+
// stopping any lane. A record already removed ends the loop before this pass is reached, and a carry
|
|
179
|
+
// record that ended or became unreadable stops the run before the code is checked, so a reload never
|
|
180
|
+
// hands a finished run to a successor.
|
|
157
181
|
async function run_pass(
|
|
158
182
|
target: string,
|
|
159
183
|
wake: RunWake,
|
|
160
184
|
ports: LoopPorts,
|
|
161
185
|
): Promise<LoopStop | undefined> {
|
|
162
|
-
const
|
|
186
|
+
const decision = await decide_pass(wake, ports)
|
|
187
|
+
|
|
188
|
+
if (decision.kind !== 'stop' && (await ports.is_code_stale())) return CODE_CHANGED
|
|
189
|
+
|
|
190
|
+
await retry_closes(ports)
|
|
191
|
+
|
|
192
|
+
const outcome = await step(wake, decision, ports)
|
|
163
193
|
|
|
164
194
|
if (outcome.kind === 'stop') return outcome.stop
|
|
165
195
|
|
|
@@ -197,6 +227,7 @@ async function run_loop(target: string, ports: LoopPorts, interval_ms: number):
|
|
|
197
227
|
|
|
198
228
|
const run_wake_loop = {
|
|
199
229
|
FAILED_REASON,
|
|
230
|
+
RELOAD_REASON,
|
|
200
231
|
run_loop,
|
|
201
232
|
}
|
|
202
233
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { run_wake_cli } from './run-wake-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh run:wake` entry, and the script `--start` spawns with `--loop`. It is kept apart from
|
|
6
|
+
// `run-wake-cli.ts` because `backlogrun-cli.ts` and `backlogrun-restart.ts` import that one: a bundle
|
|
7
|
+
// is one file, so a main guard there would fire for every command that carries it
|
|
8
|
+
// (joshuafolkken/kit#4186).
|
|
9
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
10
|
+
const ARGV_OFFSET = 2
|
|
11
|
+
|
|
12
|
+
process.exitCode = await run_wake_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
13
|
+
}
|