@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
|
@@ -2,7 +2,8 @@ import { spawnSync } from 'node:child_process'
|
|
|
2
2
|
import { setTimeout as sleep } from 'node:timers/promises'
|
|
3
3
|
import { parseArgs } from 'node:util'
|
|
4
4
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
5
|
-
import {
|
|
5
|
+
import { poll } from '#scripts/lib/poll'
|
|
6
|
+
import { MS_PER_SECOND, PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
6
7
|
import {
|
|
7
8
|
PROCESS_ALIVE,
|
|
8
9
|
PROCESS_NONE,
|
|
@@ -28,7 +29,6 @@ import { process_tools } from './process-tools'
|
|
|
28
29
|
const RECONFIRM_MS = 15_000
|
|
29
30
|
const DEFAULT_POLL_MS = 5000
|
|
30
31
|
const NEVER_APPEARED_TIMEOUT_MS = 600_000
|
|
31
|
-
const MS_PER_SECOND = 1000
|
|
32
32
|
const PROCESS_FOUND = 0
|
|
33
33
|
const PROCESS_NOT_FOUND = 1
|
|
34
34
|
const PGREP_COMMAND = 'pgrep'
|
|
@@ -36,8 +36,14 @@ const PGREP_COMMAND = 'pgrep'
|
|
|
36
36
|
// `is_settled` is read once, when the wait starts: a child that ended between two `lane:await` calls
|
|
37
37
|
// never appears in the second one, and only its settled issue tells it apart from one not yet
|
|
38
38
|
// launched.
|
|
39
|
+
//
|
|
40
|
+
// `alive_since` is when this run of the child was first seen alive: a ship it launched is no older, so
|
|
41
|
+
// a ship record launched earlier is a past dispatch's (joshuafolkken/kit#4395). A child already alive
|
|
42
|
+
// when the watch began gets the first poll's time, so a ship it launched before that is not read as
|
|
43
|
+
// its own and its disappearance waits out the re-confirm window.
|
|
39
44
|
interface AwaitState {
|
|
40
45
|
appeared: boolean
|
|
46
|
+
alive_since?: number | undefined
|
|
41
47
|
disappeared_at: number | undefined
|
|
42
48
|
first_polled_at: number | undefined
|
|
43
49
|
is_settled?: boolean
|
|
@@ -56,6 +62,7 @@ interface RawAwaitArguments {
|
|
|
56
62
|
// Injectable for testing -- the CLI never overrides these.
|
|
57
63
|
interface AwaitOptions {
|
|
58
64
|
is_running?: (issue: string) => boolean
|
|
65
|
+
is_shipped?: (issue: string, since_ms: number) => boolean
|
|
59
66
|
is_settled?: (issue: string) => Promise<boolean>
|
|
60
67
|
poll_ms?: number
|
|
61
68
|
reconfirm_ms?: number
|
|
@@ -64,8 +71,11 @@ interface AwaitOptions {
|
|
|
64
71
|
sleep?: (ms: number) => Promise<void>
|
|
65
72
|
}
|
|
66
73
|
|
|
74
|
+
// `is_shipped` is the one disappearance the re-confirm window never has to cover: a ship that ended in
|
|
75
|
+
// success merged the child's work, so no cut hand-off can follow it (joshuafolkken/kit#4395).
|
|
67
76
|
interface CheckConfig {
|
|
68
77
|
is_running: (issue: string) => boolean
|
|
78
|
+
is_shipped?: (issue: string, since_ms: number) => boolean
|
|
69
79
|
reconfirm_ms: number
|
|
70
80
|
never_appeared_timeout_ms: number
|
|
71
81
|
}
|
|
@@ -100,6 +110,10 @@ function is_process_running_default(issue: string): boolean {
|
|
|
100
110
|
return process_trace_default(issue) === PROCESS_ALIVE
|
|
101
111
|
}
|
|
102
112
|
|
|
113
|
+
function is_shipped_default(issue: string, since_ms: number): boolean {
|
|
114
|
+
return lane_handoff.is_ship_succeeded(issue, process.cwd(), since_ms)
|
|
115
|
+
}
|
|
116
|
+
|
|
103
117
|
// The same positive evidence `run:liveness` answers `settled` on: the issue closed, or it was parked.
|
|
104
118
|
async function is_settled_default(issue: string): Promise<boolean> {
|
|
105
119
|
return (await run_liveness.read_child_settled(issue)) === true
|
|
@@ -164,9 +178,16 @@ function resolve_timing(
|
|
|
164
178
|
}
|
|
165
179
|
}
|
|
166
180
|
|
|
167
|
-
function
|
|
181
|
+
function resolve_probes(options: AwaitOptions): Pick<RunConfig, 'is_running' | 'is_shipped'> {
|
|
168
182
|
return {
|
|
169
183
|
is_running: options.is_running ?? is_process_running_default,
|
|
184
|
+
is_shipped: options.is_shipped ?? is_shipped_default,
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function resolve_options(options: AwaitOptions): RunConfig {
|
|
189
|
+
return {
|
|
190
|
+
...resolve_probes(options),
|
|
170
191
|
is_settled: options.is_settled ?? is_settled_default,
|
|
171
192
|
now: options.now ?? Date.now,
|
|
172
193
|
sleep: options.sleep ?? sleep,
|
|
@@ -174,9 +195,11 @@ function resolve_options(options: AwaitOptions): RunConfig {
|
|
|
174
195
|
}
|
|
175
196
|
}
|
|
176
197
|
|
|
177
|
-
function update_liveness(state: AwaitState, is_live: boolean): void {
|
|
198
|
+
function update_liveness(state: AwaitState, is_live: boolean, now_ms: number): void {
|
|
178
199
|
if (!is_live) return
|
|
179
200
|
|
|
201
|
+
if (!state.appeared || state.disappeared_at !== undefined) state.alive_since = now_ms
|
|
202
|
+
|
|
180
203
|
state.appeared = true
|
|
181
204
|
state.disappeared_at = undefined
|
|
182
205
|
}
|
|
@@ -203,6 +226,28 @@ function check_not_appeared(
|
|
|
203
226
|
return undefined
|
|
204
227
|
}
|
|
205
228
|
|
|
229
|
+
// The ship this run of the child launched succeeded.
|
|
230
|
+
function is_own_ship_done(issue: string, state: AwaitState, config: CheckConfig): boolean {
|
|
231
|
+
const { alive_since } = state
|
|
232
|
+
|
|
233
|
+
return alive_since !== undefined && config.is_shipped?.(issue, alive_since) === true
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// A child that appeared and is gone: done at once when its ship succeeded, else once it stayed gone
|
|
237
|
+
// past the re-confirm window.
|
|
238
|
+
function check_gone(
|
|
239
|
+
issue: string,
|
|
240
|
+
state: AwaitState,
|
|
241
|
+
now_ms: number,
|
|
242
|
+
config: CheckConfig,
|
|
243
|
+
): string | undefined {
|
|
244
|
+
if (is_own_ship_done(issue, state, config)) return issue
|
|
245
|
+
|
|
246
|
+
state.disappeared_at ??= now_ms
|
|
247
|
+
|
|
248
|
+
return now_ms - state.disappeared_at >= config.reconfirm_ms ? issue : undefined
|
|
249
|
+
}
|
|
250
|
+
|
|
206
251
|
// Returns the issue that has confirmed-completed this tick, `undefined` if none yet.
|
|
207
252
|
// The `appeared` guard prevents a process that never showed up from being declared done, unless its
|
|
208
253
|
// issue had already settled when the wait started.
|
|
@@ -214,7 +259,7 @@ function check_issue(
|
|
|
214
259
|
): string | undefined {
|
|
215
260
|
const is_live = config.is_running(issue)
|
|
216
261
|
|
|
217
|
-
update_liveness(state, is_live)
|
|
262
|
+
update_liveness(state, is_live, now_ms)
|
|
218
263
|
|
|
219
264
|
if (is_live) return undefined
|
|
220
265
|
|
|
@@ -222,13 +267,7 @@ function check_issue(
|
|
|
222
267
|
return check_not_appeared(issue, state, now_ms, config.never_appeared_timeout_ms)
|
|
223
268
|
}
|
|
224
269
|
|
|
225
|
-
|
|
226
|
-
state.disappeared_at = now_ms
|
|
227
|
-
|
|
228
|
-
return undefined
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
return now_ms - state.disappeared_at >= config.reconfirm_ms ? issue : undefined
|
|
270
|
+
return check_gone(issue, state, now_ms, config)
|
|
232
271
|
}
|
|
233
272
|
|
|
234
273
|
function check_any(
|
|
@@ -252,14 +291,10 @@ async function wait_for_any(
|
|
|
252
291
|
const config = resolve_options(options)
|
|
253
292
|
const states = await make_states(issues, config.is_settled)
|
|
254
293
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
261
|
-
await config.sleep(config.poll_ms)
|
|
262
|
-
}
|
|
294
|
+
return await poll.wait_for(() => check_any(states, config.now(), config), {
|
|
295
|
+
interval_ms: config.poll_ms,
|
|
296
|
+
sleeper: config.sleep,
|
|
297
|
+
})
|
|
263
298
|
}
|
|
264
299
|
|
|
265
300
|
const lane_await = {
|
|
@@ -267,6 +302,7 @@ const lane_await = {
|
|
|
267
302
|
RECONFIRM_MS,
|
|
268
303
|
check_issue,
|
|
269
304
|
is_process_running_default,
|
|
305
|
+
is_shipped_default,
|
|
270
306
|
parse_arguments,
|
|
271
307
|
process_trace_default,
|
|
272
308
|
wait_for_any,
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { detached_launch } from '#scripts/run/detached-launch'
|
|
2
|
+
import { run_event_baseline } from '#scripts/run/event/run-event-baseline'
|
|
3
|
+
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
4
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
5
|
+
import { lane_investigation_switch } from './lane-investigation-switch'
|
|
6
|
+
import { lane_ledger } from './lane-ledger'
|
|
7
|
+
import { lane_overrun } from './lane-overrun'
|
|
8
|
+
import { lane_overrun_prompt } from './lane-overrun-prompt'
|
|
9
|
+
import { lane_stage_stats } from './lane-stage-stats'
|
|
10
|
+
|
|
11
|
+
// Every `BASELINE_MERGES`-th merge the median lane itself is investigated (joshuafolkken/kit#4887).
|
|
12
|
+
// The overrun investigation (`lane-overrun.ts`) reads only a lane slower than the threshold, so the time
|
|
13
|
+
// every lane spends is never a candidate for a cut. `run:merge` asks at each merge: the last multiple the
|
|
14
|
+
// ledger's merge count reached, when no note has it yet, launches a detached worker session that reads
|
|
15
|
+
// `lane:stats`, takes the stages and sub-stages that spend the most per merge, and files their causes
|
|
16
|
+
// by the overrun investigation's filing rules — the same prompt part, a cause's reducible minutes cut
|
|
17
|
+
// from one median merge rather than one lane (joshuafolkken/kit#4928). Its filings name no lane they
|
|
18
|
+
// were found during. The launch and the session's result go on the run's event stream as notes, which
|
|
19
|
+
// `run:board` shows. It runs only while `JOSH_LANE_INVESTIGATION` is on (`lane-investigation-switch.ts`);
|
|
20
|
+
// off by default, a due bucket launches nothing and notes nothing (joshuafolkken/kit#5044).
|
|
21
|
+
|
|
22
|
+
const { EVENT_KIND } = run_event_stream
|
|
23
|
+
const BASELINE_MERGES = 30
|
|
24
|
+
const LOG_PREFIX = 'josh-lane-baseline-'
|
|
25
|
+
const STATS_PERIOD_DAYS = 3
|
|
26
|
+
const MEDIAN_PLACEHOLDER = '<median lane minutes>'
|
|
27
|
+
const SCOPE = 'the median merge, judged from the per-merge minutes `lane:stats` prints'
|
|
28
|
+
|
|
29
|
+
// The last multiple of `BASELINE_MERGES` the count reached: two merges recorded between two asks, or an
|
|
30
|
+
// ask that failed, still leave the bucket due at the next merge.
|
|
31
|
+
function due_bucket(merges: number): number {
|
|
32
|
+
return Math.floor(merges / BASELINE_MERGES) * BASELINE_MERGES
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// A count investigated already — a retried merge finds its note — launches no second session. A
|
|
36
|
+
// failure names no count, so it never answers for one.
|
|
37
|
+
function is_noted(events: ReadonlyArray<RunEvent>, merges: number): boolean {
|
|
38
|
+
return events.some((event) => {
|
|
39
|
+
const note = event.kind === EVENT_KIND.NOTE ? run_event_baseline.parse(event.text) : undefined
|
|
40
|
+
|
|
41
|
+
return note !== undefined && note.kind !== 'failed' && note.merges === merges
|
|
42
|
+
})
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// The due bucket of the ledger's merge count, else `undefined` before the first.
|
|
46
|
+
async function due_merges(): Promise<number | undefined> {
|
|
47
|
+
const path = await lane_ledger.target()
|
|
48
|
+
|
|
49
|
+
if (path === undefined) return undefined
|
|
50
|
+
|
|
51
|
+
const merges = lane_ledger.read_entries(path).filter((entry) => lane_stage_stats.is_merge(entry))
|
|
52
|
+
const bucket = due_bucket(merges.length)
|
|
53
|
+
|
|
54
|
+
return bucket > 0 ? bucket : undefined
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function reading(merges: number): string {
|
|
58
|
+
return [
|
|
59
|
+
`Investigate the median lane after ${String(merges)} merges: not an overrun, but the time every lane`,
|
|
60
|
+
'spends. Leave this checkout as it is: write any file, an issue body included, under the system temp',
|
|
61
|
+
'directory, and never stage, commit or push.',
|
|
62
|
+
`Read \`pnpm josh lane:stats --period ${String(STATS_PERIOD_DAYS)}\` — its stage table and its`,
|
|
63
|
+
'implement sub-stage table — and take the several stages and sub-stages with the largest per-merge',
|
|
64
|
+
"time, not just the one largest. Read the period lanes' transcripts (the lane directories `lane:stats`",
|
|
65
|
+
"reads) and the run events (`pnpm josh run:event --from 0`) for where each one's time goes, and find",
|
|
66
|
+
'the causes a fix could cut.',
|
|
67
|
+
'Trace each cause to what can fix it: the minutes it spends per merge, the signal that led to the',
|
|
68
|
+
'spend (which command printed what), the `file:line` of the code or document that decided it, and',
|
|
69
|
+
'where to fix it.',
|
|
70
|
+
].join(' ')
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// One line: `detached_launch` lets a prompt break lines, but a single line keeps the log header whole.
|
|
74
|
+
function prompt(issue: number, merges: number): string {
|
|
75
|
+
const handling = lane_overrun_prompt.cause_handling({
|
|
76
|
+
origin: undefined,
|
|
77
|
+
loss_lines: lane_overrun_prompt.loss_lines_of(issue, MEDIAN_PLACEHOLDER),
|
|
78
|
+
template: run_event_baseline.ended_text(merges, '<result>'),
|
|
79
|
+
scope: SCOPE,
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
return `${reading(merges)} ${handling}`
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function note_failure(note: string): void {
|
|
86
|
+
void run_event_stream_emit.emit(EVENT_KIND.NOTE, run_event_baseline.failed_text(note))
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// The launch at merge `issue`, the `merges`-th; its filings count against that lane.
|
|
90
|
+
function launched(issue: number, merges: number): string {
|
|
91
|
+
return lane_overrun.launch({
|
|
92
|
+
env: {},
|
|
93
|
+
prompt: prompt(issue, merges),
|
|
94
|
+
log_prefix: `${LOG_PREFIX}${String(merges)}-`,
|
|
95
|
+
on_failure: note_failure,
|
|
96
|
+
})
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async function investigate_baseline(issue: number): Promise<void> {
|
|
100
|
+
const merges = await due_merges()
|
|
101
|
+
|
|
102
|
+
if (merges === undefined || is_noted(await run_event_stream_emit.all_events(), merges)) return
|
|
103
|
+
|
|
104
|
+
await run_event_stream_emit.emit(
|
|
105
|
+
EVENT_KIND.NOTE,
|
|
106
|
+
run_event_baseline.started_text(merges, launched(issue, merges)),
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Never fails the merge it follows: an error is a note on the stream, not a refused merge.
|
|
111
|
+
async function investigate(issue: number): Promise<void> {
|
|
112
|
+
if (!lane_investigation_switch.is_on()) return
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
await investigate_baseline(issue)
|
|
116
|
+
} catch (error) {
|
|
117
|
+
note_failure(detached_launch.note_of(error))
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const lane_baseline = { due_bucket, investigate }
|
|
122
|
+
|
|
123
|
+
export { lane_baseline }
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
4
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
5
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
6
|
+
import { lane_breakdown } from './lane-breakdown'
|
|
7
|
+
import { lane_breakdown_text } from './lane-breakdown-text'
|
|
8
|
+
import { lane_ledger } from './lane-ledger'
|
|
9
|
+
import { lane_net_time } from './lane-net-time'
|
|
10
|
+
|
|
11
|
+
// `josh lane:breakdown <issue>` — a merged lane's net time by stage (joshuafolkken/kit#4995), the same
|
|
12
|
+
// breakdown its overrun investigation comments on its Issue.
|
|
13
|
+
|
|
14
|
+
const ARGV_OFFSET = 2
|
|
15
|
+
const FAILURE_EXIT_CODE = 1
|
|
16
|
+
const USAGE = 'Usage: josh lane:breakdown <issue>'
|
|
17
|
+
|
|
18
|
+
async function read_ledger(): Promise<ReturnType<typeof lane_ledger.read_entries>> {
|
|
19
|
+
const path = await lane_ledger.target()
|
|
20
|
+
|
|
21
|
+
return path === undefined ? [] : lane_ledger.read_entries(path)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function missing(issue: string): number {
|
|
25
|
+
const lane = session_cite.issue(issue)
|
|
26
|
+
|
|
27
|
+
console.error(`josh lane:breakdown ${issue}: the ledger holds no dispatch and merge of ${lane}`)
|
|
28
|
+
|
|
29
|
+
return FAILURE_EXIT_CODE
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async function print(issue: string): Promise<number> {
|
|
33
|
+
const [entries, events] = [await read_ledger(), await run_event_stream_emit.all_events()]
|
|
34
|
+
const minutes = lane_net_time.net_minutes(entries, events, Number(issue))
|
|
35
|
+
const breakdown = lane_breakdown.of(entries, events, Number(issue))
|
|
36
|
+
|
|
37
|
+
if (minutes === undefined || breakdown === undefined) return missing(issue)
|
|
38
|
+
|
|
39
|
+
const report = lane_breakdown_text.report_of(Number(issue), breakdown, entries)
|
|
40
|
+
|
|
41
|
+
console.info(lane_breakdown_text.comment(Number(issue), minutes, report))
|
|
42
|
+
|
|
43
|
+
return 0
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
47
|
+
const [issue = ''] = argv
|
|
48
|
+
|
|
49
|
+
if (argv.length === 1 && issue_number_shape.is_issue_number(issue)) return await print(issue)
|
|
50
|
+
|
|
51
|
+
console.error(USAGE)
|
|
52
|
+
|
|
53
|
+
return FAILURE_EXIT_CODE
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
57
|
+
process.exitCode = await run(argv)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const lane_breakdown_cli = { USAGE, run }
|
|
61
|
+
|
|
62
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
63
|
+
|
|
64
|
+
export { lane_breakdown_cli }
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { cost_transcript } from '#scripts/cost-runtime/cost-transcript'
|
|
2
|
+
import { lane_breakdown, type Breakdown, type Stage } from './lane-breakdown'
|
|
3
|
+
import type { LaneSpan } from './lane-net-time'
|
|
4
|
+
import type { Subagent, ToolCall } from './lane-transcript-calls'
|
|
5
|
+
import { lane_transcript_stats } from './lane-transcript-stats'
|
|
6
|
+
|
|
7
|
+
// The implementation stage of a lane's breakdown (joshuafolkken/kit#4995) split by what its tool calls
|
|
8
|
+
// spent, read off the lane's transcripts: the main josh commands, the subagents, the reads and the rest
|
|
9
|
+
// of Bash, and what no call spent — the edits and the thinking. A backgrounded call has no duration
|
|
10
|
+
// (`lane-transcript-calls.ts`), so the wait on its result falls in the remainder; only its count shows.
|
|
11
|
+
//
|
|
12
|
+
// **The subagents split by the agent dispatched** — `subagent: investigator`, `subagent: reviewer`, …
|
|
13
|
+
// — and a backgrounded subagent call still names its kind, at no time, with its count beside it
|
|
14
|
+
// (joshuafolkken/kit#5297). `run:review` and `ship` / `ship:wait` count apart from other bash
|
|
15
|
+
// (joshuafolkken/kit#5293).
|
|
16
|
+
|
|
17
|
+
const REMAINDER = 'editing & thinking'
|
|
18
|
+
const OTHER_BASH = 'other bash'
|
|
19
|
+
const BASH_TOOL = 'Bash'
|
|
20
|
+
const READ = 'read'
|
|
21
|
+
|
|
22
|
+
const TOOL_KINDS: ReadonlyMap<string, string> = new Map([
|
|
23
|
+
['Read', READ],
|
|
24
|
+
['Grep', READ],
|
|
25
|
+
['Glob', READ],
|
|
26
|
+
])
|
|
27
|
+
|
|
28
|
+
const COMMAND_KINDS: ReadonlyArray<readonly [RegExp, string]> = [
|
|
29
|
+
[/\bjosh main:merge\b/u, 'main:merge'],
|
|
30
|
+
[/\bjosh check:related\b/u, 'check:related'],
|
|
31
|
+
[/\bjosh gate\b/u, 'gate'],
|
|
32
|
+
[/\bjosh run:review\b/u, 'run:review'],
|
|
33
|
+
[/\bjosh ship(?::wait)?\b/u, 'ship / ship:wait'],
|
|
34
|
+
[/\bjosh test(?::[\w-]+)?\b/u, 'test'],
|
|
35
|
+
[/\bjosh (?:lint|cspell)(?::[\w-]+)?\b/u, 'lint / cspell'],
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
interface ImplementDetail {
|
|
39
|
+
// Longest first, the remainder among them.
|
|
40
|
+
kinds: ReadonlyArray<Stage>
|
|
41
|
+
// The calls backgrounded inside the implementation.
|
|
42
|
+
background: number
|
|
43
|
+
// Each subagent kind's backgrounded calls, counted at no time.
|
|
44
|
+
untimed: ReadonlyMap<string, number>
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function command_kind(command: string): string {
|
|
48
|
+
return COMMAND_KINDS.find(([pattern]) => pattern.test(command))?.[1] ?? OTHER_BASH
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function subagent_kind(subagent: Subagent): string {
|
|
52
|
+
return `subagent: ${subagent.type}`
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// The kind a call counts under, `undefined` for one that falls in the remainder (an edit included).
|
|
56
|
+
function kind_of(call: ToolCall): string | undefined {
|
|
57
|
+
if (call.tool === BASH_TOOL) return command_kind(call.command ?? '')
|
|
58
|
+
if (call.subagent !== undefined) return subagent_kind(call.subagent)
|
|
59
|
+
|
|
60
|
+
return TOOL_KINDS.get(call.tool ?? '')
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
interface TimedPart extends Stage {
|
|
64
|
+
from_ms: number
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function is_untimed_subagent(call: ToolCall): boolean {
|
|
68
|
+
return call.background && call.subagent !== undefined
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// A call's own milliseconds, cut at the end of the span it started in; a backgrounded subagent call's none.
|
|
72
|
+
function timed_part(call: ToolCall, span: LaneSpan): ReadonlyArray<TimedPart> {
|
|
73
|
+
const name = kind_of(call)
|
|
74
|
+
|
|
75
|
+
if (name === undefined) return []
|
|
76
|
+
|
|
77
|
+
const ms = Math.min(call.duration_ms ?? 0, span.to_ms - call.started_ms)
|
|
78
|
+
const is_counted = call.duration_ms !== undefined || is_untimed_subagent(call)
|
|
79
|
+
|
|
80
|
+
return is_counted ? [{ name, ms, from_ms: call.started_ms }] : []
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function untimed_of(placed: ReadonlyArray<readonly [ToolCall, LaneSpan]>): Map<string, number> {
|
|
84
|
+
const counts = new Map<string, number>()
|
|
85
|
+
const kinds = placed.filter(([call]) => is_untimed_subagent(call)).map(([call]) => kind_of(call))
|
|
86
|
+
|
|
87
|
+
for (const kind of kinds) if (kind !== undefined) counts.set(kind, (counts.get(kind) ?? 0) + 1)
|
|
88
|
+
|
|
89
|
+
return counts
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// What neither a timed call nor a wait covers of the implementation's spans, each millisecond once.
|
|
93
|
+
function remainder_ms(parts: ReadonlyArray<TimedPart>, breakdown: Breakdown): number {
|
|
94
|
+
const busy = parts.map((part) => ({ from_ms: part.from_ms, to_ms: part.from_ms + part.ms }))
|
|
95
|
+
const covering = [...busy, ...breakdown.waits]
|
|
96
|
+
const idle = breakdown.implement.map(
|
|
97
|
+
(span) => span.to_ms - span.from_ms - lane_breakdown.covered_ms(span, covering),
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
return idle.reduce((sum, ms) => sum + ms, 0)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function span_of(call: ToolCall, spans: ReadonlyArray<LaneSpan>): LaneSpan | undefined {
|
|
104
|
+
return spans.find((span) => call.started_ms >= span.from_ms && call.started_ms < span.to_ms)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function placed_of(
|
|
108
|
+
calls: ReadonlyArray<ToolCall>,
|
|
109
|
+
spans: ReadonlyArray<LaneSpan>,
|
|
110
|
+
): Array<readonly [ToolCall, LaneSpan]> {
|
|
111
|
+
return calls.flatMap((call) => {
|
|
112
|
+
const span = span_of(call, spans)
|
|
113
|
+
|
|
114
|
+
return span === undefined ? [] : [[call, span] as const]
|
|
115
|
+
})
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// The implementation split by the calls made inside it — parallel calls each count their own time, so
|
|
119
|
+
// the kinds can add up to more — and the remainder, the time no call and no wait covered.
|
|
120
|
+
function of(calls: ReadonlyArray<ToolCall>, breakdown: Breakdown): ImplementDetail {
|
|
121
|
+
const placed = placed_of(calls, breakdown.implement)
|
|
122
|
+
const parts = placed.flatMap(([call, span]) => timed_part(call, span))
|
|
123
|
+
const remainder = { name: REMAINDER, ms: remainder_ms(parts, breakdown) }
|
|
124
|
+
|
|
125
|
+
return {
|
|
126
|
+
kinds: lane_breakdown.ranked([...parts, remainder]),
|
|
127
|
+
background: placed.filter(([call]) => call.background).length,
|
|
128
|
+
untimed: untimed_of(placed),
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// The Bash calls started inside `spans`, by the implementation's kinds — the fixes, re-ships and checks
|
|
133
|
+
// a lane child ran between two ship stages (joshuafolkken/kit#5294).
|
|
134
|
+
function bash_kinds(calls: ReadonlyArray<ToolCall>, spans: ReadonlyArray<LaneSpan>): Array<Stage> {
|
|
135
|
+
const placed = placed_of(
|
|
136
|
+
calls.filter((call) => call.tool === BASH_TOOL),
|
|
137
|
+
spans,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
return lane_breakdown.ranked(placed.flatMap(([call, span]) => timed_part(call, span)))
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// The lane's own transcript directories — `<lane root slug>-<issue>` under `~/.claude/projects`.
|
|
144
|
+
function transcript_directories(issue: number): ReadonlyArray<string> {
|
|
145
|
+
const main_cwd = cost_transcript.session_cwd(process.cwd())
|
|
146
|
+
const home = cost_transcript.home_directory()
|
|
147
|
+
const suffix = `-${String(issue)}`
|
|
148
|
+
|
|
149
|
+
return cost_transcript
|
|
150
|
+
.lane_transcript_directories(main_cwd, home)
|
|
151
|
+
.filter((directory) => directory.endsWith(suffix))
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// The tool calls of `issue`'s lane sessions still written to once its implementation began, up to the
|
|
155
|
+
// end of its last ship stage.
|
|
156
|
+
function read(issue: number, breakdown: Breakdown): Array<ToolCall> {
|
|
157
|
+
const [first] = breakdown.implement
|
|
158
|
+
const last = breakdown.ship.at(-1) ?? breakdown.implement.at(-1)
|
|
159
|
+
|
|
160
|
+
if (first === undefined || last === undefined) return []
|
|
161
|
+
|
|
162
|
+
const window = { since_ms: first.from_ms, until_ms: last.to_ms }
|
|
163
|
+
|
|
164
|
+
return lane_transcript_stats.read_calls(transcript_directories(issue), window)
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const lane_breakdown_implement = { bash_kinds, of, read, transcript_directories }
|
|
168
|
+
|
|
169
|
+
export { lane_breakdown_implement }
|
|
170
|
+
export type { ImplementDetail }
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { lane_breakdown, type Breakdown, type Segment, type Stage } from './lane-breakdown'
|
|
2
|
+
import { lane_breakdown_implement } from './lane-breakdown-implement'
|
|
3
|
+
import { lane_ledger, type LedgerEntry } from './lane-ledger'
|
|
4
|
+
import type { ToolCall } from './lane-transcript-calls'
|
|
5
|
+
|
|
6
|
+
// What each ship stage of a lane's breakdown spent its time on (joshuafolkken/kit#5294): the laps the
|
|
7
|
+
// ship wrote for its inner steps (`run-ship-lap.ts`), the lane's core-budget waits and the checks of
|
|
8
|
+
// the lane's gates, each under the stage it ended in, and the time between two ship stages split by
|
|
9
|
+
// the Bash the lane child ran there, by the implementation's kinds (`lane-breakdown-implement.ts`).
|
|
10
|
+
// A lap and a wait or a check inside it overlap — the gate's wait for cores and its checks, run side
|
|
11
|
+
// by side, are part of its `josh gate` lap — so a stage's laps can add up to more.
|
|
12
|
+
|
|
13
|
+
const { KIND } = lane_ledger
|
|
14
|
+
const CORE_WAIT_STEP = 'core-budget wait'
|
|
15
|
+
|
|
16
|
+
// Each stage's laps, longest first, keyed by the stage's name in the breakdown.
|
|
17
|
+
type Laps = ReadonlyMap<string, ReadonlyArray<Stage>>
|
|
18
|
+
|
|
19
|
+
interface Placed {
|
|
20
|
+
at_ms: number
|
|
21
|
+
part: Stage
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function lap_of(entry: LedgerEntry, issue: number): ReadonlyArray<Placed> {
|
|
25
|
+
if (entry.kind !== KIND.SHIP_LAP || entry.issue !== issue) return []
|
|
26
|
+
|
|
27
|
+
return [{ at_ms: Date.parse(entry.at), part: { name: entry.step, ms: entry.elapsed_ms } }]
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function wait_of(entry: LedgerEntry, issue: number): ReadonlyArray<Placed> {
|
|
31
|
+
if (entry.kind !== KIND.CORE_WAIT || entry.issue !== issue) return []
|
|
32
|
+
|
|
33
|
+
return [{ at_ms: Date.parse(entry.at), part: { name: CORE_WAIT_STEP, ms: entry.waited_ms } }]
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Each check the lane's gate ran, placed where the gate ended (joshuafolkken/kit#5319). A row with no
|
|
37
|
+
// `issue` — outside a lane, or written before the gate recorded it — is no lane's; a reused check
|
|
38
|
+
// started nothing, so its zero is no time spent.
|
|
39
|
+
function checks_of(entry: LedgerEntry, issue: number): ReadonlyArray<Placed> {
|
|
40
|
+
if (entry.kind !== KIND.GATE || entry.issue !== issue) return []
|
|
41
|
+
const at_ms = Date.parse(entry.at)
|
|
42
|
+
|
|
43
|
+
return (entry.checks ?? [])
|
|
44
|
+
.filter((check) => check.is_reused !== true)
|
|
45
|
+
.map((check) => ({ at_ms, part: { name: check.label, ms: check.elapsed_ms } }))
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// The ship stage a lap, a wait or a check ended in — never the time between stages, which the ship runs nothing in.
|
|
49
|
+
function stage_at(segments: ReadonlyArray<Segment>, at_ms: number): string | undefined {
|
|
50
|
+
const segment = segments.find((span) => at_ms > span.from_ms && at_ms <= span.to_ms)
|
|
51
|
+
|
|
52
|
+
return segment?.stage === lane_breakdown.BETWEEN_STAGE ? undefined : segment?.stage
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function grouped(
|
|
56
|
+
placed: ReadonlyArray<Placed>,
|
|
57
|
+
segments: ReadonlyArray<Segment>,
|
|
58
|
+
): Map<string, Array<Stage>> {
|
|
59
|
+
const groups = new Map<string, Array<Stage>>()
|
|
60
|
+
|
|
61
|
+
for (const { at_ms, part } of placed) {
|
|
62
|
+
const stage = stage_at(segments, at_ms)
|
|
63
|
+
|
|
64
|
+
if (stage !== undefined) groups.set(stage, [...(groups.get(stage) ?? []), part])
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return groups
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function between_of(
|
|
71
|
+
calls: ReadonlyArray<ToolCall>,
|
|
72
|
+
segments: ReadonlyArray<Segment>,
|
|
73
|
+
): Array<Stage> {
|
|
74
|
+
const between = segments.filter((segment) => segment.stage === lane_breakdown.BETWEEN_STAGE)
|
|
75
|
+
|
|
76
|
+
return lane_breakdown_implement.bash_kinds(calls, between)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** `issue`'s ship stages split by their laps, and the time between them by the lane child's Bash. */
|
|
80
|
+
function of(
|
|
81
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
82
|
+
issue: number,
|
|
83
|
+
breakdown: Breakdown,
|
|
84
|
+
calls: ReadonlyArray<ToolCall>,
|
|
85
|
+
): Laps {
|
|
86
|
+
const placed = entries.flatMap((entry) => [
|
|
87
|
+
...lap_of(entry, issue),
|
|
88
|
+
...wait_of(entry, issue),
|
|
89
|
+
...checks_of(entry, issue),
|
|
90
|
+
])
|
|
91
|
+
const laps = new Map(
|
|
92
|
+
[...grouped(placed, breakdown.ship)].map(([stage, parts]) => [
|
|
93
|
+
stage,
|
|
94
|
+
lane_breakdown.ranked(parts),
|
|
95
|
+
]),
|
|
96
|
+
)
|
|
97
|
+
const between = between_of(calls, breakdown.ship)
|
|
98
|
+
|
|
99
|
+
if (between.length > 0) laps.set(lane_breakdown.BETWEEN_STAGE, between)
|
|
100
|
+
|
|
101
|
+
return laps
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const lane_breakdown_laps = { CORE_WAIT_STEP, of }
|
|
105
|
+
|
|
106
|
+
export { lane_breakdown_laps }
|
|
107
|
+
export type { Laps }
|