@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
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { EpicChild } from '#scripts/epic/epic-graph'
|
|
2
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
3
|
+
import { has_label_name, IN_PROGRESS_LABEL } from '#scripts/issue/issue-labels'
|
|
4
|
+
import { issue_not_before } from '#scripts/issue/issue-not-before'
|
|
5
|
+
|
|
6
|
+
// Why the backlog had nothing to offer while children ran (joshuafolkken/kit#4513): which waiting
|
|
7
|
+
// issues wait on a dependency chain, and which on a declared start condition (a start date or a
|
|
8
|
+
// sample condition, `issue-not-before.ts`), so `lane:stats` splits `offer:watch:blocked` by cause instead of reporting one row.
|
|
9
|
+
//
|
|
10
|
+
// `backlog:next` writes one line per cause on standard error and `backlog:offer` reads them back, the
|
|
11
|
+
// way the `run:solo` notice travels; both sides go through this module so the spelling cannot drift.
|
|
12
|
+
// A child carrying `in-progress` is the running work itself, not a wait it causes, so it is left out.
|
|
13
|
+
|
|
14
|
+
type WaitCause = 'chain' | 'gate'
|
|
15
|
+
|
|
16
|
+
type WaitCauses = Readonly<Record<WaitCause, ReadonlyArray<number>>>
|
|
17
|
+
|
|
18
|
+
const CAUSES: ReadonlyArray<WaitCause> = ['chain', 'gate']
|
|
19
|
+
const MARKS: Readonly<Record<WaitCause, string>> = {
|
|
20
|
+
chain: 'Waiting on a dependency chain:',
|
|
21
|
+
gate: 'Waiting on a start condition:',
|
|
22
|
+
}
|
|
23
|
+
const TAG_SEPARATOR = '+'
|
|
24
|
+
const ISSUE_PATTERN = /#(\d+)/gu
|
|
25
|
+
const CLOSED_STATE = 'CLOSED'
|
|
26
|
+
|
|
27
|
+
// `blocked_by` keeps a relation after its blocker closes, so a candidate the overlap separation moved
|
|
28
|
+
// to `waiting` would read as a chain on the closed relation alone.
|
|
29
|
+
function has_open_blocker(child: EpicChild): boolean {
|
|
30
|
+
return child.blocked_by.some((blocker) => blocker.state !== CLOSED_STATE)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function cause_of(child: EpicChild): WaitCause | undefined {
|
|
34
|
+
if (has_label_name(child.labels, IN_PROGRESS_LABEL)) return undefined
|
|
35
|
+
if (!issue_not_before.is_due(child.body)) return 'gate'
|
|
36
|
+
|
|
37
|
+
return has_open_blocker(child) ? 'chain' : undefined
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function numbers_with(children: ReadonlyArray<EpicChild>, cause: WaitCause): Array<number> {
|
|
41
|
+
return children.filter((child) => cause_of(child) === cause).map((child) => child.number)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// This repository's waiting children by cause; a child elsewhere is not work this checkout could start.
|
|
45
|
+
function classify(children: ReadonlyArray<EpicChild>, repo: string): WaitCauses {
|
|
46
|
+
const here = children.filter((child) => child.repo === repo)
|
|
47
|
+
|
|
48
|
+
return { chain: numbers_with(here, 'chain'), gate: numbers_with(here, 'gate') }
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function cited(numbers: ReadonlyArray<number>): string {
|
|
52
|
+
return numbers.map((number) => issue_cite.plain(number)).join(' ')
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function lines_of(causes: WaitCauses): ReadonlyArray<string> {
|
|
56
|
+
return CAUSES.filter((cause) => causes[cause].length > 0).map(
|
|
57
|
+
(cause) => `${MARKS[cause]} ${cited(causes[cause])}`,
|
|
58
|
+
)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// The numbers on the cause's line; a linkified `[#N](…/issues/N)` still reads as one `#N`.
|
|
62
|
+
function numbers_on(text: string, cause: WaitCause): ReadonlyArray<number> {
|
|
63
|
+
const line = text.split('\n').find((candidate) => candidate.startsWith(MARKS[cause]))
|
|
64
|
+
|
|
65
|
+
return [...(line ?? '').matchAll(ISSUE_PATTERN)].map((match) => Number(match[1]))
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function parse(text: string): WaitCauses {
|
|
69
|
+
return { chain: numbers_on(text, 'chain'), gate: numbers_on(text, 'gate') }
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// `chain`, `gate` or `chain+gate` — the held reason's last part — or `undefined` when neither applies.
|
|
73
|
+
function tag_of(causes: WaitCauses): string | undefined {
|
|
74
|
+
const present = CAUSES.filter((cause) => causes[cause].length > 0)
|
|
75
|
+
|
|
76
|
+
return present.length > 0 ? present.join(TAG_SEPARATOR) : undefined
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function numbers_of(causes: WaitCauses): ReadonlyArray<number> {
|
|
80
|
+
return [...causes.chain, ...causes.gate]
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const backlog_wait_cause = { classify, lines_of, numbers_of, parse, tag_of }
|
|
84
|
+
|
|
85
|
+
export type { WaitCauses }
|
|
86
|
+
export { backlog_wait_cause }
|
|
@@ -6,9 +6,12 @@ import { epic_outside_blocker } from '#scripts/epic/epic-outside-blocker'
|
|
|
6
6
|
import { epic_report, type EpicNextResult } from '#scripts/epic/epic-report'
|
|
7
7
|
import {
|
|
8
8
|
has_label_name,
|
|
9
|
+
has_parked_label,
|
|
9
10
|
IN_PROGRESS_LABEL,
|
|
10
11
|
NEEDS_DECISION_LABEL,
|
|
12
|
+
RUN_STALLED_LABEL,
|
|
11
13
|
} from '#scripts/issue/issue-labels'
|
|
14
|
+
import { run_stalled } from '#scripts/run/park/run-stalled'
|
|
12
15
|
import { backlog_plan, type PlanContext } from './backlog-plan'
|
|
13
16
|
import { backlog_rank, type GateScope } from './backlog-rank'
|
|
14
17
|
|
|
@@ -32,7 +35,7 @@ const CLOSED = 'CLOSED'
|
|
|
32
35
|
const EMPTY_SCOPE: GateScope = { standalone: new Set(), declared: new Map() }
|
|
33
36
|
|
|
34
37
|
const HEADING_ASSUMPTION =
|
|
35
|
-
'Assumes every issue in a wave merges before the next wave starts. Issues a run already has are left out, and only issues of this repository are planned.'
|
|
38
|
+
'Assumes every issue in a wave merges before the next wave starts. Issues a run already has are left out and count as merged first, and only issues of this repository are planned.'
|
|
36
39
|
const UNREACHED_HEADING = 'Not reached — each names what it is waiting on:'
|
|
37
40
|
const PARALLEL_NOTE = '(parallel)'
|
|
38
41
|
const NEEDS_DECISION_NOTE = `waiting on a person (\`${NEEDS_DECISION_LABEL}\`)`
|
|
@@ -45,18 +48,23 @@ const PARALLEL_GAP = ' '.repeat(PARALLEL_GAP_WIDTH)
|
|
|
45
48
|
interface WavePlan {
|
|
46
49
|
waves: ReadonlyArray<ReadonlyArray<EpicChild>>
|
|
47
50
|
unreached: ReadonlyArray<EpicChild>
|
|
51
|
+
// This repository's running issues, which count as merged before wave 1 and so sit in neither list
|
|
52
|
+
// above; still the run's own, so `run:board` holds their lanes (kit#3969).
|
|
53
|
+
running?: ReadonlyArray<EpicChild>
|
|
48
54
|
}
|
|
49
55
|
|
|
56
|
+
// A park leaves `in-progress` on (`epic-busy.ts`), and a parked issue waits on a person rather than
|
|
57
|
+
// finishing first.
|
|
50
58
|
function is_running(child: EpicChild): boolean {
|
|
51
|
-
return has_label_name(child.labels, IN_PROGRESS_LABEL)
|
|
59
|
+
return has_label_name(child.labels, IN_PROGRESS_LABEL) && !has_parked_label(child.labels)
|
|
52
60
|
}
|
|
53
61
|
|
|
54
62
|
function as_closed(child: EpicChild, done: ReadonlySet<string>): EpicChild {
|
|
55
63
|
return done.has(epic_graph.key_of(child)) ? { ...child, state: CLOSED } : child
|
|
56
64
|
}
|
|
57
65
|
|
|
58
|
-
// The pool a wave is chosen from.
|
|
59
|
-
//
|
|
66
|
+
// The pool a wave is chosen from. `running` is every issue this run may finish, so a child behind one
|
|
67
|
+
// waits on it rather than being handed to a person.
|
|
60
68
|
interface WavePool {
|
|
61
69
|
children: ReadonlyArray<EpicChild>
|
|
62
70
|
running: ReadonlySet<string>
|
|
@@ -67,12 +75,7 @@ interface WavePool {
|
|
|
67
75
|
function pool_of(result: EpicNextResult, repo: string, scope: GateScope): WavePool {
|
|
68
76
|
const all = backlog_rank.everything_in(result)
|
|
69
77
|
|
|
70
|
-
return {
|
|
71
|
-
children: all.filter((child) => !is_running(child)),
|
|
72
|
-
running: epic_outside_blocker.running_keys(all),
|
|
73
|
-
repo,
|
|
74
|
-
scope,
|
|
75
|
-
}
|
|
78
|
+
return { children: all, running: epic_outside_blocker.running_keys(all), repo, scope }
|
|
76
79
|
}
|
|
77
80
|
|
|
78
81
|
function offer(
|
|
@@ -107,15 +110,31 @@ function next_wave(pool: WavePool, done: ReadonlySet<string>): ReadonlyArray<Epi
|
|
|
107
110
|
)
|
|
108
111
|
}
|
|
109
112
|
|
|
113
|
+
// `backlog:next` offers nothing behind a running issue, so an empty first wave still asks for the
|
|
114
|
+
// issues the running ones release.
|
|
115
|
+
function opening_wave(
|
|
116
|
+
result: EpicNextResult,
|
|
117
|
+
pool: WavePool,
|
|
118
|
+
done: ReadonlySet<string>,
|
|
119
|
+
): ReadonlyArray<EpicChild> {
|
|
120
|
+
const wave = first_wave(result, pool)
|
|
121
|
+
|
|
122
|
+
return wave.length > 0 ? wave : next_wave(pool, done)
|
|
123
|
+
}
|
|
124
|
+
|
|
110
125
|
// Each wave is closed before the next is asked for; a wave that offers nothing ends the plan, which
|
|
111
126
|
// the pool's size bounds because every wave closes at least one child. `scope` names the rows the
|
|
112
127
|
// offer's cap bounds and the paths each issue declares; left empty, no wave is capped or separated.
|
|
113
128
|
function build(result: EpicNextResult, repo: string, scope: GateScope = EMPTY_SCOPE): WavePlan {
|
|
114
129
|
const pool = pool_of(result, repo, scope)
|
|
115
|
-
const
|
|
130
|
+
const running = pool.children.filter((child) => child.repo === repo && is_running(child))
|
|
131
|
+
// A running issue finishes first, before any wave: it starts closed, so it is never offered and the
|
|
132
|
+
// issues behind it reach a later wave instead of waiting past the plan. Another repository's is not
|
|
133
|
+
// this run's to finish, and closing it would answer its release from the version already out.
|
|
134
|
+
const done = new Set(running.map((child) => epic_graph.key_of(child)))
|
|
116
135
|
const waves: Array<ReadonlyArray<EpicChild>> = []
|
|
117
136
|
|
|
118
|
-
for (let wave =
|
|
137
|
+
for (let wave = opening_wave(result, pool, done); wave.length > 0; wave = next_wave(pool, done)) {
|
|
119
138
|
waves.push(wave)
|
|
120
139
|
for (const child of wave) done.add(epic_graph.key_of(child))
|
|
121
140
|
}
|
|
@@ -124,7 +143,12 @@ function build(result: EpicNextResult, repo: string, scope: GateScope = EMPTY_SC
|
|
|
124
143
|
.everything_in(result)
|
|
125
144
|
.filter((child) => child.repo === repo && !done.has(epic_graph.key_of(child)))
|
|
126
145
|
|
|
127
|
-
return { waves, unreached }
|
|
146
|
+
return { waves, unreached, running }
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// A stalled issue's note ends on the one next action its park comment names (`run-stalled.ts`).
|
|
150
|
+
function run_stalled_note(child: number): string {
|
|
151
|
+
return `stalled mechanically — ${run_stalled.next_step(child)}`
|
|
128
152
|
}
|
|
129
153
|
|
|
130
154
|
// The plan's own "waiting on" wording is reused, so an unreached issue names its blocker the way the
|
|
@@ -132,6 +156,7 @@ function build(result: EpicNextResult, repo: string, scope: GateScope = EMPTY_SC
|
|
|
132
156
|
// as not reached instead.
|
|
133
157
|
function unreached_note(child: EpicChild, context: PlanContext): string {
|
|
134
158
|
if (has_label_name(child.labels, NEEDS_DECISION_LABEL)) return NEEDS_DECISION_NOTE
|
|
159
|
+
if (has_label_name(child.labels, RUN_STALLED_LABEL)) return run_stalled_note(child.number)
|
|
135
160
|
const note = backlog_plan.waiting_note(child, context)
|
|
136
161
|
|
|
137
162
|
return note === backlog_plan.PAST_OFFER_NOTE ? NOT_REACHED_NOTE : note
|
|
@@ -174,6 +199,7 @@ const backlog_waves = {
|
|
|
174
199
|
HEADING_ASSUMPTION,
|
|
175
200
|
NEEDS_DECISION_NOTE,
|
|
176
201
|
PARALLEL_NOTE,
|
|
202
|
+
run_stalled_note,
|
|
177
203
|
UNREACHED_HEADING,
|
|
178
204
|
build,
|
|
179
205
|
format_waves,
|
|
@@ -10,11 +10,16 @@ import { run_invocation } from '#scripts/run/run-invocation'
|
|
|
10
10
|
// **A bare number is an issue.** A shell reads an unquoted `#3437` as a comment, so `3437` in the named
|
|
11
11
|
// list is taken as `#3437`; a number after the first flag is that flag's value and is left alone.
|
|
12
12
|
//
|
|
13
|
-
// **`--stop`
|
|
14
|
-
// flag it is refused before anything is stopped — a mistyped start must never end a
|
|
13
|
+
// **`--stop` and `--restart` stand alone.** Each stops the run rather than starting one, so beside an
|
|
14
|
+
// issue or any other flag it is refused before anything is stopped — a mistyped start must never end a
|
|
15
|
+
// run.
|
|
15
16
|
|
|
16
17
|
const AGENT_FLAG = '--agent'
|
|
17
|
-
|
|
18
|
+
// A map, not an object literal: a token such as `constructor` must not read an inherited property.
|
|
19
|
+
const LONE_FLAGS: ReadonlyMap<string, LoneKind> = new Map([
|
|
20
|
+
['--stop', 'stop'],
|
|
21
|
+
['--restart', 'restart'],
|
|
22
|
+
])
|
|
18
23
|
const BACKLOG_COMMAND = 'backlogrun'
|
|
19
24
|
const ISSUE_PREFIX = '#'
|
|
20
25
|
const FLAG_PREFIX = '-'
|
|
@@ -30,8 +35,13 @@ interface BacklogrunArguments {
|
|
|
30
35
|
issues: ReadonlyArray<number>
|
|
31
36
|
}
|
|
32
37
|
|
|
38
|
+
type LoneKind = 'stop' | 'restart'
|
|
39
|
+
|
|
33
40
|
type ArgumentsResult =
|
|
34
|
-
{ kind: 'args'; args: BacklogrunArguments }
|
|
41
|
+
| { kind: 'args'; args: BacklogrunArguments }
|
|
42
|
+
| { kind: 'stop' }
|
|
43
|
+
| { kind: 'restart' }
|
|
44
|
+
| { kind: 'refused' }
|
|
35
45
|
|
|
36
46
|
interface AgentSplit {
|
|
37
47
|
agent: string | undefined
|
|
@@ -74,12 +84,14 @@ function parse_start(argv: ReadonlyArray<string>): ArgumentsResult {
|
|
|
74
84
|
}
|
|
75
85
|
|
|
76
86
|
function parse(argv: ReadonlyArray<string>): ArgumentsResult {
|
|
77
|
-
|
|
87
|
+
const lone = argv.map((token) => LONE_FLAGS.get(token)).find((kind) => kind !== undefined)
|
|
88
|
+
|
|
89
|
+
if (lone === undefined) return parse_start(argv)
|
|
78
90
|
|
|
79
|
-
return { kind: argv.length === 1 ?
|
|
91
|
+
return { kind: argv.length === 1 ? lone : 'refused' }
|
|
80
92
|
}
|
|
81
93
|
|
|
82
94
|
const backlogrun_args = { parse }
|
|
83
95
|
|
|
84
|
-
export type { BacklogrunArguments }
|
|
96
|
+
export type { ArgumentsResult, BacklogrunArguments }
|
|
85
97
|
export { backlogrun_args }
|
|
@@ -7,12 +7,14 @@ import { run_board_cli } from '#scripts/run/board/run-board-cli'
|
|
|
7
7
|
import { run_carry } from '#scripts/run/carry/run-carry'
|
|
8
8
|
import type { LaunchResult } from '#scripts/run/detached-launch'
|
|
9
9
|
import { run_wake_cli } from '#scripts/run/wake/run-wake-cli'
|
|
10
|
-
import { backlogrun_args, type BacklogrunArguments } from './backlogrun-args'
|
|
10
|
+
import { backlogrun_args, type ArgumentsResult, type BacklogrunArguments } from './backlogrun-args'
|
|
11
11
|
import { backlogrun_launch, type LaunchTarget, type StartResult } from './backlogrun-launch'
|
|
12
12
|
import { backlogrun_replace, type ReplaceVerdict } from './backlogrun-replace'
|
|
13
|
+
import { backlogrun_restart } from './backlogrun-restart'
|
|
13
14
|
import { backlogrun_stop, type StopReport } from './backlogrun-stop'
|
|
14
15
|
|
|
15
|
-
// `josh backlogrun` — start a `backlogrun` from the terminal and watch it,
|
|
16
|
+
// `josh backlogrun` — start a `backlogrun` from the terminal and watch it, stop it with `--stop`, or
|
|
17
|
+
// replace its processes with `--restart` while its record is kept (`backlogrun-restart.ts`). A
|
|
16
18
|
// run already going is never joined by a second one: the board is shown, and any issue named is pointed
|
|
17
19
|
// at `run:add` rather than added behind the person's back. Otherwise the agent is started in the
|
|
18
20
|
// background, its output to a log file, and the board takes over the terminal at once. Closing the
|
|
@@ -27,7 +29,7 @@ const ARGV_OFFSET = 2
|
|
|
27
29
|
const SUCCESS_EXIT_CODE = 0
|
|
28
30
|
const FAILURE_EXIT_CODE = 1
|
|
29
31
|
const USAGE =
|
|
30
|
-
'Usage: josh backlogrun [<n>...] [--only] [--max <n>] [--idle <minutes>] [--agent claude|codex] | --stop'
|
|
32
|
+
'Usage: josh backlogrun [<n>...] [--only] [--max <n>] [--idle <minutes>] [--agent claude|codex] | --stop | --restart'
|
|
31
33
|
|
|
32
34
|
interface BacklogrunPorts {
|
|
33
35
|
repository_directory: () => Promise<string | undefined>
|
|
@@ -36,6 +38,7 @@ interface BacklogrunPorts {
|
|
|
36
38
|
start: (args: BacklogrunArguments, target: LaunchTarget) => StartResult
|
|
37
39
|
start_supervisor: (git_directory: string, provider: AgentProvider) => LaunchResult
|
|
38
40
|
stop: (git_directory: string) => Promise<StopReport>
|
|
41
|
+
restart: (git_directory: string) => Promise<number>
|
|
39
42
|
show_board: () => Promise<number>
|
|
40
43
|
write: (line: string) => void
|
|
41
44
|
}
|
|
@@ -48,6 +51,7 @@ const LIVE_PORTS: BacklogrunPorts = {
|
|
|
48
51
|
start: (args, target) => backlogrun_launch.start(args.invocation, args.provider, target),
|
|
49
52
|
start_supervisor: run_wake_cli.start_for_launch,
|
|
50
53
|
stop: async (git_directory) => await backlogrun_stop.stop(git_directory),
|
|
54
|
+
restart: async (git_directory) => await backlogrun_restart.restart(git_directory),
|
|
51
55
|
show_board: async () => await run_board_cli.run([]),
|
|
52
56
|
write: (line) => process.stdout.write(`${line}\n`),
|
|
53
57
|
}
|
|
@@ -150,6 +154,17 @@ async function stop(git_directory: string, ports: BacklogrunPorts): Promise<numb
|
|
|
150
154
|
return backlogrun_stop.is_stopped(report) ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
|
|
151
155
|
}
|
|
152
156
|
|
|
157
|
+
async function dispatch(
|
|
158
|
+
parsed: Exclude<ArgumentsResult, { kind: 'refused' }>,
|
|
159
|
+
git_directory: string,
|
|
160
|
+
ports: BacklogrunPorts,
|
|
161
|
+
): Promise<number> {
|
|
162
|
+
if (parsed.kind === 'stop') return await stop(git_directory, ports)
|
|
163
|
+
if (parsed.kind === 'restart') return await ports.restart(git_directory)
|
|
164
|
+
|
|
165
|
+
return await begin(parsed.args, git_directory, ports)
|
|
166
|
+
}
|
|
167
|
+
|
|
153
168
|
function refuse(line: string, ports: BacklogrunPorts): number {
|
|
154
169
|
ports.write(line)
|
|
155
170
|
|
|
@@ -167,9 +182,8 @@ async function run(
|
|
|
167
182
|
const git_directory = await ports.repository_directory()
|
|
168
183
|
|
|
169
184
|
if (git_directory === undefined) return refuse('backlogrun: not inside a git repository', ports)
|
|
170
|
-
if (parsed.kind === 'stop') return await stop(git_directory, ports)
|
|
171
185
|
|
|
172
|
-
return await
|
|
186
|
+
return await dispatch(parsed, git_directory, ports)
|
|
173
187
|
}
|
|
174
188
|
|
|
175
189
|
const backlogrun_cli = { run }
|
|
@@ -180,6 +180,11 @@ function signal_parent(pid: number): void {
|
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
+
// The pid `stop_parent` would stop, read without stopping it.
|
|
184
|
+
function running_parent(git_directory: string): number | undefined {
|
|
185
|
+
return live_launch(git_directory)?.pid
|
|
186
|
+
}
|
|
187
|
+
|
|
183
188
|
// Stops the parent this launcher started and forgets its launch — the pid stopped, `undefined` where
|
|
184
189
|
// no launched parent was live. **Only the process the record names, and only while it is still that
|
|
185
190
|
// process**: a session a person typed `backlogrun` into has no launch record and is never signalled.
|
|
@@ -244,6 +249,7 @@ const backlogrun_launch = {
|
|
|
244
249
|
chosen_environment,
|
|
245
250
|
is_running,
|
|
246
251
|
pending_launch,
|
|
252
|
+
running_parent,
|
|
247
253
|
start,
|
|
248
254
|
started_for,
|
|
249
255
|
stop_parent,
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
2
|
+
import { run_board_cli } from '#scripts/run/board/run-board-cli'
|
|
3
|
+
import { run_carry, type CarryRead } from '#scripts/run/carry/run-carry'
|
|
4
|
+
import { run_carry_ended, type EndedRun } from '#scripts/run/carry/run-carry-ended'
|
|
5
|
+
import { run_wake } from '#scripts/run/wake/run-wake'
|
|
6
|
+
import { run_wake_cli } from '#scripts/run/wake/run-wake-cli'
|
|
7
|
+
import { backlogrun_stop, type StopReport } from './backlogrun-stop'
|
|
8
|
+
|
|
9
|
+
// `josh backlogrun --restart` — the run's processes replaced, its record kept. The supervisor, the
|
|
10
|
+
// parent and a headless session are stopped as `--stop` stops them, the record is left standing, and a
|
|
11
|
+
// supervisor started on the stopped one's profile adopts it: the budget, the counters and the named list
|
|
12
|
+
// carry over, and the plan made at the start is not made again.
|
|
13
|
+
//
|
|
14
|
+
// **Only a run with a record is restarted.** No record is nothing to restart; a record `--end` closed
|
|
15
|
+
// is a run that is over, and the line names the invocation that starts it again rather than reviving it.
|
|
16
|
+
// A run owned by a session this command may not signal is refused as `--stop` refuses it.
|
|
17
|
+
//
|
|
18
|
+
// **No parent session is started.** The driver (`backlog:drive`) does the routine work, and the
|
|
19
|
+
// supervisor wakes a session only where a decision is needed.
|
|
20
|
+
|
|
21
|
+
const PREFIX = 'backlogrun:'
|
|
22
|
+
const ISSUE_PREFIX_PATTERN = /^#/u
|
|
23
|
+
const SUCCESS_EXIT_CODE = 0
|
|
24
|
+
const FAILURE_EXIT_CODE = 1
|
|
25
|
+
|
|
26
|
+
interface RestartPorts {
|
|
27
|
+
read_carry: (git_directory: string) => CarryRead
|
|
28
|
+
read_ended: (git_directory: string) => EndedRun | undefined
|
|
29
|
+
read_profile: (git_directory: string) => AgentProfile | undefined
|
|
30
|
+
stop: (git_directory: string) => Promise<StopReport>
|
|
31
|
+
start_supervisor: (git_directory: string, profile: AgentProfile | undefined) => number
|
|
32
|
+
show_board: () => Promise<number>
|
|
33
|
+
write: (line: string) => void
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const LIVE_PORTS: RestartPorts = {
|
|
37
|
+
read_carry: (git_directory) => run_carry.read_carry(run_carry.carry_path(git_directory)),
|
|
38
|
+
read_ended: (git_directory) =>
|
|
39
|
+
run_carry_ended.read_ended(run_carry_ended.ended_path(git_directory)),
|
|
40
|
+
read_profile: (git_directory) => run_wake.read_wake(run_wake.wake_path(git_directory))?.profile,
|
|
41
|
+
stop: async (git_directory) => await backlogrun_stop.stop_keeping_record(git_directory),
|
|
42
|
+
start_supervisor: run_wake_cli.restart_supervisor,
|
|
43
|
+
show_board: async () => await run_board_cli.run([]),
|
|
44
|
+
write: (line) => process.stdout.write(`${line}\n`),
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// The shell reads an unquoted `#N` as a comment, so the named list is written as bare numbers, which
|
|
48
|
+
// `josh backlogrun` reads back as issues.
|
|
49
|
+
function typed_invocation(invocation: string): string {
|
|
50
|
+
const tokens = invocation.split(' ').map((token) => token.replace(ISSUE_PREFIX_PATTERN, ''))
|
|
51
|
+
|
|
52
|
+
return `pnpm josh ${tokens.join(' ')}`
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Why nothing is restarted where the record is not carried.
|
|
56
|
+
function refusal_of(read: CarryRead, ended: EndedRun | undefined): string {
|
|
57
|
+
if (read.kind === 'unreadable') return `${PREFIX} the run's record could not be read`
|
|
58
|
+
if (ended === undefined) return `${PREFIX} nothing to restart`
|
|
59
|
+
|
|
60
|
+
return `${PREFIX} the run has ended; start it again with \`${typed_invocation(ended.invocation)}\``
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function refuse(line: string, ports: RestartPorts): number {
|
|
64
|
+
ports.write(line)
|
|
65
|
+
|
|
66
|
+
return FAILURE_EXIT_CODE
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// The supervisor's profile is read before it is stopped, since stopping it removes the record that
|
|
70
|
+
// holds it; the new one runs on the same provider whatever shell the restart was typed in.
|
|
71
|
+
async function replace(git_directory: string, ports: RestartPorts): Promise<number> {
|
|
72
|
+
const profile = ports.read_profile(git_directory)
|
|
73
|
+
const report = await ports.stop(git_directory)
|
|
74
|
+
|
|
75
|
+
for (const line of backlogrun_stop.lines_of(report)) ports.write(line)
|
|
76
|
+
|
|
77
|
+
if (!backlogrun_stop.is_stopped(report)) return FAILURE_EXIT_CODE
|
|
78
|
+
|
|
79
|
+
if (ports.start_supervisor(git_directory, profile) !== SUCCESS_EXIT_CODE) {
|
|
80
|
+
return refuse(`${PREFIX} could not start the supervisor`, ports)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return await ports.show_board()
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async function restart(git_directory: string, ports: RestartPorts = LIVE_PORTS): Promise<number> {
|
|
87
|
+
const read = ports.read_carry(git_directory)
|
|
88
|
+
|
|
89
|
+
if (read.kind === 'carried') return await replace(git_directory, ports)
|
|
90
|
+
|
|
91
|
+
return refuse(refusal_of(read, ports.read_ended(git_directory)), ports)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const backlogrun_restart = { restart }
|
|
95
|
+
|
|
96
|
+
export type { RestartPorts }
|
|
97
|
+
export { backlogrun_restart }
|
|
@@ -22,12 +22,27 @@ import { backlogrun_launch } from './backlogrun-launch'
|
|
|
22
22
|
// after a `run:wake --stop` or a supervisor that gave up, and the session it woke outlives both.
|
|
23
23
|
//
|
|
24
24
|
// **Lanes are counted, never stopped**: a child killed mid-change leaves a tree nobody can resume.
|
|
25
|
+
// `josh lane:pause --all` is the way to suspend them without discarding anything.
|
|
26
|
+
//
|
|
27
|
+
// **`--restart` stops the same processes and keeps the record** (`stop_keeping_record`), so the run's
|
|
28
|
+
// budget, counters and named list carry over to the supervisor started after it.
|
|
25
29
|
|
|
26
30
|
const STOPPED_REASON = 'stopped by a person with `josh backlogrun --stop`'
|
|
27
31
|
const PREFIX = 'backlogrun:'
|
|
28
32
|
const ISSUE_PREFIX = '#'
|
|
29
33
|
|
|
30
|
-
type RecordOutcome =
|
|
34
|
+
type RecordOutcome =
|
|
35
|
+
{ kind: 'none' } | { kind: 'ended' } | { kind: 'kept' } | { kind: 'held'; owner: number }
|
|
36
|
+
|
|
37
|
+
// What stopping the processes left: the pids stopped, the record as it stood, and the live owner this
|
|
38
|
+
// command may not signal.
|
|
39
|
+
interface StoppedProcesses {
|
|
40
|
+
supervisor: number | undefined
|
|
41
|
+
parent: number | undefined
|
|
42
|
+
session: number | undefined
|
|
43
|
+
read: CarryRead
|
|
44
|
+
holder: number | undefined
|
|
45
|
+
}
|
|
31
46
|
|
|
32
47
|
interface StopReport {
|
|
33
48
|
// The pids stopped, `undefined` where there was nothing to stop.
|
|
@@ -41,6 +56,8 @@ interface StopReport {
|
|
|
41
56
|
}
|
|
42
57
|
|
|
43
58
|
interface StopPorts {
|
|
59
|
+
running_supervisor: (git_directory: string) => number | undefined
|
|
60
|
+
running_parent: (git_directory: string) => number | undefined
|
|
44
61
|
stop_supervisor: (git_directory: string) => number | undefined
|
|
45
62
|
stop_parent: (git_directory: string) => number | undefined
|
|
46
63
|
stop_session: (pid: number) => void
|
|
@@ -59,6 +76,8 @@ async function open_lanes(): Promise<Array<string>> {
|
|
|
59
76
|
|
|
60
77
|
// A person who typed the stop is at the terminal, so the ⏸️ confirmation a stop pushes is not sent.
|
|
61
78
|
const LIVE_PORTS: StopPorts = {
|
|
79
|
+
running_supervisor: (git_directory) => run_wake.read_wake(run_wake.wake_path(git_directory))?.pid,
|
|
80
|
+
running_parent: backlogrun_launch.running_parent,
|
|
62
81
|
stop_supervisor: (git_directory) => run_wake_stop.stop(run_wake.wake_path(git_directory))?.pid,
|
|
63
82
|
stop_parent: backlogrun_launch.stop_parent,
|
|
64
83
|
stop_session: run_wake_stop.signal,
|
|
@@ -120,17 +139,67 @@ async function close_record(
|
|
|
120
139
|
return { kind: 'ended' }
|
|
121
140
|
}
|
|
122
141
|
|
|
123
|
-
|
|
142
|
+
function stop_processes(git_directory: string, ports: StopPorts): StoppedProcesses {
|
|
124
143
|
const supervisor = ports.stop_supervisor(git_directory)
|
|
125
144
|
const parent = ports.stop_parent(git_directory)
|
|
126
145
|
const read = ports.read_carry(git_directory)
|
|
127
146
|
const owner = standing_owner(read, [supervisor, parent], ports)
|
|
128
147
|
const session = stop_headless(owner, read, ports)
|
|
129
148
|
const holder = session === undefined ? owner : undefined
|
|
130
|
-
const record = await close_record(git_directory, read, holder, ports)
|
|
131
|
-
const lanes = await ports.lanes()
|
|
132
149
|
|
|
133
|
-
return { supervisor, parent, session,
|
|
150
|
+
return { supervisor, parent, session, read, holder }
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function kept_record(read: CarryRead, holder: number | undefined): RecordOutcome {
|
|
154
|
+
if (read.kind === 'none') return { kind: 'none' }
|
|
155
|
+
|
|
156
|
+
return holder === undefined ? { kind: 'kept' } : { kind: 'held', owner: holder }
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const NOTHING_STOPPED = { supervisor: undefined, parent: undefined, session: undefined }
|
|
160
|
+
|
|
161
|
+
// The live owner `--restart` may not signal, read before anything is stopped: a refusal found after the
|
|
162
|
+
// supervisor and the parent were stopped would leave the run with neither.
|
|
163
|
+
function foreign_owner(git_directory: string, ports: StopPorts): number | undefined {
|
|
164
|
+
const read = ports.read_carry(git_directory)
|
|
165
|
+
|
|
166
|
+
if (is_headless_owner(read)) return undefined
|
|
167
|
+
|
|
168
|
+
const running = [ports.running_supervisor(git_directory), ports.running_parent(git_directory)]
|
|
169
|
+
|
|
170
|
+
return standing_owner(read, running, ports)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
async function report_of(
|
|
174
|
+
stopped: Pick<StoppedProcesses, 'supervisor' | 'parent' | 'session'>,
|
|
175
|
+
record: RecordOutcome,
|
|
176
|
+
ports: StopPorts,
|
|
177
|
+
): Promise<StopReport> {
|
|
178
|
+
const { supervisor, parent, session } = stopped
|
|
179
|
+
|
|
180
|
+
return { supervisor, parent, session, record, lanes: await ports.lanes() }
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
async function stop(git_directory: string, ports: StopPorts = LIVE_PORTS): Promise<StopReport> {
|
|
184
|
+
const stopped = stop_processes(git_directory, ports)
|
|
185
|
+
const record = await close_record(git_directory, stopped.read, stopped.holder, ports)
|
|
186
|
+
|
|
187
|
+
return await report_of(stopped, record, ports)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
async function stop_keeping_record(
|
|
191
|
+
git_directory: string,
|
|
192
|
+
ports: StopPorts = LIVE_PORTS,
|
|
193
|
+
): Promise<StopReport> {
|
|
194
|
+
const holder = foreign_owner(git_directory, ports)
|
|
195
|
+
|
|
196
|
+
if (holder !== undefined) {
|
|
197
|
+
return await report_of(NOTHING_STOPPED, { kind: 'held', owner: holder }, ports)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const stopped = stop_processes(git_directory, ports)
|
|
201
|
+
|
|
202
|
+
return await report_of(stopped, kept_record(stopped.read, stopped.holder), ports)
|
|
134
203
|
}
|
|
135
204
|
|
|
136
205
|
function process_line(what: string, pid: number | undefined): Array<string> {
|
|
@@ -140,6 +209,7 @@ function process_line(what: string, pid: number | undefined): Array<string> {
|
|
|
140
209
|
function record_lines(outcome: RecordOutcome): Array<string> {
|
|
141
210
|
if (outcome.kind === 'none') return []
|
|
142
211
|
if (outcome.kind === 'ended') return [`${PREFIX} ended the run's record`]
|
|
212
|
+
if (outcome.kind === 'kept') return [`${PREFIX} kept the run's record`]
|
|
143
213
|
|
|
144
214
|
return [
|
|
145
215
|
`${PREFIX} process ${String(outcome.owner)} owns the run and was not started by \`josh backlogrun\`; its record is kept — end the run from that session`,
|
|
@@ -151,7 +221,9 @@ function lane_lines(lanes: ReadonlyArray<string>): Array<string> {
|
|
|
151
221
|
|
|
152
222
|
const issues = lanes.map((issue) => `${ISSUE_PREFIX}${issue}`).join(' ')
|
|
153
223
|
|
|
154
|
-
return [
|
|
224
|
+
return [
|
|
225
|
+
`${PREFIX} ${String(lanes.length)} lane(s) still running, not stopped: ${issues} — suspend them in place with \`josh lane:pause --all\``,
|
|
226
|
+
]
|
|
155
227
|
}
|
|
156
228
|
|
|
157
229
|
// What a person reads back: one line per thing done, or the one line that says nothing was running.
|
|
@@ -172,7 +244,7 @@ function is_stopped(report: StopReport): boolean {
|
|
|
172
244
|
return report.record.kind !== 'held'
|
|
173
245
|
}
|
|
174
246
|
|
|
175
|
-
const backlogrun_stop = { is_stopped, lines_of, stop }
|
|
247
|
+
const backlogrun_stop = { is_stopped, lines_of, stop, stop_keeping_record }
|
|
176
248
|
|
|
177
249
|
export type { StopPorts, StopReport }
|
|
178
250
|
export { backlogrun_stop }
|
|
@@ -13,8 +13,8 @@ import { behavior_rules } from './behavior-rules'
|
|
|
13
13
|
// **The scope is the current run, not the whole corpus.** The store holds thousands of transcripts
|
|
14
14
|
// and over a gigabyte; walking all of it every gate would cost minutes, not the seconds the other
|
|
15
15
|
// checks take. Each gate checks its own run, so across runs the whole corpus is covered a run at a
|
|
16
|
-
// time — and the engine stays general, so a broad scan of past runs (the greenness check
|
|
17
|
-
// assertion
|
|
16
|
+
// time — and the engine stays general, so a broad scan of past runs (the greenness check each
|
|
17
|
+
// assertion is verified with) is the same walk over a different set of files.
|
|
18
18
|
|
|
19
19
|
const PASS_EXIT_CODE = 0
|
|
20
20
|
const FAIL_EXIT_CODE = 1
|