@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,274 @@
|
|
|
1
|
+
import { agent_argv } from '#scripts/agent/agent-argv'
|
|
2
|
+
import { agent_role_profile } from '#scripts/agent/agent-role-profile'
|
|
3
|
+
import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
|
|
4
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
5
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
6
|
+
import { process_identity } from '#scripts/josh/process-identity'
|
|
7
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
8
|
+
import { detached_launch } from '#scripts/run/detached-launch'
|
|
9
|
+
import { run_event_overrun, type OverrunNote } from '#scripts/run/event/run-event-overrun'
|
|
10
|
+
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
11
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
12
|
+
import { lane_breakdown, type Breakdown } from './lane-breakdown'
|
|
13
|
+
import { lane_breakdown_implement } from './lane-breakdown-implement'
|
|
14
|
+
import { lane_breakdown_text, type Report } from './lane-breakdown-text'
|
|
15
|
+
import { lane_child_marker } from './lane-child-marker'
|
|
16
|
+
import { lane_investigation_switch } from './lane-investigation-switch'
|
|
17
|
+
import { lane_ledger, type LedgerEntry } from './lane-ledger'
|
|
18
|
+
import { lane_net_time } from './lane-net-time'
|
|
19
|
+
import { lane_overrun_prompt } from './lane-overrun-prompt'
|
|
20
|
+
import { lane_tail_stats } from './lane-tail-stats'
|
|
21
|
+
|
|
22
|
+
// A merged lane over the overrun threshold of net time is investigated for its causes
|
|
23
|
+
// (joshuafolkken/kit#4751). `run:merge` asks at each merge: a lane at or under the threshold — its long
|
|
24
|
+
// total spent waiting on a person or an outage included — stops here, before any record of it is read.
|
|
25
|
+
// An overrun launches a detached worker session that reads the lane's records and files each unfiled
|
|
26
|
+
// cause through `issue:file` — the causes one fix place shares as one issue, or folded into an open
|
|
27
|
+
// issue touching the same files (joshuafolkken/kit#4858) — so the next lane starts without waiting on
|
|
28
|
+
// it. The session carries the lane's child mark, which makes `issue:file` count its filings against the
|
|
29
|
+
// lane (`issue-file-cap.ts`), and `--found-during` names the same origin; its overrun mark records the
|
|
30
|
+
// filings as the investigation's, not the child's (joshuafolkken/kit#4880). The launch and the session's result both go on the run's
|
|
31
|
+
// event stream as notes. It runs only while `JOSH_LANE_INVESTIGATION` is on (`lane-investigation-switch.ts`);
|
|
32
|
+
// off by default, an overrun leaves a skipped note in place of the launch (joshuafolkken/kit#5044).
|
|
33
|
+
|
|
34
|
+
const { EVENT_KIND } = run_event_stream
|
|
35
|
+
const { DISABLED_REASON } = run_event_overrun
|
|
36
|
+
const LOG_PREFIX = 'josh-lane-overrun-'
|
|
37
|
+
const LOG_SUFFIX = '.log'
|
|
38
|
+
const NO_LEDGER = 'no ledger'
|
|
39
|
+
|
|
40
|
+
// A lane's net minutes and their breakdown by stage, or why there are none (joshuafolkken/kit#4818).
|
|
41
|
+
// `is_commented` says an earlier pass of the lane commented the breakdown on its Issue already;
|
|
42
|
+
// `entries` are the ledger rows the breakdown's details are read off (joshuafolkken/kit#5078).
|
|
43
|
+
type LaneNet =
|
|
44
|
+
| {
|
|
45
|
+
kind: 'minutes'
|
|
46
|
+
minutes: number
|
|
47
|
+
breakdown: Breakdown
|
|
48
|
+
entries: ReadonlyArray<LedgerEntry>
|
|
49
|
+
is_commented: boolean
|
|
50
|
+
}
|
|
51
|
+
| { kind: 'missing'; reason: string }
|
|
52
|
+
|
|
53
|
+
// A launch that failed is retried once, at the next `run:merge` (joshuafolkken/kit#4930).
|
|
54
|
+
const MAX_LAUNCH_FAILURES = 2
|
|
55
|
+
|
|
56
|
+
function overrun_notes(events: ReadonlyArray<RunEvent>): ReadonlyArray<OverrunNote> {
|
|
57
|
+
return events.flatMap((event) =>
|
|
58
|
+
event.kind === EVENT_KIND.NOTE ? (run_event_overrun.parse(event.text) ?? []) : [],
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// A pass that threw before it noted anything leaves a failure with no minutes.
|
|
63
|
+
function is_thrown(note: OverrunNote): boolean {
|
|
64
|
+
return note.kind === 'failed' && note.minutes === undefined
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// A start note that launched no session.
|
|
68
|
+
function is_launch_failure(note: OverrunNote): boolean {
|
|
69
|
+
return note.kind === 'failed' && note.minutes !== undefined
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function is_final(note: OverrunNote): boolean {
|
|
73
|
+
return !is_thrown(note) && !is_launch_failure(note)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// A merge `run:merge` collects again — a driver retry, a parent's hand run — finds its lane's note on
|
|
77
|
+
// the stream and launches no second session to file the same causes. A pass that threw before it
|
|
78
|
+
// noted anything leaves only its failure, which the retry answers; a launch that failed is answered
|
|
79
|
+
// once more.
|
|
80
|
+
function is_noted(events: ReadonlyArray<RunEvent>, issue: number): boolean {
|
|
81
|
+
const notes = overrun_notes(events).filter((note) => note.issue === issue)
|
|
82
|
+
const failures = notes.filter((note) => is_launch_failure(note)).length
|
|
83
|
+
|
|
84
|
+
return failures >= MAX_LAUNCH_FAILURES || notes.some((note) => is_final(note))
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// The earlier lanes whose latest note is a launch failure not yet retried; a retry that threw leaves
|
|
88
|
+
// its own note last, so it is not swept up again at every merge after.
|
|
89
|
+
function retried_lanes(events: ReadonlyArray<RunEvent>, issue: number): ReadonlyArray<number> {
|
|
90
|
+
const latest = new Map(overrun_notes(events).map((note) => [note.issue, note]))
|
|
91
|
+
|
|
92
|
+
latest.delete(issue)
|
|
93
|
+
|
|
94
|
+
return [...latest.values()]
|
|
95
|
+
.filter((note) => is_launch_failure(note) && !is_noted(events, note.issue))
|
|
96
|
+
.map((note) => note.issue)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// A pass that noted the lane before launched nothing it recorded, but it may have commented.
|
|
100
|
+
function is_commented(events: ReadonlyArray<RunEvent>, issue: number): boolean {
|
|
101
|
+
return overrun_notes(events).some((note) => note.issue === issue)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function net_in(path: string, events: ReadonlyArray<RunEvent>, issue: number): LaneNet {
|
|
105
|
+
const entries = lane_ledger.read_entries(path)
|
|
106
|
+
const minutes = lane_net_time.net_minutes(entries, events, issue)
|
|
107
|
+
const breakdown = lane_breakdown.of(entries, events, issue)
|
|
108
|
+
|
|
109
|
+
if (minutes === undefined || breakdown === undefined) {
|
|
110
|
+
return { kind: 'missing', reason: lane_net_time.missing_reason(entries, issue) }
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return { kind: 'minutes', minutes, breakdown, entries, is_commented: is_commented(events, issue) }
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// The net time of a lane not yet noted, or `undefined` when its note is on the stream already.
|
|
117
|
+
async function net_of(issue: number): Promise<LaneNet | undefined> {
|
|
118
|
+
const events = await run_event_stream_emit.all_events()
|
|
119
|
+
|
|
120
|
+
if (is_noted(events, issue)) return undefined
|
|
121
|
+
|
|
122
|
+
const path = await lane_ledger.target()
|
|
123
|
+
|
|
124
|
+
return path === undefined ? { kind: 'missing', reason: NO_LEDGER } : net_in(path, events, issue)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// What the session reads, and the four facts it traces each cause to.
|
|
128
|
+
function reading(issue: number, cite: string, minutes: number): string {
|
|
129
|
+
const directories =
|
|
130
|
+
lane_breakdown_implement.transcript_directories(issue).join(', ') || 'none found'
|
|
131
|
+
|
|
132
|
+
return [
|
|
133
|
+
`Investigate why lane ${cite} took ${String(minutes)} minutes of net time (dispatch to merge, less`,
|
|
134
|
+
'its waits on a person and on outages). Leave this checkout as it is: write any file, an issue body',
|
|
135
|
+
'included, under the system temp directory, and never stage, commit or push.',
|
|
136
|
+
`Read the lane's transcripts (${directories}), its ship log (\`pnpm josh ship --log ${String(issue)}\`)`,
|
|
137
|
+
'and the run events (`pnpm josh run:event --from 0`), and find the causes that spent time other than',
|
|
138
|
+
'waiting. Trace each cause to what can fix it: the span it spent, the signal that led to the wrong call',
|
|
139
|
+
'or the wait (which command printed what), the `file:line` of the code or document that decided it, and',
|
|
140
|
+
'where to fix it.',
|
|
141
|
+
].join(' ')
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// One line: `detached_launch` lets a prompt break lines, but a single line keeps the log header whole.
|
|
145
|
+
// The breakdown leads, so the search starts from the longest stage (joshuafolkken/kit#4995).
|
|
146
|
+
function prompt(issue: number, minutes: number, report: Report): string {
|
|
147
|
+
const reads = reading(issue, issue_cite.plain(issue), minutes)
|
|
148
|
+
const stages = lane_breakdown_text.line(report)
|
|
149
|
+
|
|
150
|
+
return `${stages} ${reads} ${lane_overrun_prompt.handling(issue, minutes)}`
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function note_failure(issue: number): (note: string) => void {
|
|
154
|
+
return (note) => {
|
|
155
|
+
void run_event_stream_emit.emit(EVENT_KIND.NOTE, run_event_overrun.failed_text(issue, note))
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// A detached investigation session: its prompt, its `env` — the lane marks an overrun's filings count
|
|
160
|
+
// against that lane by, none for the baseline's — the prefix of its log's name, and the note a failed
|
|
161
|
+
// launch leaves.
|
|
162
|
+
interface Investigation {
|
|
163
|
+
env: Readonly<Record<string, string>>
|
|
164
|
+
prompt: string
|
|
165
|
+
log_prefix: string
|
|
166
|
+
on_failure: (note: string) => void
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// What became of the launch, in the words the launch note carries — the overrun's and the baseline
|
|
170
|
+
// investigation's (`lane-baseline.ts`) alike.
|
|
171
|
+
function launch(investigation: Investigation): string {
|
|
172
|
+
const cwd = process.cwd()
|
|
173
|
+
const built = agent_argv.resolve_in(investigation.prompt, agent_role_profile.WORKER, cwd)
|
|
174
|
+
|
|
175
|
+
if (built.kind === 'rejected') return `not investigated: ${built.note}`
|
|
176
|
+
|
|
177
|
+
const request = {
|
|
178
|
+
argv: built.argv,
|
|
179
|
+
cwd,
|
|
180
|
+
env: investigation.env,
|
|
181
|
+
log_path: stamp_file.stamp_path(investigation.log_prefix, PROJECT_ROOT, LOG_SUFFIX),
|
|
182
|
+
profile: built.profile,
|
|
183
|
+
}
|
|
184
|
+
const result = detached_launch.launch(request, investigation.on_failure)
|
|
185
|
+
|
|
186
|
+
return result.kind === 'launched'
|
|
187
|
+
? run_event_overrun.investigating(result.pid, process_identity.read_start(result.pid))
|
|
188
|
+
: `not investigated: ${result.note}`
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function launched(issue: number, minutes: number, report: Report): string {
|
|
192
|
+
return launch({
|
|
193
|
+
env: lane_child_marker.overrun_env_for(String(issue)),
|
|
194
|
+
prompt: prompt(issue, minutes, report),
|
|
195
|
+
log_prefix: `${LOG_PREFIX}${String(issue)}-`,
|
|
196
|
+
on_failure: note_failure(issue),
|
|
197
|
+
})
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
type OverranNet = Extract<LaneNet, { kind: 'minutes' }>
|
|
201
|
+
|
|
202
|
+
// The breakdown goes on the lane's Issue before the session starts, once across the lane's passes; a
|
|
203
|
+
// refused comment costs the comment, not the investigation.
|
|
204
|
+
async function overran_text(issue: number, net: OverranNet): Promise<string> {
|
|
205
|
+
const report = lane_breakdown_text.report_of(issue, net.breakdown, net.entries)
|
|
206
|
+
const comment = lane_breakdown_text.comment(issue, net.minutes, report)
|
|
207
|
+
|
|
208
|
+
if (!net.is_commented) await git_gh_issue_write.issue_try_comment(String(issue), comment)
|
|
209
|
+
|
|
210
|
+
const outcome = launched(issue, net.minutes, report)
|
|
211
|
+
const longest = lane_breakdown.longest_of(net.breakdown)
|
|
212
|
+
|
|
213
|
+
return run_event_overrun.started_text(issue, net.minutes, outcome, longest)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// The note every merged lane leaves: its net minutes at or under the threshold, why it has none, or the
|
|
217
|
+
// launch of its overrun's investigation.
|
|
218
|
+
async function note_text(issue: number, net: LaneNet): Promise<string> {
|
|
219
|
+
if (net.kind === 'missing') return run_event_overrun.skipped_text(issue, net.reason)
|
|
220
|
+
// The threshold sets no priority: each filing is ranked by its causes' reducible minutes
|
|
221
|
+
// (joshuafolkken/kit#4928). `lane:stats` counts the lanes over it on dispatch-to-merge time, not
|
|
222
|
+
// on this net time.
|
|
223
|
+
const is_over = lane_tail_stats.is_overrun(net.minutes)
|
|
224
|
+
|
|
225
|
+
if (!is_over) return run_event_overrun.within_text(issue, net.minutes)
|
|
226
|
+
|
|
227
|
+
// The switch off, an overrun leaves its skip: no breakdown comment and no launch.
|
|
228
|
+
if (!lane_investigation_switch.is_on()) {
|
|
229
|
+
return run_event_overrun.skipped_text(issue, DISABLED_REASON)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
return await overran_text(issue, net)
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
async function investigate_lane(issue: number): Promise<void> {
|
|
236
|
+
const net = await net_of(issue)
|
|
237
|
+
|
|
238
|
+
if (net === undefined) return
|
|
239
|
+
|
|
240
|
+
await run_event_stream_emit.emit(EVENT_KIND.NOTE, await note_text(issue, net))
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Never fails the merge it follows: an error is a note on the stream, not a refused merge.
|
|
244
|
+
async function guarded(issue: number, pass: (issue: number) => Promise<void>): Promise<void> {
|
|
245
|
+
try {
|
|
246
|
+
await pass(issue)
|
|
247
|
+
} catch (error) {
|
|
248
|
+
note_failure(issue)(detached_launch.note_of(error))
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// The merged lane, then each earlier lane whose launch failed once.
|
|
253
|
+
async function investigate_with_retries(issue: number): Promise<void> {
|
|
254
|
+
await investigate_lane(issue)
|
|
255
|
+
const retried = retried_lanes(await run_event_stream_emit.all_events(), issue)
|
|
256
|
+
|
|
257
|
+
for (const lane of retried) {
|
|
258
|
+
// eslint-disable-next-line no-await-in-loop -- one pass at a time appends to the stream, as the merged lane's did
|
|
259
|
+
await guarded(lane, investigate_lane)
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// With the switch off a lane still notes its net minutes, which `run:board` draws; no earlier lane is
|
|
264
|
+
// retried.
|
|
265
|
+
async function investigate(issue: number): Promise<void> {
|
|
266
|
+
const pass = lane_investigation_switch.is_on() ? investigate_with_retries : investigate_lane
|
|
267
|
+
|
|
268
|
+
await guarded(issue, pass)
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const lane_overrun = { investigate, launch }
|
|
272
|
+
|
|
273
|
+
export type { Investigation }
|
|
274
|
+
export { lane_overrun }
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { has_parked_label } from '#scripts/issue/issue-labels'
|
|
2
2
|
import { issue_state_cli } from '#scripts/issue/issue-state-cli'
|
|
3
3
|
|
|
4
|
-
// Whether an issue is parked for a person —
|
|
4
|
+
// Whether an issue is parked for a person — any park label (`PARKED_LABELS`) — read live, so a session a
|
|
5
5
|
// lane's broker would start for it is refused once the run has parked it (joshuafolkken/kit#3878).
|
|
6
6
|
//
|
|
7
7
|
// **An issue whose state cannot be read is not parked**: the read gates every brokered review, so
|
|
@@ -10,7 +10,7 @@ import { issue_state_cli } from '#scripts/issue/issue-state-cli'
|
|
|
10
10
|
async function is_parked(issue: string): Promise<boolean> {
|
|
11
11
|
const read = await issue_state_cli.read_issue(issue)
|
|
12
12
|
|
|
13
|
-
return read.kind === 'state' &&
|
|
13
|
+
return read.kind === 'state' && has_parked_label(read.state.labels)
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
const lane_parked = { is_parked }
|
|
@@ -57,6 +57,16 @@ function is_lane_root(directory: string, environment: LaneEnvironment): boolean
|
|
|
57
57
|
return DEFAULT_LANE_ROOT_PATTERN.test(path.basename(directory))
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
+
// Claude Code's own worktrees (`EnterWorktree`, an `isolation: "worktree"` subagent) sit at
|
|
61
|
+
// `<checkout>/.claude/worktrees/<name>`, and a hook launched in one runs there
|
|
62
|
+
// (joshuafolkken/kit#4617). The session is still the one its checkout started, so a directory under
|
|
63
|
+
// one reads as the checkout that holds it.
|
|
64
|
+
const CLAUDE_WORKTREES_PATTERN = /[/\\]\.claude[/\\]worktrees[/\\][^/\\]+(?:[/\\].*)?$/u
|
|
65
|
+
|
|
66
|
+
function checkout_of(directory: string): string {
|
|
67
|
+
return directory.replace(CLAUDE_WORKTREES_PATTERN, '')
|
|
68
|
+
}
|
|
69
|
+
|
|
60
70
|
// **The inverse of `lane_directory`, and the one lane test that needs no git.** `lane_registry`
|
|
61
71
|
// answers the same question authoritatively by parsing `git worktree list`, but that read is
|
|
62
72
|
// asynchronous and a `PreToolUse` guard is synchronous by contract — so a guard that has to know
|
|
@@ -71,7 +81,7 @@ function lane_issue_of(
|
|
|
71
81
|
directory: string,
|
|
72
82
|
environment: LaneEnvironment = process.env,
|
|
73
83
|
): string | undefined {
|
|
74
|
-
const resolved = path.resolve(directory)
|
|
84
|
+
const resolved = checkout_of(path.resolve(directory))
|
|
75
85
|
const issue = path.basename(resolved)
|
|
76
86
|
|
|
77
87
|
if (!issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue)) return undefined
|
|
@@ -79,6 +89,17 @@ function lane_issue_of(
|
|
|
79
89
|
return is_lane_root(path.dirname(resolved), environment) ? issue : undefined
|
|
80
90
|
}
|
|
81
91
|
|
|
92
|
+
// The lane `directory` (this process's own by default) sits in, as a number; `undefined` outside a
|
|
93
|
+
// lane — the `issue` a ledger row written from inside a lane carries.
|
|
94
|
+
function issue_here(
|
|
95
|
+
directory: string = process.cwd(),
|
|
96
|
+
environment: LaneEnvironment = process.env,
|
|
97
|
+
): number | undefined {
|
|
98
|
+
const lane = lane_issue_of(directory, environment)
|
|
99
|
+
|
|
100
|
+
return lane === undefined ? undefined : Number(lane)
|
|
101
|
+
}
|
|
102
|
+
|
|
82
103
|
function lane_branch(issue: string): string {
|
|
83
104
|
return `${issue}${LANE_BRANCH_SUFFIX}`
|
|
84
105
|
}
|
|
@@ -98,8 +119,10 @@ const lane_paths = {
|
|
|
98
119
|
LANE_BRANCH_SUFFIX,
|
|
99
120
|
LANE_ROOT_KEY,
|
|
100
121
|
SEAT_LOCK_DIR,
|
|
122
|
+
checkout_of,
|
|
101
123
|
default_lane_root,
|
|
102
124
|
is_lane_entry,
|
|
125
|
+
issue_here,
|
|
103
126
|
lane_branch,
|
|
104
127
|
lane_directory,
|
|
105
128
|
lane_issue_of,
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
4
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
5
|
+
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
6
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
7
|
+
import { lane_ledger_write } from './lane-ledger-write'
|
|
8
|
+
import { lane_pause, type LaneSignalled } from './lane-pause'
|
|
9
|
+
import type { LaneProcesses } from './lane-reap'
|
|
10
|
+
import { lane_registry } from './lane-registry'
|
|
11
|
+
import { lane_state } from './lane-state'
|
|
12
|
+
|
|
13
|
+
// `josh lane:pause <issue> | --all` and `josh lane:resume <issue> | --all` — one script told apart by
|
|
14
|
+
// the verb the registry passes first. A named lane with no child process to signal exits non-zero, so a
|
|
15
|
+
// caller never takes a pause that stopped nothing as done — a detached resident signalled alone counts
|
|
16
|
+
// as nothing. A lane whose detached processes could not be read exits non-zero too, since a resume
|
|
17
|
+
// may have left one of them stopped. A lane whose child was signalled has the change written to its state record and to the
|
|
18
|
+
// run's event stream, so who halted it is on record, and to the lane ledger, so `lane:stats` leaves the
|
|
19
|
+
// stopped time out of the lane's implement sub-stages (joshuafolkken/kit#5168).
|
|
20
|
+
|
|
21
|
+
const ARGV_OFFSET = 2
|
|
22
|
+
const SUCCESS_EXIT_CODE = 0
|
|
23
|
+
const FAILURE_EXIT_CODE = 1
|
|
24
|
+
const ALL_FLAG = '--all'
|
|
25
|
+
const USAGE = [
|
|
26
|
+
'Usage: josh lane:pause <issue-number> | josh lane:pause --all',
|
|
27
|
+
' josh lane:resume <issue-number> | josh lane:resume --all',
|
|
28
|
+
].join('\n')
|
|
29
|
+
|
|
30
|
+
const VERBS = {
|
|
31
|
+
pause: { act: 'pause_lane', done: 'paused', state: 'paused' },
|
|
32
|
+
resume: { act: 'resume_lane', done: 'resumed', state: 'running' },
|
|
33
|
+
} as const
|
|
34
|
+
|
|
35
|
+
type Verb = keyof typeof VERBS
|
|
36
|
+
|
|
37
|
+
function is_verb(value: string | undefined): value is Verb {
|
|
38
|
+
return value === 'pause' || value === 'resume'
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async function lanes_of(target: ReadonlyArray<string>): Promise<Array<LaneProcesses> | undefined> {
|
|
42
|
+
const [issue, ...rest] = target
|
|
43
|
+
|
|
44
|
+
if (issue === undefined || rest.length > 0) return undefined
|
|
45
|
+
if (issue === ALL_FLAG) return await lane_pause.open_lanes()
|
|
46
|
+
if (!issue_number_shape.is_issue_number(issue)) return undefined
|
|
47
|
+
|
|
48
|
+
return [await lane_registry.lane_location(issue)]
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function outcome_of(verb: Verb, result: LaneSignalled): string {
|
|
52
|
+
const { done } = VERBS[verb]
|
|
53
|
+
const count = String(result.signalled.length)
|
|
54
|
+
|
|
55
|
+
if (result.signalled.length === 0) return `no child process running — nothing ${done}`
|
|
56
|
+
|
|
57
|
+
if (result.child.length === 0) {
|
|
58
|
+
return `no child process running — ${done} ${count} detached process(es), state unchanged`
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return `${done} ${count} process(es)`
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const UNREAD_NOTE =
|
|
65
|
+
' — could not read the detached processes (lsof or ps failed); any of them was missed'
|
|
66
|
+
|
|
67
|
+
// One line per lane: how many of its processes were signalled, and whether its residents went unread.
|
|
68
|
+
function report(verb: Verb, issue: string, result: LaneSignalled): void {
|
|
69
|
+
const note = result.is_unread ? UNREAD_NOTE : ''
|
|
70
|
+
|
|
71
|
+
console.info(`lane:${verb} ${issue_cite.plain(issue)}: ${outcome_of(verb, result)}${note}`)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async function record(verb: Verb, issue: string): Promise<void> {
|
|
75
|
+
const command = `lane:${verb}`
|
|
76
|
+
|
|
77
|
+
await lane_state.record_change({ issue, state: VERBS[verb].state, command })
|
|
78
|
+
await lane_ledger_write.record_lane_state({ issue: Number(issue), state: VERBS[verb].state })
|
|
79
|
+
await run_event_stream_emit.emit(
|
|
80
|
+
run_event_stream.EVENT_KIND.LANE_STATE,
|
|
81
|
+
`${issue_cite.plain(issue)} ${VERBS[verb].done} by ${command}`,
|
|
82
|
+
)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async function settle(verb: Verb, lane: LaneProcesses): Promise<LaneSignalled> {
|
|
86
|
+
const result = lane_pause[VERBS[verb].act](lane)
|
|
87
|
+
|
|
88
|
+
report(verb, lane.issue, result)
|
|
89
|
+
if (result.child.length > 0) await record(verb, lane.issue)
|
|
90
|
+
|
|
91
|
+
return result
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// A named lane with no child signalled fails; any lane whose residents went unread fails.
|
|
95
|
+
function is_failed(result: LaneSignalled, is_named: boolean): boolean {
|
|
96
|
+
return result.is_unread || (is_named && result.child.length === 0)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async function apply(
|
|
100
|
+
verb: Verb,
|
|
101
|
+
lanes: ReadonlyArray<LaneProcesses>,
|
|
102
|
+
is_named: boolean,
|
|
103
|
+
): Promise<number> {
|
|
104
|
+
const results = await Promise.all(lanes.map(async (lane) => await settle(verb, lane)))
|
|
105
|
+
|
|
106
|
+
return results.some((result) => is_failed(result, is_named))
|
|
107
|
+
? FAILURE_EXIT_CODE
|
|
108
|
+
: SUCCESS_EXIT_CODE
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function report_usage(): number {
|
|
112
|
+
console.error(USAGE)
|
|
113
|
+
|
|
114
|
+
return FAILURE_EXIT_CODE
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
118
|
+
const [verb, ...target] = argv
|
|
119
|
+
if (!is_verb(verb)) return report_usage()
|
|
120
|
+
const lanes = await lanes_of(target)
|
|
121
|
+
|
|
122
|
+
return lanes === undefined ? report_usage() : await apply(verb, lanes, target[0] !== ALL_FLAG)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
126
|
+
process.exitCode = await run(argv)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const lane_pause_cli = { run }
|
|
130
|
+
|
|
131
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
132
|
+
|
|
133
|
+
export { lane_pause_cli }
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { lane_reap, type LaneProcesses, type ReapProbes } from './lane-reap'
|
|
2
|
+
import { lane_registry } from './lane-registry'
|
|
3
|
+
import { lane_residents } from './lane-residents'
|
|
4
|
+
|
|
5
|
+
// Suspending a lane child in place, and letting it carry on from the same point.
|
|
6
|
+
//
|
|
7
|
+
// **Nothing but the processes is touched here.** The work tree, the branch and the issue stay as they
|
|
8
|
+
// are, so a paused lane is resumed rather than rebuilt — the one way to halt a lane that `lane:close`
|
|
9
|
+
// (which deletes it) and `lane:withdraw` (which takes its issue out of the run) are not. The command
|
|
10
|
+
// (`lane-pause-cli.ts`) records the change in the lane's state and on the run's event stream.
|
|
11
|
+
//
|
|
12
|
+
// **The tree is `lane_reap`'s** — the same match, the same descendants, the caller's own ancestry
|
|
13
|
+
// spared — so a pause and a reap never disagree on which processes are the lane's.
|
|
14
|
+
//
|
|
15
|
+
// **A pause reads the tree again until no new process turns up.** A parent signalled after it had
|
|
16
|
+
// already forked leaves a child that was not in the first read running; each round stops what the
|
|
17
|
+
// last one did not see, up to `PAUSE_ROUNDS`.
|
|
18
|
+
//
|
|
19
|
+
// **A process detached from the tree is stopped and continued with it** (joshuafolkken/kit#4300): the
|
|
20
|
+
// edit hook's `eslint_d`, a detached `ship`, found by its working directory or mark as `lane:close`
|
|
21
|
+
// finds it (`lane-residents.ts`), so a resume reaches every process the pause stopped. A pause with no
|
|
22
|
+
// child in the tree stops none of them: it pauses no lane and records nothing, so nothing would resume
|
|
23
|
+
// them. A read of them that failed is `is_unread`, never "none", so a caller can say they were missed.
|
|
24
|
+
|
|
25
|
+
const STOP_SIGNAL = 'SIGSTOP'
|
|
26
|
+
const CONTINUE_SIGNAL = 'SIGCONT'
|
|
27
|
+
const PAUSE_ROUNDS = 5
|
|
28
|
+
|
|
29
|
+
type LaneSignal = typeof STOP_SIGNAL | typeof CONTINUE_SIGNAL
|
|
30
|
+
|
|
31
|
+
interface PauseProbes extends ReapProbes {
|
|
32
|
+
signal: (pid: number, name: LaneSignal) => boolean
|
|
33
|
+
// What runs from the lane outside the tree (`lane-residents.ts`); `undefined` when unreadable.
|
|
34
|
+
residents: (lane: LaneProcesses) => ReadonlyArray<number> | undefined
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// What a pause or a resume reached: the lane's processes signalled, and those of them in the child's
|
|
38
|
+
// tree. Only `child` says the lane is running — a resident outlives the child it served (`eslint_d`
|
|
39
|
+
// idles on), so signalling it alone pauses no lane. `is_unread`: the residents could not be read, so
|
|
40
|
+
// any of them may have been missed.
|
|
41
|
+
interface LaneSignalled {
|
|
42
|
+
signalled: Array<number>
|
|
43
|
+
child: Array<number>
|
|
44
|
+
is_unread: boolean
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// One read of the lane: the child's tree, and the tree with what runs from the lane outside it.
|
|
48
|
+
interface LaneRead {
|
|
49
|
+
tree: Array<number>
|
|
50
|
+
all: Array<number>
|
|
51
|
+
is_unread: boolean
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function signal(pid: number, name: LaneSignal): boolean {
|
|
55
|
+
try {
|
|
56
|
+
process.kill(pid, name)
|
|
57
|
+
|
|
58
|
+
return true
|
|
59
|
+
} catch {
|
|
60
|
+
return false
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const SYSTEM_PROBES: PauseProbes = {
|
|
65
|
+
...lane_reap.SYSTEM_PROBES,
|
|
66
|
+
signal,
|
|
67
|
+
residents: (lane) => lane_residents.residents(lane),
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// The lane child's tree and what runs from the lane outside it, each once. The residents are read only
|
|
71
|
+
// beside a child, unless `is_resident_read_forced`.
|
|
72
|
+
function lane_processes(
|
|
73
|
+
lane: LaneProcesses,
|
|
74
|
+
probes: PauseProbes,
|
|
75
|
+
is_resident_read_forced: boolean,
|
|
76
|
+
): LaneRead {
|
|
77
|
+
const tree = lane_reap.lane_tree(lane.issue, probes)
|
|
78
|
+
if (!is_resident_read_forced && tree.length === 0) return { tree, all: tree, is_unread: false }
|
|
79
|
+
const residents = probes.residents(lane)
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
tree,
|
|
83
|
+
all: [...new Set([...tree, ...(residents ?? [])])],
|
|
84
|
+
is_unread: residents === undefined,
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function signalled_of(
|
|
89
|
+
signalled: Array<number>,
|
|
90
|
+
tree: ReadonlySet<number>,
|
|
91
|
+
is_unread: boolean,
|
|
92
|
+
): LaneSignalled {
|
|
93
|
+
return { signalled, child: signalled.filter((pid) => tree.has(pid)), is_unread }
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Every pid read is `seen`, so a process the signal could not reach is not retried each round; only the
|
|
97
|
+
// ones the signal reached are `stopped`. Every tree pid read is `tree`.
|
|
98
|
+
interface PauseProgress {
|
|
99
|
+
seen: Set<number>
|
|
100
|
+
tree: Set<number>
|
|
101
|
+
stopped: Array<number>
|
|
102
|
+
is_unread: boolean
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function stop_unseen(lane: LaneProcesses, progress: PauseProgress, probes: PauseProbes): number {
|
|
106
|
+
const read = lane_processes(lane, probes, progress.tree.size > 0)
|
|
107
|
+
const unseen = read.all.filter((pid) => !progress.seen.has(pid))
|
|
108
|
+
|
|
109
|
+
for (const pid of read.tree) progress.tree.add(pid)
|
|
110
|
+
progress.is_unread ||= read.is_unread
|
|
111
|
+
|
|
112
|
+
for (const pid of unseen) {
|
|
113
|
+
progress.seen.add(pid)
|
|
114
|
+
if (probes.signal(pid, STOP_SIGNAL)) progress.stopped.push(pid)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return unseen.length
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** SIGSTOP every process of the lane; returns the pids stopped. */
|
|
121
|
+
function pause_lane(lane: LaneProcesses, probes: PauseProbes = SYSTEM_PROBES): LaneSignalled {
|
|
122
|
+
const progress: PauseProgress = {
|
|
123
|
+
seen: new Set(),
|
|
124
|
+
tree: new Set(),
|
|
125
|
+
stopped: [],
|
|
126
|
+
is_unread: false,
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
for (let round = 0; round < PAUSE_ROUNDS; round += 1) {
|
|
130
|
+
if (stop_unseen(lane, progress, probes) === 0) break
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return signalled_of(progress.stopped, progress.tree, progress.is_unread)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** SIGCONT every process of the lane; returns the pids continued. */
|
|
137
|
+
function resume_lane(lane: LaneProcesses, probes: PauseProbes = SYSTEM_PROBES): LaneSignalled {
|
|
138
|
+
const read = lane_processes(lane, probes, true)
|
|
139
|
+
const continued = read.all.filter((pid) => probes.signal(pid, CONTINUE_SIGNAL))
|
|
140
|
+
|
|
141
|
+
return signalled_of(continued, new Set(read.tree), read.is_unread)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Only what a pause reads: a lane is matched by its issue and its directory, nothing else.
|
|
145
|
+
function processes_of(lane: LaneProcesses): LaneProcesses {
|
|
146
|
+
return { issue: lane.issue, directory: lane.directory }
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
async function open_lanes(): Promise<Array<LaneProcesses>> {
|
|
150
|
+
const lanes = await lane_registry.list_lanes()
|
|
151
|
+
|
|
152
|
+
return lanes.map((lane) => processes_of(lane))
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const lane_pause = { PAUSE_ROUNDS, open_lanes, pause_lane, resume_lane }
|
|
156
|
+
|
|
157
|
+
export { lane_pause }
|
|
158
|
+
export type { LaneSignal, LaneSignalled, PauseProbes }
|