@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
|
@@ -4,12 +4,14 @@ import { epic_rank } from '#scripts/epic/epic-rank'
|
|
|
4
4
|
import type { EpicNextResult } from '#scripts/epic/epic-report'
|
|
5
5
|
import { epic_solo, type SoloGate, type SoloSelection } from '#scripts/epic/epic-solo'
|
|
6
6
|
import { git_next_issues } from '#scripts/issue/git-next-issues'
|
|
7
|
+
import type { LaneRecords } from '#scripts/lane/lane-state'
|
|
7
8
|
import { backlog_overlap, type Declared } from './backlog-overlap'
|
|
8
9
|
|
|
9
10
|
// What the backlog offers, in the order it is decided: rank, then the
|
|
10
11
|
// `run:solo` gate, then the cap. `backlog:next` and `backlog:plan --waves` both call `select`, so the
|
|
11
12
|
// plan's first wave is what the run starts into an idle repository rather than an order the run never
|
|
12
|
-
// takes.
|
|
13
|
+
// takes. Only the cap's width differs: `backlog:next` prints `DISPLAY_LIMIT` rows, a wave holds the
|
|
14
|
+
// lane limit (`limit`).
|
|
13
15
|
//
|
|
14
16
|
// **The cap comes last.** Applied while the standalone half is classified, before the gate, it would
|
|
15
17
|
// cut a `run:solo` issue ranked sixth or lower before the gate could see it — and offer the issues
|
|
@@ -28,37 +30,51 @@ function everything_in(result: EpicNextResult): ReadonlyArray<EpicChild> {
|
|
|
28
30
|
// The ranking is `epic_rank.rank`, shared with a named epic's lanes.
|
|
29
31
|
const { rank } = epic_rank
|
|
30
32
|
|
|
31
|
-
// This repository's candidates
|
|
32
|
-
//
|
|
33
|
-
function
|
|
33
|
+
// This repository's candidates put in `order` inside the result; another repository's are left as
|
|
34
|
+
// they came.
|
|
35
|
+
function reorder_repo(
|
|
36
|
+
result: EpicNextResult,
|
|
37
|
+
repo: string,
|
|
38
|
+
order: (children: ReadonlyArray<EpicChild>) => ReadonlyArray<EpicChild>,
|
|
39
|
+
): EpicNextResult {
|
|
34
40
|
if (result.verdict !== 'run') return result
|
|
35
41
|
|
|
36
|
-
const pool = everything_in(result)
|
|
37
|
-
|
|
38
42
|
return {
|
|
39
43
|
...result,
|
|
40
44
|
candidates: result.candidates.map((bundle) =>
|
|
41
|
-
bundle.repo === repo ? { ...bundle, children:
|
|
45
|
+
bundle.repo === repo ? { ...bundle, children: order(bundle.children) } : bundle,
|
|
42
46
|
),
|
|
43
47
|
}
|
|
44
48
|
}
|
|
45
49
|
|
|
50
|
+
// The rank `select` starts from; `offer_order` adds the yielded-first step for `backlog:plan`.
|
|
51
|
+
function rank_result(result: EpicNextResult, repo: string): EpicNextResult {
|
|
52
|
+
const pool = everything_in(result)
|
|
53
|
+
|
|
54
|
+
return reorder_repo(result, repo, (children) => rank(children, pool))
|
|
55
|
+
}
|
|
56
|
+
|
|
46
57
|
// The standalone rows past the cap, in offer order.
|
|
47
58
|
function overflow_of(
|
|
48
59
|
offered: ReadonlyArray<EpicChild>,
|
|
49
60
|
standalone: ReadonlySet<string>,
|
|
61
|
+
limit: number,
|
|
50
62
|
): ReadonlySet<string> {
|
|
51
63
|
const keys = offered.map((child) => epic_graph.key_of(child)).filter((key) => standalone.has(key))
|
|
52
64
|
|
|
53
|
-
return new Set(keys.slice(
|
|
65
|
+
return new Set(keys.slice(limit))
|
|
54
66
|
}
|
|
55
67
|
|
|
56
68
|
function is_in(child: EpicChild, keys: ReadonlySet<string>): boolean {
|
|
57
69
|
return keys.has(epic_graph.key_of(child))
|
|
58
70
|
}
|
|
59
71
|
|
|
60
|
-
function cap(
|
|
61
|
-
|
|
72
|
+
function cap(
|
|
73
|
+
selection: SoloSelection,
|
|
74
|
+
standalone: ReadonlySet<string>,
|
|
75
|
+
limit: number,
|
|
76
|
+
): SoloSelection {
|
|
77
|
+
const overflow = overflow_of(selection.offered, standalone, limit)
|
|
62
78
|
|
|
63
79
|
if (overflow.size === 0) return selection
|
|
64
80
|
|
|
@@ -82,22 +98,61 @@ interface OfferInput {
|
|
|
82
98
|
// The paths each issue declares; two candidates whose paths overlap are not offered together.
|
|
83
99
|
// Absent, nothing is separated.
|
|
84
100
|
declared?: Declared
|
|
101
|
+
// The issues' lane state records; a clash with a paused holder says so. Absent, none is named.
|
|
102
|
+
lanes?: LaneRecords
|
|
103
|
+
// The keys of the issues that gave their lane back (`lane-yield.ts`). Absent, none did.
|
|
104
|
+
yielded?: ReadonlySet<string>
|
|
105
|
+
// How many standalone rows the cap keeps. Absent, `DISPLAY_LIMIT` — what `backlog:next` prints.
|
|
106
|
+
limit?: number
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// A yielded issue ahead of the rank: its lane was taken from it, so it takes the first free one
|
|
110
|
+
// once its holder ends rather than queueing behind the pool (joshuafolkken/kit#5107). While the
|
|
111
|
+
// holder runs, its kept plan still withholds it in the separation. It goes ahead of a `run:solo`
|
|
112
|
+
// issue too: the solo gate sees it first.
|
|
113
|
+
function yielded_first(
|
|
114
|
+
ranked: ReadonlyArray<EpicChild>,
|
|
115
|
+
yielded: ReadonlySet<string>,
|
|
116
|
+
): Array<EpicChild> {
|
|
117
|
+
return [
|
|
118
|
+
...ranked.filter((child) => is_in(child, yielded)),
|
|
119
|
+
...ranked.filter((child) => !is_in(child, yielded)),
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// A ranked result in the order `select` walks it — a yielded issue ahead of the rank — so
|
|
124
|
+
// `backlog:plan`'s "Ready now" reads in the order each wave is offered in (joshuafolkken/kit#5299).
|
|
125
|
+
function offer_order(
|
|
126
|
+
result: EpicNextResult,
|
|
127
|
+
repo: string,
|
|
128
|
+
yielded: ReadonlySet<string> = new Set(),
|
|
129
|
+
): EpicNextResult {
|
|
130
|
+
return reorder_repo(result, repo, (children) => yielded_first(children, yielded))
|
|
85
131
|
}
|
|
86
132
|
|
|
87
133
|
// The overlap separation runs before the cap, for the reason the gate does: the cap only ever
|
|
88
134
|
// removes what would otherwise be offered.
|
|
89
135
|
function select(input: OfferInput): SoloSelection {
|
|
90
|
-
const ranked = rank(input.candidates, input.pool)
|
|
91
|
-
const { read, repo } = input
|
|
136
|
+
const ranked = yielded_first(rank(input.candidates, input.pool), input.yielded ?? new Set())
|
|
137
|
+
const { read, repo, lanes } = input
|
|
92
138
|
const gated = epic_solo.select(ranked, read, repo)
|
|
93
|
-
const separated = backlog_overlap.separate(gated, input.declared ?? new Map(), {
|
|
139
|
+
const separated = backlog_overlap.separate(gated, input.declared ?? new Map(), {
|
|
140
|
+
read,
|
|
141
|
+
repo,
|
|
142
|
+
lanes,
|
|
143
|
+
})
|
|
94
144
|
|
|
95
|
-
return cap(separated, input.standalone)
|
|
145
|
+
return cap(separated, input.standalone, input.limit ?? git_next_issues.DISPLAY_LIMIT)
|
|
96
146
|
}
|
|
97
147
|
|
|
98
148
|
interface GateScope {
|
|
99
149
|
standalone: ReadonlySet<string>
|
|
100
150
|
declared: Declared
|
|
151
|
+
lanes?: LaneRecords
|
|
152
|
+
yielded?: ReadonlySet<string>
|
|
153
|
+
// How many standalone rows a planned wave holds — the lane limit; `backlog:next`'s offer ignores
|
|
154
|
+
// it. Absent, a wave is not capped (joshuafolkken/kit#5300).
|
|
155
|
+
wave_limit?: number | undefined
|
|
101
156
|
}
|
|
102
157
|
|
|
103
158
|
// `backlog:next`'s gate: `epic_solo.gate` with this selection in place of its bare one.
|
|
@@ -109,7 +164,7 @@ function gate(result: EpicNextResult, read: BusyRead, repo: string, scope: GateS
|
|
|
109
164
|
)
|
|
110
165
|
}
|
|
111
166
|
|
|
112
|
-
const backlog_rank = { everything_in, gate, rank_result, select }
|
|
167
|
+
const backlog_rank = { everything_in, gate, offer_order, rank_result, select }
|
|
113
168
|
|
|
114
169
|
export { backlog_rank }
|
|
115
170
|
export type { GateScope, OfferInput }
|
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
2
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
3
|
-
import {
|
|
3
|
+
import type { JoshResult } from '#scripts/josh/josh-run'
|
|
4
4
|
import { lane_capacity } from '#scripts/lane/lane-capacity'
|
|
5
|
+
import { lane_process_table, type TableRead } from '#scripts/lane/lane-process-table'
|
|
5
6
|
import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
|
|
7
|
+
import { lane_snapshot_trace } from '#scripts/lane/lane-snapshot-trace'
|
|
6
8
|
import { lane_spent } from '#scripts/lane/lane-spent'
|
|
9
|
+
import { lane_state } from '#scripts/lane/lane-state'
|
|
7
10
|
import type { RunCarry } from '#scripts/run/carry/run-carry'
|
|
11
|
+
import { run_event_scope } from '#scripts/run/event/run-event-scope'
|
|
12
|
+
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
8
13
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
9
14
|
import { run_headless } from '#scripts/run/run-headless'
|
|
10
15
|
import { run_invocation } from '#scripts/run/run-invocation'
|
|
11
|
-
import {
|
|
16
|
+
import { backlog_drive_restore } from './backlog-drive-restore'
|
|
17
|
+
import { backlog_next_shared } from './backlog-next-shared'
|
|
18
|
+
import { backlog_occupied } from './backlog-occupied'
|
|
19
|
+
import { backlog_offer_exclude } from './backlog-offer-exclude'
|
|
12
20
|
import { backlog_stalled } from './backlog-stalled'
|
|
13
21
|
|
|
14
22
|
// The ready line reports runnable work to the driving backlogrun parent on a watcher wake.
|
|
@@ -21,10 +29,27 @@ interface ReadyReading {
|
|
|
21
29
|
free_lanes: number
|
|
22
30
|
}
|
|
23
31
|
|
|
24
|
-
// How many open lanes hold a place under the limit,
|
|
32
|
+
// How many open lanes hold a place under the limit, how many hold a port seat, and the ones with no
|
|
33
|
+
// lane state record.
|
|
25
34
|
interface LaneUse {
|
|
26
35
|
occupied: number
|
|
27
36
|
seated: number
|
|
37
|
+
unknown: ReadonlyArray<string>
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// The lanes that hold a place under the limit, read once for every count drawn from them.
|
|
41
|
+
interface LaneRoom {
|
|
42
|
+
occupied: ReadonlyArray<LaneInfo>
|
|
43
|
+
// The open lanes no child is working in, read from the same snapshot.
|
|
44
|
+
idle: ReadonlyArray<string>
|
|
45
|
+
// The open lanes with no lane state record, counted as holding a place until one is written.
|
|
46
|
+
unknown: ReadonlyArray<string>
|
|
47
|
+
use: LaneUse
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
interface LaneCount {
|
|
51
|
+
limit: number
|
|
52
|
+
free: number
|
|
28
53
|
}
|
|
29
54
|
|
|
30
55
|
interface ReadyPorts {
|
|
@@ -32,45 +57,69 @@ interface ReadyPorts {
|
|
|
32
57
|
ready_issues: () => Promise<ReadonlyArray<string>>
|
|
33
58
|
}
|
|
34
59
|
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
60
|
+
// The lanes that hold a place under the limit (`backlog-occupied.ts`), the idle ones and the unknown
|
|
61
|
+
// ones. Paused is each lane's state record's answer; every lane's idle reading is drawn from one
|
|
62
|
+
// asynchronous process snapshot, so the count never blocks its caller's event loop
|
|
63
|
+
// (joshuafolkken/kit#4241, #4245); `run:board` passes the snapshot its redraw already read (#4246).
|
|
64
|
+
async function occupancy_of(
|
|
65
|
+
open: ReadonlyArray<LaneInfo>,
|
|
66
|
+
table: TableRead,
|
|
67
|
+
): Promise<Omit<LaneRoom, 'use'>> {
|
|
68
|
+
const rows = await table()
|
|
69
|
+
const issues = open.map((lane) => lane.issue)
|
|
70
|
+
const trace = { process_trace: await lane_snapshot_trace.traces_of(issues, rows) }
|
|
71
|
+
const records = await lane_state.read_states(issues)
|
|
72
|
+
const is_merge_waiting = await lane_snapshot_trace.merge_waits_of(issues, rows)
|
|
73
|
+
const occupied = backlog_occupied.occupied_lanes(
|
|
74
|
+
open,
|
|
75
|
+
(live) => lane_spent.idle_lanes(live, trace),
|
|
76
|
+
records,
|
|
77
|
+
is_merge_waiting,
|
|
78
|
+
)
|
|
79
|
+
const unknown = backlog_occupied.unknown_lanes(open, records)
|
|
80
|
+
|
|
81
|
+
return { occupied, idle: lane_spent.idle_lanes(open, trace), unknown }
|
|
44
82
|
}
|
|
45
83
|
|
|
46
|
-
// The lanes that hold a place under the limit
|
|
47
|
-
|
|
84
|
+
// The open lanes as the free count reads them: those that hold a place under the limit, and every
|
|
85
|
+
// open one, since an uncounted lane still holds its port seat.
|
|
86
|
+
async function lane_room(
|
|
87
|
+
lanes?: ReadonlyArray<LaneInfo>,
|
|
88
|
+
table: TableRead = lane_process_table.read_table,
|
|
89
|
+
): Promise<LaneRoom> {
|
|
48
90
|
const open = lanes ?? (await lane_registry.list_lanes())
|
|
91
|
+
const occupancy = await occupancy_of(open, table)
|
|
92
|
+
const seated = open.filter((lane) => !lane.is_stranded).length
|
|
49
93
|
|
|
50
|
-
|
|
94
|
+
const use = { occupied: occupancy.occupied.length, seated, unknown: occupancy.unknown }
|
|
95
|
+
|
|
96
|
+
return { ...occupancy, use }
|
|
51
97
|
}
|
|
52
98
|
|
|
53
|
-
// The open lanes as the free count reads them: those that hold a place under the limit, and every
|
|
54
|
-
// open one, since an uncounted lane still holds its port seat.
|
|
55
99
|
async function lane_use(lanes?: ReadonlyArray<LaneInfo>): Promise<LaneUse> {
|
|
56
|
-
const
|
|
57
|
-
const occupied = await occupied_lanes(open)
|
|
100
|
+
const room = await lane_room(lanes)
|
|
58
101
|
|
|
59
|
-
return
|
|
102
|
+
return room.use
|
|
60
103
|
}
|
|
61
104
|
|
|
62
105
|
function free_of(limit: number, use: LaneUse): number {
|
|
63
106
|
return lane_capacity.free_lanes(limit, use.occupied, use.seated)
|
|
64
107
|
}
|
|
65
108
|
|
|
66
|
-
//
|
|
67
|
-
// prints, and the one `run:board` draws, so the two never answer apart.
|
|
68
|
-
async function
|
|
109
|
+
// The limit and the free lanes in `room`, `undefined` where the limit could not be read: the count
|
|
110
|
+
// `lane:limit` prints, and the one `run:board` draws, so the two never answer apart.
|
|
111
|
+
async function count_in(room: LaneRoom): Promise<LaneCount | undefined> {
|
|
69
112
|
const limit = await lane_capacity.lane_limit()
|
|
70
113
|
|
|
71
114
|
if (limit.kind !== 'limit') return undefined
|
|
72
115
|
|
|
73
|
-
return free_of(limit.limit,
|
|
116
|
+
return { limit: limit.limit, free: free_of(limit.limit, room.use) }
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async function free_lanes_beside(lanes: ReadonlyArray<LaneInfo>): Promise<number | undefined> {
|
|
120
|
+
const count = await count_in(await lane_room(lanes))
|
|
121
|
+
|
|
122
|
+
return count?.free
|
|
74
123
|
}
|
|
75
124
|
|
|
76
125
|
async function free_under(limit: number): Promise<number> {
|
|
@@ -94,12 +143,24 @@ async function free_lane_count(): Promise<number> {
|
|
|
94
143
|
// **The drive's count throws on an unreadable limit**. The drive launches no
|
|
95
144
|
// more than this count, so the safe-direction zero above would leave it launching nothing and reporting
|
|
96
145
|
// nothing for good; a bad setting is the hard error `lane_capacity` says it is, ending the drive loudly.
|
|
97
|
-
async function
|
|
146
|
+
async function drive_limit(): Promise<number> {
|
|
98
147
|
const limit = await lane_capacity.lane_limit()
|
|
99
148
|
|
|
100
149
|
if (limit.kind !== 'limit') throw new Error(limit.problem)
|
|
101
150
|
|
|
102
|
-
return
|
|
151
|
+
return limit.limit
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
async function drive_free_lane_count(): Promise<number> {
|
|
155
|
+
return await free_under(await drive_limit())
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// The drive's room under the limit alone, for resuming a kept lane, which already holds its port seat.
|
|
159
|
+
async function drive_limit_room(): Promise<number> {
|
|
160
|
+
const limit = await drive_limit()
|
|
161
|
+
const use = await lane_use()
|
|
162
|
+
|
|
163
|
+
return lane_capacity.limit_room(limit, use.occupied)
|
|
103
164
|
}
|
|
104
165
|
|
|
105
166
|
// **A `--only` run has no pool to drain**. `backlog:next` lists the opted-in
|
|
@@ -110,13 +171,32 @@ function drains_pool(carry: RunCarry | undefined): boolean {
|
|
|
110
171
|
return carry === undefined || !run_invocation.has_only(carry.invocation)
|
|
111
172
|
}
|
|
112
173
|
|
|
174
|
+
// The offer's own exclusion, read off this run's stream: a merged child `backlog:next` still reads OPEN,
|
|
175
|
+
// or one in flight, is no ready work (joshuafolkken/kit#4349). Scoped to this invocation, as the drive's
|
|
176
|
+
// list is: the stream is the repository's log, so an earlier run's merge or unsettled launch would
|
|
177
|
+
// otherwise hide a reopened issue for good.
|
|
178
|
+
async function stream_exclude(carry: RunCarry | undefined): Promise<ReadonlyArray<string>> {
|
|
179
|
+
const target = await run_event_stream_emit.stream_target()
|
|
180
|
+
|
|
181
|
+
if (target === undefined || carry === undefined) return []
|
|
182
|
+
|
|
183
|
+
const scope = run_event_scope.scope_of({ kind: 'carried', carry })
|
|
184
|
+
const events = run_event_scope.scoped_events(run_event_stream.read_events(target), scope) ?? []
|
|
185
|
+
|
|
186
|
+
return backlog_drive_restore.offer_exclude(events)
|
|
187
|
+
}
|
|
188
|
+
|
|
113
189
|
// The `backlog:next` read, or `undefined` for a `--only` run, which answers none before paying for the
|
|
114
190
|
// network read. A bounded read keeps stderr piped: the arrival probe reads once
|
|
115
191
|
// a minute, and a forwarded refusal would fill the watcher's output.
|
|
116
192
|
async function read_backlog_next(timeout_ms?: number): Promise<JoshResult | undefined> {
|
|
117
|
-
|
|
193
|
+
const carry = await run_headless.current_carry()
|
|
194
|
+
|
|
195
|
+
if (!drains_pool(carry)) return undefined
|
|
196
|
+
|
|
197
|
+
const argv = ['backlog:next', ...backlog_offer_exclude.exclude_argv(await stream_exclude(carry))]
|
|
118
198
|
|
|
119
|
-
return await
|
|
199
|
+
return await backlog_next_shared.read(argv, timeout_ms === undefined, timeout_ms)
|
|
120
200
|
}
|
|
121
201
|
|
|
122
202
|
// The runnable issues for this checkout, read the way a loop reads them: `backlog:next`'s numeric lines.
|
|
@@ -208,9 +288,11 @@ const backlog_ready = {
|
|
|
208
288
|
print_offer_hint,
|
|
209
289
|
free_lane_count,
|
|
210
290
|
free_lanes_beside,
|
|
291
|
+
count_in,
|
|
292
|
+
lane_room,
|
|
211
293
|
lane_use,
|
|
212
|
-
occupied_lanes,
|
|
213
294
|
drive_free_lane_count,
|
|
295
|
+
drive_limit_room,
|
|
214
296
|
drains_pool,
|
|
215
297
|
print_ready_line,
|
|
216
298
|
read_ready,
|
|
@@ -219,4 +301,4 @@ const backlog_ready = {
|
|
|
219
301
|
}
|
|
220
302
|
|
|
221
303
|
export { backlog_ready }
|
|
222
|
-
export type { LaneUse, ReadyPorts, ReadyReading }
|
|
304
|
+
export type { LaneCount, LaneRoom, LaneUse, ReadyPorts, ReadyReading }
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { lane_ledger, type LedgerEntry } from '#scripts/lane/lane-ledger'
|
|
2
|
+
import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
|
|
2
3
|
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
3
4
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
4
5
|
import { backlog_ready, type ReadyPorts } from './backlog-ready'
|
|
5
6
|
import { backlog_stalled, type StallReading, type StallVerdict } from './backlog-stalled'
|
|
6
7
|
|
|
7
8
|
// The I/O half of the stall detector: it gathers the three counts the pure
|
|
8
|
-
// judge in `backlog-stalled.ts` weighs, then — on a stall — leaves the marker
|
|
9
|
-
//
|
|
9
|
+
// judge in `backlog-stalled.ts` weighs, then — on a stall — leaves the marker `run:step` reads as
|
|
10
|
+
// `backlog:next`. It sends no Telegram (joshuafolkken/kit#4015): a stall resolves itself at the next
|
|
11
|
+
// dispatch, so the person it reached had nothing to do; the idle notification `backlog:drive` sends
|
|
12
|
+
// when nothing is left to dispatch is the one that wants a hand. `stop-guard.ts` wires it into the Stop hook, so it runs at each loop boundary; the CLI
|
|
10
13
|
// exposes the same call for a person to run by hand.
|
|
11
14
|
//
|
|
12
15
|
// **Cheap first.** The costly read is `backlog:next`, a subprocess that hits the network. The two local
|
|
@@ -14,26 +17,39 @@ import { backlog_stalled, type StallReading, type StallVerdict } from './backlog
|
|
|
14
17
|
// is one `git worktree list`. Neither the lane count nor the backlog read is made unless the cheaper
|
|
15
18
|
// condition ahead of it already holds, so an ordinary stop — a run not idle, or with no free lane —
|
|
16
19
|
// costs a single file read and nothing more.
|
|
20
|
+
//
|
|
21
|
+
// **A stall is aged from when work and a lane first met** (joshuafolkken/kit#4349). Each probe records,
|
|
22
|
+
// on the lane ledger, whether offerable work and a free lane coexist — only when that changes — and the
|
|
23
|
+
// wait runs from the observation that opened the current episode. The dispatch age stays the cheap
|
|
24
|
+
// gate: the wait can never exceed it.
|
|
17
25
|
|
|
18
26
|
const NO_FREE = 0
|
|
19
27
|
const NO_READY = 0
|
|
20
28
|
const NO_AGE = 0
|
|
21
29
|
|
|
22
|
-
// The
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
// The seams a test replaces: the stream target and its events, the clock, the two counts, and the two
|
|
27
|
-
// side effects. The defaults are the real readers; a test hands fakes so the gather and report logic run
|
|
28
|
-
// without a git tree, a network or a wall clock.
|
|
30
|
+
// The seams a test replaces: the stream target and its events, the clock, the two counts, the ledger,
|
|
31
|
+
// and the marker. The defaults are the real readers; a test hands fakes so the gather and report logic
|
|
32
|
+
// run without a git tree, a network or a wall clock.
|
|
29
33
|
interface DetectPorts {
|
|
30
34
|
resolve_target: () => Promise<string | undefined>
|
|
31
35
|
read_events: (target: string) => ReadonlyArray<RunEvent>
|
|
32
36
|
now_ms: () => number
|
|
33
37
|
free_lane_count: () => Promise<number>
|
|
34
38
|
ready_count: () => Promise<number>
|
|
39
|
+
read_ledger: () => Promise<ReadonlyArray<LedgerEntry>>
|
|
40
|
+
mark_offerable: (is_offerable: boolean) => Promise<void>
|
|
35
41
|
emit_stall: (text: string) => Promise<boolean>
|
|
36
|
-
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
interface Counts {
|
|
45
|
+
ready_count: number
|
|
46
|
+
free_lanes: number
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// The dispatch reference the episode is bounded by, and the probe's own time.
|
|
50
|
+
interface Clock {
|
|
51
|
+
reference_ms: number
|
|
52
|
+
now_ms: number
|
|
37
53
|
}
|
|
38
54
|
|
|
39
55
|
// The free-lane and runnable-issue reads are `backlog-ready.ts`'s — the watcher's ready line reads the
|
|
@@ -55,8 +71,15 @@ async function real_emit_stall(text: string): Promise<boolean> {
|
|
|
55
71
|
return await run_event_stream_emit.emit_once_since(STALL, text, CHILD_LAUNCH)
|
|
56
72
|
}
|
|
57
73
|
|
|
58
|
-
|
|
59
|
-
|
|
74
|
+
// A test run has no ledger (`lane_ledger.target`), so it reads as empty there.
|
|
75
|
+
async function read_real_ledger(): Promise<ReadonlyArray<LedgerEntry>> {
|
|
76
|
+
const path = await lane_ledger.target()
|
|
77
|
+
|
|
78
|
+
return path === undefined ? [] : lane_ledger.read_entries(path)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async function real_mark_offerable(is_offerable: boolean): Promise<void> {
|
|
82
|
+
await lane_ledger_write.record_offerable(is_offerable)
|
|
60
83
|
}
|
|
61
84
|
|
|
62
85
|
function ports_over(ready: ReadyPorts): DetectPorts {
|
|
@@ -66,26 +89,64 @@ function ports_over(ready: ReadyPorts): DetectPorts {
|
|
|
66
89
|
now_ms: () => Date.now(),
|
|
67
90
|
free_lane_count: ready.free_lane_count,
|
|
68
91
|
ready_count: ready_count_of(ready),
|
|
92
|
+
read_ledger: read_real_ledger,
|
|
93
|
+
mark_offerable: real_mark_offerable,
|
|
69
94
|
emit_stall: real_emit_stall,
|
|
70
|
-
notify_stalled: real_notify_stalled,
|
|
71
95
|
}
|
|
72
96
|
}
|
|
73
97
|
|
|
74
98
|
const DEFAULT_PORTS: DetectPorts = ports_over(backlog_ready.DEFAULT_PORTS)
|
|
75
99
|
|
|
76
|
-
function ok_reading(
|
|
77
|
-
return { ready_count: NO_READY, free_lanes: NO_FREE,
|
|
100
|
+
function ok_reading(): StallReading {
|
|
101
|
+
return { ready_count: NO_READY, free_lanes: NO_FREE, waiting_ms: NO_AGE }
|
|
78
102
|
}
|
|
79
103
|
|
|
80
|
-
//
|
|
81
|
-
//
|
|
82
|
-
|
|
83
|
-
async function probe_reading(ports: DetectPorts, dispatch_age_ms: number): Promise<StallReading> {
|
|
104
|
+
// Count the free lanes, and only if one is free read the backlog. A full pool short-circuits before the
|
|
105
|
+
// network call — a stall needs a lane to go into.
|
|
106
|
+
async function read_counts(ports: DetectPorts): Promise<Counts> {
|
|
84
107
|
const free_lanes = await ports.free_lane_count()
|
|
85
108
|
|
|
86
|
-
if (free_lanes <= NO_FREE) return { ready_count: NO_READY, free_lanes
|
|
109
|
+
if (free_lanes <= NO_FREE) return { ready_count: NO_READY, free_lanes }
|
|
110
|
+
|
|
111
|
+
return { ready_count: await ports.ready_count(), free_lanes }
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function has_both(counts: Counts): boolean {
|
|
115
|
+
return counts.ready_count > NO_READY && counts.free_lanes > NO_FREE
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// How long both have held: from the observation that opened the episode, or zero where this probe opens
|
|
119
|
+
// or closes one — and records that change.
|
|
120
|
+
async function waiting_ms(
|
|
121
|
+
ports: DetectPorts,
|
|
122
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
123
|
+
clock: Clock,
|
|
124
|
+
is_offerable: boolean,
|
|
125
|
+
): Promise<number> {
|
|
126
|
+
const opened_ms = backlog_stalled.open_offerable_ms(entries, clock.reference_ms)
|
|
127
|
+
|
|
128
|
+
if (is_offerable === (opened_ms !== undefined)) return clock.now_ms - (opened_ms ?? clock.now_ms)
|
|
87
129
|
|
|
88
|
-
|
|
130
|
+
await ports.mark_offerable(is_offerable)
|
|
131
|
+
|
|
132
|
+
return NO_AGE
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// The idle-and-past-threshold branch, where the costly reads finally happen.
|
|
136
|
+
async function probe_reading(ports: DetectPorts, clock: Clock): Promise<StallReading> {
|
|
137
|
+
const counts = await read_counts(ports)
|
|
138
|
+
const entries = await ports.read_ledger()
|
|
139
|
+
const waited = await waiting_ms(ports, entries, clock, has_both(counts))
|
|
140
|
+
|
|
141
|
+
return { ...counts, waiting_ms: waited, hold: backlog_stalled.open_hold(entries) }
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// The dispatch reference and the probe's time, or `undefined` when the stream has nothing to age against.
|
|
145
|
+
function clock_of(ports: DetectPorts, target: string): Clock | undefined {
|
|
146
|
+
const now_ms = ports.now_ms()
|
|
147
|
+
const age = backlog_stalled.dispatch_age_ms(ports.read_events(target), now_ms)
|
|
148
|
+
|
|
149
|
+
return age === undefined ? undefined : { reference_ms: now_ms - age, now_ms }
|
|
89
150
|
}
|
|
90
151
|
|
|
91
152
|
// The reading that decides the verdict, assembled cheap-condition-first. `undefined` is the unreadable
|
|
@@ -96,25 +157,38 @@ async function gather(ports: DetectPorts, threshold_ms: number): Promise<StallRe
|
|
|
96
157
|
|
|
97
158
|
if (target === undefined) return undefined
|
|
98
159
|
|
|
99
|
-
const
|
|
160
|
+
const clock = clock_of(ports, target)
|
|
100
161
|
|
|
101
|
-
if (
|
|
102
|
-
if (age <= threshold_ms) return ok_reading(age)
|
|
162
|
+
if (clock === undefined || clock.now_ms - clock.reference_ms <= threshold_ms) return ok_reading()
|
|
103
163
|
|
|
104
|
-
return await probe_reading(ports,
|
|
164
|
+
return await probe_reading(ports, clock)
|
|
105
165
|
}
|
|
106
166
|
|
|
107
|
-
// The
|
|
108
|
-
//
|
|
109
|
-
//
|
|
110
|
-
async function
|
|
111
|
-
|
|
167
|
+
// The watcher's once-a-minute arrival probe records the same observation from the reading it already
|
|
168
|
+
// made, so an episode opens within a probe interval of work meeting a lane — not at the first stop past
|
|
169
|
+
// the dispatch-age gate, which would hide up to one threshold of the wait. Best-effort, like the check.
|
|
170
|
+
async function observe_offerable(
|
|
171
|
+
is_offerable: boolean,
|
|
172
|
+
ports: DetectPorts = DEFAULT_PORTS,
|
|
173
|
+
): Promise<void> {
|
|
174
|
+
try {
|
|
175
|
+
const target = await ports.resolve_target()
|
|
176
|
+
const clock = target === undefined ? undefined : clock_of(ports, target)
|
|
112
177
|
|
|
113
|
-
|
|
178
|
+
if (clock !== undefined) await waiting_ms(ports, await ports.read_ledger(), clock, is_offerable)
|
|
179
|
+
} catch {
|
|
180
|
+
// A failed observation is dropped: the next probe records it, and the watcher's loop must not break.
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// The marker, once per stall episode: `emit_stall` refuses a second until a dispatch has intervened, so a
|
|
185
|
+
// stall polled every stop lands on the stream once, not once a turn.
|
|
186
|
+
async function report(ports: DetectPorts, reading: StallReading): Promise<void> {
|
|
187
|
+
await ports.emit_stall(backlog_stalled.describe(reading))
|
|
114
188
|
}
|
|
115
189
|
|
|
116
|
-
// Read the three conditions, print nothing, and on a stall leave the marker
|
|
117
|
-
//
|
|
190
|
+
// Read the three conditions, print nothing, and on a stall leave the marker. The verdict is returned for
|
|
191
|
+
// the CLI to print; the side effect is the report's.
|
|
118
192
|
async function detect_and_report(
|
|
119
193
|
ports: DetectPorts = DEFAULT_PORTS,
|
|
120
194
|
threshold_ms: number = backlog_stalled.STALL_THRESHOLD_MS,
|
|
@@ -127,7 +201,7 @@ async function detect_and_report(
|
|
|
127
201
|
return verdict
|
|
128
202
|
}
|
|
129
203
|
|
|
130
|
-
// Best-effort for the Stop hook: the detector is a report, so a failure to gather or
|
|
204
|
+
// Best-effort for the Stop hook: the detector is a report, so a failure to gather or mark is dropped
|
|
131
205
|
// rather than raised into the stop decision it rides alongside.
|
|
132
206
|
async function run_stall_check(ready: ReadyPorts = backlog_ready.DEFAULT_PORTS): Promise<void> {
|
|
133
207
|
try {
|
|
@@ -137,7 +211,7 @@ async function run_stall_check(ready: ReadyPorts = backlog_ready.DEFAULT_PORTS):
|
|
|
137
211
|
}
|
|
138
212
|
}
|
|
139
213
|
|
|
140
|
-
const backlog_stalled_detect = { detect_and_report, run_stall_check }
|
|
214
|
+
const backlog_stalled_detect = { detect_and_report, observe_offerable, run_stall_check }
|
|
141
215
|
|
|
142
216
|
export { backlog_stalled_detect }
|
|
143
217
|
export type { DetectPorts }
|