@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
|
@@ -17,45 +17,23 @@
|
|
|
17
17
|
// without a process, a network or a clock.
|
|
18
18
|
|
|
19
19
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
20
|
-
import type { LaunchOutcome } from '#scripts/lane/lane-launch-cli'
|
|
21
20
|
import type { MergeResult } from '#scripts/run/merge/run-merge-cli'
|
|
22
|
-
import { run_merge_token
|
|
23
|
-
import {
|
|
21
|
+
import { run_merge_token } from '#scripts/run/merge/run-merge-token'
|
|
22
|
+
import { backlog_drive_adopt } from './backlog-drive-adopt'
|
|
23
|
+
import { backlog_drive_hold, type HeldWaiting } from './backlog-drive-hold'
|
|
24
|
+
import { backlog_drive_idle } from './backlog-drive-idle'
|
|
25
|
+
import { backlog_drive_judge } from './backlog-drive-judge'
|
|
26
|
+
import { backlog_drive_launch_pass, type DriveLaunch } from './backlog-drive-launch-pass'
|
|
27
|
+
import { backlog_drive_memory } from './backlog-drive-memory'
|
|
28
|
+
import { backlog_drive_paused } from './backlog-drive-paused'
|
|
29
|
+
import { backlog_drive_token_handling } from './backlog-drive-token-handling'
|
|
24
30
|
|
|
25
31
|
const { MERGE_TOKEN } = run_merge_token
|
|
32
|
+
const { HANDOFF_TOKENS, IMMEDIATE_TOKENS, TOKEN_HANDLING } = backlog_drive_token_handling
|
|
26
33
|
const RUN_VERDICT = 'run'
|
|
27
34
|
const STOP_VERDICT = 'stop'
|
|
28
|
-
//
|
|
29
|
-
|
|
30
|
-
// stop, the environment down, a foreign owner, an unreadable state. `stop` — the failure guard, or a
|
|
31
|
-
// failed child left unparked — collects the child, starts nothing more, and collects the children still
|
|
32
|
-
// in flight before the loop ends. `await` is a cut resumed in place: the same lane is awaited again.
|
|
33
|
-
//
|
|
34
|
-
// **The offer `run:merge` passes through is never read here** (joshuafolkken/kit#3781): its `stop` —
|
|
35
|
-
// only person-waiting issues left — is spelled like the control one, and acting on it ended the run
|
|
36
|
-
// without the idle watch. The loop asks `backlog:offer` on the next pass instead, so whether a parked
|
|
37
|
-
// backlog waits or ends is `backlog:budget`'s alone, after a merge as after any other pass.
|
|
38
|
-
type TokenHandling = 'hand-back' | 'stop' | 'await'
|
|
39
|
-
const TOKEN_HANDLING: Readonly<Record<MergeToken, TokenHandling>> = {
|
|
40
|
-
[MERGE_TOKEN.OVER]: 'hand-back',
|
|
41
|
-
[MERGE_TOKEN.HUMAN_REVIEW]: 'hand-back',
|
|
42
|
-
[MERGE_TOKEN.ENVIRONMENT]: 'hand-back',
|
|
43
|
-
[MERGE_TOKEN.BUSY]: 'hand-back',
|
|
44
|
-
[MERGE_TOKEN.RETRY]: 'hand-back',
|
|
45
|
-
[MERGE_TOKEN.STOP]: 'stop',
|
|
46
|
-
[MERGE_TOKEN.RESUMED]: 'await',
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function tokens_handled(...handlings: ReadonlyArray<TokenHandling>): ReadonlySet<string> {
|
|
50
|
-
const entries = Object.entries(TOKEN_HANDLING)
|
|
51
|
-
|
|
52
|
-
return new Set(entries.filter(([, handling]) => handlings.includes(handling)).map(([key]) => key))
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const IMMEDIATE_TOKENS = tokens_handled('hand-back')
|
|
56
|
-
// Every token `run:merge` prints first even on a non-zero exit.
|
|
57
|
-
const HANDOFF_TOKENS = tokens_handled('hand-back', 'stop')
|
|
58
|
-
const MERGED_OUTCOME = 'merged'
|
|
35
|
+
// The outcomes that keep a child out of the rest of this run's offers.
|
|
36
|
+
const EXCLUDED_OUTCOMES: ReadonlySet<string> = new Set(['merged', 'withdrawn'])
|
|
59
37
|
const WATCH_VERDICT = 'watch'
|
|
60
38
|
// The verdicts the loop acts on without the parent. Any other is handed back as it was printed.
|
|
61
39
|
const KNOWN_VERDICTS: ReadonlySet<string> = new Set([
|
|
@@ -65,17 +43,19 @@ const KNOWN_VERDICTS: ReadonlySet<string> = new Set([
|
|
|
65
43
|
'wait',
|
|
66
44
|
])
|
|
67
45
|
const NO_RETRIES = 0
|
|
68
|
-
const NO_FREE_LANES = 0
|
|
69
46
|
const EXHAUSTED_ANSWER = 'exhausted'
|
|
70
47
|
const JUDGE_REASON = 'judge'
|
|
71
|
-
|
|
72
|
-
const
|
|
48
|
+
// The `hold` reason a pass held by a Claude usage limit records.
|
|
49
|
+
const USAGE_LIMIT_REASON = 'usage-limit'
|
|
50
|
+
const { launch_all } = backlog_drive_launch_pass
|
|
73
51
|
|
|
74
|
-
interface OfferRead {
|
|
52
|
+
interface OfferRead extends HeldWaiting {
|
|
75
53
|
verdict: string
|
|
76
54
|
issues: ReadonlyArray<string>
|
|
77
55
|
retries: number
|
|
78
56
|
answer?: string | undefined
|
|
57
|
+
// Why a `blocked` answer started nothing — `solo`, or `backlog-wait-cause.ts`'s with its `waiting`.
|
|
58
|
+
cause?: string | undefined
|
|
79
59
|
reason?: string | undefined
|
|
80
60
|
// Whether a drain here owes the retrospective: the opt-in switch is on and it has not run yet. Absent
|
|
81
61
|
// reads as not owed, so a drain with the switch off keeps the idle watch.
|
|
@@ -98,6 +78,8 @@ interface DriveState {
|
|
|
98
78
|
stop_is_finish?: boolean | undefined
|
|
99
79
|
// The child whose merge answered `stop`, carried on the resume line: no offer re-derives that stop.
|
|
100
80
|
stopped_by?: string | undefined
|
|
81
|
+
// The last offer answered `run` on a machine with no memory to spare (`backlog-drive-memory.ts`).
|
|
82
|
+
is_memory_held?: boolean | undefined
|
|
101
83
|
}
|
|
102
84
|
|
|
103
85
|
interface DriveEnd {
|
|
@@ -118,19 +100,40 @@ interface DrivePorts {
|
|
|
118
100
|
is_finished: (issue: string) => boolean
|
|
119
101
|
// `run:merge <N>`'s first stdout token and the outcome it handled the child as.
|
|
120
102
|
merge: (issue: string) => Promise<Collected>
|
|
103
|
+
// The lanes on a child this run launched and never settled that the loop does not hold — one the
|
|
104
|
+
// parent dispatched itself with `lane:launch` (`backlog_drive_adopt.adoptable` in production).
|
|
105
|
+
adoptable: (in_flight: ReadonlyArray<string>) => Promise<ReadonlyArray<string>>
|
|
121
106
|
// `backlog:offer`'s answer for the state, or `undefined` when it exited non-zero.
|
|
122
107
|
offer: (state: DriveState) => Promise<OfferRead | undefined>
|
|
123
|
-
// Where `lane:launch`'s chain ended — `launched`, `unopened` (no lane taken) or `failed` (one taken)
|
|
124
|
-
|
|
108
|
+
// Where `lane:launch`'s chain ended — `launched`, `unopened` (no lane taken) or `failed` (one taken) —
|
|
109
|
+
// or `measured`, the issue closed by its declaration with no lane taken.
|
|
110
|
+
launch: (issue: string) => Promise<DriveLaunch>
|
|
125
111
|
// The lanes free right now — `backlog_ready.drive_free_lane_count` in production, the limit less the
|
|
126
112
|
// open lanes.
|
|
127
113
|
free_lanes: () => Promise<number>
|
|
128
|
-
//
|
|
129
|
-
|
|
114
|
+
// The places left under the limit, port seats aside — `backlog_ready.drive_limit_room` in production.
|
|
115
|
+
limit_room: () => Promise<number>
|
|
116
|
+
// Whether the issue already holds a kept lane (one a child was dispatched into) — it is reused, and
|
|
117
|
+
// seated ahead of a fresh launch inside the limit room (`backlog-drive-seats.ts`).
|
|
130
118
|
has_lane: (issue: string) => Promise<boolean>
|
|
131
119
|
// How many open issues lacking `auto-ok` still owe a judgement — `auto_ok_judge_read.owed` in
|
|
132
120
|
// production, `0` when the read failed.
|
|
133
121
|
judgement_owed: () => Promise<number>
|
|
122
|
+
// Whether the machine has no memory for one more lane — `backlog_drive_memory.gauge()` in production,
|
|
123
|
+
// which carries its hysteresis between calls.
|
|
124
|
+
memory_held: () => Promise<boolean>
|
|
125
|
+
// Whether a Claude usage limit that stopped a child has yet to reset — `run_merge_usage_limit.is_held`
|
|
126
|
+
// in production (joshuafolkken/kit#4745).
|
|
127
|
+
usage_limited: () => Promise<boolean>
|
|
128
|
+
// Why an offered pass started nothing (`backlog-drive-hold.ts`). Production records it in the lane
|
|
129
|
+
// ledger only while a lane is free. `undefined` is the run's stop, which owes no lane a child.
|
|
130
|
+
hold: (reason: string | undefined, waiting?: ReadonlyArray<number>) => Promise<void>
|
|
131
|
+
// A watch with nothing in flight — the one idle notification (`backlog-drive-idle.ts`), deduplicated
|
|
132
|
+
// per episode by the port itself.
|
|
133
|
+
idle: (state: DriveState) => Promise<void>
|
|
134
|
+
// A holding offer with nothing in flight — the paused-lane notice (`backlog-drive-paused.ts`), which
|
|
135
|
+
// reads the lane records itself and is deduplicated per pause episode by the port.
|
|
136
|
+
paused: () => Promise<void>
|
|
134
137
|
now: () => Date
|
|
135
138
|
}
|
|
136
139
|
|
|
@@ -154,20 +157,12 @@ function ended(reason: string, state: DriveState, token?: string, issue?: string
|
|
|
154
157
|
}
|
|
155
158
|
}
|
|
156
159
|
|
|
157
|
-
//
|
|
158
|
-
//
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
read.verdict === WATCH_VERDICT &&
|
|
162
|
-
read.answer === EXHAUSTED_ANSWER &&
|
|
163
|
-
state.in_flight.length === 0 &&
|
|
164
|
-
read.is_retrospective_owed === true
|
|
165
|
-
)
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
function needs_retrospective(read: OfferRead, state: DriveState): boolean {
|
|
160
|
+
// A drain owing the retrospective, read under a `watch` or a `stop` verdict. Only an empty backlog
|
|
161
|
+
// drains: `backlog:offer` marks the drain on `exhausted` alone, so a watch over a parked or unreadable
|
|
162
|
+
// backlog has no retrospective for `run:step` to fire and stays the driver's.
|
|
163
|
+
function is_drain_owed(read: OfferRead, state: DriveState, verdict: string): boolean {
|
|
169
164
|
return (
|
|
170
|
-
read.verdict ===
|
|
165
|
+
read.verdict === verdict &&
|
|
171
166
|
read.answer === EXHAUSTED_ANSWER &&
|
|
172
167
|
state.in_flight.length === 0 &&
|
|
173
168
|
read.is_retrospective_owed === true
|
|
@@ -196,10 +191,12 @@ function merge_stopped(issue: string, state: DriveState): DriveState {
|
|
|
196
191
|
}
|
|
197
192
|
}
|
|
198
193
|
|
|
199
|
-
//
|
|
200
|
-
//
|
|
194
|
+
// A merged child is excluded because `backlog:next` may still read it OPEN, and a withdrawn one because
|
|
195
|
+
// `lane:withdraw` leaves it OPEN for the next run, not this one (joshuafolkken/kit#4365). Any other is
|
|
196
|
+
// classified by its labels, so excluding it would hide a child a person released for the rest of the
|
|
197
|
+
// process.
|
|
201
198
|
function excluded(issue: string, outcome: Collected['outcome'], state: DriveState): Array<string> {
|
|
202
|
-
if (outcome
|
|
199
|
+
if (!EXCLUDED_OUTCOMES.has(outcome) || state.exclude.includes(issue)) return state.exclude
|
|
203
200
|
|
|
204
201
|
return [...state.exclude, issue]
|
|
205
202
|
}
|
|
@@ -251,66 +248,19 @@ async function collect_finished(state: DriveState, ports: DrivePorts): Promise<P
|
|
|
251
248
|
current = result.state
|
|
252
249
|
}
|
|
253
250
|
|
|
254
|
-
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
// A `lane:open` refused with every lane taken is a wait, not a judgement: the
|
|
258
|
-
// next offer after a lane frees retries it. A step failing after the lane opened is always handed back —
|
|
259
|
-
// that lane holds the last seat itself, so the free count would read the failure as a full pool.
|
|
260
|
-
async function refused(
|
|
261
|
-
issue: string,
|
|
262
|
-
outcome: LaunchOutcome['kind'],
|
|
263
|
-
state: DriveState,
|
|
264
|
-
ports: DrivePorts,
|
|
265
|
-
): Promise<PassResult> {
|
|
266
|
-
if (outcome !== UNOPENED) return ended('launch', state, undefined, issue)
|
|
267
|
-
if ((await ports.free_lanes()) <= NO_FREE_LANES) return { kind: 'continue', state }
|
|
268
|
-
|
|
269
|
-
return ended('launch', state, undefined, issue)
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// **No more new lanes than free lanes**. `backlog:offer` lists every ready issue without reading the
|
|
273
|
-
// lanes, so launching all of them overran `JOSH_LANE_LIMIT` until `lane:open` ran out of seats. An issue
|
|
274
|
-
// that already holds a kept lane reuses it and takes no seat (`backlog-drive-seats.ts`); the rest launch
|
|
275
|
-
// up to the free count, read once before the first launch.
|
|
276
|
-
//
|
|
277
|
-
// **Only a launch is activity**: a pass that started nothing — every lane taken
|
|
278
|
-
// — keeps `active` where it was, or the once-a-minute offer would restart the idle budget for good.
|
|
279
|
-
function launched(state: DriveState, in_flight: Array<string>, ports: DrivePorts): DriveState {
|
|
280
|
-
if (in_flight.length === state.in_flight.length) return { ...state, in_flight }
|
|
281
|
-
|
|
282
|
-
return { ...state, in_flight, active: ports.now().toISOString() }
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
async function launch_all(
|
|
286
|
-
issues: ReadonlyArray<string>,
|
|
287
|
-
state: DriveState,
|
|
288
|
-
ports: DrivePorts,
|
|
289
|
-
): Promise<PassResult> {
|
|
290
|
-
const in_flight = [...state.in_flight]
|
|
291
|
-
|
|
292
|
-
const launching = await backlog_drive_seats.seated(issues, ports)
|
|
251
|
+
await backlog_drive_hold.stopped(state, current, ports)
|
|
293
252
|
|
|
294
|
-
|
|
295
|
-
// eslint-disable-next-line no-await-in-loop -- lanes launch in order and the first refusal ends the pass
|
|
296
|
-
const outcome = await ports.launch(issue)
|
|
297
|
-
|
|
298
|
-
if (outcome !== LAUNCHED) {
|
|
299
|
-
// eslint-disable-next-line no-await-in-loop -- lanes launch in order and the first refusal ends the pass
|
|
300
|
-
return await refused(issue, outcome, launched(state, in_flight, ports), ports)
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
in_flight.push(issue)
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
return { kind: 'continue', state: launched(state, in_flight, ports) }
|
|
253
|
+
return { kind: 'continue', state: current }
|
|
307
254
|
}
|
|
308
255
|
|
|
309
256
|
// A watch with nothing in flight is the drain: `run:step` owes the retrospective there, so it is the
|
|
310
257
|
// parent's. With children still running the watch is only waiting on them.
|
|
311
258
|
function on_verdict(read: OfferRead, state: DriveState): PassResult {
|
|
312
259
|
if (!KNOWN_VERDICTS.has(read.verdict)) return ended(read.verdict, state, read.verdict)
|
|
313
|
-
|
|
260
|
+
|
|
261
|
+
if (is_drain_owed(read, state, STOP_VERDICT)) {
|
|
262
|
+
return ended('retrospective', state, 'retrospective')
|
|
263
|
+
}
|
|
314
264
|
|
|
315
265
|
if (read.verdict === STOP_VERDICT) {
|
|
316
266
|
return {
|
|
@@ -324,43 +274,53 @@ function on_verdict(read: OfferRead, state: DriveState): PassResult {
|
|
|
324
274
|
}
|
|
325
275
|
}
|
|
326
276
|
|
|
327
|
-
if (
|
|
277
|
+
if (is_drain_owed(read, state, WATCH_VERDICT)) return ended(WATCH_VERDICT, state, WATCH_VERDICT)
|
|
278
|
+
|
|
279
|
+
return { kind: 'continue', state }
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
async function usage_held(state: DriveState, ports: DrivePorts): Promise<PassResult> {
|
|
283
|
+
await ports.hold(USAGE_LIMIT_REASON)
|
|
328
284
|
|
|
329
285
|
return { kind: 'continue', state }
|
|
330
286
|
}
|
|
331
287
|
|
|
332
|
-
//
|
|
333
|
-
//
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
288
|
+
// An offer answered `run`: launched while the machine has memory to spare and no usage limit is in
|
|
289
|
+
// force, held until both hold otherwise. A usage-limited pass polls on as a held one does.
|
|
290
|
+
async function run_offered(
|
|
291
|
+
issues: ReadonlyArray<string>,
|
|
292
|
+
state: DriveState,
|
|
293
|
+
ports: DrivePorts,
|
|
294
|
+
): Promise<PassResult> {
|
|
295
|
+
if (await ports.usage_limited()) return await usage_held(state, ports)
|
|
338
296
|
|
|
339
|
-
if (
|
|
297
|
+
if (await ports.memory_held()) return await backlog_drive_memory.held(state, ports)
|
|
340
298
|
|
|
341
|
-
return
|
|
299
|
+
return await launch_all(issues, state, ports)
|
|
342
300
|
}
|
|
343
301
|
|
|
302
|
+
// Every offer answers the memory hold afresh: one that is not `run` leaves nothing held for memory.
|
|
344
303
|
async function ask_offer(state: DriveState, ports: DrivePorts): Promise<PassResult> {
|
|
345
304
|
const read = await ports.offer(state)
|
|
346
305
|
|
|
347
306
|
if (read === undefined) return ended('offer', state)
|
|
348
307
|
|
|
349
|
-
const next = { ...state, retries: read.retries }
|
|
308
|
+
const next = { ...state, retries: read.retries, is_memory_held: false }
|
|
309
|
+
|
|
310
|
+
if (read.verdict === RUN_VERDICT) return await run_offered(read.issues, next, ports)
|
|
311
|
+
if (await backlog_drive_judge.is_owed(read, ports)) return ended(JUDGE_REASON, next, JUDGE_REASON)
|
|
350
312
|
|
|
351
|
-
|
|
352
|
-
|
|
313
|
+
const idle = await backlog_drive_idle.noticed(on_verdict(read, next), read, ports)
|
|
314
|
+
const result = await backlog_drive_paused.noticed(idle, read, ports)
|
|
353
315
|
|
|
354
|
-
return
|
|
316
|
+
return await backlog_drive_hold.held(result, read, ports)
|
|
355
317
|
}
|
|
356
318
|
|
|
357
319
|
// One pass: collect every child that ended, then — unless a `stop` has been read — ask what to start.
|
|
358
320
|
// `should_offer` is the caller's throttle on the one network read; a collection always asks, because a
|
|
359
321
|
// lane just freed.
|
|
360
322
|
function is_offering(before: DriveState, after: DriveState, should_offer: boolean): boolean {
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
return should_offer || after.in_flight.length !== before.in_flight.length
|
|
323
|
+
return !after.is_stopping && (should_offer || after.in_flight.length !== before.in_flight.length)
|
|
364
324
|
}
|
|
365
325
|
|
|
366
326
|
// A stopping run with nothing left in flight has ended.
|
|
@@ -377,10 +337,11 @@ async function run_pass(
|
|
|
377
337
|
should_offer: boolean,
|
|
378
338
|
ports: DrivePorts,
|
|
379
339
|
): Promise<PassResult> {
|
|
380
|
-
const
|
|
340
|
+
const held = await backlog_drive_adopt.held(state, should_offer, ports)
|
|
341
|
+
const collected = await collect_finished(held, ports)
|
|
381
342
|
|
|
382
343
|
if (collected.kind === 'end') return collected
|
|
383
|
-
if (!is_offering(
|
|
344
|
+
if (!is_offering(held, collected.state, should_offer)) return settle(collected)
|
|
384
345
|
|
|
385
346
|
return settle(await ask_offer(collected.state, ports))
|
|
386
347
|
}
|
|
@@ -419,10 +380,13 @@ function is_window_spent(run: LoopRun, config: LoopConfig, now_ms: number): bool
|
|
|
419
380
|
type LoopStep = { kind: 'end'; end: DriveEnd } | { kind: 'next'; run: LoopRun }
|
|
420
381
|
|
|
421
382
|
// One pass of the loop: the offer is due on the first pass and then no oftener than `offer_ms`, bar the
|
|
422
|
-
// passes that collected a child. A `next` carries the run
|
|
383
|
+
// passes that collected a child and the one that finds a memory hold cleared. A `next` carries the run
|
|
384
|
+
// to sleep on and pass again.
|
|
423
385
|
async function loop_step(run: LoopRun, config: LoopConfig, ports: LoopPorts): Promise<LoopStep> {
|
|
424
386
|
const now_ms = ports.now().getTime()
|
|
425
|
-
const is_due =
|
|
387
|
+
const is_due =
|
|
388
|
+
now_ms - run.offered_ms >= config.offer_ms ||
|
|
389
|
+
(await backlog_drive_memory.is_cleared(run.state, ports))
|
|
426
390
|
const result = await run_pass(run.state, is_due, ports)
|
|
427
391
|
|
|
428
392
|
ports.on_state(result.state)
|
|
@@ -460,6 +424,7 @@ async function run_loop(
|
|
|
460
424
|
const backlog_drive = {
|
|
461
425
|
HANDOFF_TOKENS,
|
|
462
426
|
TOKEN_HANDLING,
|
|
427
|
+
USAGE_LIMIT_REASON,
|
|
463
428
|
initial_state,
|
|
464
429
|
merge_stopped,
|
|
465
430
|
run_loop,
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { OptedInRead, TrackingRead } from '#scripts/auto-ok/auto-ok-cli'
|
|
2
|
+
import { epic_graph } from '#scripts/epic/epic-graph'
|
|
3
|
+
import { epic_index } from '#scripts/epic/epic-index'
|
|
4
|
+
import { lane_plan } from '#scripts/lane/lane-plan'
|
|
5
|
+
import { lane_state } from '#scripts/lane/lane-state'
|
|
6
|
+
import { backlog_plan_comment } from './backlog-plan-comment'
|
|
7
|
+
import { backlog_pool } from './backlog-pool'
|
|
8
|
+
import type { GateScope } from './backlog-rank'
|
|
9
|
+
|
|
10
|
+
type OptedIn = Extract<OptedInRead, { kind: 'read' }>
|
|
11
|
+
type Tracking = Extract<TrackingRead, { kind: 'read' }>
|
|
12
|
+
|
|
13
|
+
// Everything the answer is assembled from, read once and passed down rather than re-fetched.
|
|
14
|
+
interface PoolContext {
|
|
15
|
+
opted_in: OptedIn
|
|
16
|
+
tracking: Tracking
|
|
17
|
+
repo: string
|
|
18
|
+
exclude: ReadonlyArray<number>
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// The rows the offer's cap bounds — the standalone half.
|
|
22
|
+
function standalone_keys(context: PoolContext): ReadonlySet<string> {
|
|
23
|
+
return backlog_pool.standalone_keys(context.opted_in.issues, {
|
|
24
|
+
tracked: epic_index.withheld_children(context.tracking.index, context.opted_in.issues),
|
|
25
|
+
exclude: context.exclude,
|
|
26
|
+
repo: context.repo,
|
|
27
|
+
})
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// The issues whose lane yielded on a plan it kept (`lane-yield.ts`) — offered first (`backlog-rank.ts`,
|
|
31
|
+
// joshuafolkken/kit#5107).
|
|
32
|
+
function yielded_keys(context: PoolContext, directory: string): ReadonlySet<string> {
|
|
33
|
+
const yielded = context.opted_in.issues.filter((issue) =>
|
|
34
|
+
lane_plan.is_yielded(issue.number, directory),
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
return new Set(yielded.map(({ number }) => epic_graph.key_of({ number, repo: context.repo })))
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// The running lanes still carry the pickup label, so the opted-in listing holds their bodies too —
|
|
41
|
+
// which is what lets a candidate be held back from a path a running lane already declares.
|
|
42
|
+
// `backlog:plan --waves` reads the same scope, so its first wave is this offer. Their lane state
|
|
43
|
+
// records name a paused holder in the wait it causes (joshuafolkken/kit#4270); they are local files.
|
|
44
|
+
// A lane's recorded plan (joshuafolkken/kit#4864), else a plan comment (joshuafolkken/kit#4923), is
|
|
45
|
+
// read in place of the body (joshuafolkken/kit#4937).
|
|
46
|
+
async function gate_scope(context: PoolContext): Promise<GateScope> {
|
|
47
|
+
const { issues } = context.opted_in
|
|
48
|
+
const directory = process.cwd()
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
standalone: standalone_keys(context),
|
|
52
|
+
declared: await backlog_plan_comment.declared_of(issues, directory),
|
|
53
|
+
lanes: await lane_state.read_states(issues.map((issue) => String(issue.number))),
|
|
54
|
+
yielded: yielded_keys(context, directory),
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const backlog_gate_scope = { gate_scope }
|
|
59
|
+
|
|
60
|
+
export { backlog_gate_scope }
|
|
61
|
+
export type { OptedIn, PoolContext }
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
3
|
+
import { issue_measured_close } from '#scripts/issue/issue-measured-close'
|
|
4
|
+
import {
|
|
5
|
+
measure_declaration,
|
|
6
|
+
type MeasureDeclaration,
|
|
7
|
+
type MeasureVerdict,
|
|
8
|
+
} from '#scripts/issue/measure-declaration'
|
|
9
|
+
import { trusted_measure, type CommandRun } from '#scripts/issue/trusted-measure'
|
|
10
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
11
|
+
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
12
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
13
|
+
|
|
14
|
+
// joshuafolkken/kit#4621: the drive runs a due issue's measurement declaration (`measure-declaration.ts`)
|
|
15
|
+
// before it opens a lane. A value within the bound closes the issue the way `issue:measured` does — the
|
|
16
|
+
// result comment, the `measured` label, the close and the epic's progress — and puts a `measured` event
|
|
17
|
+
// on the stream, so no lane is spent. Anything else — no declaration, an untrusted body, a value out of
|
|
18
|
+
// bound, a failed command, output that is not one number — launches the lane as before; where a
|
|
19
|
+
// command ran, its result is commented first, so the child starts from the measurement, not a re-run.
|
|
20
|
+
|
|
21
|
+
const FENCE = '```'
|
|
22
|
+
const VERDICT_WORDS: Readonly<Record<MeasureVerdict['kind'], string>> = {
|
|
23
|
+
pass: 'within the bound, so the issue is closed without a lane.',
|
|
24
|
+
fail: 'out of the bound, so the issue goes to a lane.',
|
|
25
|
+
unreadable: 'no value could be read from the output, so the issue goes to a lane.',
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface Measurement {
|
|
29
|
+
declaration: MeasureDeclaration
|
|
30
|
+
run: CommandRun
|
|
31
|
+
verdict: MeasureVerdict
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function declared(issue: string): Promise<MeasureDeclaration | undefined> {
|
|
35
|
+
const read = await trusted_measure.read_trusted_body(issue)
|
|
36
|
+
|
|
37
|
+
return read.kind === 'trusted' ? measure_declaration.parse(read.body) : undefined
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function measured(declaration: MeasureDeclaration): Measurement {
|
|
41
|
+
const run = trusted_measure.run_command(declaration.command)
|
|
42
|
+
const verdict: MeasureVerdict =
|
|
43
|
+
run.kind === 'ok' ? measure_declaration.judge(declaration, run.output) : { kind: 'unreadable' }
|
|
44
|
+
|
|
45
|
+
return { declaration, run, verdict }
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function value_words(verdict: MeasureVerdict): string {
|
|
49
|
+
return verdict.kind === 'unreadable' ? 'unreadable' : String(verdict.value)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// The result comment: the declaration, the value read, what follows and the command's own output.
|
|
53
|
+
// Script-emitted, so English (`run-merge.ts` → `park_comment`).
|
|
54
|
+
function report(measurement: Measurement): string {
|
|
55
|
+
const { declaration, run, verdict } = measurement
|
|
56
|
+
|
|
57
|
+
return [
|
|
58
|
+
'`backlog:drive` ran the measurement declaration.',
|
|
59
|
+
'',
|
|
60
|
+
`- Declaration: ${measure_declaration.format(declaration)}`,
|
|
61
|
+
`- Value: ${value_words(verdict)}`,
|
|
62
|
+
`- Verdict: ${VERDICT_WORDS[verdict.kind]}`,
|
|
63
|
+
'',
|
|
64
|
+
FENCE,
|
|
65
|
+
trusted_measure.text_of(run),
|
|
66
|
+
FENCE,
|
|
67
|
+
].join('\n')
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async function close_passed(issue: string, measurement: Measurement): Promise<boolean> {
|
|
71
|
+
const is_closed = await issue_measured_close.close(issue, report(measurement))
|
|
72
|
+
const value = value_words(measurement.verdict)
|
|
73
|
+
const bound = `${measurement.declaration.operator} ${String(measurement.declaration.threshold)}`
|
|
74
|
+
|
|
75
|
+
if (is_closed) {
|
|
76
|
+
await run_event_stream_emit.emit(
|
|
77
|
+
run_event_stream.EVENT_KIND.MEASURED,
|
|
78
|
+
`${issue_cite.plain(issue)} measured by backlog:drive: ${value} ${bound}`,
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return is_closed
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// The result handed to the lane on the issue itself, which the child reads with its comments. A comment
|
|
86
|
+
// that cannot be posted still launches the lane: the child re-runs the declaration.
|
|
87
|
+
async function hand_over(issue: string, measurement: Measurement): Promise<false> {
|
|
88
|
+
try {
|
|
89
|
+
await git_gh_command.issue_comment(issue, report(measurement))
|
|
90
|
+
} catch (error) {
|
|
91
|
+
console.error(`Measurement result not posted: ${error_text.message_of(error)}`)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return false
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Whether the drive closed the issue by its declaration; `false` launches its lane.
|
|
98
|
+
async function closed(issue: string): Promise<boolean> {
|
|
99
|
+
const declaration = await declared(issue)
|
|
100
|
+
|
|
101
|
+
if (declaration === undefined) return false
|
|
102
|
+
|
|
103
|
+
const measurement = measured(declaration)
|
|
104
|
+
|
|
105
|
+
return measurement.verdict.kind === 'pass'
|
|
106
|
+
? await close_passed(issue, measurement)
|
|
107
|
+
: await hand_over(issue, measurement)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const backlog_measure_close = { closed }
|
|
111
|
+
|
|
112
|
+
export { backlog_measure_close }
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { backlog_next } from './backlog-next'
|
|
4
|
+
|
|
5
|
+
// The `josh backlog:next` entry, kept apart from `backlog-next.ts` because other modules import that
|
|
6
|
+
// one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186).
|
|
8
|
+
//
|
|
9
|
+
// `process.exitCode` rather than `process.exit()`, for the reason `auto-ok:next` records: the whole
|
|
10
|
+
// contract is `answers=$(pnpm josh backlog:next)`, and exiting outright can cut the pipe before it
|
|
11
|
+
// has drained.
|
|
12
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
13
|
+
const ARGV_OFFSET = 2
|
|
14
|
+
|
|
15
|
+
process.exitCode = await backlog_next.run(process.argv.slice(ARGV_OFFSET))
|
|
16
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
2
|
+
import { shared_cache, type CacheSlot } from '#scripts/josh/shared-cache'
|
|
3
|
+
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
4
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
5
|
+
import { z } from 'zod'
|
|
6
|
+
import { backlog_next } from './backlog-next'
|
|
7
|
+
|
|
8
|
+
// One `josh backlog:next` answer shared by every reader that asks it within a minute
|
|
9
|
+
// (joshuafolkken/kit#4550).
|
|
10
|
+
//
|
|
11
|
+
// **The drive's assignment and the arrival probe each ask every minute, and since a lane waiting on its
|
|
12
|
+
// merge frees its slot (joshuafolkken/kit#4483) a free slot is the usual state** — so both read the
|
|
13
|
+
// whole pool from GitHub every minute, for the same answer.
|
|
14
|
+
//
|
|
15
|
+
// **The key carries the newest event on the run's stream**, so a launch, a merge or a park — anything
|
|
16
|
+
// that can change what may start — is never answered from before it: the first ask after it reads
|
|
17
|
+
// again. Only an answer that read is kept; a failure or a `retry` is asked again by the next reader.
|
|
18
|
+
|
|
19
|
+
const SUCCESS_EXIT_CODE = 0
|
|
20
|
+
|
|
21
|
+
const NEXT_CACHE: CacheSlot = { prefix: 'josh-backlog-next-', ttl_ms: 60_000 }
|
|
22
|
+
|
|
23
|
+
const result_schema = z.object({
|
|
24
|
+
code: z.number(),
|
|
25
|
+
out: z.string(),
|
|
26
|
+
err: z.string().exactOptional(),
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
// The key a shared plan read is kept under: what was asked, and the newest event on the run's stream.
|
|
30
|
+
// `run:board`'s plan read keys by it too (joshuafolkken/kit#4558).
|
|
31
|
+
async function stream_key(scope: unknown): Promise<string> {
|
|
32
|
+
const target = await run_event_stream_emit.stream_target()
|
|
33
|
+
const last = target === undefined ? undefined : run_event_stream.read_last(target)
|
|
34
|
+
|
|
35
|
+
return JSON.stringify({ argv: scope, last })
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function is_kept(result: JoshResult): boolean {
|
|
39
|
+
if (result.code !== SUCCESS_EXIT_CODE) return false
|
|
40
|
+
|
|
41
|
+
return !result.out.split('\n').includes(backlog_next.VERDICT_TOKENS.retry)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// A kept answer replays its explanation where the live one would have streamed it.
|
|
45
|
+
function replay(result: JoshResult, should_forward_stderr: boolean): JoshResult {
|
|
46
|
+
if (should_forward_stderr && result.err !== undefined && result.err !== '') {
|
|
47
|
+
console.error(result.err)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return result
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function read(
|
|
54
|
+
argv: ReadonlyArray<string>,
|
|
55
|
+
should_forward_stderr = false,
|
|
56
|
+
timeout_ms?: number,
|
|
57
|
+
): Promise<JoshResult> {
|
|
58
|
+
const key = await stream_key(argv)
|
|
59
|
+
const now_ms = Date.now()
|
|
60
|
+
const kept = shared_cache.read(NEXT_CACHE, key, result_schema, now_ms)
|
|
61
|
+
|
|
62
|
+
if (kept !== undefined) return replay(kept, should_forward_stderr)
|
|
63
|
+
|
|
64
|
+
const result = await josh_command.josh_run(argv, should_forward_stderr, timeout_ms)
|
|
65
|
+
|
|
66
|
+
if (is_kept(result)) shared_cache.write(NEXT_CACHE, key, result, now_ms)
|
|
67
|
+
|
|
68
|
+
return result
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const backlog_next_shared = { NEXT_CACHE, read, stream_key }
|
|
72
|
+
|
|
73
|
+
export { backlog_next_shared }
|