@joshuafolkken/kit 1.1514.0 → 1.2114.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/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- 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 +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- 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 +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -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 +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -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 +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- 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 +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -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 +5 -4
- 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 +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- 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 +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- 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/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- 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/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -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 +33 -2
- 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 +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- 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-rank.ts +5 -0
- 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-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -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 +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- 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 +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -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/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -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 +38 -179
- 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/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- 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 +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -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 +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -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 +114 -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-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- 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 +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- 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 +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- 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 +160 -161
- 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 +142 -101
- 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 +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -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 +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- 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 +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -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 +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- 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/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- 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/token-shape.ts +111 -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-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -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 +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- 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/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- 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 +24 -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 +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- 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/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -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 +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- 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 +71 -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 +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -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 +90 -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 +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -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-link.ts +15 -2
- 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 +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- 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 +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -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 +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -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 +264 -258
- 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 +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- 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-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -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 +58 -10
- 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 +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- 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 +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- 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-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- 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 +3 -4
- 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 +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- 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 +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -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-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- 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 +6 -11
- package/scripts/security/secretlint-scan.ts +42 -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 +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- 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 +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -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/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- 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-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -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 +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- 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 +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- 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/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -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 +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -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-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- 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-O6GDRNJB.js +0 -343
- 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-TNUMY6NL.js +0 -4838
- 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/context-cut-threshold.ts +0 -11
- 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/filing-cap.ts +0 -132
- 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,11 +1,13 @@
|
|
|
1
1
|
import { epic_triage } from '#scripts/epic/epic-triage'
|
|
2
2
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
3
|
+
import { lane_ledger, type LedgerEntry } from '#scripts/lane/lane-ledger'
|
|
4
|
+
import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
|
|
3
5
|
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
4
6
|
|
|
5
7
|
// When ready backlog work sits undispatched while lanes are free, nobody notices until a person asks.
|
|
6
8
|
// This is the mechanical judge of that state: three facts read, never
|
|
7
9
|
// weighed — is there runnable work, is there a free lane, and has nothing been dispatched for a while.
|
|
8
|
-
// The verdict is a report, not a stop: a false positive costs one
|
|
10
|
+
// The verdict is a report, not a stop: a false positive costs one stream marker, never a halted run.
|
|
9
11
|
//
|
|
10
12
|
// **Pure by design.** The clock and the counts are handed in, so the four acceptance cases — work with
|
|
11
13
|
// a free lane, work with no free lane, no work, and an unreadable record — and the elapsed-time
|
|
@@ -13,7 +15,6 @@ import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-st
|
|
|
13
15
|
// counts is `backlog-stalled-detect.ts`; this file only decides.
|
|
14
16
|
|
|
15
17
|
const STALL_THRESHOLD_MINUTES = 10
|
|
16
|
-
const MS_PER_MINUTE = 60_000
|
|
17
18
|
const STALL_THRESHOLD_MS = STALL_THRESHOLD_MINUTES * MS_PER_MINUTE
|
|
18
19
|
const NONE = 0
|
|
19
20
|
|
|
@@ -28,11 +29,14 @@ const OK: StallVerdict = 'ok'
|
|
|
28
29
|
const UNREADABLE: StallVerdict = 'unreadable'
|
|
29
30
|
|
|
30
31
|
// The three facts, read and never judged: how many issues could start now, how many lanes are free, and
|
|
31
|
-
// how long since the last dispatch
|
|
32
|
+
// how long both have held together since the last dispatch — never the idle time before work arrived or
|
|
33
|
+
// a long child ran (joshuafolkken/kit#4349). `hold` is the driver's open hold reason (`memory`, …), so a
|
|
34
|
+
// deliberate hold reads apart from a slow dispatch. Assembled by the detect layer; consumed only here.
|
|
32
35
|
interface StallReading {
|
|
33
36
|
ready_count: number
|
|
34
37
|
free_lanes: number
|
|
35
|
-
|
|
38
|
+
waiting_ms: number
|
|
39
|
+
hold?: string | undefined
|
|
36
40
|
}
|
|
37
41
|
|
|
38
42
|
// All three together, and only together. Separated from `assess` so the short-circuit gate in the
|
|
@@ -40,9 +44,7 @@ interface StallReading {
|
|
|
40
44
|
// same condition rather than a second copy of it.
|
|
41
45
|
function is_stalled(reading: StallReading, threshold_ms: number): boolean {
|
|
42
46
|
return (
|
|
43
|
-
reading.ready_count > NONE &&
|
|
44
|
-
reading.free_lanes > NONE &&
|
|
45
|
-
reading.dispatch_age_ms > threshold_ms
|
|
47
|
+
reading.ready_count > NONE && reading.free_lanes > NONE && reading.waiting_ms > threshold_ms
|
|
46
48
|
)
|
|
47
49
|
}
|
|
48
50
|
|
|
@@ -68,23 +70,55 @@ function dispatch_reference_iso(events: ReadonlyArray<RunEvent>): string | undef
|
|
|
68
70
|
return last_launch?.at ?? events[0]?.at
|
|
69
71
|
}
|
|
70
72
|
|
|
71
|
-
//
|
|
72
|
-
|
|
73
|
-
function dispatch_age_ms(events: ReadonlyArray<RunEvent>, now_ms: number): number | undefined {
|
|
73
|
+
// That reference as epoch milliseconds, or `undefined` when there is none or the stamp is unparseable.
|
|
74
|
+
function dispatch_reference_ms(events: ReadonlyArray<RunEvent>): number | undefined {
|
|
74
75
|
const iso = dispatch_reference_iso(events)
|
|
76
|
+
const at = iso === undefined ? NaN : Date.parse(iso)
|
|
77
|
+
|
|
78
|
+
return Number.isNaN(at) ? undefined : at
|
|
79
|
+
}
|
|
75
80
|
|
|
76
|
-
|
|
81
|
+
// Milliseconds since that reference, or `undefined` when there is no reference — the caller reads it as
|
|
82
|
+
// "nothing to age against" and returns no stall. A stall cannot be older than this, so it gates the
|
|
83
|
+
// costly reads.
|
|
84
|
+
function dispatch_age_ms(events: ReadonlyArray<RunEvent>, now_ms: number): number | undefined {
|
|
85
|
+
const at = dispatch_reference_ms(events)
|
|
86
|
+
|
|
87
|
+
return at === undefined ? undefined : now_ms - at
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// When the current coexistence of offerable work and a free lane was first observed: the newest
|
|
91
|
+
// observation since the reference, if it saw both. `undefined` when it did not or none was made — an
|
|
92
|
+
// observation before the last dispatch belongs to an episode that dispatch ended.
|
|
93
|
+
function open_offerable_ms(
|
|
94
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
95
|
+
reference_ms: number,
|
|
96
|
+
): number | undefined {
|
|
97
|
+
const newest = entries.findLast(
|
|
98
|
+
(entry) => entry.kind === lane_ledger.KIND.OFFERABLE && Date.parse(entry.at) >= reference_ms,
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
if (newest?.kind !== lane_ledger.KIND.OFFERABLE || !newest.is_offerable) return undefined
|
|
102
|
+
|
|
103
|
+
return Date.parse(newest.at)
|
|
104
|
+
}
|
|
77
105
|
|
|
78
|
-
|
|
106
|
+
// The driver's open hold reason: the newest of its hold, release and dispatch records, when a hold.
|
|
107
|
+
function open_hold(entries: ReadonlyArray<LedgerEntry>): string | undefined {
|
|
108
|
+
const { HELD, RELEASED, DISPATCH } = lane_ledger.KIND
|
|
109
|
+
const hold_kinds: ReadonlySet<string> = new Set([HELD, RELEASED, DISPATCH])
|
|
110
|
+
const newest = entries.findLast((entry) => hold_kinds.has(entry.kind))
|
|
79
111
|
|
|
80
|
-
return
|
|
112
|
+
return newest?.kind === lane_ledger.KIND.HELD ? newest.reason : undefined
|
|
81
113
|
}
|
|
82
114
|
|
|
83
|
-
// The one line a person reads in the notification and on the stream: what is waiting
|
|
115
|
+
// The one line a person reads in the notification and on the stream: what is waiting, how long, and the
|
|
116
|
+
// driver's hold reason when it holds deliberately.
|
|
84
117
|
function describe(reading: StallReading): string {
|
|
85
|
-
const minutes = Math.floor(reading.
|
|
118
|
+
const minutes = Math.floor(reading.waiting_ms / MS_PER_MINUTE)
|
|
119
|
+
const held = reading.hold === undefined ? '' : ` (held: ${reading.hold})`
|
|
86
120
|
|
|
87
|
-
return `${String(reading.ready_count)} ready, ${String(reading.free_lanes)} free lane(s), ${String(minutes)}m
|
|
121
|
+
return `${String(reading.ready_count)} ready, ${String(reading.free_lanes)} free lane(s), ${String(minutes)}m waiting with both${held}`
|
|
88
122
|
}
|
|
89
123
|
|
|
90
124
|
// The runnable issue numbers `backlog:next` printed: one token per line, a bare number per runnable
|
|
@@ -118,6 +152,8 @@ const backlog_stalled = {
|
|
|
118
152
|
describe,
|
|
119
153
|
dispatch_age_ms,
|
|
120
154
|
needs_triage,
|
|
155
|
+
open_hold,
|
|
156
|
+
open_offerable_ms,
|
|
121
157
|
ready_tokens,
|
|
122
158
|
}
|
|
123
159
|
|
|
@@ -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
|
|
|
@@ -21,7 +24,7 @@ import { backlog_rank, type GateScope } from './backlog-rank'
|
|
|
21
24
|
// **No rule is written twice.** The first wave is `backlog_rank.select` — rank, `run:solo` gate,
|
|
22
25
|
// overlap separation, cap —
|
|
23
26
|
// over the very candidates `backlog:next` resolves, asked of an idle repository — so it is what
|
|
24
|
-
// `backlog:next` prints when nothing is running. Each later wave marks the earlier waves closed and re-classifies the same pool
|
|
27
|
+
// `backlog:next` prints when nothing is running, cut at the lane limit rather than the printed count. Each later wave marks the earlier waves closed and re-classifies the same pool
|
|
25
28
|
// through `epic_classify.classify_children` with the resolver `epic:next` sorted it with the first
|
|
26
29
|
// time — `epic_cross_repo.resolve_cross_repo`, so a blocker in another repository still waits for its
|
|
27
30
|
// release rather than counting as done on close — then puts the runnable set through
|
|
@@ -30,9 +33,13 @@ import { backlog_rank, type GateScope } from './backlog-rank'
|
|
|
30
33
|
const IDLE: BusyRead = { kind: 'idle' }
|
|
31
34
|
const CLOSED = 'CLOSED'
|
|
32
35
|
const EMPTY_SCOPE: GateScope = { standalone: new Set(), declared: new Map() }
|
|
36
|
+
// A wave is as wide as the lanes that run it, not `backlog:next`'s `DISPLAY_LIMIT` — that printed
|
|
37
|
+
// count pushed an issue whose blocker closed in wave k past wave k+1 (joshuafolkken/kit#5300).
|
|
38
|
+
const UNCAPPED = Infinity
|
|
33
39
|
|
|
34
40
|
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.'
|
|
41
|
+
'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.'
|
|
42
|
+
const UNCAPPED_WIDTH = 'A wave is not capped: the lane limit could not be read.'
|
|
36
43
|
const UNREACHED_HEADING = 'Not reached — each names what it is waiting on:'
|
|
37
44
|
const PARALLEL_NOTE = '(parallel)'
|
|
38
45
|
const NEEDS_DECISION_NOTE = `waiting on a person (\`${NEEDS_DECISION_LABEL}\`)`
|
|
@@ -45,18 +52,23 @@ const PARALLEL_GAP = ' '.repeat(PARALLEL_GAP_WIDTH)
|
|
|
45
52
|
interface WavePlan {
|
|
46
53
|
waves: ReadonlyArray<ReadonlyArray<EpicChild>>
|
|
47
54
|
unreached: ReadonlyArray<EpicChild>
|
|
55
|
+
// This repository's running issues, which count as merged before wave 1 and so sit in neither list
|
|
56
|
+
// above; still the run's own, so `run:board` holds their lanes (kit#3969).
|
|
57
|
+
running?: ReadonlyArray<EpicChild>
|
|
48
58
|
}
|
|
49
59
|
|
|
60
|
+
// A park leaves `in-progress` on (`epic-busy.ts`), and a parked issue waits on a person rather than
|
|
61
|
+
// finishing first.
|
|
50
62
|
function is_running(child: EpicChild): boolean {
|
|
51
|
-
return has_label_name(child.labels, IN_PROGRESS_LABEL)
|
|
63
|
+
return has_label_name(child.labels, IN_PROGRESS_LABEL) && !has_parked_label(child.labels)
|
|
52
64
|
}
|
|
53
65
|
|
|
54
66
|
function as_closed(child: EpicChild, done: ReadonlySet<string>): EpicChild {
|
|
55
67
|
return done.has(epic_graph.key_of(child)) ? { ...child, state: CLOSED } : child
|
|
56
68
|
}
|
|
57
69
|
|
|
58
|
-
// The pool a wave is chosen from.
|
|
59
|
-
//
|
|
70
|
+
// The pool a wave is chosen from. `running` is every issue this run may finish, so a child behind one
|
|
71
|
+
// waits on it rather than being handed to a person.
|
|
60
72
|
interface WavePool {
|
|
61
73
|
children: ReadonlyArray<EpicChild>
|
|
62
74
|
running: ReadonlySet<string>
|
|
@@ -67,12 +79,7 @@ interface WavePool {
|
|
|
67
79
|
function pool_of(result: EpicNextResult, repo: string, scope: GateScope): WavePool {
|
|
68
80
|
const all = backlog_rank.everything_in(result)
|
|
69
81
|
|
|
70
|
-
return {
|
|
71
|
-
children: all.filter((child) => !is_running(child)),
|
|
72
|
-
running: epic_outside_blocker.running_keys(all),
|
|
73
|
-
repo,
|
|
74
|
-
scope,
|
|
75
|
-
}
|
|
82
|
+
return { children: all, running: epic_outside_blocker.running_keys(all), repo, scope }
|
|
76
83
|
}
|
|
77
84
|
|
|
78
85
|
function offer(
|
|
@@ -81,8 +88,10 @@ function offer(
|
|
|
81
88
|
pool: WavePool,
|
|
82
89
|
): ReadonlyArray<EpicChild> {
|
|
83
90
|
const { repo, scope } = pool
|
|
91
|
+
const limit = scope.wave_limit ?? UNCAPPED
|
|
84
92
|
|
|
85
|
-
return backlog_rank.select({ candidates, pool: children, read: IDLE, repo, ...scope })
|
|
93
|
+
return backlog_rank.select({ candidates, pool: children, read: IDLE, repo, ...scope, limit })
|
|
94
|
+
.offered
|
|
86
95
|
}
|
|
87
96
|
|
|
88
97
|
// Ranked against the whole result, exactly as `backlog:next` ranks it, so the two agree.
|
|
@@ -107,15 +116,31 @@ function next_wave(pool: WavePool, done: ReadonlySet<string>): ReadonlyArray<Epi
|
|
|
107
116
|
)
|
|
108
117
|
}
|
|
109
118
|
|
|
119
|
+
// `backlog:next` offers nothing behind a running issue, so an empty first wave still asks for the
|
|
120
|
+
// issues the running ones release.
|
|
121
|
+
function opening_wave(
|
|
122
|
+
result: EpicNextResult,
|
|
123
|
+
pool: WavePool,
|
|
124
|
+
done: ReadonlySet<string>,
|
|
125
|
+
): ReadonlyArray<EpicChild> {
|
|
126
|
+
const wave = first_wave(result, pool)
|
|
127
|
+
|
|
128
|
+
return wave.length > 0 ? wave : next_wave(pool, done)
|
|
129
|
+
}
|
|
130
|
+
|
|
110
131
|
// Each wave is closed before the next is asked for; a wave that offers nothing ends the plan, which
|
|
111
132
|
// the pool's size bounds because every wave closes at least one child. `scope` names the rows the
|
|
112
133
|
// offer's cap bounds and the paths each issue declares; left empty, no wave is capped or separated.
|
|
113
134
|
function build(result: EpicNextResult, repo: string, scope: GateScope = EMPTY_SCOPE): WavePlan {
|
|
114
135
|
const pool = pool_of(result, repo, scope)
|
|
115
|
-
const
|
|
136
|
+
const running = pool.children.filter((child) => child.repo === repo && is_running(child))
|
|
137
|
+
// A running issue finishes first, before any wave: it starts closed, so it is never offered and the
|
|
138
|
+
// issues behind it reach a later wave instead of waiting past the plan. Another repository's is not
|
|
139
|
+
// this run's to finish, and closing it would answer its release from the version already out.
|
|
140
|
+
const done = new Set(running.map((child) => epic_graph.key_of(child)))
|
|
116
141
|
const waves: Array<ReadonlyArray<EpicChild>> = []
|
|
117
142
|
|
|
118
|
-
for (let wave =
|
|
143
|
+
for (let wave = opening_wave(result, pool, done); wave.length > 0; wave = next_wave(pool, done)) {
|
|
119
144
|
waves.push(wave)
|
|
120
145
|
for (const child of wave) done.add(epic_graph.key_of(child))
|
|
121
146
|
}
|
|
@@ -124,7 +149,12 @@ function build(result: EpicNextResult, repo: string, scope: GateScope = EMPTY_SC
|
|
|
124
149
|
.everything_in(result)
|
|
125
150
|
.filter((child) => child.repo === repo && !done.has(epic_graph.key_of(child)))
|
|
126
151
|
|
|
127
|
-
return { waves, unreached }
|
|
152
|
+
return { waves, unreached, running }
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// A stalled issue's note ends on the one next action its park comment names (`run-stalled.ts`).
|
|
156
|
+
function run_stalled_note(child: number): string {
|
|
157
|
+
return `stalled mechanically — ${run_stalled.next_step(child)}`
|
|
128
158
|
}
|
|
129
159
|
|
|
130
160
|
// The plan's own "waiting on" wording is reused, so an unreached issue names its blocker the way the
|
|
@@ -132,6 +162,7 @@ function build(result: EpicNextResult, repo: string, scope: GateScope = EMPTY_SC
|
|
|
132
162
|
// as not reached instead.
|
|
133
163
|
function unreached_note(child: EpicChild, context: PlanContext): string {
|
|
134
164
|
if (has_label_name(child.labels, NEEDS_DECISION_LABEL)) return NEEDS_DECISION_NOTE
|
|
165
|
+
if (has_label_name(child.labels, RUN_STALLED_LABEL)) return run_stalled_note(child.number)
|
|
135
166
|
const note = backlog_plan.waiting_note(child, context)
|
|
136
167
|
|
|
137
168
|
return note === backlog_plan.PAST_OFFER_NOTE ? NOT_REACHED_NOTE : note
|
|
@@ -150,6 +181,12 @@ function unreached_lines(plan: WavePlan, context: PlanContext): Array<string> {
|
|
|
150
181
|
)
|
|
151
182
|
}
|
|
152
183
|
|
|
184
|
+
function width_line(wave_limit: number | undefined): string {
|
|
185
|
+
if (wave_limit === undefined) return UNCAPPED_WIDTH
|
|
186
|
+
|
|
187
|
+
return `A wave holds at most ${String(wave_limit)} standalone issues, the lane limit; an epic's children are not counted.`
|
|
188
|
+
}
|
|
189
|
+
|
|
153
190
|
function format_waves(
|
|
154
191
|
result: EpicNextResult,
|
|
155
192
|
context: PlanContext,
|
|
@@ -163,6 +200,7 @@ function format_waves(
|
|
|
163
200
|
return [
|
|
164
201
|
`Backlog waves — ${context.repo}`,
|
|
165
202
|
HEADING_ASSUMPTION,
|
|
203
|
+
width_line(scope.wave_limit),
|
|
166
204
|
'',
|
|
167
205
|
...(waves.length === 0 ? [backlog_plan.NOTHING] : waves),
|
|
168
206
|
'',
|
|
@@ -174,9 +212,12 @@ const backlog_waves = {
|
|
|
174
212
|
HEADING_ASSUMPTION,
|
|
175
213
|
NEEDS_DECISION_NOTE,
|
|
176
214
|
PARALLEL_NOTE,
|
|
215
|
+
run_stalled_note,
|
|
216
|
+
UNCAPPED_WIDTH,
|
|
177
217
|
UNREACHED_HEADING,
|
|
178
218
|
build,
|
|
179
219
|
format_waves,
|
|
220
|
+
width_line,
|
|
180
221
|
}
|
|
181
222
|
|
|
182
223
|
export { backlog_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 }
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
type AgentProvider,
|
|
7
7
|
} from '#scripts/agent/agent-role-profile'
|
|
8
8
|
import { agent_session_environment } from '#scripts/josh/agent-session-environment'
|
|
9
|
+
import { durable_state } from '#scripts/josh/durable-state'
|
|
9
10
|
import { process_identity } from '#scripts/josh/process-identity'
|
|
10
11
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
11
12
|
import { json_value } from '#scripts/lib/json-value'
|
|
@@ -27,8 +28,8 @@ import { z } from 'zod'
|
|
|
27
28
|
// session can still start a Codex parent. The same choice is handed to the parent as
|
|
28
29
|
// `JOSH_AGENT_PROVIDER`, the key a detached child with no session of its own resolves from.
|
|
29
30
|
|
|
30
|
-
const LAUNCH_PREFIX =
|
|
31
|
-
const LOG_PREFIX =
|
|
31
|
+
const LAUNCH_PREFIX = durable_state.PREFIX.BACKLOGRUN_LAUNCH
|
|
32
|
+
const LOG_PREFIX = durable_state.PREFIX.BACKLOGRUN_LOG
|
|
32
33
|
const LOG_SUFFIX = '.log'
|
|
33
34
|
|
|
34
35
|
const launch_schema = z.object({
|
|
@@ -64,11 +65,11 @@ interface Launched {
|
|
|
64
65
|
type StartResult = { kind: 'launched'; launched: Launched } | { kind: 'failed'; note: string }
|
|
65
66
|
|
|
66
67
|
function launch_path(git_directory: string): string {
|
|
67
|
-
return
|
|
68
|
+
return durable_state.path(LAUNCH_PREFIX, git_directory)
|
|
68
69
|
}
|
|
69
70
|
|
|
70
71
|
function log_path(git_directory: string): string {
|
|
71
|
-
return
|
|
72
|
+
return durable_state.path(LOG_PREFIX, git_directory, LOG_SUFFIX)
|
|
72
73
|
}
|
|
73
74
|
|
|
74
75
|
function read_launch(target: string): LaunchRecord | undefined {
|
|
@@ -180,6 +181,11 @@ function signal_parent(pid: number): void {
|
|
|
180
181
|
}
|
|
181
182
|
}
|
|
182
183
|
|
|
184
|
+
// The pid `stop_parent` would stop, read without stopping it.
|
|
185
|
+
function running_parent(git_directory: string): number | undefined {
|
|
186
|
+
return live_launch(git_directory)?.pid
|
|
187
|
+
}
|
|
188
|
+
|
|
183
189
|
// Stops the parent this launcher started and forgets its launch — the pid stopped, `undefined` where
|
|
184
190
|
// no launched parent was live. **Only the process the record names, and only while it is still that
|
|
185
191
|
// process**: a session a person typed `backlogrun` into has no launch record and is never signalled.
|
|
@@ -243,7 +249,10 @@ const backlogrun_launch = {
|
|
|
243
249
|
argv_of,
|
|
244
250
|
chosen_environment,
|
|
245
251
|
is_running,
|
|
252
|
+
launch_path,
|
|
253
|
+
log_path,
|
|
246
254
|
pending_launch,
|
|
255
|
+
running_parent,
|
|
247
256
|
start,
|
|
248
257
|
started_for,
|
|
249
258
|
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 }
|