@joshuafolkken/kit 1.1514.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { cost_transcript } from '#scripts/cost-runtime/cost-transcript'
|
|
3
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
4
|
+
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
5
|
+
import { lane_stage_stats } from './lane-stage-stats'
|
|
6
|
+
import { lane_stats, type StatsWindow } from './lane-stats'
|
|
7
|
+
import { lane_transcript_calls, type ToolCall } from './lane-transcript-calls'
|
|
8
|
+
|
|
9
|
+
// The lane speed metrics only the lane sessions' transcripts hold, printed by `josh lane:stats` under the
|
|
10
|
+
// ledger's tables so a speed check needs no ad-hoc aggregation (joshuafolkken/kit#4418): tool time per
|
|
11
|
+
// session, the verification calls and the share that waited for the core budget, and the medians of
|
|
12
|
+
// `lint:related` / `test:related`.
|
|
13
|
+
//
|
|
14
|
+
// **A chained call is counted apart from a solo one.** One Bash call that runs two verification
|
|
15
|
+
// commands (`josh lint:related && josh test:related`) has one duration for both, so it would read as
|
|
16
|
+
// either command's time; the per-command medians take solo calls only. **Only a foreground call is
|
|
17
|
+
// timed** — `lane_transcript_calls` leaves a backgrounded one's duration out.
|
|
18
|
+
//
|
|
19
|
+
// **The period is cut at each call's own timestamp**, not a transcript's modification time, so a
|
|
20
|
+
// fractional `--period` (since a merge) counts the same calls whichever session they sit in.
|
|
21
|
+
|
|
22
|
+
const TIMED_COMMANDS: ReadonlyArray<string> = ['lint:related', 'test:related']
|
|
23
|
+
// **The verification calls split by what ran them** (joshuafolkken/kit#4442): the scoped checks of the
|
|
24
|
+
// implementation loop, a whole `gate` or `metrics` run by hand before the ship, and the `ship` call —
|
|
25
|
+
// whose own gate runs inside it and is the ledger's to count — so a hand-run gate is never hidden in the
|
|
26
|
+
// loop's volume. A call naming two classes counts in each.
|
|
27
|
+
const CALL_CLASSES: ReadonlyArray<readonly [string, ReadonlySet<string>]> = [
|
|
28
|
+
['verification calls, scoped checks', new Set([...TIMED_COMMANDS, 'cspell:dot'])],
|
|
29
|
+
['verification calls, gate / metrics by hand', new Set(['gate', 'metrics'])],
|
|
30
|
+
['verification calls, ship', new Set(['ship'])],
|
|
31
|
+
]
|
|
32
|
+
const VERIFICATION_COMMANDS: ReadonlySet<string> = new Set(
|
|
33
|
+
CALL_CLASSES.flatMap(([, names]) => [...names]),
|
|
34
|
+
)
|
|
35
|
+
// A command is `josh <name>` at the start of a shell command — after a separator and the shell
|
|
36
|
+
// keywords, then past what `time_shell` skips (env assignments, wrappers with their flags and operands,
|
|
37
|
+
// a `pnpm` / `npx` runner) — so `josh lint:related; josh test:related`, `out=$(pnpm josh gate)` and
|
|
38
|
+
// `CI=1 timeout 600 pnpm josh gate` name their commands. A heredoc body or a quoted string only
|
|
39
|
+
// mentions a command, so `time_shell.unquoted` cuts both, keeping a `"$(…)"` that runs
|
|
40
|
+
// (joshuafolkken/kit#4525).
|
|
41
|
+
const SEPARATOR_PATTERN = /[;&|()\n]/u
|
|
42
|
+
const WORD_PATTERN = /\s+/u
|
|
43
|
+
const KEYWORDS: ReadonlySet<string> = new Set([
|
|
44
|
+
'if',
|
|
45
|
+
'elif',
|
|
46
|
+
'else',
|
|
47
|
+
'then',
|
|
48
|
+
'while',
|
|
49
|
+
'until',
|
|
50
|
+
'do',
|
|
51
|
+
'!',
|
|
52
|
+
'{',
|
|
53
|
+
])
|
|
54
|
+
// `scripts/gate/core-wait.ts` writes this into every wait line it prints.
|
|
55
|
+
const CORE_WAIT_PHRASE = 'waits for the core budget'
|
|
56
|
+
const PERCENT = 100
|
|
57
|
+
const COLUMNS = ['transcript metric', 'value'] as const
|
|
58
|
+
const { NOT_MEASURED } = lane_stage_stats
|
|
59
|
+
|
|
60
|
+
// The josh command `segment` runs, or `''` when it runs none.
|
|
61
|
+
function segment_command(segment: string): string {
|
|
62
|
+
const words = segment.trim().split(WORD_PATTERN)
|
|
63
|
+
const start = words.findIndex((word) => !KEYWORDS.has(word))
|
|
64
|
+
const named = time_shell.josh_command_of_segment(words.slice(start).join(' '))
|
|
65
|
+
|
|
66
|
+
return named.slice(time_shell.JOSH_PREFIX.length)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Every josh command a shell `command` runs, in order.
|
|
70
|
+
function josh_commands(command = ''): Array<string> {
|
|
71
|
+
const spoken = time_shell.unquoted(command)
|
|
72
|
+
const named = spoken.split(SEPARATOR_PATTERN).map((segment) => segment_command(segment))
|
|
73
|
+
|
|
74
|
+
return named.filter((name) => name !== '')
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function verification_commands(command = ''): Array<string> {
|
|
78
|
+
return josh_commands(command).filter((name) => VERIFICATION_COMMANDS.has(name))
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function seconds_cell(ms: number | undefined): string {
|
|
82
|
+
return ms === undefined ? NOT_MEASURED : (ms / MS_PER_SECOND).toFixed(1)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function is_timed(ms: number | undefined): ms is number {
|
|
86
|
+
return ms !== undefined
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function durations(calls: ReadonlyArray<ToolCall>): Array<number> {
|
|
90
|
+
return calls.map((call) => call.duration_ms).filter((ms) => is_timed(ms))
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// The lane sessions that made a call among `calls`, each once.
|
|
94
|
+
function sessions_of(calls: ReadonlyArray<ToolCall>): Array<string> {
|
|
95
|
+
return [...new Set(calls.map((call) => call.session_id))]
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Each session's summed foreground tool time, for the sessions that made a call in the period.
|
|
99
|
+
function session_times(calls: ReadonlyArray<ToolCall>): Array<number> {
|
|
100
|
+
return sessions_of(calls).map((session) =>
|
|
101
|
+
durations(calls.filter((call) => call.session_id === session)).reduce(
|
|
102
|
+
(sum, value) => sum + value,
|
|
103
|
+
0,
|
|
104
|
+
),
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function share_cell(part: number, whole: number): string {
|
|
109
|
+
if (whole === 0) return NOT_MEASURED
|
|
110
|
+
|
|
111
|
+
return `${String(part)} of ${String(whole)} (${((part / whole) * PERCENT).toFixed(1)}%)`
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// The calls that ran the verification command `name` and no other, so each one's time is its own.
|
|
115
|
+
function solo_calls(calls: ReadonlyArray<ToolCall>, name: string): Array<ToolCall> {
|
|
116
|
+
return calls.filter((call) => {
|
|
117
|
+
const named = verification_commands(call.command)
|
|
118
|
+
|
|
119
|
+
return named.length === 1 && named[0] === name
|
|
120
|
+
})
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function solo_median_row(verifying: ReadonlyArray<ToolCall>, name: string): Array<string> {
|
|
124
|
+
const solo = solo_calls(verifying, name)
|
|
125
|
+
|
|
126
|
+
return [`${name} median, solo (s)`, seconds_cell(lane_stats.median(durations(solo)))]
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function class_rows(verifying: ReadonlyArray<ToolCall>): Array<Array<string>> {
|
|
130
|
+
return CALL_CLASSES.map(([metric, names]) => {
|
|
131
|
+
const named = verifying.filter((call) =>
|
|
132
|
+
verification_commands(call.command).some((name) => names.has(name)),
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
return [metric, String(named.length)]
|
|
136
|
+
})
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function rows_of(calls: ReadonlyArray<ToolCall>): Array<Array<string>> {
|
|
140
|
+
const times = session_times(calls)
|
|
141
|
+
const verifying = calls.filter((call) => verification_commands(call.command).length > 0)
|
|
142
|
+
const chained = verifying.filter((call) => verification_commands(call.command).length > 1)
|
|
143
|
+
const waited = verifying.filter((call) => call.output.includes(CORE_WAIT_PHRASE))
|
|
144
|
+
|
|
145
|
+
return [
|
|
146
|
+
['lane sessions', String(times.length)],
|
|
147
|
+
['tool time per session, median (min)', lane_stage_stats.cell(lane_stats.median(times))],
|
|
148
|
+
['tool time per session, mean (min)', lane_stage_stats.cell(lane_stats.mean(times))],
|
|
149
|
+
['verification calls, solo', String(verifying.length - chained.length)],
|
|
150
|
+
['verification calls, chained', String(chained.length)],
|
|
151
|
+
...class_rows(verifying),
|
|
152
|
+
['waited for the core budget', share_cell(waited.length, verifying.length)],
|
|
153
|
+
...TIMED_COMMANDS.map((name) => solo_median_row(verifying, name)),
|
|
154
|
+
]
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function in_period(calls: ReadonlyArray<ToolCall>, window: StatsWindow): Array<ToolCall> {
|
|
158
|
+
return calls.filter(
|
|
159
|
+
(call) => call.started_ms >= window.since_ms && call.started_ms <= window.until_ms,
|
|
160
|
+
)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// The period's table: `calls` is every lane session's calls, filtered here to `window`.
|
|
164
|
+
function table(calls: ReadonlyArray<ToolCall>, window: StatsWindow): string {
|
|
165
|
+
const period = in_period(calls, window)
|
|
166
|
+
|
|
167
|
+
return [
|
|
168
|
+
lane_stats.to_row(COLUMNS),
|
|
169
|
+
lane_stats.to_row(COLUMNS.map(() => '---')),
|
|
170
|
+
...rows_of(period).map((row) => lane_stats.to_row(row)),
|
|
171
|
+
].join('\n')
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// The tool calls of every lane session under `directories` that was still written to in `window` — a
|
|
175
|
+
// transcript last modified before the period holds no call in it, so it is never read. A delegated
|
|
176
|
+
// unit's transcript is not a lane session, and its time is already inside the parent's wait for it.
|
|
177
|
+
// A session's own transcript sits directly in its lane's directory, so that directory is its lane.
|
|
178
|
+
function read_calls(directories: ReadonlyArray<string>, window: StatsWindow): Array<ToolCall> {
|
|
179
|
+
return cost_transcript
|
|
180
|
+
.list_sessions_across(directories)
|
|
181
|
+
.filter((file) => !file.is_delegated && file.modified_ms >= window.since_ms)
|
|
182
|
+
.flatMap((file) =>
|
|
183
|
+
lane_transcript_calls.parse(
|
|
184
|
+
{ session_id: file.session_id, lane: path.dirname(file.path) },
|
|
185
|
+
cost_transcript.read_raw(file),
|
|
186
|
+
),
|
|
187
|
+
)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const lane_transcript_stats = {
|
|
191
|
+
durations,
|
|
192
|
+
in_period,
|
|
193
|
+
josh_commands,
|
|
194
|
+
read_calls,
|
|
195
|
+
solo_calls,
|
|
196
|
+
table,
|
|
197
|
+
verification_commands,
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export { lane_transcript_stats }
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { git_command } from '#scripts/git/git-command'
|
|
2
2
|
import { run_hold } from '#scripts/run/hold/run-hold'
|
|
3
|
+
import { PROCESS_NONE } from '#scripts/run/run-liveness'
|
|
3
4
|
import { lane_await } from './lane-await'
|
|
4
5
|
import type { LaneInfo } from './lane-registry'
|
|
5
6
|
|
|
@@ -9,7 +10,7 @@ import type { LaneInfo } from './lane-registry'
|
|
|
9
10
|
// refuses it as `already-open` — so the next launch of that issue failed on a lane with nothing in it.
|
|
10
11
|
//
|
|
11
12
|
// **Every unreadable answer is "not vacant"**: `is_tree_dirty` already reads an unreadable status as
|
|
12
|
-
// dirty, and a branch whose commits cannot be counted is kept rather than closed, because closing it
|
|
13
|
+
// dirty, a process probe that could not look reads as occupied, and a branch whose commits cannot be counted is kept rather than closed, because closing it
|
|
13
14
|
// deletes the branch and anything on it.
|
|
14
15
|
async function has_no_commits(lane: LaneInfo): Promise<boolean> {
|
|
15
16
|
try {
|
|
@@ -21,8 +22,10 @@ async function has_no_commits(lane: LaneInfo): Promise<boolean> {
|
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
24
|
|
|
25
|
+
// Only pgrep's own "no match" clears a lane: a probe that failed or timed out never looked, and a
|
|
26
|
+
// freshly launched child with no commit yet must not read vacant on it (joshuafolkken/kit#4028).
|
|
24
27
|
function is_occupied(lane: LaneInfo): boolean {
|
|
25
|
-
return lane.is_stranded || lane_await.
|
|
28
|
+
return lane.is_stranded || lane_await.process_trace_default(lane.issue) !== PROCESS_NONE
|
|
26
29
|
}
|
|
27
30
|
|
|
28
31
|
async function is_vacant(lane: LaneInfo): Promise<boolean> {
|
|
@@ -31,6 +34,13 @@ async function is_vacant(lane: LaneInfo): Promise<boolean> {
|
|
|
31
34
|
return await has_no_commits(lane)
|
|
32
35
|
}
|
|
33
36
|
|
|
34
|
-
|
|
37
|
+
// The issues of the lanes that hold nothing worth keeping, read in parallel.
|
|
38
|
+
async function vacant_issues(lanes: ReadonlyArray<LaneInfo>): Promise<Array<string>> {
|
|
39
|
+
const answers = await Promise.all(lanes.map(async (lane) => await is_vacant(lane)))
|
|
40
|
+
|
|
41
|
+
return lanes.filter((_lane, index) => answers[index] === true).map((lane) => lane.issue)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const lane_vacant = { is_vacant, vacant_issues }
|
|
35
45
|
|
|
36
46
|
export { lane_vacant }
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// `josh lane:value cell --table <title> --row <label> --column <header>` — one cell of a table
|
|
2
|
+
// `josh lane:stats` prints, as one number (joshuafolkken/kit#5144). The tables are read as printed, so
|
|
3
|
+
// every new `lane:stats` table is declarable without a new metric and no aggregation is copied.
|
|
4
|
+
//
|
|
5
|
+
// A table is named by its first header cell and a row by its first cell. **The address must name one
|
|
6
|
+
// cell** — two tables share the `check` title, so an address that matches more than one numeric cell
|
|
7
|
+
// answers `undefined`, as a missing or non-numeric one does, never a guess.
|
|
8
|
+
|
|
9
|
+
const ROW_OPEN = '| '
|
|
10
|
+
const ROW_CLOSE = ' |'
|
|
11
|
+
const CELL_SEPARATOR = ' | '
|
|
12
|
+
const BLOCK_SEPARATOR = /\n\s*\n/u
|
|
13
|
+
const NUMBER_PATTERN = /^-?\d+(?:\.\d+)?$/u
|
|
14
|
+
const HEADER_ROWS = 2
|
|
15
|
+
|
|
16
|
+
interface CellAddress {
|
|
17
|
+
table: string
|
|
18
|
+
row: string
|
|
19
|
+
column: string
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
type Cells = ReadonlyArray<string>
|
|
23
|
+
|
|
24
|
+
function cells_of(line: string): Cells | undefined {
|
|
25
|
+
const text = line.trim()
|
|
26
|
+
|
|
27
|
+
if (!text.startsWith(ROW_OPEN) || !text.endsWith(ROW_CLOSE)) return undefined
|
|
28
|
+
|
|
29
|
+
return text.slice(ROW_OPEN.length, -ROW_CLOSE.length).split(CELL_SEPARATOR)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function rows_of(block: string): ReadonlyArray<Cells> {
|
|
33
|
+
return block
|
|
34
|
+
.split('\n')
|
|
35
|
+
.map((line) => cells_of(line))
|
|
36
|
+
.filter((row) => row !== undefined)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Every printed table as its rows of cells, the header first; a block with no row is dropped.
|
|
40
|
+
function blocks_of(tables: ReadonlyArray<string>): ReadonlyArray<ReadonlyArray<Cells>> {
|
|
41
|
+
return tables
|
|
42
|
+
.flatMap((table) => table.split(BLOCK_SEPARATOR))
|
|
43
|
+
.map((block) => rows_of(block))
|
|
44
|
+
.filter((rows) => rows.length > 0)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// The cell texts at the address in one table — none when its title or column differs.
|
|
48
|
+
function texts_in(rows: ReadonlyArray<Cells>, address: CellAddress): ReadonlyArray<string> {
|
|
49
|
+
const [header = []] = rows
|
|
50
|
+
const column = header.indexOf(address.column)
|
|
51
|
+
|
|
52
|
+
if (header[0] !== address.table || column < 1) return []
|
|
53
|
+
|
|
54
|
+
return rows
|
|
55
|
+
.slice(HEADER_ROWS)
|
|
56
|
+
.filter((cells) => cells[0] === address.row)
|
|
57
|
+
.map((cells) => cells[column] ?? '')
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// The one numeric cell at `address` across `tables`, or `undefined` for none, many or a non-number.
|
|
61
|
+
function value(tables: ReadonlyArray<string>, address: CellAddress): number | undefined {
|
|
62
|
+
const numbers = blocks_of(tables)
|
|
63
|
+
.flatMap((rows) => texts_in(rows, address))
|
|
64
|
+
.filter((text) => NUMBER_PATTERN.test(text))
|
|
65
|
+
|
|
66
|
+
return numbers.length === 1 ? Number(numbers[0]) : undefined
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const lane_value_cell = { value }
|
|
70
|
+
|
|
71
|
+
export type { CellAddress }
|
|
72
|
+
export { lane_value_cell }
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { metrics_totals } from '#scripts/gate/metrics-totals'
|
|
2
|
+
import { since_green } from '#scripts/gate/since-green'
|
|
3
|
+
import { MS_PER_MINUTE, MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
4
|
+
import { run_ship_pre_detach } from '#scripts/run/ship/run-ship-pre-detach'
|
|
5
|
+
import { lane_ledger, type CoreWaitEntry, type LedgerEntry } from './lane-ledger'
|
|
6
|
+
import { lane_stats, type StatsWindow } from './lane-stats'
|
|
7
|
+
import type { ToolCall } from './lane-transcript-calls'
|
|
8
|
+
import { lane_transcript_stats } from './lane-transcript-stats'
|
|
9
|
+
|
|
10
|
+
// `josh lane:value <metric> --since <instant>` — one lane measurement as one number, so a follow-up
|
|
11
|
+
// measurement Issue can declare it (its measurement declaration line) and `backlog:drive` closes it without a lane
|
|
12
|
+
// (joshuafolkken/kit#4630). Each metric is one an Issue measured by hand from the lane transcripts or
|
|
13
|
+
// the ledger; `lane:stats` prints the tables they were read from.
|
|
14
|
+
//
|
|
15
|
+
// **Per lane is per lane, not per session** — every lane runs at least a child and a ship-reviewer
|
|
16
|
+
// session, so the divisor is the lanes whose sessions made a tool call in the period. A metric with no
|
|
17
|
+
// sample answers `undefined`, never a zero that would pass.
|
|
18
|
+
|
|
19
|
+
const LINT_RELATED = 'lint:related'
|
|
20
|
+
const SHIP = 'ship'
|
|
21
|
+
const EDIT_TOOL = 'Edit'
|
|
22
|
+
// Both pre-detach forms: a `--since` window from before joshuafolkken/kit#4716 holds the bare form's.
|
|
23
|
+
const METRICS_STOPS: ReadonlyArray<string> = [
|
|
24
|
+
metrics_totals.METRICS_RERECORD_COMMAND,
|
|
25
|
+
metrics_totals.METRICS_TOTALS_COMMAND,
|
|
26
|
+
].map((list) => run_ship_pre_detach.failure_prefix(list))
|
|
27
|
+
|
|
28
|
+
interface LaneRecords {
|
|
29
|
+
entries: ReadonlyArray<LedgerEntry>
|
|
30
|
+
calls: ReadonlyArray<ToolCall>
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
type Metric = (records: LaneRecords) => number | undefined
|
|
34
|
+
|
|
35
|
+
function seconds_of(ms: number | undefined): number | undefined {
|
|
36
|
+
return ms === undefined ? undefined : ms / MS_PER_SECOND
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// `count` spread over the period's lanes, or `undefined` when no lane ran.
|
|
40
|
+
function per_lane(count: number, calls: ReadonlyArray<ToolCall>): number | undefined {
|
|
41
|
+
const lanes = new Set(calls.map((call) => call.lane)).size
|
|
42
|
+
|
|
43
|
+
return lanes === 0 ? undefined : count / lanes
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// #4599: the median time of a `lint:related` that found nothing moved since its last green run.
|
|
47
|
+
function lint_unmoved({ calls }: LaneRecords): number | undefined {
|
|
48
|
+
const unmoved = lane_transcript_stats
|
|
49
|
+
.solo_calls(calls, LINT_RELATED)
|
|
50
|
+
.filter((call) => call.output.includes(since_green.UNMOVED_REASON))
|
|
51
|
+
|
|
52
|
+
return seconds_of(lane_stats.median(lane_transcript_stats.durations(unmoved)))
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// #4600: the `ship` calls whose pre-detach check the metrics totals stopped, per lane.
|
|
56
|
+
function metrics_stops({ calls }: LaneRecords): number | undefined {
|
|
57
|
+
const stops = calls.filter(
|
|
58
|
+
(call) =>
|
|
59
|
+
lane_transcript_stats.verification_commands(call.command).includes(SHIP) &&
|
|
60
|
+
METRICS_STOPS.some((stop) => call.output.includes(stop)),
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
return per_lane(stops.length, calls)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// A lane's `lint:related` wait — one outside a lane (the main checkout's) has no `issue` and no lane
|
|
67
|
+
// session to be divided among.
|
|
68
|
+
function is_lint_wait(entry: LedgerEntry): entry is CoreWaitEntry {
|
|
69
|
+
return (
|
|
70
|
+
entry.kind === lane_ledger.KIND.CORE_WAIT &&
|
|
71
|
+
entry.command === LINT_RELATED &&
|
|
72
|
+
entry.issue !== undefined
|
|
73
|
+
)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// #4601: the minutes `lint:related` waited for the core budget, per lane.
|
|
77
|
+
function lint_core_wait({ entries, calls }: LaneRecords): number | undefined {
|
|
78
|
+
const waited = entries.filter((entry) => is_lint_wait(entry))
|
|
79
|
+
const total_ms = waited.reduce((sum, wait) => sum + wait.waited_ms, 0)
|
|
80
|
+
|
|
81
|
+
return per_lane(total_ms / MS_PER_MINUTE, calls)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// #4602: the median time of one `Edit` call, hooks included.
|
|
85
|
+
function edit({ calls }: LaneRecords): number | undefined {
|
|
86
|
+
const edits = calls.filter((call) => call.tool === EDIT_TOOL)
|
|
87
|
+
|
|
88
|
+
return seconds_of(lane_stats.median(lane_transcript_stats.durations(edits)))
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const METRICS: Readonly<Record<string, Metric>> = {
|
|
92
|
+
'lint-unmoved': lint_unmoved,
|
|
93
|
+
'metrics-stops': metrics_stops,
|
|
94
|
+
'lint-core-wait': lint_core_wait,
|
|
95
|
+
edit,
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const NAMES: ReadonlyArray<string> = Object.keys(METRICS)
|
|
99
|
+
|
|
100
|
+
function is_metric(name: string): boolean {
|
|
101
|
+
return Object.hasOwn(METRICS, name)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// The value of `name` over `window`; `records` are the whole ledger and every lane call, cut here.
|
|
105
|
+
function value(name: string, records: LaneRecords, window: StatsWindow): number | undefined {
|
|
106
|
+
const metric = is_metric(name) ? METRICS[name] : undefined
|
|
107
|
+
const period = {
|
|
108
|
+
entries: lane_stats.in_window(records.entries, window),
|
|
109
|
+
calls: lane_transcript_stats.in_period(records.calls, window),
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return metric === undefined ? undefined : metric(period)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const lane_value = { NAMES, is_metric, value }
|
|
116
|
+
|
|
117
|
+
export type { LaneRecords }
|
|
118
|
+
export { lane_value }
|
|
@@ -4,8 +4,9 @@ import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
|
4
4
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
5
5
|
import { lane_withdraw, type WithdrawOutcome } from './lane-withdraw'
|
|
6
6
|
|
|
7
|
-
// `josh lane:withdraw <issue> --reason <text>` — every explanation on standard error, and a
|
|
8
|
-
//
|
|
7
|
+
// `josh lane:withdraw <issue> --reason <text>` — every explanation on standard error, and anything but a
|
|
8
|
+
// finished withdrawal exits non-zero, so a caller never takes a half-done one as done. The Issue stays
|
|
9
|
+
// open on success.
|
|
9
10
|
|
|
10
11
|
const ARGV_OFFSET = 2
|
|
11
12
|
const SUCCESS_EXIT_CODE = 0
|
|
@@ -24,7 +25,7 @@ function issue_of(positionals: ReadonlyArray<string>): string | undefined {
|
|
|
24
25
|
return rest.length === 0 && issue_number_shape.is_issue_number(issue ?? '') ? issue : undefined
|
|
25
26
|
}
|
|
26
27
|
|
|
27
|
-
// A reason of only whitespace is no reason: the Issue would
|
|
28
|
+
// A reason of only whitespace is no reason: the Issue would carry an empty `Why:` line.
|
|
28
29
|
function reason_of(value: unknown): string | undefined {
|
|
29
30
|
const reason = cli_flags.string_of(value)?.trim()
|
|
30
31
|
|
|
@@ -41,7 +42,7 @@ function parse_request(argv: ReadonlyArray<string>): Request | undefined {
|
|
|
41
42
|
}
|
|
42
43
|
|
|
43
44
|
function exit_code_of(outcome: WithdrawOutcome): number {
|
|
44
|
-
return outcome.kind === 'withdrawn'
|
|
45
|
+
return outcome.kind === 'withdrawn' ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { git_command } from '#scripts/git/git-command'
|
|
2
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
3
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
4
|
+
import { run_board_closed, type ClosedIssue } from '#scripts/run/board/run-board-closed'
|
|
5
|
+
import { run_event_scope } from '#scripts/run/event/run-event-scope'
|
|
6
|
+
import type { RunEvent } from '#scripts/run/event/run-event-stream'
|
|
7
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
8
|
+
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
9
|
+
import { lane_withdraw, type Withdrawer } from './lane-withdraw'
|
|
10
|
+
|
|
11
|
+
// Every open lane whose issue was closed on GitHub as not planned is withdrawn through `lane:withdraw`'s
|
|
12
|
+
// own path (joshuafolkken/kit#4915): its child is stopped, its work stashed and the lane closed, so the
|
|
13
|
+
// lane leaves the count and no cut resumes it. Nothing else ends such a lane: the child keeps working on
|
|
14
|
+
// an issue no one wants, and the lane limit counts it while the board draws no lane for it.
|
|
15
|
+
//
|
|
16
|
+
// **Only a not-planned close is swept.** A merged issue's lane is ended by the merge path, where a
|
|
17
|
+
// detached ship may still be running its tail; an issue closed as completed by hand is left to
|
|
18
|
+
// `lane:prune` and `run:merge`, which books it withdrawn when no merged pull request closed it
|
|
19
|
+
// (joshuafolkken/kit#4916). An issue that could not be read is
|
|
20
|
+
// asked again on the next pass, and a lane whose withdrawal is already on the event stream is not
|
|
21
|
+
// withdrawn twice.
|
|
22
|
+
//
|
|
23
|
+
// **A branch with commits on no remote is kept**: the close deletes the branch and the stash keeps only
|
|
24
|
+
// uncommitted work, so a person decides with `lane:withdraw` by hand. `run:merge` withdraws through the
|
|
25
|
+
// same guard (`withdraw_lane`).
|
|
26
|
+
|
|
27
|
+
const SWEEP_REASON = 'its issue was closed as not planned while the lane was still open'
|
|
28
|
+
|
|
29
|
+
function is_not_planned(read: ClosedIssue | undefined): boolean {
|
|
30
|
+
return read !== undefined && read.is_not_planned && !read.is_merged
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** The open lanes whose issue is closed as not planned. */
|
|
34
|
+
async function closed_lanes(): Promise<Array<LaneInfo>> {
|
|
35
|
+
const listed = await lane_registry.list_lanes()
|
|
36
|
+
const lanes = listed.filter((lane) => !lane.is_stranded)
|
|
37
|
+
const { closed } = await run_board_closed.read_all(lanes.map((lane) => Number(lane.issue)))
|
|
38
|
+
|
|
39
|
+
return lanes.filter((lane) => is_not_planned(closed.get(Number(lane.issue))))
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// An unreadable count keeps the branch, as unpushed commits would.
|
|
43
|
+
async function has_unpushed(branch: string): Promise<boolean> {
|
|
44
|
+
try {
|
|
45
|
+
return (await git_command.commit_count_unpushed(branch)) > 0
|
|
46
|
+
} catch (error) {
|
|
47
|
+
error_text.trace_swallowed('lane_withdraw_closed.has_unpushed', error)
|
|
48
|
+
|
|
49
|
+
return true
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function kept_note(issue: string, by: Withdrawer): string {
|
|
54
|
+
const settled = by === 'yield' ? 'gave its lane back' : 'is closed without a merge'
|
|
55
|
+
|
|
56
|
+
return `${session_cite.issue(issue)} ${settled}, but its branch has commits on no remote, so its lane is kept — run \`pnpm josh lane:withdraw ${issue}\` by hand.`
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
interface UnattendedWithdrawal {
|
|
60
|
+
note: string
|
|
61
|
+
// The withdrawal could not read the issue, so nothing was stopped or closed.
|
|
62
|
+
is_retry: boolean
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Withdraw a closed issue's open lane with no person present, keeping a branch with unpushed commits. */
|
|
66
|
+
async function withdraw_lane(
|
|
67
|
+
lane: LaneInfo,
|
|
68
|
+
reason: string,
|
|
69
|
+
by: Withdrawer,
|
|
70
|
+
): Promise<UnattendedWithdrawal> {
|
|
71
|
+
if (await has_unpushed(lane.branch)) return { note: kept_note(lane.issue, by), is_retry: false }
|
|
72
|
+
const outcome = await lane_withdraw.withdraw(lane.issue, reason, by)
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
note: lane_withdraw.describe(outcome, lane.issue),
|
|
76
|
+
is_retry: outcome.kind === 'unreadable',
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async function sweep_lane(
|
|
81
|
+
lane: LaneInfo,
|
|
82
|
+
events: ReadonlyArray<RunEvent>,
|
|
83
|
+
): Promise<string | undefined> {
|
|
84
|
+
if (run_event_scope.is_withdrawn(events, lane.issue)) return undefined
|
|
85
|
+
const { note } = await withdraw_lane(lane, SWEEP_REASON, 'supervisor')
|
|
86
|
+
|
|
87
|
+
return note
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// One lane's failure does not stop the sweep: the rest are still withdrawn, and this one is asked again.
|
|
91
|
+
async function try_sweep_lane(
|
|
92
|
+
lane: LaneInfo,
|
|
93
|
+
events: ReadonlyArray<RunEvent>,
|
|
94
|
+
): Promise<string | undefined> {
|
|
95
|
+
try {
|
|
96
|
+
return await sweep_lane(lane, events)
|
|
97
|
+
} catch (error) {
|
|
98
|
+
error_text.trace_swallowed('lane_withdraw_closed.sweep_lane', error)
|
|
99
|
+
|
|
100
|
+
return `${session_cite.issue(lane.issue)} could not be withdrawn (${error_text.message_of(error)}); the next pass tries again.`
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Withdraw every open lane whose issue is closed as not planned — the supervisor's pass; one note each. */
|
|
105
|
+
async function withdraw_closed(): Promise<Array<string>> {
|
|
106
|
+
const lanes = await closed_lanes()
|
|
107
|
+
const events = await run_event_stream_emit.current_events()
|
|
108
|
+
const notes: Array<string> = []
|
|
109
|
+
|
|
110
|
+
// Sequential, as `lane_close.close_each` is: two worktree removals at once contend for git's
|
|
111
|
+
// registration directory.
|
|
112
|
+
for (const lane of lanes) {
|
|
113
|
+
// eslint-disable-next-line no-await-in-loop -- worktree writes contend for the same registration directory
|
|
114
|
+
const note = await try_sweep_lane(lane, events)
|
|
115
|
+
|
|
116
|
+
if (note !== undefined) notes.push(note)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return notes
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const lane_withdraw_closed = { SWEEP_REASON, withdraw_closed, withdraw_lane }
|
|
123
|
+
|
|
124
|
+
export { lane_withdraw_closed }
|