@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
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import {
|
|
2
|
+
lane_ledger,
|
|
3
|
+
type DispatchEntry,
|
|
4
|
+
type LaneStateChangeEntry,
|
|
5
|
+
type LedgerEntry,
|
|
6
|
+
} from './lane-ledger'
|
|
7
|
+
|
|
8
|
+
// The spans each lane stood paused, read off the `lane-state` lines `lane:pause` and `lane:resume`
|
|
9
|
+
// append to the ledger (joshuafolkken/kit#5168). A SIGSTOP leaves the call in flight on the clock, so a
|
|
10
|
+
// measurement of a lane's time takes its overlap with these out: `lane:pause --all` once put seven
|
|
11
|
+
// hours into one plan call and one check call.
|
|
12
|
+
//
|
|
13
|
+
// **A pause opens a span, the lane's next resume or dispatch closes it** — `lane:restart` and a
|
|
14
|
+
// re-dispatch start a fresh child without a resume; a pause with neither yet stays open, and a
|
|
15
|
+
// resume with no pause before it closes nothing.
|
|
16
|
+
|
|
17
|
+
const PAUSED = 'paused'
|
|
18
|
+
const LANE_ISSUE_PATTERN = /-(?<issue>\d+)$/u
|
|
19
|
+
|
|
20
|
+
interface PausedSpan {
|
|
21
|
+
from_ms: number
|
|
22
|
+
to_ms: number
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Each lane's paused spans, by issue number.
|
|
26
|
+
type PausedSpans = ReadonlyMap<number, ReadonlyArray<PausedSpan>>
|
|
27
|
+
|
|
28
|
+
interface Walk {
|
|
29
|
+
spans: Array<PausedSpan>
|
|
30
|
+
open_ms: number | undefined
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// A ledger line that opens or closes a lane's paused span.
|
|
34
|
+
type Change = LaneStateChangeEntry | DispatchEntry
|
|
35
|
+
|
|
36
|
+
const NONE: ReadonlyArray<PausedSpan> = []
|
|
37
|
+
|
|
38
|
+
function is_change(entry: LedgerEntry): entry is Change {
|
|
39
|
+
return entry.kind === lane_ledger.KIND.LANE_STATE || entry.kind === lane_ledger.KIND.DISPATCH
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function is_pause(change: Change): boolean {
|
|
43
|
+
return change.kind === lane_ledger.KIND.LANE_STATE && change.state === PAUSED
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function step(walk: Walk, change: Change): Walk {
|
|
47
|
+
const at_ms = Date.parse(change.at)
|
|
48
|
+
|
|
49
|
+
if (is_pause(change)) return { spans: walk.spans, open_ms: walk.open_ms ?? at_ms }
|
|
50
|
+
if (walk.open_ms === undefined) return walk
|
|
51
|
+
|
|
52
|
+
return { spans: [...walk.spans, { from_ms: walk.open_ms, to_ms: at_ms }], open_ms: undefined }
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// One lane's changes, oldest first, folded into its spans.
|
|
56
|
+
function spans_of(changes: ReadonlyArray<Change>): Array<PausedSpan> {
|
|
57
|
+
let walk: Walk = { spans: [], open_ms: undefined }
|
|
58
|
+
|
|
59
|
+
for (const change of changes) walk = step(walk, change)
|
|
60
|
+
if (walk.open_ms === undefined) return walk.spans
|
|
61
|
+
|
|
62
|
+
return [...walk.spans, { from_ms: walk.open_ms, to_ms: Infinity }]
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function by_lane(entries: ReadonlyArray<LedgerEntry>): PausedSpans {
|
|
66
|
+
const changes = entries
|
|
67
|
+
.filter((entry) => is_change(entry))
|
|
68
|
+
.toSorted((left, right) => Date.parse(left.at) - Date.parse(right.at))
|
|
69
|
+
const issues = [...new Set(changes.map((change) => change.issue))]
|
|
70
|
+
|
|
71
|
+
return new Map(
|
|
72
|
+
issues.map((issue) => [issue, spans_of(changes.filter((change) => change.issue === issue))]),
|
|
73
|
+
)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// The spans of the lane a transcript directory (`<lane-root-slug>-<issue>`) belongs to.
|
|
77
|
+
function of_lane(spans: PausedSpans, lane: string): ReadonlyArray<PausedSpan> {
|
|
78
|
+
const issue = LANE_ISSUE_PATTERN.exec(lane)?.groups?.['issue']
|
|
79
|
+
|
|
80
|
+
return issue === undefined ? NONE : (spans.get(Number(issue)) ?? NONE)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// How much of `from_ms`…`to_ms` the spans cover.
|
|
84
|
+
function overlap_ms(spans: ReadonlyArray<PausedSpan>, from_ms: number, to_ms: number): number {
|
|
85
|
+
let sum = 0
|
|
86
|
+
|
|
87
|
+
for (const span of spans) {
|
|
88
|
+
sum += Math.max(0, Math.min(to_ms, span.to_ms) - Math.max(from_ms, span.from_ms))
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return sum
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const lane_paused_spans = { by_lane, of_lane, overlap_ms }
|
|
95
|
+
|
|
96
|
+
export type { PausedSpan, PausedSpans }
|
|
97
|
+
export { lane_paused_spans }
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { auto_ok_cli } from '#scripts/auto-ok/auto-ok-cli'
|
|
2
|
+
import { backlog_overlap, type Clash } from '#scripts/backlog/backlog-overlap'
|
|
3
|
+
import { backlog_plan_comment } from '#scripts/backlog/backlog-plan-comment'
|
|
4
|
+
import type { OpenIssueData } from '#scripts/git/git-schemas'
|
|
5
|
+
import { has_any_label, IN_PROGRESS_LABEL } from '#scripts/issue/issue-labels'
|
|
6
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
7
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
8
|
+
import { run_hold_cli } from '#scripts/run/hold/run-hold-cli'
|
|
9
|
+
import { lane_plan, type LanePlan } from './lane-plan'
|
|
10
|
+
import { lane_yield, type YieldAt } from './lane-yield'
|
|
11
|
+
|
|
12
|
+
// The check `josh lane:plan <issue> <path>...` runs (`lane-plan-cli.ts`) — record the files a lane child
|
|
13
|
+
// plans to edit, and answer once whether a running lane that planned earlier declares or plans one of
|
|
14
|
+
// them (joshuafolkken/kit#4864).
|
|
15
|
+
//
|
|
16
|
+
// **The check happens before the first edit**, so a conflict the bodies did not show is met while the
|
|
17
|
+
// later lane has nothing to throw away, not at its ship. **A lane that finds a holder gives its lane
|
|
18
|
+
// back** rather than waiting for the holder to end (joshuafolkken/kit#4926): polling kept the seat taken
|
|
19
|
+
// while nothing moved, which made two lanes one. It notes its yield (`lane-yield.ts`), keeps its plan as
|
|
20
|
+
// yielded, releases its hold, prints `yield` and the child ends; the issue is offered again once the
|
|
21
|
+
// holder's lane ends. A document under `docs/` is never a clash (`backlog-overlap.ts` →
|
|
22
|
+
// `is_shared_document`).
|
|
23
|
+
//
|
|
24
|
+
// **`--probe` answers the same question and records nothing** (joshuafolkken/kit#5211) — no plan, no
|
|
25
|
+
// yield, no release. **`run:entry` gives the lane back at the entry** in a lane child, before any
|
|
26
|
+
// reading, on the paths dispatch gated on (`yield_at_entry`), so a holder that planned them since
|
|
27
|
+
// dispatch takes the lane back before the investigation the later `lane:plan` would have thrown away.
|
|
28
|
+
|
|
29
|
+
const SUCCESS_EXIT_CODE = 0
|
|
30
|
+
const FAILURE_EXIT_CODE = 1
|
|
31
|
+
const YIELD_EXIT_CODE = 2
|
|
32
|
+
const RELEASE_FLAG = '--release'
|
|
33
|
+
const RUNNING = new Set([IN_PROGRESS_LABEL])
|
|
34
|
+
const UNREAD = 'unread'
|
|
35
|
+
|
|
36
|
+
// What the overlap check found: the clash, none, or a listing it could not read.
|
|
37
|
+
type Probe = Clash | typeof UNREAD | undefined
|
|
38
|
+
|
|
39
|
+
function plan_of(argv: ReadonlyArray<string>, now: Date): LanePlan | undefined {
|
|
40
|
+
const [issue = '', ...paths] = argv
|
|
41
|
+
|
|
42
|
+
const claims = [...backlog_overlap.path_claims(paths)]
|
|
43
|
+
|
|
44
|
+
if (!issue_number_shape.is_issue_number(issue) || claims.length === 0) return undefined
|
|
45
|
+
|
|
46
|
+
return { issue: Number(issue), paths: claims, planned_at: now.toISOString() }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// The opted-in listing — the running lanes carry the pickup label, so it holds their bodies.
|
|
50
|
+
async function opted_in(): Promise<ReadonlyArray<OpenIssueData> | undefined> {
|
|
51
|
+
const read = await auto_ok_cli.fetch_opted_in()
|
|
52
|
+
|
|
53
|
+
return read.kind === 'read' ? read.issues : undefined
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function running_of(issues: ReadonlyArray<OpenIssueData>): ReadonlyArray<OpenIssueData> {
|
|
57
|
+
return issues.filter((issue) => has_any_label(issue.labels, RUNNING))
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function clash_among(
|
|
61
|
+
plan: LanePlan,
|
|
62
|
+
issues: ReadonlyArray<OpenIssueData>,
|
|
63
|
+
directory: string,
|
|
64
|
+
): Clash | undefined {
|
|
65
|
+
const declared = lane_plan.with_plans(backlog_overlap.declared_of(issues), directory)
|
|
66
|
+
|
|
67
|
+
return lane_plan.clash_of(plan, declared, directory)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function overlap_text(issue: number, clash: Clash): string {
|
|
71
|
+
const holder = session_cite.issue(clash.holder)
|
|
72
|
+
|
|
73
|
+
return `${session_cite.issue(issue)}'s planned \`${clash.path}\` overlaps \`${clash.claimed}\`, which ${holder} declares or plans`
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// The yield goes on the stream before the child is told to end, so `run:merge` books it `yielded`. The
|
|
77
|
+
// plan is kept as yielded (`lane_plan.release`) and the child's hold released, so it can end with no
|
|
78
|
+
// edit; `yield` is printed last, after the release's own verdict.
|
|
79
|
+
async function give_back(
|
|
80
|
+
plan: LanePlan,
|
|
81
|
+
clash: Clash,
|
|
82
|
+
directory: string,
|
|
83
|
+
at: YieldAt,
|
|
84
|
+
): Promise<number> {
|
|
85
|
+
const overlap = overlap_text(plan.issue, clash)
|
|
86
|
+
|
|
87
|
+
lane_plan.record({ ...plan, yielded: true }, directory)
|
|
88
|
+
await lane_yield.record_yield(plan.issue, overlap, at)
|
|
89
|
+
await run_hold_cli.run([RELEASE_FLAG, String(plan.issue)])
|
|
90
|
+
console.error(
|
|
91
|
+
`${overlap}, so it gives its lane back: end the session now, with no edit — \`run:merge\` closes the lane, and the issue is offered again once that lane ends.`,
|
|
92
|
+
)
|
|
93
|
+
console.info('yield')
|
|
94
|
+
|
|
95
|
+
return YIELD_EXIT_CODE
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function clear_answer(): number {
|
|
99
|
+
console.info('clear')
|
|
100
|
+
|
|
101
|
+
return SUCCESS_EXIT_CODE
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function clear(plan: LanePlan, directory: string): number {
|
|
105
|
+
lane_plan.record({ ...plan, cleared: true, yielded: undefined }, directory)
|
|
106
|
+
|
|
107
|
+
return clear_answer()
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// An unread listing proves no holder absent, so it holds the edit back for one more ask.
|
|
111
|
+
function unread(): number {
|
|
112
|
+
console.error(auto_ok_cli.UNREADABLE_MESSAGE)
|
|
113
|
+
console.info('wait')
|
|
114
|
+
|
|
115
|
+
return FAILURE_EXIT_CODE
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// The overlap check alone, writing nothing — what `--probe` answers and `check_plan` acts on.
|
|
119
|
+
async function probe(plan: LanePlan, directory: string): Promise<Probe> {
|
|
120
|
+
const issues = await opted_in()
|
|
121
|
+
|
|
122
|
+
return issues === undefined ? UNREAD : clash_among(plan, running_of(issues), directory)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
async function check_plan(plan: LanePlan, directory: string): Promise<number> {
|
|
126
|
+
lane_plan.record(plan, directory)
|
|
127
|
+
const found = await probe(plan, directory)
|
|
128
|
+
|
|
129
|
+
if (found === UNREAD) return unread()
|
|
130
|
+
|
|
131
|
+
return found === undefined
|
|
132
|
+
? clear(plan, directory)
|
|
133
|
+
: await give_back(plan, found, directory, 'summary')
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// `--probe`'s answer: the same tokens and exit codes as the plan's, with nothing written.
|
|
137
|
+
async function probe_answer(plan: LanePlan, directory: string): Promise<number> {
|
|
138
|
+
const found = await probe(plan, directory)
|
|
139
|
+
|
|
140
|
+
if (found === UNREAD) return unread()
|
|
141
|
+
if (found === undefined) return clear_answer()
|
|
142
|
+
|
|
143
|
+
console.error(`${overlap_text(plan.issue, found)}.`)
|
|
144
|
+
console.info('yield')
|
|
145
|
+
|
|
146
|
+
return YIELD_EXIT_CODE
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// A lane that plans again — after a yield, or to add a file — keeps the place in line its first plan
|
|
150
|
+
// took: a fresh time would hand the files it already holds to a lane that planned after it. A yield
|
|
151
|
+
// stays marked until the plan clears, so a check the listing could not answer keeps the plan its lane
|
|
152
|
+
// yielded on.
|
|
153
|
+
function placed(plan: LanePlan, directory: string): LanePlan {
|
|
154
|
+
const recorded = lane_plan.read(plan.issue, directory)
|
|
155
|
+
if (recorded === undefined) return plan
|
|
156
|
+
|
|
157
|
+
return { ...plan, planned_at: recorded.planned_at, yielded: recorded.yielded }
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// The paths `issue` declares in the scope dispatch gated on — its recorded plan, else its plan comment,
|
|
161
|
+
// else its body (`backlog-plan-comment.ts`) — read off the same listing the probe reads the holders from.
|
|
162
|
+
async function entry_plan(
|
|
163
|
+
issue: number,
|
|
164
|
+
issues: ReadonlyArray<OpenIssueData>,
|
|
165
|
+
directory: string,
|
|
166
|
+
): Promise<LanePlan | undefined> {
|
|
167
|
+
const own = issues.filter((candidate) => candidate.number === issue)
|
|
168
|
+
const declared = await backlog_plan_comment.declared_of(own, directory)
|
|
169
|
+
const plan = plan_of([String(issue), ...(declared.get(issue) ?? [])], new Date())
|
|
170
|
+
|
|
171
|
+
return plan === undefined ? undefined : placed(plan, directory)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
async function entry_yield(
|
|
175
|
+
issue: number,
|
|
176
|
+
issues: ReadonlyArray<OpenIssueData>,
|
|
177
|
+
directory: string,
|
|
178
|
+
): Promise<boolean> {
|
|
179
|
+
const plan = await entry_plan(issue, issues, directory)
|
|
180
|
+
const found = plan === undefined ? undefined : clash_among(plan, running_of(issues), directory)
|
|
181
|
+
|
|
182
|
+
if (plan === undefined || found === undefined) return false
|
|
183
|
+
|
|
184
|
+
await give_back(plan, found, directory, 'entry')
|
|
185
|
+
|
|
186
|
+
return true
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// **The entry probe** `run:entry` runs in a lane child before the investigation: a clash gives the lane back
|
|
190
|
+
// there, noted `at: entry`, the way `lane:plan` would after the summary. A clear answer, an unread
|
|
191
|
+
// listing or no declared path writes nothing — the later `lane:plan` still checks at the first edit.
|
|
192
|
+
async function yield_at_entry(issue: number, directory: string = process.cwd()): Promise<boolean> {
|
|
193
|
+
const issues = await opted_in()
|
|
194
|
+
|
|
195
|
+
return issues === undefined ? false : await entry_yield(issue, issues, directory)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const lane_plan_check = {
|
|
199
|
+
YIELD_EXIT_CODE,
|
|
200
|
+
check_plan,
|
|
201
|
+
placed,
|
|
202
|
+
plan_of,
|
|
203
|
+
probe_answer,
|
|
204
|
+
yield_at_entry,
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export { lane_plan_check }
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { lane_plan_check } from './lane-plan-check'
|
|
4
|
+
|
|
5
|
+
// `josh lane:plan <issue> <path>... [--probe]` — the command line over `lane-plan-check.ts`, which holds
|
|
6
|
+
// the check and the yield so `run:entry` can import them without this entry's main guard.
|
|
7
|
+
|
|
8
|
+
const ARGV_OFFSET = 2
|
|
9
|
+
const FAILURE_EXIT_CODE = 1
|
|
10
|
+
const PROBE_FLAG = '--probe'
|
|
11
|
+
const USAGE = 'Usage: josh lane:plan <issue-number> <path> [<path> ...] [--probe]'
|
|
12
|
+
const { YIELD_EXIT_CODE } = lane_plan_check
|
|
13
|
+
|
|
14
|
+
async function run(
|
|
15
|
+
argv: ReadonlyArray<string>,
|
|
16
|
+
directory: string = process.cwd(),
|
|
17
|
+
): Promise<number> {
|
|
18
|
+
const plan = lane_plan_check.plan_of(
|
|
19
|
+
argv.filter((token) => token !== PROBE_FLAG),
|
|
20
|
+
new Date(),
|
|
21
|
+
)
|
|
22
|
+
const action = argv.includes(PROBE_FLAG)
|
|
23
|
+
? lane_plan_check.probe_answer
|
|
24
|
+
: lane_plan_check.check_plan
|
|
25
|
+
|
|
26
|
+
if (plan !== undefined) return await action(lane_plan_check.placed(plan, directory), directory)
|
|
27
|
+
|
|
28
|
+
console.error(USAGE)
|
|
29
|
+
|
|
30
|
+
return FAILURE_EXIT_CODE
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
34
|
+
process.exitCode = await run(argv)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const lane_plan_cli = { USAGE, YIELD_EXIT_CODE, run }
|
|
38
|
+
|
|
39
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
40
|
+
|
|
41
|
+
export { lane_plan_cli }
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { backlog_overlap, type Clash, type Declared } from '#scripts/backlog/backlog-overlap'
|
|
2
|
+
import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
3
|
+
import { durable_state } from '#scripts/josh/durable-state'
|
|
4
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
5
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
6
|
+
import { z } from 'zod'
|
|
7
|
+
|
|
8
|
+
// The files a lane child plans to edit, recorded by `josh lane:plan` once its work summary settles.
|
|
9
|
+
//
|
|
10
|
+
// **An issue body names the paths its reporter saw, not the ones the change touches.**
|
|
11
|
+
// joshuafolkken/kit#4858 and joshuafolkken/kit#4859 declared disjoint paths, ran side by side, and both
|
|
12
|
+
// edited `scripts/lane/lane-overrun.ts`; the second ship stopped on the conflict (joshuafolkken/kit#4864).
|
|
13
|
+
// The plan is the first moment the touched files are known, so it is recorded here and read as the
|
|
14
|
+
// declaration in place of the body — by `lane:plan` to hold the later lane back, and by `backlog:next`.
|
|
15
|
+
//
|
|
16
|
+
// **Keyed to the repository and the issue, not the work tree**, and kept in the common git directory
|
|
17
|
+
// (`durable-state.ts`): the lane records it from its own work tree and the parent reads it from the main
|
|
18
|
+
// checkout, both resolve the same directory, and a reboot does not drop a running lane's plan.
|
|
19
|
+
// `lane:close` releases it with the lane (`release`).
|
|
20
|
+
|
|
21
|
+
const lane_plan_schema = z.object({
|
|
22
|
+
issue: z.number(),
|
|
23
|
+
paths: z.array(z.string()),
|
|
24
|
+
planned_at: z.string(),
|
|
25
|
+
cleared: z.boolean().optional(),
|
|
26
|
+
// The lane gave its lane back on this plan (`lane-yield.ts`), so the plan outlives the lane.
|
|
27
|
+
yielded: z.boolean().optional(),
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
type LanePlan = z.infer<typeof lane_plan_schema>
|
|
31
|
+
|
|
32
|
+
function plan_path(repository: string, issue: number): string {
|
|
33
|
+
return durable_state.path(durable_state.PREFIX.LANE_PLAN, repository, `-${String(issue)}.json`)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function record(plan: LanePlan, directory: string): boolean {
|
|
37
|
+
const repository = git_common_directory.repository(directory)
|
|
38
|
+
|
|
39
|
+
if (repository === undefined) return false
|
|
40
|
+
|
|
41
|
+
stamp_file.replace_stamp(plan_path(repository, plan.issue), plan)
|
|
42
|
+
|
|
43
|
+
return true
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function remove(issue: number, directory: string): void {
|
|
47
|
+
const repository = git_common_directory.repository(directory)
|
|
48
|
+
|
|
49
|
+
if (repository !== undefined) stamp_file.remove_stamp(plan_path(repository, issue))
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function read(issue: number, directory: string): LanePlan | undefined {
|
|
53
|
+
const repository = git_common_directory.repository(directory)
|
|
54
|
+
const text =
|
|
55
|
+
repository === undefined ? undefined : stamp_file.read_stamp_text(plan_path(repository, issue))
|
|
56
|
+
|
|
57
|
+
return text === undefined ? undefined : json_value.parse_with(text, lane_plan_schema)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Whether `issue` has no plan that `lane:plan` cleared, in a repository that can hold one — a checkout
|
|
61
|
+
// with no common git directory cannot record a plan, so it is never asked for one. A plan recorded but
|
|
62
|
+
// not cleared — a yield, an unread listing — lifts no hold: the record is written before the check.
|
|
63
|
+
function is_uncleared(issue: number, directory: string): boolean {
|
|
64
|
+
return (
|
|
65
|
+
git_common_directory.repository(directory) !== undefined &&
|
|
66
|
+
read(issue, directory)?.cleared !== true
|
|
67
|
+
)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// What an ended lane does with its plan. A plan the lane yielded on (`lane-yield.ts`,
|
|
71
|
+
// joshuafolkken/kit#4926) stays: `backlog:next` holds the issue back on it while the holder runs, and
|
|
72
|
+
// its next lane keeps the place in line it took. Any other plan goes — cleared, or left by a lane that
|
|
73
|
+
// ended before its check answered — so the issue's next lane plans afresh rather than inheriting the
|
|
74
|
+
// files and the place in line of a run that is over.
|
|
75
|
+
function release(issue: number, directory: string): void {
|
|
76
|
+
if (read(issue, directory)?.yielded !== true) remove(issue, directory)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// `declared` with each issue's recorded plan, if any, in place of what it declares (joshuafolkken/kit#4937).
|
|
80
|
+
function with_plans(declared: Declared, directory: string): Declared {
|
|
81
|
+
const replaced = [...declared].map(([issue, paths]): [number, ReadonlySet<string>] => [
|
|
82
|
+
issue,
|
|
83
|
+
new Set(read(issue, directory)?.paths ?? paths),
|
|
84
|
+
])
|
|
85
|
+
|
|
86
|
+
return new Map(replaced)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Whether `other` holds its files ahead of `plan`: it was cleared, or it planned first. A cleared lane
|
|
90
|
+
// may already be editing, so a kept place in line never takes its files from it.
|
|
91
|
+
function goes_before(other: LanePlan, plan: LanePlan): boolean {
|
|
92
|
+
return other.cleared === true || other.planned_at < plan.planned_at
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// The `holders` whose plan goes before `plan` — the only ones it yields to. Of two uncleared plans the
|
|
96
|
+
// earlier goes first, so two lanes that plan the same file never yield to each other.
|
|
97
|
+
function earlier_holders(
|
|
98
|
+
plan: LanePlan,
|
|
99
|
+
holders: ReadonlyArray<number>,
|
|
100
|
+
directory: string,
|
|
101
|
+
): Array<number> {
|
|
102
|
+
return holders.filter((holder) => {
|
|
103
|
+
const other = holder === plan.issue ? undefined : read(holder, directory)
|
|
104
|
+
|
|
105
|
+
return other !== undefined && goes_before(other, plan)
|
|
106
|
+
})
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// The first file of `plan` that a lane in `declared` — its recorded plan, else its body — holds ahead of
|
|
110
|
+
// it. `lane:plan` yields on it, and a named run holds the yielded issue back on the same answer.
|
|
111
|
+
function clash_of(plan: LanePlan, declared: Declared, directory: string): Clash | undefined {
|
|
112
|
+
const holders = earlier_holders(plan, [...declared.keys()], directory)
|
|
113
|
+
|
|
114
|
+
return backlog_overlap.path_clash(new Set(plan.paths), declared, holders)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function is_yielded(issue: number, directory: string): boolean {
|
|
118
|
+
return read(issue, directory)?.yielded === true
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Whether `issue` yielded on a plan that a lane in `declared` still holds one of its files ahead of —
|
|
122
|
+
// what a named run holds the issue back on, as `backlog:next` does on the same kept plan
|
|
123
|
+
// (joshuafolkken/kit#4926). Without it the run relaunches the issue at once, and the lane yields again.
|
|
124
|
+
function is_yield_held(issue: number, declared: Declared, directory: string): boolean {
|
|
125
|
+
const plan = read(issue, directory)
|
|
126
|
+
|
|
127
|
+
return plan?.yielded === true && clash_of(plan, declared, directory) !== undefined
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const lane_plan = {
|
|
131
|
+
clash_of,
|
|
132
|
+
earlier_holders,
|
|
133
|
+
is_uncleared,
|
|
134
|
+
is_yield_held,
|
|
135
|
+
is_yielded,
|
|
136
|
+
read,
|
|
137
|
+
record,
|
|
138
|
+
release,
|
|
139
|
+
remove,
|
|
140
|
+
with_plans,
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export { lane_plan }
|
|
144
|
+
export type { LanePlan }
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { process_identity } from '#scripts/josh/process-identity'
|
|
2
|
+
import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
3
|
+
import { execa } from 'execa'
|
|
4
|
+
import { lane_reap, type TreeProbes } from './lane-reap'
|
|
5
|
+
import { process_tools } from './process-tools'
|
|
6
|
+
|
|
7
|
+
// Every process on the machine at one instant, read by one asynchronous `ps`, answering the probes a
|
|
8
|
+
// lane's tree is read through (joshuafolkken/kit#4241), and the listing `run:board`'s
|
|
9
|
+
// usage columns are read from (joshuafolkken/kit#4246).
|
|
10
|
+
//
|
|
11
|
+
// **Why one snapshot.** `lane_reap`'s probes start one synchronous `ps` / `pgrep` per ancestor and per
|
|
12
|
+
// descendant, so a reader that asks about every lane each few seconds — `run:board`, the backlogrun
|
|
13
|
+
// drive — blocked its event loop for over a second with seven lanes under load. The snapshot costs one
|
|
14
|
+
// spawn whatever the lane and process counts, and never blocks. `run:board` takes one per refresh and
|
|
15
|
+
// hands it to both the lane count and the usage columns (`shared`), so the two read the same instant.
|
|
16
|
+
//
|
|
17
|
+
// **The walk is not re-implemented.** `lane_reap` still walks the tree; the
|
|
18
|
+
// snapshot only answers the questions it asks. `matching` reads the full command line the way
|
|
19
|
+
// `pgrep -f` does, and `-ww` keeps `ps` from cutting it at a terminal width. The command is the full
|
|
20
|
+
// line rather than `comm`: `ps` cuts any column but the last, so the two cannot share one listing.
|
|
21
|
+
//
|
|
22
|
+
// **The start time is `process_identity`'s own reading.** A detached ship's record names its process by
|
|
23
|
+
// start time (`run-ship-detach.ts`), and the `lstart` column under `process_identity`'s environment
|
|
24
|
+
// prints it exactly as that module's own `ps` does, so a ship is told alive from these rows without
|
|
25
|
+
// starting another `ps` (joshuafolkken/kit#4245).
|
|
26
|
+
|
|
27
|
+
const COLUMNS = ['pid=', 'ppid=', 'time=', 'rss=', 'stat=', process_identity.START_TIME_FORMAT]
|
|
28
|
+
const PS_ARGUMENTS = ['-A', '-ww', '-o', [...COLUMNS, 'command='].join(',')]
|
|
29
|
+
// `ps` labels nothing locale-dependent here, and the C locale keeps its columns stable; the time zone
|
|
30
|
+
// fixes how the start time prints.
|
|
31
|
+
const PS_ENVIRONMENT = process_identity.PROBE_ENVIRONMENT
|
|
32
|
+
const FIELD_SEPARATOR = /\s+/u
|
|
33
|
+
// `lstart` prints `Tue Sep 8 08:39:04 2026`: five fields, the day of the month padded to two places.
|
|
34
|
+
const START_FIELDS = 5
|
|
35
|
+
const DAY_FIELD = 2
|
|
36
|
+
const DAY_WIDTH = 2
|
|
37
|
+
|
|
38
|
+
interface ProcessRow {
|
|
39
|
+
pid: number
|
|
40
|
+
parent: number
|
|
41
|
+
// `ps`'s cumulative CPU time as printed, `[DD-][HH:]MM:SS[.ss]`.
|
|
42
|
+
time: string
|
|
43
|
+
rss_kb: number
|
|
44
|
+
stat: string
|
|
45
|
+
// The start time as `process_identity`'s `ps` prints it.
|
|
46
|
+
start: string
|
|
47
|
+
command: string
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// One snapshot's rows.
|
|
51
|
+
type ProcessTable = ReadonlyArray<ProcessRow>
|
|
52
|
+
// A snapshot read on demand, `undefined` where `ps` did not answer.
|
|
53
|
+
type TableRead = () => Promise<ProcessTable | undefined>
|
|
54
|
+
|
|
55
|
+
function is_row(row: ProcessRow): boolean {
|
|
56
|
+
const { pid, parent, rss_kb, command } = row
|
|
57
|
+
|
|
58
|
+
return Number.isSafeInteger(pid + parent) && Number.isFinite(rss_kb) && command !== ''
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// The split fields put back with the day's padding the split dropped.
|
|
62
|
+
function start_of(fields: ReadonlyArray<string>): string {
|
|
63
|
+
return fields
|
|
64
|
+
.map((field, index) => (index === DAY_FIELD ? field.padStart(DAY_WIDTH) : field))
|
|
65
|
+
.join(' ')
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// The command's own runs of white space read as one space, which no lane pattern tells apart.
|
|
69
|
+
function row_of(line: string): ProcessRow | undefined {
|
|
70
|
+
const [pid, parent, time = '', rss, stat = '', ...rest] = line.trim().split(FIELD_SEPARATOR)
|
|
71
|
+
const numbers = { pid: Number(pid), parent: Number(parent), rss_kb: Number(rss) }
|
|
72
|
+
const start = start_of(rest.slice(0, START_FIELDS))
|
|
73
|
+
const row = { ...numbers, time, stat, start, command: rest.slice(START_FIELDS).join(' ') }
|
|
74
|
+
|
|
75
|
+
return is_row(row) ? row : undefined
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Each `ps` line as a row; a line that does not read as one is left out. */
|
|
79
|
+
function parse(printed: string): Array<ProcessRow> {
|
|
80
|
+
return printed
|
|
81
|
+
.split('\n')
|
|
82
|
+
.map((line) => row_of(line))
|
|
83
|
+
.filter((row) => row !== undefined)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function matching_in(rows: ProcessTable, pattern: string): Array<number> {
|
|
87
|
+
const expression = new RegExp(pattern, 'u')
|
|
88
|
+
|
|
89
|
+
return rows.filter((row) => expression.test(row.command)).map((row) => row.pid)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Each parent's children, indexed once so a walk does not rescan every row per process.
|
|
93
|
+
function children_index(rows: ProcessTable): Map<number, Array<number>> {
|
|
94
|
+
const children = new Map<number, Array<number>>()
|
|
95
|
+
|
|
96
|
+
for (const { pid, parent } of rows) {
|
|
97
|
+
const siblings = children.get(parent) ?? []
|
|
98
|
+
|
|
99
|
+
siblings.push(pid)
|
|
100
|
+
children.set(parent, siblings)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return children
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** The probes a lane's tree is read through, answered from `rows` alone. */
|
|
107
|
+
function probes_of(rows: ProcessTable): TreeProbes {
|
|
108
|
+
const by_pid = new Map(rows.map((row) => [row.pid, row]))
|
|
109
|
+
const children = children_index(rows)
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
matching: (pattern) => matching_in(rows, pattern),
|
|
113
|
+
children_of: (pid) => children.get(pid) ?? [],
|
|
114
|
+
parent_of: (pid) => by_pid.get(pid)?.parent,
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** `process_identity.read_start` with its `ps` answered from `rows`: `/proc` first, as there. */
|
|
119
|
+
function start_reader(rows: ProcessTable): (pid: number) => string | undefined {
|
|
120
|
+
const starts = new Map(rows.map((row) => [row.pid, row.start]))
|
|
121
|
+
const probes = {
|
|
122
|
+
...process_identity.START_PROBES,
|
|
123
|
+
read_ps_start: (pid: number) => starts.get(pid),
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return (pid) => process_identity.read_start(pid, probes)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** The snapshot, `undefined` where `ps` did not answer; a missing `ps` is refused by name. */
|
|
130
|
+
async function read_table(): Promise<ProcessTable | undefined> {
|
|
131
|
+
try {
|
|
132
|
+
const { stdout } = await execa(lane_reap.PS_COMMAND, PS_ARGUMENTS, {
|
|
133
|
+
env: PS_ENVIRONMENT,
|
|
134
|
+
timeout: PROBE_TIMEOUT_MS,
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
return parse(stdout)
|
|
138
|
+
} catch (error) {
|
|
139
|
+
process_tools.throw_if_missing(lane_reap.PS_COMMAND, error)
|
|
140
|
+
|
|
141
|
+
return undefined
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** `read`, run on the first call alone; every later call answers that same snapshot. */
|
|
146
|
+
function shared(read: TableRead): TableRead {
|
|
147
|
+
const taken: { table?: ReturnType<TableRead> } = {}
|
|
148
|
+
|
|
149
|
+
return async function table() {
|
|
150
|
+
taken.table ??= read()
|
|
151
|
+
|
|
152
|
+
return await taken.table
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const lane_process_table = {
|
|
157
|
+
PS_ARGUMENTS,
|
|
158
|
+
parse,
|
|
159
|
+
probes_of,
|
|
160
|
+
read_table,
|
|
161
|
+
shared,
|
|
162
|
+
start_reader,
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export { lane_process_table }
|
|
166
|
+
export type { ProcessRow, ProcessTable, TableRead }
|