@joshuafolkken/kit 1.1514.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,17 +1,33 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
2
|
+
import {
|
|
3
|
+
lane_ledger,
|
|
4
|
+
type GateCheckRecord,
|
|
5
|
+
type GateEntry,
|
|
6
|
+
type LedgerEntry,
|
|
7
|
+
type PushMissEntry,
|
|
8
|
+
} from './lane-ledger'
|
|
2
9
|
import { lane_stage_stats } from './lane-stage-stats'
|
|
3
10
|
import { lane_stats, type StatsWindow } from './lane-stats'
|
|
4
11
|
|
|
5
|
-
// Which check a gate waited on:
|
|
6
|
-
//
|
|
7
|
-
//
|
|
12
|
+
// Which check a gate waited on: one period's per-check rows reduced to one row per check — median,
|
|
13
|
+
// maximum, runs, reuses, no-ops and whole-suite fallbacks — printed by `josh lane:stats`.
|
|
14
|
+
//
|
|
15
|
+
// The whole gate is the first row, since its reuse started no check (joshuafolkken/kit#4397); the
|
|
16
|
+
// checks follow in the order they first appear.
|
|
8
17
|
//
|
|
9
18
|
// **A reused check is counted, never timed.** It started no process, so its zero would pull the median
|
|
10
|
-
// toward a check that never ran; a check with only reused rows prints `not measured`.
|
|
19
|
+
// toward a check that never ran; a check with only reused rows prints `not measured`. **The unit leg's
|
|
20
|
+
// since-green no-op is counted the same way** (joshuafolkken/kit#4457): it ran no test, so its second
|
|
21
|
+
// would stand for a run that tested nothing.
|
|
22
|
+
//
|
|
23
|
+
// **The fallbacks are broken down by why** in a second table, one row per reason kind, so a slow unit
|
|
24
|
+
// leg can be read as the full suite it ran and the reason it had to. A pre-push hook that ran a suite
|
|
25
|
+
// over a record it could not reuse joins it, prefixed `pre-push <scope>:`.
|
|
11
26
|
|
|
12
|
-
const MS_PER_SECOND = 1000
|
|
13
27
|
const DECIMALS = 1
|
|
14
|
-
const
|
|
28
|
+
const WHOLE_GATE_LABEL = 'gate (whole)'
|
|
29
|
+
const COLUMNS = ['check', 'median (s)', 'max (s)', 'runs', 'reused', 'no-op', 'fallback'] as const
|
|
30
|
+
const FALLBACK_COLUMNS = ['fallback reason', 'runs'] as const
|
|
15
31
|
|
|
16
32
|
function is_gate(entry: LedgerEntry): entry is GateEntry {
|
|
17
33
|
return entry.kind === lane_ledger.KIND.GATE
|
|
@@ -23,34 +39,80 @@ function cell(milliseconds: number | undefined): string {
|
|
|
23
39
|
: (milliseconds / MS_PER_SECOND).toFixed(DECIMALS)
|
|
24
40
|
}
|
|
25
41
|
|
|
42
|
+
function header(columns: ReadonlyArray<string>): Array<string> {
|
|
43
|
+
return [lane_stats.to_row(columns), lane_stats.to_row(columns.map(() => '---'))]
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function count(
|
|
47
|
+
runs: ReadonlyArray<GateCheckRecord>,
|
|
48
|
+
is_counted: (check: GateCheckRecord) => boolean,
|
|
49
|
+
): string {
|
|
50
|
+
return String(runs.filter((check) => is_counted(check)).length)
|
|
51
|
+
}
|
|
52
|
+
|
|
26
53
|
function check_row(label: string, checks: ReadonlyArray<GateCheckRecord>): string {
|
|
27
54
|
const runs = checks.filter((check) => check.label === label)
|
|
28
|
-
const timed = runs.filter((check) => check.is_reused !== true
|
|
55
|
+
const timed = runs.filter((check) => check.is_reused !== true && check.is_unmoved !== true)
|
|
56
|
+
const elapsed = timed.map((check) => check.elapsed_ms)
|
|
29
57
|
|
|
30
58
|
return lane_stats.to_row([
|
|
31
59
|
label,
|
|
32
|
-
cell(lane_stats.median(
|
|
33
|
-
cell(lane_stats.peak(
|
|
60
|
+
cell(lane_stats.median(elapsed)),
|
|
61
|
+
cell(lane_stats.peak(elapsed)),
|
|
34
62
|
String(runs.length),
|
|
35
|
-
|
|
63
|
+
count(runs, (check) => check.is_reused === true),
|
|
64
|
+
count(runs, (check) => check.is_unmoved === true),
|
|
65
|
+
count(runs, (check) => check.fallback !== undefined),
|
|
36
66
|
])
|
|
37
67
|
}
|
|
38
68
|
|
|
39
|
-
// The
|
|
69
|
+
// The whole gate read as one more check, so its reuse is counted the way a check's is.
|
|
70
|
+
function whole_gate(gate: GateEntry): GateCheckRecord {
|
|
71
|
+
return {
|
|
72
|
+
label: WHOLE_GATE_LABEL,
|
|
73
|
+
elapsed_ms: gate.elapsed_ms,
|
|
74
|
+
is_passed: gate.is_passed,
|
|
75
|
+
is_reused: gate.is_reused,
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function is_push_miss(entry: LedgerEntry): entry is PushMissEntry {
|
|
80
|
+
return entry.kind === lane_ledger.KIND.PUSH_MISS
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// A pre-push hook's miss, told apart from the gate's own fallbacks by its scope (joshuafolkken/kit#5234).
|
|
84
|
+
function push_reason(miss: PushMissEntry): string {
|
|
85
|
+
return `pre-push ${miss.scope}: ${miss.reason}`
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function fallback_table(
|
|
89
|
+
checks: ReadonlyArray<GateCheckRecord>,
|
|
90
|
+
misses: ReadonlyArray<PushMissEntry>,
|
|
91
|
+
): string {
|
|
92
|
+
const fallbacks = checks.map((check) => check.fallback).filter((reason) => reason !== undefined)
|
|
93
|
+
const reasons = [...fallbacks, ...misses.map((miss) => push_reason(miss))]
|
|
94
|
+
const kinds = [...new Set(reasons)]
|
|
95
|
+
const rows = kinds.map((kind) =>
|
|
96
|
+
lane_stats.to_row([kind, String(reasons.filter((reason) => reason === kind).length)]),
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
return [...header(FALLBACK_COLUMNS), ...rows].join('\n')
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// The period's tables: `entries` is the whole ledger, filtered here to `window`.
|
|
40
103
|
function table(entries: ReadonlyArray<LedgerEntry>, window: StatsWindow): string {
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const labels = [...new Set(
|
|
104
|
+
const windowed = lane_stats.in_window(entries, window)
|
|
105
|
+
const gates = windowed.filter(is_gate)
|
|
106
|
+
const checks = gates.flatMap((gate) => gate.checks ?? [])
|
|
107
|
+
const rows = [...gates.map((gate) => whole_gate(gate)), ...checks]
|
|
108
|
+
const labels = [...new Set(rows.map((row) => row.label))]
|
|
46
109
|
|
|
47
110
|
return [
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
].join('\n')
|
|
111
|
+
[...header(COLUMNS), ...labels.map((label) => check_row(label, rows))].join('\n'),
|
|
112
|
+
fallback_table(checks, windowed.filter(is_push_miss)),
|
|
113
|
+
].join('\n\n')
|
|
52
114
|
}
|
|
53
115
|
|
|
54
|
-
const lane_check_stats = { table }
|
|
116
|
+
const lane_check_stats = { WHOLE_GATE_LABEL, cell, header, table }
|
|
55
117
|
|
|
56
118
|
export { lane_check_stats }
|
|
@@ -47,6 +47,13 @@ function process_pattern(issue: string): string {
|
|
|
47
47
|
return `(${CHILD_INVOCATION}|${REVIEW_INVOCATION}|${SHIP_PROCESS} .*) ${issue_cite.plain(issue)}$`
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
// The `pgrep -f` pattern that finds the detached ship supervisor of `issue` alone.
|
|
51
|
+
function ship_pattern(issue: string): string {
|
|
52
|
+
issue_number_shape.require_issue_number(issue)
|
|
53
|
+
|
|
54
|
+
return `${SHIP_PROCESS} .* ${issue_cite.plain(issue)}$`
|
|
55
|
+
}
|
|
56
|
+
|
|
50
57
|
function review_invocation(issue: string): string {
|
|
51
58
|
issue_number_shape.require_issue_number(issue)
|
|
52
59
|
|
|
@@ -88,8 +95,8 @@ function outage_resume_invocation(issue: string): string {
|
|
|
88
95
|
// tail and the changed files (`run-ship-stop-context.ts`), so the session starts at the fix rather than
|
|
89
96
|
// at `josh ship --log` and `git diff` (joshuafolkken/kit#3923).
|
|
90
97
|
//
|
|
91
|
-
// The context gets what the rest of the prompt leaves of
|
|
92
|
-
//
|
|
98
|
+
// The context gets what the rest of the prompt leaves of `MAX_VALUE_LENGTH`, so the whole prompt
|
|
99
|
+
// stays within it and launches (joshuafolkken/kit#3964).
|
|
93
100
|
function known_stop_lines(
|
|
94
101
|
issue: string,
|
|
95
102
|
stop: ShipStop,
|
|
@@ -120,13 +127,21 @@ function ship_stop_invocation(issue: string, stop?: ShipStop): string {
|
|
|
120
127
|
return [opening, ...middle, closing].join(LINE_BREAK)
|
|
121
128
|
}
|
|
122
129
|
|
|
130
|
+
// The same stop for the session that launched the ship and still waits on it (`run-ship-waiter.ts`):
|
|
131
|
+
// the next command and the context alone, since that session has the run in front of it already.
|
|
132
|
+
function ship_stop_note(issue: string, stop: ShipStop): string {
|
|
133
|
+
return known_stop_lines(issue, stop, []).join(LINE_BREAK)
|
|
134
|
+
}
|
|
135
|
+
|
|
123
136
|
const lane_child_invocation = {
|
|
124
137
|
child_invocation,
|
|
125
138
|
outage_resume_invocation,
|
|
126
139
|
process_pattern,
|
|
127
140
|
resume_invocation,
|
|
128
141
|
review_invocation,
|
|
142
|
+
ship_pattern,
|
|
129
143
|
ship_stop_invocation,
|
|
144
|
+
ship_stop_note,
|
|
130
145
|
}
|
|
131
146
|
|
|
132
147
|
export type { ShipStop }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// The environment keys a launcher marks a lane child with, in a module of their own so the unit
|
|
2
|
+
// suite's vitest config reads them without widening its import graph (`whole-suite-files.ts`).
|
|
3
|
+
// `lane-child-marker.ts` documents each mark; a mark added there is added here, and the unit suite
|
|
4
|
+
// then blanks it with no list of its own (joshuafolkken/kit#5029).
|
|
5
|
+
|
|
6
|
+
const KEY = 'JOSH_LANE_CHILD'
|
|
7
|
+
const OVERRUN_KEY = 'JOSH_LANE_OVERRUN'
|
|
8
|
+
const MARK_KEYS: ReadonlyArray<string> = [KEY, OVERRUN_KEY]
|
|
9
|
+
|
|
10
|
+
const lane_child_mark_keys = { KEY, MARK_KEYS, OVERRUN_KEY }
|
|
11
|
+
|
|
12
|
+
export { lane_child_mark_keys }
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
2
|
+
import { lane_child_mark_keys } from './lane-child-mark-keys'
|
|
2
3
|
import { lane_paths } from './lane-paths'
|
|
3
4
|
|
|
4
5
|
// The mark a dispatched lane child carries, so the pre-gate cut and a resume are decided from the
|
|
@@ -17,7 +18,7 @@ import { lane_paths } from './lane-paths'
|
|
|
17
18
|
// equals the lane's own issue, so a leaked mark for another issue is read as absent. The name, the
|
|
18
19
|
// meaning and the lifetime are documented once in
|
|
19
20
|
// `.claude/skills/workflow-commands/pre-gate-cut.md`.
|
|
20
|
-
const KEY =
|
|
21
|
+
const { KEY, OVERRUN_KEY } = lane_child_mark_keys
|
|
21
22
|
|
|
22
23
|
// **A dispatched child also asks for the five-minute prompt-cache TTL**. A
|
|
23
24
|
// headless `claude -p` session on a subscription defaults to the one-hour TTL, whose writes bill at 2x
|
|
@@ -28,6 +29,11 @@ const KEY = 'JOSH_LANE_CHILD'
|
|
|
28
29
|
const CACHE_TTL_KEY = 'CLAUDE_CODE_PROMPT_CACHE_TTL'
|
|
29
30
|
const CACHE_TTL = '5m'
|
|
30
31
|
|
|
32
|
+
// **An overrun investigation also carries its own mark** (joshuafolkken/kit#4880): it runs as the
|
|
33
|
+
// lane's child, so `issue:file` reads this one to record its filings as the investigation's rather than
|
|
34
|
+
// the child's. The launcher sets it, so the record never rests on the model passing an argument.
|
|
35
|
+
const OVERRUN_VALUE = '1'
|
|
36
|
+
|
|
31
37
|
type MarkerSource = Readonly<Record<string, string | undefined>>
|
|
32
38
|
|
|
33
39
|
// The environment fragment that marks a child dispatched for `#<issue>`. Composed from a digits-only
|
|
@@ -50,6 +56,16 @@ function marked_issue(source: MarkerSource = process.env): string | undefined {
|
|
|
50
56
|
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(value) ? value : undefined
|
|
51
57
|
}
|
|
52
58
|
|
|
59
|
+
// The environment of the overrun investigation of `#<issue>`'s lane: the child's, plus its own mark.
|
|
60
|
+
function overrun_environment_for(issue: string): Record<string, string> {
|
|
61
|
+
return { ...environment_for(issue), [OVERRUN_KEY]: OVERRUN_VALUE }
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Read only beside a valid child mark, so a mark leaked without one is read as absent.
|
|
65
|
+
function is_overrun(source: MarkerSource = process.env): boolean {
|
|
66
|
+
return source[OVERRUN_KEY] === OVERRUN_VALUE && marked_issue(source) !== undefined
|
|
67
|
+
}
|
|
68
|
+
|
|
53
69
|
// True when this session is a dispatched lane child for the checkout it is running in: the mark is
|
|
54
70
|
// present and names this lane's own issue, read from the checkout path. A numeric mark naming a
|
|
55
71
|
// *different* issue leaked in from a parent session into a checkout it does not belong to, so it is
|
|
@@ -63,8 +79,11 @@ function is_child_of(directory: string, source: MarkerSource = process.env): boo
|
|
|
63
79
|
|
|
64
80
|
const lane_child_marker = {
|
|
65
81
|
KEY,
|
|
82
|
+
OVERRUN_KEY,
|
|
66
83
|
env_for: environment_for,
|
|
84
|
+
overrun_env_for: overrun_environment_for,
|
|
67
85
|
is_child_of,
|
|
86
|
+
is_overrun,
|
|
68
87
|
marked_issue,
|
|
69
88
|
}
|
|
70
89
|
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { lane_check_stats } from './lane-check-stats'
|
|
2
|
+
import { lane_ledger, type LedgerEntry, type StageEntry } from './lane-ledger'
|
|
3
|
+
import { lane_ledger_write } from './lane-ledger-write'
|
|
4
|
+
import { lane_stats, type StatsWindow } from './lane-stats'
|
|
5
|
+
|
|
6
|
+
// The followup's critical path (joshuafolkken/kit#5295): over the period's `ci-wait` rows, which check
|
|
7
|
+
// settled last — how often, and the median and maximum of when it settled into the wait — printed by
|
|
8
|
+
// `josh lane:stats`. A row from before the field, or a wait no check was seen to settle in, names none
|
|
9
|
+
// and is left out.
|
|
10
|
+
|
|
11
|
+
const COLUMNS = ['followup critical path', 'runs', 'median (s)', 'max (s)'] as const
|
|
12
|
+
|
|
13
|
+
interface LastCheck {
|
|
14
|
+
name: string
|
|
15
|
+
elapsed_ms: number
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function settled({ last_check, check_ms }: StageEntry): LastCheck | undefined {
|
|
19
|
+
if (last_check === undefined) return undefined
|
|
20
|
+
|
|
21
|
+
const elapsed_ms = check_ms?.[last_check]
|
|
22
|
+
|
|
23
|
+
return elapsed_ms === undefined ? undefined : { name: last_check, elapsed_ms }
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function last_check_of(entry: LedgerEntry): LastCheck | undefined {
|
|
27
|
+
if (entry.kind !== lane_ledger.KIND.STAGE || entry.stage !== lane_ledger_write.CI_WAIT_STAGE) {
|
|
28
|
+
return undefined
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return settled(entry)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function name_row(name: string, lasts: ReadonlyArray<LastCheck>): string {
|
|
35
|
+
const elapsed = lasts.filter((last) => last.name === name).map((last) => last.elapsed_ms)
|
|
36
|
+
|
|
37
|
+
return lane_stats.to_row([
|
|
38
|
+
name,
|
|
39
|
+
String(elapsed.length),
|
|
40
|
+
lane_check_stats.cell(lane_stats.median(elapsed)),
|
|
41
|
+
lane_check_stats.cell(lane_stats.peak(elapsed)),
|
|
42
|
+
])
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// The period's table: `entries` is the whole ledger, filtered here to `window`.
|
|
46
|
+
function table(entries: ReadonlyArray<LedgerEntry>, window: StatsWindow): string {
|
|
47
|
+
const lasts = lane_stats
|
|
48
|
+
.in_window(entries, window)
|
|
49
|
+
.map((entry) => last_check_of(entry))
|
|
50
|
+
.filter((last) => last !== undefined)
|
|
51
|
+
const names = [...new Set(lasts.map((last) => last.name))]
|
|
52
|
+
|
|
53
|
+
return [...lane_check_stats.header(COLUMNS), ...names.map((name) => name_row(name, lasts))].join(
|
|
54
|
+
'\n',
|
|
55
|
+
)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// `issue`'s followup line detail for `lane:breakdown`: the last check its latest `ci-wait` row names,
|
|
59
|
+
// `''` where none does.
|
|
60
|
+
function last_check_text(entries: ReadonlyArray<LedgerEntry>, issue: number): string {
|
|
61
|
+
const last = entries
|
|
62
|
+
.filter((entry) => entry.kind === lane_ledger.KIND.STAGE && entry.issue === issue)
|
|
63
|
+
.map((entry) => last_check_of(entry))
|
|
64
|
+
.findLast((found) => found !== undefined)
|
|
65
|
+
|
|
66
|
+
return last === undefined
|
|
67
|
+
? ''
|
|
68
|
+
: ` (last check: ${last.name} ${lane_check_stats.cell(last.elapsed_ms)}s)`
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const lane_ci_path_stats = { last_check_text, table }
|
|
72
|
+
|
|
73
|
+
export { lane_ci_path_stats }
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
2
|
+
import { lane_ledger, type GateCheckRecord, type GateEntry, type LedgerEntry } from './lane-ledger'
|
|
3
|
+
import { lane_stage_stats } from './lane-stage-stats'
|
|
4
|
+
import { lane_stats, type StatsWindow } from './lane-stats'
|
|
5
|
+
import { lane_tail_stats } from './lane-tail-stats'
|
|
6
|
+
|
|
7
|
+
// What each gate check claimed from the core budget against what it used (joshuafolkken/kit#5138): one
|
|
8
|
+
// period's per-check rows reduced to one row per check — the median cores requested, then the cores it
|
|
9
|
+
// kept busy (`cpu_ms ÷ elapsed_ms`) as a median, a 90th percentile and a maximum, and the seconds its
|
|
10
|
+
// claims waited. The weights in `scripts/gate/core-weights.ts` are changed from this table, never by it.
|
|
11
|
+
//
|
|
12
|
+
// **Only a measured run is counted**: a reused check started no process, and a check with no `cpu_ms`
|
|
13
|
+
// was recorded before the field existed, so neither says how many cores the check used.
|
|
14
|
+
|
|
15
|
+
const DECIMALS = 1
|
|
16
|
+
const COLUMNS = [
|
|
17
|
+
'check',
|
|
18
|
+
'claim',
|
|
19
|
+
'runs',
|
|
20
|
+
'cores median',
|
|
21
|
+
'cores p90',
|
|
22
|
+
'cores max',
|
|
23
|
+
'wait (s)',
|
|
24
|
+
] as const
|
|
25
|
+
const { NOT_MEASURED } = lane_stage_stats
|
|
26
|
+
|
|
27
|
+
interface MeasuredCheck {
|
|
28
|
+
label: string
|
|
29
|
+
elapsed_ms: number
|
|
30
|
+
cpu_ms: number
|
|
31
|
+
claim?: GateCheckRecord['claim']
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function is_gate(entry: LedgerEntry): entry is GateEntry {
|
|
35
|
+
return entry.kind === lane_ledger.KIND.GATE
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function is_measured(check: GateCheckRecord): check is GateCheckRecord & MeasuredCheck {
|
|
39
|
+
return check.is_reused !== true && check.cpu_ms !== undefined && check.elapsed_ms > 0
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function number_cell(value: number | undefined): string {
|
|
43
|
+
return value === undefined ? NOT_MEASURED : value.toFixed(DECIMALS)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function seconds_cell(milliseconds: number | undefined): string {
|
|
47
|
+
return number_cell(milliseconds === undefined ? undefined : milliseconds / MS_PER_SECOND)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function total(values: ReadonlyArray<number>): number {
|
|
51
|
+
return values.reduce((sum, value) => sum + value, 0)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function check_row(label: string, checks: ReadonlyArray<MeasuredCheck>): string {
|
|
55
|
+
const runs = checks.filter((check) => check.label === label)
|
|
56
|
+
const cores = runs.map((check) => check.cpu_ms / check.elapsed_ms)
|
|
57
|
+
const claims = runs.map((check) => check.claim).filter((claim) => claim !== undefined)
|
|
58
|
+
const requested = claims.map((claim) => claim.requested)
|
|
59
|
+
const waited_ms = claims.length === 0 ? undefined : total(claims.map((claim) => claim.waited_ms))
|
|
60
|
+
|
|
61
|
+
return lane_stats.to_row([
|
|
62
|
+
label,
|
|
63
|
+
number_cell(lane_stats.median(requested)),
|
|
64
|
+
String(runs.length),
|
|
65
|
+
number_cell(lane_stats.median(cores)),
|
|
66
|
+
number_cell(lane_tail_stats.tail_minutes(cores)),
|
|
67
|
+
number_cell(lane_stats.peak(cores)),
|
|
68
|
+
seconds_cell(waited_ms),
|
|
69
|
+
])
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// The period's table: `entries` is the whole ledger, filtered here to `window`.
|
|
73
|
+
function table(entries: ReadonlyArray<LedgerEntry>, window: StatsWindow): string {
|
|
74
|
+
const gates = lane_stats.in_window(entries, window).filter(is_gate)
|
|
75
|
+
const checks = gates.flatMap((gate) => gate.checks ?? []).filter(is_measured)
|
|
76
|
+
const labels = [...new Set(checks.map((check) => check.label))]
|
|
77
|
+
const header = [lane_stats.to_row(COLUMNS), lane_stats.to_row(COLUMNS.map(() => '---'))]
|
|
78
|
+
|
|
79
|
+
return [...header, ...labels.map((label) => check_row(label, checks))].join('\n')
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const lane_claim_stats = { table }
|
|
83
|
+
|
|
84
|
+
export { lane_claim_stats }
|
package/scripts/lane/lane-cli.ts
CHANGED
|
@@ -17,6 +17,7 @@ import { lane_open, type OpenOutcome } from './lane-open'
|
|
|
17
17
|
import { lane_output, type ReadOutcome, type RecordOutcome } from './lane-output'
|
|
18
18
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
19
19
|
import { lane_report } from './lane-report'
|
|
20
|
+
import { lane_residents } from './lane-residents'
|
|
20
21
|
import { lane_seed_policy } from './lane-seed'
|
|
21
22
|
import type { KeptLane } from './lane-spent'
|
|
22
23
|
import { lane_stray } from './lane-stray'
|
|
@@ -111,16 +112,25 @@ function report_issues(issues: ReadonlyArray<string>): number {
|
|
|
111
112
|
return SUCCESS_EXIT_CODE
|
|
112
113
|
}
|
|
113
114
|
|
|
114
|
-
//
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
// What the close terminated: the lane child that had not ended, and what else ran from the checkout.
|
|
116
|
+
function report_terminated(outcome: CloseOutcome): void {
|
|
117
|
+
const cited = session_cite.issue(outcome.issue)
|
|
118
|
+
|
|
118
119
|
if (outcome.reaped.length > 0) {
|
|
119
120
|
console.error(
|
|
120
|
-
`Terminated the lane child for ${
|
|
121
|
+
`Terminated the lane child for ${cited} that had not ended by itself: process ${outcome.reaped.join(', ')}.`,
|
|
121
122
|
)
|
|
122
123
|
}
|
|
123
124
|
|
|
125
|
+
lane_residents.report(outcome.residents, cited)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// A close that left something behind exits non-zero and names it. Reported as a success, it would
|
|
129
|
+
// send the caller to the next `lane:open`, which then fails on git's own message about a branch that
|
|
130
|
+
// still exists.
|
|
131
|
+
function report_close(outcome: CloseOutcome): number {
|
|
132
|
+
report_terminated(outcome)
|
|
133
|
+
|
|
124
134
|
if (outcome.kind !== 'incomplete') {
|
|
125
135
|
return report_issues(outcome.kind === 'closed' ? [outcome.issue] : [])
|
|
126
136
|
}
|
|
@@ -3,9 +3,13 @@ import { git_command } from '#scripts/git/git-command'
|
|
|
3
3
|
import { git_worktree } from '#scripts/git/git-worktree'
|
|
4
4
|
import { error_text } from '#scripts/lib/error-message'
|
|
5
5
|
import { lane_paths } from './lane-paths'
|
|
6
|
+
import { lane_plan } from './lane-plan'
|
|
6
7
|
import { lane_reap } from './lane-reap'
|
|
8
|
+
import { lane_reap_settle } from './lane-reap-settle'
|
|
7
9
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
10
|
+
import { lane_residents } from './lane-residents'
|
|
8
11
|
import { lane_spent, type KeptLane } from './lane-spent'
|
|
12
|
+
import { lane_state } from './lane-state'
|
|
9
13
|
|
|
10
14
|
// Closing a lane: no work tree, no branch, no directory.
|
|
11
15
|
//
|
|
@@ -13,7 +17,8 @@ import { lane_spent, type KeptLane } from './lane-spent'
|
|
|
13
17
|
// every step here is written to run over a subject that is already gone or that still holds
|
|
14
18
|
// uncommitted work. A close that refused either would leave exactly the debris it exists to remove,
|
|
15
19
|
// and the next lane for that issue would then fail on a directory nobody could account for. There
|
|
16
|
-
// is no ledger entry to remove: the lane's seat lived in the `.env` that goes with the work tree.
|
|
20
|
+
// is no ledger entry to remove: the lane's seat lived in the `.env` that goes with the work tree. The
|
|
21
|
+
// lane's state record outlives it, marked `ended`, so its last state stays readable.
|
|
17
22
|
|
|
18
23
|
interface LaneTargets {
|
|
19
24
|
directory: string
|
|
@@ -36,6 +41,9 @@ interface CloseOutcome {
|
|
|
36
41
|
left_behind: Array<string>
|
|
37
42
|
// The lane child's processes this close terminated — empty for a child that ended by itself.
|
|
38
43
|
reaped: Array<number>
|
|
44
|
+
// What else still ran from the lane's checkout or carried its mark and this close terminated
|
|
45
|
+
// (`lane-residents.ts`); `undefined` where the processes could not be read.
|
|
46
|
+
residents: Array<number> | undefined
|
|
39
47
|
}
|
|
40
48
|
|
|
41
49
|
interface SweepOutcome {
|
|
@@ -112,39 +120,76 @@ function close_kind(did_exist: boolean, left_behind: ReadonlyArray<string>): Clo
|
|
|
112
120
|
return did_exist ? 'closed' : 'none'
|
|
113
121
|
}
|
|
114
122
|
|
|
115
|
-
// The
|
|
116
|
-
//
|
|
117
|
-
// Derived here from the current work tree, a close run inside a lane
|
|
118
|
-
// reports `none` over a directory that is still on disk.
|
|
119
|
-
async function lane_root_directory(): Promise<string> {
|
|
120
|
-
return lane_paths.lane_root(await lane_registry.main_repository_root())
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
+
// The lane root is the main work tree's (`lane_root_directory`), so the fallback directory an
|
|
124
|
+
// unregistered lane is closed by is the one `lane:open` would have created.
|
|
123
125
|
/**
|
|
124
126
|
* Close the lane for `issue`. `none` means there was nothing there, which is not a failure: a caller
|
|
125
127
|
* cleaning up after an interruption cannot know whether the lane was ever opened. `incomplete` means
|
|
126
128
|
* something survived the removal, and `left_behind` names it.
|
|
127
129
|
*/
|
|
128
130
|
async function resolve_lane(issue: string): Promise<ResolvedLane> {
|
|
129
|
-
const root = await lane_root_directory()
|
|
131
|
+
const root = await lane_registry.lane_root_directory()
|
|
130
132
|
const existing = lane_registry.find_lane(await lane_registry.list_lanes(), issue)
|
|
131
133
|
|
|
132
134
|
return { existing, targets: lane_targets(root, issue, existing) }
|
|
133
135
|
}
|
|
134
136
|
|
|
137
|
+
// A lane closed before is `none` on a retry, and ends there once its record says it is not over —
|
|
138
|
+
// an issue never opened is not given a record.
|
|
139
|
+
async function is_ending(issue: string, kind: CloseKind): Promise<boolean> {
|
|
140
|
+
if (kind !== 'none') return kind === 'closed'
|
|
141
|
+
|
|
142
|
+
const record = await lane_state.read_state(issue)
|
|
143
|
+
|
|
144
|
+
return record !== undefined && record.state !== 'ended'
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// The lane's processes, settled after the removal so the processes have had the work tree's deletion
|
|
148
|
+
// to exit in too; what outlived the SIGKILL replaces what the lane's record noted for `run:board`.
|
|
149
|
+
async function survivors_of(issue: string, directory: string): Promise<Array<string>> {
|
|
150
|
+
const survivors = await lane_reap_settle.settle({ issue, directory })
|
|
151
|
+
|
|
152
|
+
if (survivors !== undefined) await lane_state.record_stuck(issue, survivors)
|
|
153
|
+
|
|
154
|
+
return lane_reap_settle.survivor_texts(survivors)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Whatever the removal left: the checkout's residue, then the processes that outlived it.
|
|
158
|
+
async function left_behind_of(issue: string, targets: LaneTargets): Promise<Array<string>> {
|
|
159
|
+
const survivors = await survivors_of(issue, targets.directory)
|
|
160
|
+
|
|
161
|
+
return [...(await residue(targets)), ...survivors]
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// An ended lane's cleared plan goes with it; a plan its lane yielded on stays (`lane_plan.release`).
|
|
165
|
+
async function record_end(issue: string): Promise<void> {
|
|
166
|
+
await lane_state.record_change({ issue, state: 'ended', command: 'lane:close' })
|
|
167
|
+
lane_plan.release(Number(issue), process.cwd())
|
|
168
|
+
}
|
|
169
|
+
|
|
135
170
|
async function close_lane(issue: string): Promise<CloseOutcome> {
|
|
136
171
|
const { existing, targets } = await resolve_lane(issue)
|
|
137
172
|
const did_exist = existing !== undefined || existsSync(targets.directory)
|
|
138
173
|
// Before the removal, not after: a child still running in the tree would keep writing into a
|
|
139
174
|
// directory being deleted, and a process outliving its lane is a half-discarded state — the work
|
|
140
|
-
// tree gone, the child still answering `alive`.
|
|
141
|
-
const reaped = lane_reap.reap_child(issue)
|
|
175
|
+
// tree gone, the child still answering `alive`. What else still runs from the checkout goes too.
|
|
176
|
+
const reaped = lane_reap.reap_child({ issue, directory: targets.directory })
|
|
177
|
+
const residents = lane_residents.end_residents({ issue, directory: targets.directory }, reaped)
|
|
142
178
|
|
|
143
179
|
await remove_lane(targets)
|
|
144
180
|
|
|
145
|
-
const left_behind = await
|
|
181
|
+
const left_behind = await left_behind_of(issue, targets)
|
|
182
|
+
const kind = close_kind(did_exist, left_behind)
|
|
183
|
+
|
|
184
|
+
if (await is_ending(issue, kind)) await record_end(issue)
|
|
146
185
|
|
|
147
|
-
return { issue, kind
|
|
186
|
+
return { issue, kind, left_behind, reaped, residents }
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
type DuePredicate = (issue: string) => Promise<boolean>
|
|
190
|
+
|
|
191
|
+
async function always_due(): Promise<boolean> {
|
|
192
|
+
return true
|
|
148
193
|
}
|
|
149
194
|
|
|
150
195
|
// A lane that could not be closed is recorded rather than thrown: a sweep has to attempt every lane,
|
|
@@ -163,14 +208,24 @@ async function try_close(issue: string): Promise<boolean> {
|
|
|
163
208
|
|
|
164
209
|
// Sequential on purpose: two `git worktree` writes at once contend for the same registration
|
|
165
210
|
// directory, and the whole point of the command is that nothing is left half-removed.
|
|
166
|
-
async function
|
|
211
|
+
async function close_into(sweep: SweepOutcome, issue: string, is_due: DuePredicate): Promise<void> {
|
|
212
|
+
if (!(await is_due(issue))) return
|
|
213
|
+
const bucket = (await try_close(issue)) ? sweep.closed : sweep.failed
|
|
214
|
+
|
|
215
|
+
bucket.push(issue)
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// `is_due` is asked right before each close, not for every issue up front: a close can wait out the
|
|
219
|
+
// grace window, and a lane opened again meanwhile is no longer one to close.
|
|
220
|
+
async function close_each(
|
|
221
|
+
issues: ReadonlyArray<string>,
|
|
222
|
+
is_due: DuePredicate = always_due,
|
|
223
|
+
): Promise<SweepOutcome> {
|
|
167
224
|
const sweep: SweepOutcome = { closed: [], failed: [] }
|
|
168
225
|
|
|
169
226
|
for (const issue of issues) {
|
|
170
227
|
// eslint-disable-next-line no-await-in-loop -- worktree writes contend for the same registration directory
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
bucket.push(issue)
|
|
228
|
+
await close_into(sweep, issue, is_due)
|
|
174
229
|
}
|
|
175
230
|
|
|
176
231
|
return sweep
|
|
@@ -196,11 +251,29 @@ async function close_all_lanes(): Promise<SweepOutcome> {
|
|
|
196
251
|
return await close_each(lanes.map((lane) => lane.issue))
|
|
197
252
|
}
|
|
198
253
|
|
|
254
|
+
async function is_unfinished(issue: string): Promise<boolean> {
|
|
255
|
+
const { targets } = await resolve_lane(issue)
|
|
256
|
+
|
|
257
|
+
return !existsSync(targets.directory)
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Close again every lane whose work tree is gone but whose record is not `ended` — a close a process
|
|
262
|
+
* outlived. The supervisor runs it each pass, so a lane ends once its last process does.
|
|
263
|
+
*/
|
|
264
|
+
async function retry_closes(): Promise<SweepOutcome> {
|
|
265
|
+
const records = await lane_state.read_records()
|
|
266
|
+
const issues = records.filter((record) => record.state !== 'ended').map(({ issue }) => issue)
|
|
267
|
+
|
|
268
|
+
return await close_each(issues, is_unfinished)
|
|
269
|
+
}
|
|
270
|
+
|
|
199
271
|
const lane_close = {
|
|
200
272
|
close_all_lanes,
|
|
201
273
|
close_lane,
|
|
202
274
|
prune_lanes,
|
|
203
275
|
resolve_lane,
|
|
276
|
+
retry_closes,
|
|
204
277
|
}
|
|
205
278
|
|
|
206
279
|
export type { CloseKind, CloseOutcome, PruneOutcome, ResolvedLane, SweepOutcome }
|