@joshuafolkken/kit 1.1514.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process'
|
|
2
|
+
import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
3
|
+
import { lane_child_marker } from './lane-child-marker'
|
|
4
|
+
|
|
5
|
+
// Each process's lane mark — the `JOSH_LANE_CHILD` it inherited — read from `ps -E`
|
|
6
|
+
// (joshuafolkken/kit#4315).
|
|
7
|
+
//
|
|
8
|
+
// **A process belongs to a lane by its mark wherever it runs.** A lane child that measures something
|
|
9
|
+
// from the main checkout or `/tmp` leaves processes whose working directory is not under the lane, and
|
|
10
|
+
// one started under `script` or a new session has left the child's tree and group for pid 1. The
|
|
11
|
+
// environment survives all of that, and `lane:dispatch` puts the issue number in it
|
|
12
|
+
// (`lane-child-marker.ts`), so the mark names the lane a process was started from.
|
|
13
|
+
//
|
|
14
|
+
// **The mark is read from the environment, never from the arguments.** `ps -E` appends the environment
|
|
15
|
+
// to the command line, so the plain command line is read too and only what follows it is searched: a
|
|
16
|
+
// `grep JOSH_LANE_CHILD=42` carries the text without the mark.
|
|
17
|
+
//
|
|
18
|
+
// **An application bundle is never marked.** A lane that opened Docker Desktop passed its environment
|
|
19
|
+
// to an application the whole machine uses; it is a person's, not the lane's.
|
|
20
|
+
//
|
|
21
|
+
// **macOS alone**, as `process-directories.ts` reads it: elsewhere nothing is listed.
|
|
22
|
+
|
|
23
|
+
const PS_COMMAND = '/bin/ps'
|
|
24
|
+
const LISTING_ARGUMENTS = ['-A', '-ww', '-o', 'pid=,command=']
|
|
25
|
+
const ENVIRONMENT_FLAG = '-E'
|
|
26
|
+
// `ps -E` over every process runs to hundreds of kilobytes; the default 1 MiB would cut it short.
|
|
27
|
+
const LISTING_BUFFER_BYTES = 67_108_864
|
|
28
|
+
const PID_LINE = /^\s*(?<pid>\d+) (?<command>.*)$/u
|
|
29
|
+
const APPLICATION_BUNDLE = '.app/Contents/'
|
|
30
|
+
const LISTING_PLATFORMS: ReadonlySet<NodeJS.Platform> = new Set(['darwin'])
|
|
31
|
+
const MARK = new RegExp(String.raw`(?:^|\s)${lane_child_marker.KEY}=(?<issue>\d+)(?=\s|$)`, 'u')
|
|
32
|
+
|
|
33
|
+
function command_lines(printed: string): Map<number, string> {
|
|
34
|
+
const groups = printed.split('\n').map((line) => PID_LINE.exec(line)?.groups)
|
|
35
|
+
|
|
36
|
+
return new Map(
|
|
37
|
+
groups
|
|
38
|
+
.filter((group) => group !== undefined)
|
|
39
|
+
.map((group) => [Number(group['pid']), group['command'] ?? '']),
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// What `ps -E` printed after the plain command line; `undefined` for an application bundle and for a
|
|
44
|
+
// process the two listings disagree on (it ended or exec'd between them).
|
|
45
|
+
function environment_of(command: string | undefined, with_environment: string): string | undefined {
|
|
46
|
+
if (command === undefined || command.includes(APPLICATION_BUNDLE)) return undefined
|
|
47
|
+
|
|
48
|
+
return with_environment.startsWith(command) ? with_environment.slice(command.length) : undefined
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function mark_of(command: string | undefined, with_environment: string): string | undefined {
|
|
52
|
+
const environment = environment_of(command, with_environment)
|
|
53
|
+
|
|
54
|
+
return environment === undefined ? undefined : MARK.exec(environment)?.groups?.['issue']
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Each marked process's issue, from `ps`'s plain and `-E` listings. */
|
|
58
|
+
function parse(plain: string, with_environment: string): Map<number, string> {
|
|
59
|
+
const commands = command_lines(plain)
|
|
60
|
+
const marks = [...command_lines(with_environment)].map(
|
|
61
|
+
([pid, line]) => [pid, mark_of(commands.get(pid), line)] as const,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
return new Map(marks.filter((pair): pair is [number, string] => pair[1] !== undefined))
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function listing(arguments_: ReadonlyArray<string>): string | undefined {
|
|
68
|
+
const result = spawnSync(PS_COMMAND, arguments_, {
|
|
69
|
+
encoding: 'utf8',
|
|
70
|
+
maxBuffer: LISTING_BUFFER_BYTES,
|
|
71
|
+
timeout: PROBE_TIMEOUT_MS,
|
|
72
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
return result.error === undefined ? result.stdout : undefined
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Every marked process's issue, `undefined` where `ps` could not be run or timed out — never read as
|
|
80
|
+
* "nothing marked".
|
|
81
|
+
*/
|
|
82
|
+
function list_all(platform: NodeJS.Platform = process.platform): Map<number, string> | undefined {
|
|
83
|
+
if (!LISTING_PLATFORMS.has(platform)) return new Map()
|
|
84
|
+
const plain = listing(LISTING_ARGUMENTS)
|
|
85
|
+
const with_environment = listing([ENVIRONMENT_FLAG, ...LISTING_ARGUMENTS])
|
|
86
|
+
|
|
87
|
+
if (plain === undefined || with_environment === undefined) return undefined
|
|
88
|
+
|
|
89
|
+
return parse(plain, with_environment)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const process_lane_marks = { list_all, parse }
|
|
93
|
+
|
|
94
|
+
export { process_lane_marks }
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto'
|
|
2
|
+
import { chmodSync, mkdirSync, renameSync, rmSync, writeFileSync } from 'node:fs'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
|
|
5
|
+
// Replacing a file so a concurrent reader sees the old content or the new, never half of either.
|
|
6
|
+
//
|
|
7
|
+
// The content is written to a staging file and renamed over the target; `rename` swaps the path
|
|
8
|
+
// itself, so a reader that opened the old file keeps reading it. **The staging name is unique per
|
|
9
|
+
// write** — process id and a random UUID — because two writers sharing one name interleave their bytes
|
|
10
|
+
// into the same staging file and both rename the mix into place. Create-exclusively refuses a name
|
|
11
|
+
// someone else already holds rather than writing through it, and the `finally` removes the staging
|
|
12
|
+
// file on every failing path. The `.tmp` ending keeps it out of a directory scan that matches the
|
|
13
|
+
// target's own extension.
|
|
14
|
+
|
|
15
|
+
const STAGING_EXTENSION = '.tmp'
|
|
16
|
+
const CREATE_EXCLUSIVE_FLAG = 'wx'
|
|
17
|
+
|
|
18
|
+
interface AtomicWriteOptions {
|
|
19
|
+
// Given to the create, so a private file is never readable at another mode in between, and
|
|
20
|
+
// applied again with `chmod`, so the umask cannot narrow it.
|
|
21
|
+
readonly mode?: number
|
|
22
|
+
// Where the staging file is written; the target's directory by default. It must sit on the
|
|
23
|
+
// target's filesystem for the rename to stay atomic.
|
|
24
|
+
readonly staging_directory?: string
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function staging_path(target: string, staging_directory: string): string {
|
|
28
|
+
const name = `${path.basename(target)}.${String(process.pid)}.${randomUUID()}${STAGING_EXTENSION}`
|
|
29
|
+
|
|
30
|
+
return path.join(staging_directory, name)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function write_staged(staging: string, content: string | Uint8Array, mode?: number): void {
|
|
34
|
+
writeFileSync(staging, content, {
|
|
35
|
+
flag: CREATE_EXCLUSIVE_FLAG,
|
|
36
|
+
...(mode !== undefined && { mode }),
|
|
37
|
+
})
|
|
38
|
+
if (mode !== undefined) chmodSync(staging, mode)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function replace_file(
|
|
42
|
+
target: string,
|
|
43
|
+
content: string | Uint8Array,
|
|
44
|
+
options: AtomicWriteOptions = {},
|
|
45
|
+
): void {
|
|
46
|
+
const directory = options.staging_directory ?? path.dirname(target)
|
|
47
|
+
const staging = staging_path(target, directory)
|
|
48
|
+
|
|
49
|
+
mkdirSync(directory, { recursive: true })
|
|
50
|
+
|
|
51
|
+
try {
|
|
52
|
+
write_staged(staging, content, options.mode)
|
|
53
|
+
renameSync(staging, target)
|
|
54
|
+
} finally {
|
|
55
|
+
rmSync(staging, { force: true })
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const atomic_write = { replace_file }
|
|
60
|
+
|
|
61
|
+
export { atomic_write }
|
|
62
|
+
export type { AtomicWriteOptions }
|
|
@@ -69,6 +69,16 @@ function collect_output(all: string, reason: ReadonlyArray<string>): string {
|
|
|
69
69
|
return [all, ...reason].filter((part) => part !== '').join('\n')
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
+
// A buffered child writes to a pipe, so it is told to keep its colors unless the caller opted out.
|
|
73
|
+
// Exported for the eslint daemon route (`eslint-daemon.ts`), which buffers the same way.
|
|
74
|
+
function child_environment(): NodeJS.ProcessEnv {
|
|
75
|
+
const environment = { ...process.env }
|
|
76
|
+
if (environment['NO_COLOR'] === undefined) environment['FORCE_COLOR'] = FORCE_COLOR
|
|
77
|
+
else delete environment['FORCE_COLOR']
|
|
78
|
+
|
|
79
|
+
return environment
|
|
80
|
+
}
|
|
81
|
+
|
|
72
82
|
async function run_buffered_process(
|
|
73
83
|
command_args: ReadonlyArray<string>,
|
|
74
84
|
options: BufferedProcessOptions = {},
|
|
@@ -76,14 +86,11 @@ async function run_buffered_process(
|
|
|
76
86
|
// `performance.now()` rather than `Date.now()`: it is monotonic, so a system clock adjusted
|
|
77
87
|
// mid-check cannot produce a negative or wildly inflated duration.
|
|
78
88
|
const started_at = performance.now()
|
|
79
|
-
const environment = { ...process.env }
|
|
80
|
-
if (environment['NO_COLOR'] === undefined) environment['FORCE_COLOR'] = FORCE_COLOR
|
|
81
|
-
else delete environment['FORCE_COLOR']
|
|
82
89
|
// `cwd` is spread in rather than assigned: `exactOptionalPropertyTypes` refuses an explicit
|
|
83
90
|
// `undefined` for an optional `string`, and passing one anyway breaks execa's overload
|
|
84
91
|
// resolution — which silently widens `result.all` back to `string | undefined`.
|
|
85
92
|
const result = await execa(PNPM, [...command_args], {
|
|
86
|
-
env:
|
|
93
|
+
env: child_environment(),
|
|
87
94
|
extendEnv: false,
|
|
88
95
|
all: true,
|
|
89
96
|
reject: false,
|
|
@@ -104,7 +111,7 @@ function is_process_failed(result: Pick<BufferedProcessResult, 'exit_code'>): bo
|
|
|
104
111
|
return result.exit_code !== 0
|
|
105
112
|
}
|
|
106
113
|
|
|
107
|
-
const buffered_process = { is_process_failed, run_buffered_process }
|
|
114
|
+
const buffered_process = { child_environment, is_process_failed, run_buffered_process }
|
|
108
115
|
|
|
109
116
|
export type { BufferedProcessResult }
|
|
110
117
|
export { buffered_process, FAIL_EXIT_CODE }
|
package/scripts/lib/cli-flags.ts
CHANGED
|
@@ -152,7 +152,59 @@ function attach_values(
|
|
|
152
152
|
return attached
|
|
153
153
|
}
|
|
154
154
|
|
|
155
|
+
// Digits and nothing else. `Number('')`, `Number(' ')` and `Number('0x10')` are all safe integers, so a
|
|
156
|
+
// check that only asked `Number.isSafeInteger` would read an unset shell variable — `--max
|
|
157
|
+
// "$max_issues"` — as zero. The magnitude check is separate because the pattern bounds nothing: a
|
|
158
|
+
// number past the safe range would be read as a different number.
|
|
159
|
+
const COUNT_PATTERN = /^\d+$/u
|
|
160
|
+
// Whole and positive: `0`, a sign, a decimal point and anything not a digit are refused.
|
|
161
|
+
const POSITIVE_PATTERN = /^[1-9]\d*$/u
|
|
162
|
+
|
|
163
|
+
// The value a positive-integer setting answers, or why it could not be read. A problem rather than a
|
|
164
|
+
// throw: the caller decides whether a bad setting ends the command or is reported and worked around.
|
|
165
|
+
type PositiveSetting = { kind: 'limit'; limit: number } | { kind: 'problem'; problem: string }
|
|
166
|
+
|
|
167
|
+
function to_integer(raw: string | undefined, pattern: RegExp): number | undefined {
|
|
168
|
+
if (raw === undefined || !pattern.test(raw)) return undefined
|
|
169
|
+
|
|
170
|
+
const parsed = Number(raw)
|
|
171
|
+
|
|
172
|
+
return Number.isSafeInteger(parsed) ? parsed : undefined
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// A count flag's value — zero or more — or `undefined` when it is absent or not a count.
|
|
176
|
+
function to_count(raw: string | undefined): number | undefined {
|
|
177
|
+
return to_integer(raw, COUNT_PATTERN)
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// A value that must be one or more, or `undefined` when it is absent or not.
|
|
181
|
+
function to_positive(raw: string | undefined): number | undefined {
|
|
182
|
+
return to_integer(raw, POSITIVE_PATTERN)
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// A positive-integer setting read from the environment or an argument. Blank is unset, not invalid — an
|
|
186
|
+
// `.env` line left as `KEY=` is a setting nobody configured — and answers `fallback`. Anything else that
|
|
187
|
+
// is not a positive integer is a problem naming `name`, never a silent fall back to the default: a typo
|
|
188
|
+
// that quietly became the default is a number nobody chose.
|
|
189
|
+
function read_positive_setting(
|
|
190
|
+
raw: string | undefined,
|
|
191
|
+
name: string,
|
|
192
|
+
fallback: number,
|
|
193
|
+
): PositiveSetting {
|
|
194
|
+
const trimmed = raw?.trim() ?? ''
|
|
195
|
+
|
|
196
|
+
if (trimmed === '') return { kind: 'limit', limit: fallback }
|
|
197
|
+
|
|
198
|
+
const limit = to_positive(trimmed)
|
|
199
|
+
if (limit !== undefined) return { kind: 'limit', limit }
|
|
200
|
+
|
|
201
|
+
return { kind: 'problem', problem: `${name} must be a positive integer, not "${trimmed}"` }
|
|
202
|
+
}
|
|
203
|
+
|
|
155
204
|
const cli_flags = {
|
|
205
|
+
to_count,
|
|
206
|
+
to_positive,
|
|
207
|
+
read_positive_setting,
|
|
156
208
|
attach_values,
|
|
157
209
|
usage_line,
|
|
158
210
|
refuse_unknown_flags,
|
|
@@ -167,3 +219,4 @@ const cli_flags = {
|
|
|
167
219
|
}
|
|
168
220
|
|
|
169
221
|
export { cli_flags }
|
|
222
|
+
export type { PositiveSetting }
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
|
|
2
|
+
|
|
3
|
+
// The figures the reports print — a dollar amount, a token count, a percentage share, a duration in
|
|
4
|
+
// minutes and a local wall clock — and the precision each uses. The cost reports, `josh time`'s
|
|
5
|
+
// reports, `run:board` and the run event pane all render these, so each is written once here.
|
|
6
|
+
|
|
7
|
+
const USD_DECIMALS = 4
|
|
8
|
+
const PERCENT_SCALE = 100
|
|
9
|
+
const PERCENT_DECIMALS = 1
|
|
10
|
+
const MINUTE_DECIMALS = 1
|
|
11
|
+
const CLOCK_WIDTH = 2
|
|
12
|
+
const CLOCK_PAD = '0'
|
|
13
|
+
|
|
14
|
+
// The caller names the decimals where its figure rounds to another place — a run total to the cent.
|
|
15
|
+
function format_usd(usd: number, decimals: number = USD_DECIMALS): string {
|
|
16
|
+
return `$${usd.toFixed(decimals)}`
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function format_tokens(count: number): string {
|
|
20
|
+
return count.toLocaleString('en-US')
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function format_share(part: number, whole: number): string {
|
|
24
|
+
if (whole === 0) return 'n/a'
|
|
25
|
+
|
|
26
|
+
return `${((part / whole) * PERCENT_SCALE).toFixed(PERCENT_DECIMALS)}%`
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function format_minutes(duration_ms: number): string {
|
|
30
|
+
return `${(duration_ms / MS_PER_MINUTE).toFixed(MINUTE_DECIMALS)} min`
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function two_digits(value: number): string {
|
|
34
|
+
return String(value).padStart(CLOCK_WIDTH, CLOCK_PAD)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// The local wall-clock `HH:MM:SS` of a moment.
|
|
38
|
+
function clock_of(ms: number): string {
|
|
39
|
+
const date = new Date(ms)
|
|
40
|
+
|
|
41
|
+
return [date.getHours(), date.getMinutes(), date.getSeconds()]
|
|
42
|
+
.map((value) => two_digits(value))
|
|
43
|
+
.join(':')
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// The local wall-clock `HH:MM` of a moment, for one a person reads to the minute.
|
|
47
|
+
function minute_of(ms: number): string {
|
|
48
|
+
const date = new Date(ms)
|
|
49
|
+
|
|
50
|
+
return [date.getHours(), date.getMinutes()].map((value) => two_digits(value)).join(':')
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const figure_format = {
|
|
54
|
+
format_usd,
|
|
55
|
+
format_tokens,
|
|
56
|
+
format_share,
|
|
57
|
+
format_minutes,
|
|
58
|
+
two_digits,
|
|
59
|
+
clock_of,
|
|
60
|
+
minute_of,
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export { figure_format }
|
|
@@ -28,12 +28,20 @@ function parse_with<T>(text: string, schema: z.ZodType<T>): T | undefined {
|
|
|
28
28
|
return parsed.success ? parsed.data : undefined
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
+
// The read a listing wants: text that is not JSON and JSON that is not an array both answer
|
|
32
|
+
// `undefined`, so a caller can keep "unreadable" apart from an empty listing.
|
|
33
|
+
function parse_array(text: string): Array<unknown> | undefined {
|
|
34
|
+
const value = parse_or_undefined(text)
|
|
35
|
+
|
|
36
|
+
return Array.isArray(value) ? value : undefined
|
|
37
|
+
}
|
|
38
|
+
|
|
31
39
|
// A plain object, as opposed to an array or a primitive. `typeof null` is `'object'`, and an array
|
|
32
40
|
// answers `'object'` too, so both have to be excluded by hand before a key lookup means anything.
|
|
33
41
|
function is_record(value: unknown): value is Record<string, unknown> {
|
|
34
42
|
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
35
43
|
}
|
|
36
44
|
|
|
37
|
-
const json_value = { parse_or_undefined, parse_with, is_record }
|
|
45
|
+
const json_value = { parse_or_undefined, parse_with, parse_array, is_record }
|
|
38
46
|
|
|
39
47
|
export { json_value }
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import type { z } from 'zod'
|
|
4
|
+
import { json_value } from './json-value'
|
|
5
|
+
import { file_reader } from './read-file'
|
|
6
|
+
|
|
7
|
+
// The one place a `package.json` is named and read. Readers across `scripts/` had each spelled the
|
|
8
|
+
// file name and written their own read-then-parse; they now ask here, and choose only how a manifest
|
|
9
|
+
// that cannot be read answers.
|
|
10
|
+
const PACKAGE_JSON = 'package.json'
|
|
11
|
+
|
|
12
|
+
function manifest_path(directory: string): string {
|
|
13
|
+
return path.join(directory, PACKAGE_JSON)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// For a manifest that must exist: a missing file, text that is not JSON and a shape the schema
|
|
17
|
+
// rejects all throw, so the defect surfaces where it was met.
|
|
18
|
+
function read_manifest<T>(directory: string, schema: z.ZodType<T>): T {
|
|
19
|
+
const text = readFileSync(manifest_path(directory), 'utf8')
|
|
20
|
+
|
|
21
|
+
return schema.parse(JSON.parse(text))
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// For a manifest that may be absent or broken without that being this reader's failure: every one of
|
|
25
|
+
// those answers `undefined`.
|
|
26
|
+
function read_manifest_if_valid<T>(directory: string, schema: z.ZodType<T>): T | undefined {
|
|
27
|
+
const text = file_reader.read_if_readable(manifest_path(directory))
|
|
28
|
+
if (text === undefined) return undefined
|
|
29
|
+
|
|
30
|
+
return json_value.parse_with(text, schema)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const package_manifest = { manifest_path, read_manifest, read_manifest_if_valid }
|
|
34
|
+
|
|
35
|
+
export { PACKAGE_JSON, package_manifest }
|
package/scripts/lib/poll.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// One
|
|
1
|
+
// One polling loop — bounded by attempts, or ended only by its read — and one sleep, in one place.
|
|
2
2
|
//
|
|
3
3
|
// **Three modules had already written the same three-line `sleep`** — `gh/git-pr-checks.ts`,
|
|
4
4
|
// `eval/eval-run.ts` and `propagate/propagate-publish.ts` — and the release command's tag watch
|
|
@@ -24,9 +24,6 @@ interface PollOptions {
|
|
|
24
24
|
sleeper?: (duration_ms: number) => Promise<void>
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
// **True as soon as `is_done` answers true, false when the attempts run out.** The first attempt runs
|
|
28
|
-
// before any wait, so a condition already met costs nothing — which is the common case for a tag that
|
|
29
|
-
// was created while the command was doing something else.
|
|
30
27
|
// **The wait goes between attempts, never after the last one**, so the budget a caller computes from
|
|
31
28
|
// `attempts × interval_ms` is the budget it actually spends. The pre-existing merge-gate loop in
|
|
32
29
|
// `git-pr-checks.ts` guards its sleep the same way; extracted here so the loop keeps one branch.
|
|
@@ -39,21 +36,53 @@ async function wait_between(
|
|
|
39
36
|
if (attempt < attempts - 1) await wait(interval_ms)
|
|
40
37
|
}
|
|
41
38
|
|
|
42
|
-
|
|
39
|
+
type WaitOptions = Omit<PollOptions, 'attempts'>
|
|
40
|
+
|
|
41
|
+
// **The first value `read` answers, `undefined` when the attempts run out.** `undefined` is "not yet",
|
|
42
|
+
// so a read that reaches a verdict — success or failure — answers it and the loop ends there.
|
|
43
|
+
async function poll_for<T>(
|
|
44
|
+
read: () => Promise<T | undefined> | T | undefined,
|
|
45
|
+
options: PollOptions,
|
|
46
|
+
): Promise<T | undefined> {
|
|
43
47
|
const wait = options.sleeper ?? sleep
|
|
44
48
|
|
|
45
49
|
for (let attempt = 0; attempt < options.attempts; attempt += 1) {
|
|
46
50
|
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
47
|
-
|
|
51
|
+
const value = await read()
|
|
52
|
+
if (value !== undefined) return value
|
|
48
53
|
|
|
49
54
|
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
50
55
|
await wait_between(wait, options.interval_ms, attempt, options.attempts)
|
|
51
56
|
}
|
|
52
57
|
|
|
53
|
-
return
|
|
58
|
+
return undefined
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// **True as soon as `is_done` answers true, false when the attempts run out.** The first attempt runs
|
|
62
|
+
// before any wait, so a condition already met costs nothing — which is the common case for a tag that
|
|
63
|
+
// was created while the command was doing something else.
|
|
64
|
+
async function poll_until(
|
|
65
|
+
is_done: () => Promise<boolean> | boolean,
|
|
66
|
+
options: PollOptions,
|
|
67
|
+
): Promise<boolean> {
|
|
68
|
+
const is_reached = await poll_for(async () => ((await is_done()) ? true : undefined), options)
|
|
69
|
+
|
|
70
|
+
return is_reached === true
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// **A wait that ends only when `read` answers** — a child process exiting, a ship leaving `running`.
|
|
74
|
+
// Its bound, if any, is the read's own: a wall-clock deadline the read answers with its failure.
|
|
75
|
+
async function wait_for<T>(
|
|
76
|
+
read: () => Promise<T | undefined> | T | undefined,
|
|
77
|
+
options: WaitOptions,
|
|
78
|
+
): Promise<T> {
|
|
79
|
+
const value = await poll_for(read, { ...options, attempts: Infinity })
|
|
80
|
+
if (value === undefined) throw new Error('an unbounded poll ran out of attempts')
|
|
81
|
+
|
|
82
|
+
return value
|
|
54
83
|
}
|
|
55
84
|
|
|
56
|
-
const poll = { poll_until, sleep }
|
|
85
|
+
const poll = { poll_for, poll_until, sleep, wait_for }
|
|
57
86
|
|
|
58
87
|
export { poll }
|
|
59
|
-
export type { PollOptions }
|
|
88
|
+
export type { PollOptions, WaitOptions }
|
package/scripts/lib/read-file.ts
CHANGED
|
@@ -2,6 +2,8 @@ import { readFileSync } from 'node:fs'
|
|
|
2
2
|
|
|
3
3
|
const ABSENT_CODE = 'ENOENT'
|
|
4
4
|
|
|
5
|
+
// Whether a filesystem error says "there is nothing here" — ENOENT and nothing else. A permission
|
|
6
|
+
// error or ENOTDIR says something is there, so neither reads as absent.
|
|
5
7
|
function is_absent(error: unknown): boolean {
|
|
6
8
|
return error instanceof Error && 'code' in error && error.code === ABSENT_CODE
|
|
7
9
|
}
|
|
@@ -35,6 +37,6 @@ function read_if_readable(path: string): string | undefined {
|
|
|
35
37
|
}
|
|
36
38
|
}
|
|
37
39
|
|
|
38
|
-
const file_reader = { read_optional, read_file_or_empty, read_if_readable }
|
|
40
|
+
const file_reader = { is_absent, read_optional, read_file_or_empty, read_if_readable }
|
|
39
41
|
|
|
40
42
|
export { file_reader }
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Both steps run to their end before either's failure is thrown, so neither is left half-done behind
|
|
2
|
+
// the other's failure. The first step's failure is thrown when both failed.
|
|
3
|
+
async function settled_together(first: Promise<void>, second: Promise<void>): Promise<void> {
|
|
4
|
+
const [result, other] = await Promise.allSettled([first, second])
|
|
5
|
+
|
|
6
|
+
if (result.status === 'rejected') throw result.reason
|
|
7
|
+
if (other.status === 'rejected') throw other.reason
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export { settled_together }
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// One word for a POSIX shell, in single quotes, so a `$`, a backtick or a `"` in it is never expanded
|
|
2
|
+
// or ends the word: a quote inside closes the word, adds an escaped quote and reopens it.
|
|
3
|
+
|
|
4
|
+
const QUOTE = "'"
|
|
5
|
+
const ESCAPED_QUOTE = String.raw`'\''`
|
|
6
|
+
|
|
7
|
+
function single_quoted(text: string): string {
|
|
8
|
+
return QUOTE + text.split(QUOTE).join(ESCAPED_QUOTE) + QUOTE
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// A token of only these characters means the same to the shell quoted or not, so it is left bare.
|
|
12
|
+
const BARE_WORD = /^[\w%+,./:=@-]+$/u
|
|
13
|
+
|
|
14
|
+
// `token` as one shell word: bare when quoting would change nothing, single-quoted otherwise.
|
|
15
|
+
function word(token: string): string {
|
|
16
|
+
return BARE_WORD.test(token) ? token : single_quoted(token)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const shell_quote = { single_quoted, word }
|
|
20
|
+
|
|
21
|
+
export { shell_quote }
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { lstatSync } from 'node:fs'
|
|
2
|
+
|
|
3
|
+
// An answer remembered per key, recomputed only when the key's stamp changes (joshuafolkken/kit#4263).
|
|
4
|
+
//
|
|
5
|
+
// **`run:board` redraws every second, and most of what it reads has not changed since the last
|
|
6
|
+
// redraw.** A process's app name, a ledger's parsed lines and a work tree's git config were computed
|
|
7
|
+
// again on every pass, and on a saturated machine those passes stopped the spinner for 45–200ms. The
|
|
8
|
+
// stamp is what says "this has changed": a file's `file_stamp`, or a constant where the key alone
|
|
9
|
+
// decides the answer.
|
|
10
|
+
|
|
11
|
+
const NO_STAMP = ''
|
|
12
|
+
const STAMP_SEPARATOR = ':'
|
|
13
|
+
|
|
14
|
+
interface Remembered<Value> {
|
|
15
|
+
stamp: string
|
|
16
|
+
value: Value
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
interface StampedMemo<Value> {
|
|
20
|
+
// `compute`'s answer for `key`, run only when `key` was never seen or its stamp moved since.
|
|
21
|
+
of: (key: string, stamp: string, compute: () => Value) => Value
|
|
22
|
+
// Forget every key outside `keys` — a process gone from the table, so the memo cannot grow unbounded.
|
|
23
|
+
keep: (keys: ReadonlySet<string>) => void
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function create<Value>(): StampedMemo<Value> {
|
|
27
|
+
const answers = new Map<string, Remembered<Value>>()
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
of(key, stamp, compute) {
|
|
31
|
+
const known = answers.get(key)
|
|
32
|
+
|
|
33
|
+
if (known?.stamp === stamp) return known.value
|
|
34
|
+
|
|
35
|
+
const value = compute()
|
|
36
|
+
|
|
37
|
+
answers.set(key, { stamp, value })
|
|
38
|
+
|
|
39
|
+
return value
|
|
40
|
+
},
|
|
41
|
+
keep(keys) {
|
|
42
|
+
for (const key of answers.keys()) if (!keys.has(key)) answers.delete(key)
|
|
43
|
+
},
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// What changes when a file is rewritten, appended to, replaced or re-owned: its inode, its modification
|
|
48
|
+
// and change times and its size. An absent or unreadable file is `NO_STAMP`, so it reads again once
|
|
49
|
+
// it appears.
|
|
50
|
+
function file_stamp(file: string): string {
|
|
51
|
+
try {
|
|
52
|
+
const status = lstatSync(file)
|
|
53
|
+
|
|
54
|
+
return [status.ino, status.mtimeMs, status.ctimeMs, status.size].join(STAMP_SEPARATOR)
|
|
55
|
+
} catch {
|
|
56
|
+
return NO_STAMP
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const stamped_memo = { NO_STAMP, create, file_stamp }
|
|
61
|
+
|
|
62
|
+
export { stamped_memo }
|
|
63
|
+
export type { StampedMemo }
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Runs work whose own reports go to stdout with stdout pointed at stderr, for a caller whose stdout is
|
|
2
|
+
// a contract: the `Stop` hook's decision envelope, and `josh run:hold`'s single verdict token.
|
|
3
|
+
|
|
4
|
+
type StreamWrite = typeof process.stdout.write
|
|
5
|
+
|
|
6
|
+
function set_stdout_write(stream_write: StreamWrite): void {
|
|
7
|
+
process.stdout.write = stream_write
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
async function run<T>(work: () => Promise<T>): Promise<T> {
|
|
11
|
+
const saved = { write: process.stdout.write.bind(process.stdout) }
|
|
12
|
+
|
|
13
|
+
set_stdout_write(process.stderr.write.bind(process.stderr))
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
return await work()
|
|
17
|
+
} finally {
|
|
18
|
+
set_stdout_write(saved.write)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const stdout_on_stderr = { run }
|
|
23
|
+
|
|
24
|
+
export { stdout_on_stderr }
|
package/scripts/lib/timeouts.ts
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
// limit stays stuck where it stopped and never comes back, so every such
|
|
4
4
|
// call takes one of these, and a value used in more than one place is named once here.
|
|
5
5
|
|
|
6
|
+
// The unit conversions every duration is read and printed through. They sit beside the limits because a
|
|
7
|
+
// limit is the most common thing they convert; a second copy in a caller is a clone of these two lines.
|
|
8
|
+
const MS_PER_SECOND = 1000
|
|
9
|
+
const SECONDS_PER_MINUTE = 60
|
|
10
|
+
const MS_PER_MINUTE = MS_PER_SECOND * SECONDS_PER_MINUTE
|
|
11
|
+
|
|
6
12
|
// A probe that only asks the local machine (`ps`, `lsof`, `git config`) on a path something else is
|
|
7
13
|
// waiting on. Failing answers "cannot tell", which every caller handles, so anything slower is a fault.
|
|
8
14
|
const PROBE_TIMEOUT_MS = 2000
|
|
@@ -41,6 +47,9 @@ export {
|
|
|
41
47
|
HOOK_PROCESS_TIMEOUT_MS,
|
|
42
48
|
INSTALL_TIMEOUT_MS,
|
|
43
49
|
LINT_TIMEOUT_MS,
|
|
50
|
+
MS_PER_MINUTE,
|
|
51
|
+
MS_PER_SECOND,
|
|
44
52
|
PROBE_TIMEOUT_MS,
|
|
53
|
+
SECONDS_PER_MINUTE,
|
|
45
54
|
SUITE_TIMEOUT_MS,
|
|
46
55
|
}
|