@joshuafolkken/kit 1.1514.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises'
|
|
2
|
-
import { availableParallelism, cpus, totalmem } from 'node:os'
|
|
2
|
+
import { availableParallelism, cpus, loadavg, totalmem } from 'node:os'
|
|
3
3
|
import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
4
4
|
import { execa } from 'execa'
|
|
5
5
|
|
|
@@ -32,12 +32,12 @@ import { execa } from 'execa'
|
|
|
32
32
|
// The window the busy cores are measured over: long enough that one scheduler tick does not dominate it,
|
|
33
33
|
// short enough that a solo admission is not visibly delayed.
|
|
34
34
|
const SAMPLE_WINDOW_MS = 250
|
|
35
|
-
// **
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
//
|
|
40
|
-
const
|
|
35
|
+
// **Run-queue load outside the ledger past this many times the cores holds the first waiter too**
|
|
36
|
+
// (joshuafolkken/kit#4361). The first waiter ignores outside load (joshuafolkken/kit#4313), and lanes took
|
|
37
|
+
// the 11-core machine to a load average of 25–34. Twice the cores is loose on purpose: the one-core
|
|
38
|
+
// editor load #4313 stopped holding a solo gate stays far below it, so neither its starvation nor the
|
|
39
|
+
// lanes' speed comes back, while a machine whose queue beyond the ledger passes two per core waits.
|
|
40
|
+
const OVERLOAD_FACTOR = 2
|
|
41
41
|
const BYTES_PER_MB = 1_048_576
|
|
42
42
|
const KB_PER_MB = 1024
|
|
43
43
|
const PERCENT = 100
|
|
@@ -62,7 +62,10 @@ const PAGE_SIZE_NAME = 'hw.pagesize'
|
|
|
62
62
|
// The kernel's memory-pressure verdict — 1 normal, 2 warning, 4 critical — the one Activity Monitor
|
|
63
63
|
// colors its "memory pressure" graph by.
|
|
64
64
|
const PRESSURE_NAME = 'kern.memorystatus_vm_pressure_level'
|
|
65
|
-
|
|
65
|
+
// **Only critical holds; warning is sticky** (joshuafolkken/kit#4199). On macOS the verdict can stay at
|
|
66
|
+
// warning for hours after the pressure passed, so a hold on warning never lifts. What is pressured right
|
|
67
|
+
// now shows in the free figure and the swap and compressor traffic; the verdict adds only critical.
|
|
68
|
+
const PRESSURE_HOLD = 4
|
|
66
69
|
// The swap traffic across one window that reads as pressure — 64 MB a second paged to disk. A machine
|
|
67
70
|
// that swapped once still pages a few megabytes back in as old pages are touched.
|
|
68
71
|
const SWAP_PRESSURE_MB = 16
|
|
@@ -81,10 +84,13 @@ const SYSCTL_ARGUMENTS = [
|
|
|
81
84
|
const SYSCTL_LINE = /^(?<name>[\w.]+): (?<value>\d+)$/gmu
|
|
82
85
|
|
|
83
86
|
// `memory_pressured` says why `available_mb` read none, so a claim that waits can name the pressure.
|
|
87
|
+
// `run_queue` is the one-minute load average: the busy cores stop at the core count, so only the queue
|
|
88
|
+
// tells a machine at twice its cores from one at once (`is_overloaded`).
|
|
84
89
|
interface MachineReading {
|
|
85
90
|
busy_cores: number | undefined
|
|
86
91
|
available_mb: number | undefined
|
|
87
92
|
memory_pressured?: boolean | undefined
|
|
93
|
+
run_queue?: number | undefined
|
|
88
94
|
}
|
|
89
95
|
|
|
90
96
|
// The memory half of a reading. `swapped_mb` is a counter — every page swapped in or out since boot —
|
|
@@ -103,10 +109,15 @@ interface LedgerLoad {
|
|
|
103
109
|
memory_mb: number
|
|
104
110
|
}
|
|
105
111
|
|
|
112
|
+
// `busy_excess` is the measured cores beyond what the ledger declares — what `cores` gave up to load the
|
|
113
|
+
// ledger does not hold, so a claim that waits on it can name the CPU as saturated. `is_overloaded` lifts
|
|
114
|
+
// the first waiter's exemption from that load (`core_admission.is_admitted`).
|
|
106
115
|
interface MachineBudget {
|
|
107
116
|
cores: number
|
|
108
117
|
memory_mb: number
|
|
109
118
|
memory_pressured?: boolean | undefined
|
|
119
|
+
busy_excess?: number | undefined
|
|
120
|
+
is_overloaded?: boolean | undefined
|
|
110
121
|
}
|
|
111
122
|
|
|
112
123
|
interface CpuTimes {
|
|
@@ -287,22 +298,23 @@ function moved_over(from: number | undefined, to: number | undefined, limit: num
|
|
|
287
298
|
|
|
288
299
|
function is_pressured(before: MemoryReading, after: MemoryReading): boolean {
|
|
289
300
|
return (
|
|
290
|
-
(after.pressure_level ?? 0) >=
|
|
301
|
+
(after.pressure_level ?? 0) >= PRESSURE_HOLD ||
|
|
291
302
|
moved_over(before.swapped_mb, after.swapped_mb, SWAP_PRESSURE_MB) ||
|
|
292
303
|
moved_over(before.compressed_mb, after.compressed_mb, COMPRESSION_PRESSURE_MB)
|
|
293
304
|
)
|
|
294
305
|
}
|
|
295
306
|
|
|
296
|
-
// **
|
|
297
|
-
//
|
|
298
|
-
//
|
|
299
|
-
//
|
|
300
|
-
//
|
|
301
|
-
//
|
|
302
|
-
|
|
307
|
+
// **Only a reading the kernel calls critical has nothing free to admit against.** Swap and compressor
|
|
308
|
+
// traffic across the window used to answer no free memory too (joshuafolkken/kit#3943), but this machine
|
|
309
|
+
// swaps out 0.4–1.3 TB a day as a matter of course, so that traffic held about a third of every wait
|
|
310
|
+
// with memory to spare (joshuafolkken/kit#4313). A claim now waits on memory only when the free figure
|
|
311
|
+
// falls short of what it declares; the traffic still names the wait as pressure (`memory_pressured`),
|
|
312
|
+
// and holds a claim past the shortfall that running alone or the wait cap would otherwise start
|
|
313
|
+
// (`core_admission.is_swap_held`, joshuafolkken/kit#4451).
|
|
314
|
+
function pressured_available(after: MemoryReading): number | undefined {
|
|
303
315
|
if (after.available_mb === undefined) return undefined
|
|
304
316
|
|
|
305
|
-
return
|
|
317
|
+
return (after.pressure_level ?? 0) >= PRESSURE_HOLD ? 0 : after.available_mb
|
|
306
318
|
}
|
|
307
319
|
|
|
308
320
|
// Memory is read at both ends of the window, so the swap counter's difference is the activity during it.
|
|
@@ -312,13 +324,13 @@ async function read_machine(
|
|
|
312
324
|
const before = cpu_times()
|
|
313
325
|
const [memory_before] = await Promise.all([read_memory(), sleep(SAMPLE_WINDOW_MS)])
|
|
314
326
|
const memory_after = await read_memory()
|
|
315
|
-
const
|
|
316
|
-
|
|
317
|
-
: undefined
|
|
327
|
+
const is_host = is_unquoted()
|
|
328
|
+
const busy_cores = is_host ? busy_cores_between(before, cpu_times(), cpus().length) : undefined
|
|
318
329
|
|
|
319
330
|
return {
|
|
320
331
|
busy_cores,
|
|
321
|
-
|
|
332
|
+
run_queue: is_host ? loadavg()[0] : undefined,
|
|
333
|
+
available_mb: pressured_available(memory_after),
|
|
322
334
|
memory_pressured: is_pressured(memory_before, memory_after),
|
|
323
335
|
}
|
|
324
336
|
}
|
|
@@ -327,31 +339,52 @@ async function read_sample(): Promise<MachineSample> {
|
|
|
327
339
|
return { cpu: cpu_times(), memory: await read_memory(), total_mb: totalmem() / BYTES_PER_MB }
|
|
328
340
|
}
|
|
329
341
|
|
|
330
|
-
// The busy cores the ledger does not account for,
|
|
331
|
-
//
|
|
342
|
+
// The busy cores the ledger does not account for, in whole cores — the budget is in whole cores, and a
|
|
343
|
+
// fraction of a core is not a core to give up.
|
|
344
|
+
//
|
|
345
|
+
// **Every busy core counts, the background included** (joshuafolkken/kit#4238). A baseline of two cores
|
|
346
|
+
// used to be exempt, so with 10 cores reserved and all 11 busy the reading saw no excess and admitted
|
|
347
|
+
// another claim onto a saturated CPU.
|
|
332
348
|
function external_cores(busy_cores: number | undefined, ledger_cores: number): number {
|
|
333
349
|
if (busy_cores === undefined) return 0
|
|
334
350
|
|
|
335
|
-
return Math.floor(Math.max(0, busy_cores - ledger_cores
|
|
351
|
+
return Math.floor(Math.max(0, busy_cores - ledger_cores))
|
|
336
352
|
}
|
|
337
353
|
|
|
338
|
-
//
|
|
339
|
-
//
|
|
340
|
-
//
|
|
341
|
-
//
|
|
342
|
-
|
|
354
|
+
// The run queue beyond what the ledger declares, past `OVERLOAD_FACTOR` times the cores. The ledger's own
|
|
355
|
+
// claims running past their weight count as outside load. The load average trails by a minute, so a
|
|
356
|
+
// first waiter held here waits out the decay — only at a load already this far past the machine. A queue
|
|
357
|
+
// that could not be read, and Windows' constant zero, never hold.
|
|
358
|
+
function is_overloaded(
|
|
359
|
+
run_queue: number | undefined,
|
|
360
|
+
ledger_cores: number,
|
|
361
|
+
cores: number,
|
|
362
|
+
): boolean {
|
|
363
|
+
if (run_queue === undefined) return false
|
|
364
|
+
|
|
365
|
+
return run_queue - ledger_cores > cores * OVERLOAD_FACTOR
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// **The budget the ledger admits against: `cores − max(ledger, busy)` free, plus what the ledger itself
|
|
369
|
+
// already holds.** The admission walk counts the ledger's declared weight again, so it is added back —
|
|
370
|
+
// what is subtracted is only the busy load beyond it. A claim admitted moments ago is not busy yet, and
|
|
371
|
+
// the ledger's declared cores cover it. The caller passes every admitted claim's cores but only the
|
|
372
|
+
// memory of claims past `core_admission.RAMP_UP_MS`, whose tools have had time to allocate.
|
|
343
373
|
// Memory that could not be read is no limit at all, the behavior before memory was read.
|
|
344
374
|
function machine_budget(cores: number, reading: MachineReading, ledger: LedgerLoad): MachineBudget {
|
|
375
|
+
const busy_excess = external_cores(reading.busy_cores, ledger.cores)
|
|
376
|
+
|
|
345
377
|
return {
|
|
346
|
-
cores: cores -
|
|
378
|
+
cores: Math.max(0, cores - busy_excess),
|
|
347
379
|
memory_mb:
|
|
348
380
|
reading.available_mb === undefined ? Infinity : reading.available_mb + ledger.memory_mb,
|
|
349
381
|
memory_pressured: reading.memory_pressured,
|
|
382
|
+
busy_excess,
|
|
383
|
+
is_overloaded: is_overloaded(reading.run_queue, ledger.cores, cores),
|
|
350
384
|
}
|
|
351
385
|
}
|
|
352
386
|
|
|
353
387
|
const machine_capacity = {
|
|
354
|
-
BASELINE_CORES,
|
|
355
388
|
busy_cores_between,
|
|
356
389
|
busy_share_between,
|
|
357
390
|
COMPRESSION_PRESSURE_MB,
|
|
@@ -360,6 +393,7 @@ const machine_capacity = {
|
|
|
360
393
|
parse_darwin_memory,
|
|
361
394
|
parse_linux_available,
|
|
362
395
|
parse_linux_swapped,
|
|
396
|
+
PRESSURE_HOLD,
|
|
363
397
|
pressured_available,
|
|
364
398
|
read_machine,
|
|
365
399
|
read_memory,
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { buffered_process } from '#scripts/lib/buffered-process'
|
|
2
|
+
import { release_approval_prune } from '#scripts/release/release-approval-prune'
|
|
3
|
+
import { project_checks } from './project-checks'
|
|
4
|
+
|
|
5
|
+
// kit's metrics ratchet totals (`josh metrics --totals-only`), brought forward from the detached
|
|
6
|
+
// `josh ship`'s pre-detach checks to the implementation loop: a feature grows a total almost every
|
|
7
|
+
// time, and a growth first met at the pre-detach stop costs a ship re-run beside the
|
|
8
|
+
// `josh metrics --accept` (joshuafolkken/kit#4594). `josh lint:related` reports it as a notice, never a
|
|
9
|
+
// failure, so a total that grows again within the loop does not demand an accept per edit; the
|
|
10
|
+
// pre-detach check stays the stop. A consumer's kit has no `josh metrics`, so it runs in kit alone.
|
|
11
|
+
|
|
12
|
+
const METRICS_TOTALS_COMMAND: ReadonlyArray<string> = ['josh', 'metrics', '--totals-only']
|
|
13
|
+
// The form ship runs before the detach and before each scoped pair: it also re-records a growth the
|
|
14
|
+
// branch's approval names (joshuafolkken/kit#4716).
|
|
15
|
+
const METRICS_RERECORD_COMMAND: ReadonlyArray<string> = [...METRICS_TOTALS_COMMAND, '--rerecord']
|
|
16
|
+
// Neutral on the cause: a growth and a run that never finished both stop the pre-detach check.
|
|
17
|
+
const NOTICE_HEADING =
|
|
18
|
+
'⚠ josh metrics --totals-only did not pass — settle it before `josh ship`, or the pre-detach check stops the ship (a total the branch approval names is re-recorded there):'
|
|
19
|
+
|
|
20
|
+
async function growth_notice(directory: string): Promise<string | undefined> {
|
|
21
|
+
if (!project_checks.is_kit_repository(directory)) return undefined
|
|
22
|
+
|
|
23
|
+
const result = await buffered_process.run_buffered_process(METRICS_TOTALS_COMMAND, {
|
|
24
|
+
cwd: directory,
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
if (!buffered_process.is_process_failed(result)) return undefined
|
|
28
|
+
|
|
29
|
+
return `${NOTICE_HEADING}\n${result.output.trim()}`
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function carries_approval(files: Readonly<Record<string, string>>): boolean {
|
|
33
|
+
return Object.keys(files).some((file) => release_approval_prune.is_approval(file))
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Re-records the branch's approval before a scoped pair reads the tree, so a review fix that grows a
|
|
37
|
+
// named total again does not stop the gate after it (joshuafolkken/kit#4716). It runs only where the
|
|
38
|
+
// changed tree carries an approval, and answers whether it ran; its verdict is left to the gate's own
|
|
39
|
+
// metrics step.
|
|
40
|
+
async function rerecord(
|
|
41
|
+
directory: string,
|
|
42
|
+
files: Readonly<Record<string, string>>,
|
|
43
|
+
): Promise<boolean> {
|
|
44
|
+
if (!project_checks.is_kit_repository(directory) || !carries_approval(files)) return false
|
|
45
|
+
|
|
46
|
+
await buffered_process.run_buffered_process(METRICS_RERECORD_COMMAND, { cwd: directory })
|
|
47
|
+
|
|
48
|
+
return true
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const metrics_totals = {
|
|
52
|
+
METRICS_RERECORD_COMMAND,
|
|
53
|
+
METRICS_TOTALS_COMMAND,
|
|
54
|
+
NOTICE_HEADING,
|
|
55
|
+
growth_notice,
|
|
56
|
+
rerecord,
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { metrics_totals }
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { git_spawn } from '#scripts/git/git-spawn'
|
|
2
|
+
import { file_map_stamp, type FileMapStamp } from '#scripts/josh/file-map-stamp'
|
|
3
|
+
import type { GateTree } from './gate-tree'
|
|
4
|
+
|
|
5
|
+
// Every path whose content can differ from the tree a green record was taken on — the one reading the
|
|
6
|
+
// gate's per-check reuse (`check-reuse.ts`) and the scoped checks' since-green narrowing
|
|
7
|
+
// (`since-green.ts`) both act on, so the two can never disagree about what moved.
|
|
8
|
+
//
|
|
9
|
+
// **What moved is the union of two diffs**. The changed-file map is a diff against the merge base, so a
|
|
10
|
+
// path absent from both maps holds the merge base's content — and the base's own diff
|
|
11
|
+
// (`git diff <recorded> <current>`) names every path that content moved for, which is what a main sync
|
|
12
|
+
// brought in. A path in either map whose digest differs is the other half
|
|
13
|
+
// (`file_map_stamp.changed_since`).
|
|
14
|
+
|
|
15
|
+
const NAME_SEPARATOR = '\0'
|
|
16
|
+
const BASE_DIFF = ['diff', '--name-only', '--no-renames', '-z'] as const
|
|
17
|
+
|
|
18
|
+
async function base_diff(from: string, to: string): Promise<ReadonlyArray<string> | undefined> {
|
|
19
|
+
if (from === to) return []
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
const names = await git_spawn.read([...BASE_DIFF, from, to])
|
|
23
|
+
|
|
24
|
+
return names.split(NAME_SEPARATOR).filter((name) => name !== '')
|
|
25
|
+
} catch {
|
|
26
|
+
return undefined
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// The two diffs apart: `synced` is what a main sync brought in, `changed` the paths whose digest moved.
|
|
31
|
+
// A path can be in both.
|
|
32
|
+
interface MovedParts {
|
|
33
|
+
changed: ReadonlyArray<string>
|
|
34
|
+
synced: ReadonlyArray<string>
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// `undefined` when the record cannot be compared: no base on either side, or a tree map that came back
|
|
38
|
+
// empty — also what `gate-tree.ts` answers when git could not be read, so it describes no tree.
|
|
39
|
+
async function moved_parts(stamp: FileMapStamp, tree: GateTree): Promise<MovedParts | undefined> {
|
|
40
|
+
const is_unread = Object.keys(tree.files).length === 0
|
|
41
|
+
|
|
42
|
+
if (is_unread || stamp.base === undefined || tree.base === undefined) return undefined
|
|
43
|
+
|
|
44
|
+
const synced = await base_diff(stamp.base, tree.base)
|
|
45
|
+
|
|
46
|
+
if (synced === undefined) return undefined
|
|
47
|
+
|
|
48
|
+
return { changed: file_map_stamp.changed_since(stamp, tree.files), synced }
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function union_of(parts: MovedParts): ReadonlyArray<string> {
|
|
52
|
+
return [...new Set([...parts.changed, ...parts.synced])]
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function moved_since(
|
|
56
|
+
stamp: FileMapStamp,
|
|
57
|
+
tree: GateTree,
|
|
58
|
+
): Promise<ReadonlyArray<string> | undefined> {
|
|
59
|
+
const parts = await moved_parts(stamp, tree)
|
|
60
|
+
|
|
61
|
+
return parts === undefined ? undefined : union_of(parts)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const moved_paths = { moved_parts, moved_since, union_of }
|
|
65
|
+
|
|
66
|
+
export type { MovedParts }
|
|
67
|
+
export { moved_paths }
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, globSync
|
|
1
|
+
import { existsSync, globSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { find_local_bin_upwards } from '#scripts/build/local-bin'
|
|
4
4
|
import { doctor_consumer } from '#scripts/doctor/doctor-consumer'
|
|
@@ -6,10 +6,10 @@ import { own_formatter } from '#scripts/init/own-formatter'
|
|
|
6
6
|
import { project_profile } from '#scripts/init/project-profile'
|
|
7
7
|
import { ancestor_directories } from '#scripts/lib/ancestor-directories'
|
|
8
8
|
import { json_value } from '#scripts/lib/json-value'
|
|
9
|
+
import { package_manifest } from '#scripts/lib/package-manifest'
|
|
9
10
|
import { NOT_USED_MARKER, SKIP_MARKER } from '#scripts/test/skip-marker'
|
|
10
11
|
import { z } from 'zod'
|
|
11
12
|
|
|
12
|
-
const PACKAGE_JSON = 'package.json'
|
|
13
13
|
const IGNORED_DIRS = new Set([
|
|
14
14
|
'node_modules',
|
|
15
15
|
'.git',
|
|
@@ -48,7 +48,7 @@ const object_schema = z.record(z.string(), z.unknown())
|
|
|
48
48
|
function project_root(directory: string): string {
|
|
49
49
|
return (
|
|
50
50
|
ancestor_directories.nearest(directory, (candidate) =>
|
|
51
|
-
existsSync(
|
|
51
|
+
existsSync(package_manifest.manifest_path(candidate)),
|
|
52
52
|
) ?? directory
|
|
53
53
|
)
|
|
54
54
|
}
|
|
@@ -86,16 +86,9 @@ function is_basic_manifest(manifest: unknown): boolean {
|
|
|
86
86
|
return project_profile.parse_profile(josh['profile']) === 'basic'
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
//
|
|
90
|
-
// `undefined` for text that is not JSON.
|
|
89
|
+
// A missing, unreadable or non-JSON manifest answers `undefined`; the shape is each caller's question.
|
|
91
90
|
function read_manifest(directory: string): unknown {
|
|
92
|
-
|
|
93
|
-
const manifest_path = path.join(project_root(directory), PACKAGE_JSON)
|
|
94
|
-
|
|
95
|
-
return json_value.parse_or_undefined(readFileSync(manifest_path, 'utf8'))
|
|
96
|
-
} catch {
|
|
97
|
-
return undefined
|
|
98
|
-
}
|
|
91
|
+
return package_manifest.read_manifest_if_valid(project_root(directory), z.unknown())
|
|
99
92
|
}
|
|
100
93
|
|
|
101
94
|
function is_basic(directory: string): boolean {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { file_map_stamp, type FileMapStampAccess } from '#scripts/josh/file-map-stamp'
|
|
2
2
|
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
3
|
-
import {
|
|
3
|
+
import { run_record_path } from '#scripts/josh/run-record-path'
|
|
4
4
|
import { review_stamps } from '#scripts/review/review-stamps'
|
|
5
5
|
import { test_unit_guard } from '#scripts/test/test-unit-guard'
|
|
6
6
|
import { gate_tree, type GateTree } from './gate-tree'
|
|
@@ -12,16 +12,20 @@ import { gate_tree, type GateTree } from './gate-tree'
|
|
|
12
12
|
// tree neither check has read return their findings one round trip at a time; one call running both
|
|
13
13
|
// checks first returns most of them at once.
|
|
14
14
|
//
|
|
15
|
-
// **It fixes when the checks run,
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
15
|
+
// **It fixes when the checks run, and only one writer decides whether.** Nothing here skips a check or
|
|
16
|
+
// reinterprets its output, and `josh gate` still runs its four checks exactly as before. The one other
|
|
17
|
+
// reader is the checks' own re-run, which narrows to what moved since this record (`since-green.ts`).
|
|
18
|
+
// The one writer without a run behind it is `josh ship`'s scoped pair after a merge with the default
|
|
19
|
+
// branch that shares nothing with the branch (`run-ship-synced-scope.ts`, joshuafolkken/kit#4985).
|
|
19
20
|
//
|
|
20
21
|
// **The judgement is the gate's own, not a second one.** "There is a record and nothing it covers has
|
|
21
|
-
// moved" is `
|
|
22
|
-
// already compares
|
|
23
|
-
//
|
|
24
|
-
//
|
|
22
|
+
// moved" is `file_map_stamp.changed_since` plus the base equality `gate_skip.reusable_green_gate`
|
|
23
|
+
// already compares and the inputs fingerprint each record carries (`verification-inputs.ts`), over the
|
|
24
|
+
// same `FileMapStamp` shape written to the same kind of file. A second definition of "this tree is
|
|
25
|
+
// unchanged" is the clone `CLAUDE.md` prohibits, and it is exactly where two commands would start
|
|
26
|
+
// disagreeing about one working tree. The one deliberate difference: this reader ignores josh's own
|
|
27
|
+
// `.josh/` run records, while the gate's own reuse (`gate_skip` via `review_brief.matching_stamp`)
|
|
28
|
+
// does not — safe, because the gate still lints and tests those records.
|
|
25
29
|
//
|
|
26
30
|
// **It refuses `josh review:brief`, and now the local `josh gate` too, but never CI's**.
|
|
27
31
|
// The brief was the first refusal point because it is where `review:attest`
|
|
@@ -56,11 +60,13 @@ interface ScopedCheck {
|
|
|
56
60
|
// The record paths, overridable so a test can plant one without overwriting the record a real run in
|
|
57
61
|
// this checkout relies on — the same reason `gate_skip.reusable_green_gate` takes a `source`.
|
|
58
62
|
// `is_unit_skipped` is overridable for the same reason, so a suite running in a checkout with vitest
|
|
59
|
-
// can stand in for a project without one.
|
|
63
|
+
// can stand in for a project without one. `is_lane_child` is the gate's answer for a dispatched lane
|
|
64
|
+
// child, absent for every other caller.
|
|
60
65
|
interface ScopedSources {
|
|
61
66
|
lint?: string
|
|
62
67
|
test?: string
|
|
63
68
|
is_unit_skipped?: boolean
|
|
69
|
+
is_lane_child?: boolean
|
|
64
70
|
}
|
|
65
71
|
|
|
66
72
|
// **`test:related` is required only where it can ever answer**. In a project
|
|
@@ -88,14 +94,29 @@ function checks_of(sources: ScopedSources): ReadonlyArray<ScopedCheck> {
|
|
|
88
94
|
: [lint, test]
|
|
89
95
|
}
|
|
90
96
|
|
|
97
|
+
// **A record josh itself keeps under `.josh/` does not unseat a green record** (joshuafolkken/kit#4905):
|
|
98
|
+
// `metrics --accept` and the ship's own approval re-record write there after the pair passed, and the
|
|
99
|
+
// preflight re-ran both checks over nothing but that bookkeeping. The gate still lints and tests the
|
|
100
|
+
// whole change, and a later scoped run reads such a file as moved since its record.
|
|
101
|
+
|
|
91
102
|
// **An unreadable record reads as an absent one, and that is the safe direction.** `read` swallows a
|
|
92
103
|
// malformed or foreign file and answers `undefined`, so the two cases are indistinguishable here —
|
|
93
104
|
// and the consequence of treating one as the other is a single 14-second scoped run, against the
|
|
94
105
|
// alternative of briefing a review on a tree nothing has checked.
|
|
95
|
-
function describes_tree(
|
|
96
|
-
|
|
106
|
+
function describes_tree(
|
|
107
|
+
check: ScopedCheck,
|
|
108
|
+
tree: Record<string, string>,
|
|
109
|
+
base: string,
|
|
110
|
+
is_overlooked: (relative: string) => boolean = run_record_path.is_run_record,
|
|
111
|
+
): boolean {
|
|
112
|
+
const stamp = check.stamp.read(check.source)
|
|
97
113
|
|
|
98
|
-
return
|
|
114
|
+
return (
|
|
115
|
+
stamp !== undefined &&
|
|
116
|
+
file_map_stamp.changed_since(stamp, tree).every((relative) => is_overlooked(relative)) &&
|
|
117
|
+
file_map_stamp.describes_base(stamp, base) &&
|
|
118
|
+
check.stamp.describes_inputs(stamp)
|
|
119
|
+
)
|
|
99
120
|
}
|
|
100
121
|
|
|
101
122
|
// **Whether there is a tree to speak about at all**, asked once and used from both ends: the reader
|
|
@@ -147,25 +168,60 @@ function missing_scripts(
|
|
|
147
168
|
return stale_checks(tree, base, sources).map((check) => check.script)
|
|
148
169
|
}
|
|
149
170
|
|
|
171
|
+
// The scripts whose green record still describes this tree, which `check:related` need not run again
|
|
172
|
+
// (joshuafolkken/kit#5156). A tree with no answer reuses nothing, never reading silence as green. A
|
|
173
|
+
// moved `.josh/` record counts here: the gate is not behind `check:related` to lint and test it.
|
|
174
|
+
function overlooks_nothing(): boolean {
|
|
175
|
+
return false
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function green_scripts(
|
|
179
|
+
tree: Record<string, string>,
|
|
180
|
+
base: string | undefined,
|
|
181
|
+
sources: ScopedSources = {},
|
|
182
|
+
): ReadonlyArray<string> {
|
|
183
|
+
if (!is_answerable(tree, base)) return []
|
|
184
|
+
|
|
185
|
+
return checks_of(sources)
|
|
186
|
+
.filter((check) => describes_tree(check, tree, base, overlooks_nothing))
|
|
187
|
+
.map((check) => check.script)
|
|
188
|
+
}
|
|
189
|
+
|
|
150
190
|
const REFUSAL_HEADLINE = '⛔ scoped checks not green on this tree'
|
|
151
191
|
|
|
152
192
|
// **The way out travels with the refusal.** A message saying only "not verified" leaves the caller
|
|
153
193
|
// holding the same question and no sanctioned answer, which is how the checks ended up after the
|
|
154
194
|
// review in the first place. So the text names the one command that closes it, what it costs, and
|
|
155
|
-
//
|
|
156
|
-
|
|
195
|
+
// the expected next move: reissuing this call, or for a lane child's gate, handing over to ship.
|
|
196
|
+
const REISSUE_STEP = 'and reissue this command.'
|
|
197
|
+
|
|
198
|
+
// joshuafolkken/kit#4776: a lane child that reissued the gate here ran it in the foreground for three
|
|
199
|
+
// minutes before `ship`, which runs its own gate beside the review, so that green was never used.
|
|
200
|
+
const LANE_CHILD_STEP =
|
|
201
|
+
'then hand over to `pnpm josh ship --detach --review "<title> #<N>"` rather than reissuing the ' +
|
|
202
|
+
'gate — this is a dispatched lane child, and ship runs the gate beside the review ' +
|
|
203
|
+
'(`.claude/skills/workflow-commands/chain-rule.md` step 0).'
|
|
204
|
+
|
|
205
|
+
function refusal(missing: ReadonlyArray<string>, next_step: string): string {
|
|
157
206
|
return (
|
|
158
207
|
`${REFUSAL_HEADLINE}: ${missing.join(' and ')} ` +
|
|
159
208
|
'have not passed on the files this branch changed. The gate and review round 1 start together, ' +
|
|
160
209
|
'so a brief composed now describes a tree neither check has read — joshuafolkken/kit#1503 spent ' +
|
|
161
210
|
'282 seconds, 31% of the run, picking up one lint rule and one failing test at a time after its ' +
|
|
162
211
|
'review had already started. Run them in one call — ' +
|
|
163
|
-
`\`${LINT_COMMAND} && ${TEST_COMMAND}\`, measured at 13.8 seconds —
|
|
164
|
-
'The record fixes when the checks run
|
|
165
|
-
'
|
|
212
|
+
`\`${LINT_COMMAND} && ${TEST_COMMAND}\`, measured at 13.8 seconds — ${next_step} ` +
|
|
213
|
+
'The record fixes when the checks run: only a merge with the default branch sharing nothing ' +
|
|
214
|
+
"with this branch's change is recorded without a run. " +
|
|
215
|
+
'`.claude/skills/workflow-commands/chain-rule.md` → "Orchestration facts single-sourced here".'
|
|
166
216
|
)
|
|
167
217
|
}
|
|
168
218
|
|
|
219
|
+
// **Only the gate's pre-check sets `is_lane_child`**: a lane child refused at `josh run:review` reissues
|
|
220
|
+
// it as chain-rule step 0 says, so `review:brief`'s callers keep the reissue wording.
|
|
221
|
+
function next_step_of(sources: ScopedSources): string {
|
|
222
|
+
return sources.is_lane_child === true ? LANE_CHILD_STEP : REISSUE_STEP
|
|
223
|
+
}
|
|
224
|
+
|
|
169
225
|
function refusal_for(
|
|
170
226
|
tree: Record<string, string>,
|
|
171
227
|
base: string | undefined,
|
|
@@ -173,7 +229,7 @@ function refusal_for(
|
|
|
173
229
|
): string | undefined {
|
|
174
230
|
const missing = missing_checks(tree, base, sources)
|
|
175
231
|
|
|
176
|
-
return missing.length === 0 ? undefined : refusal(missing)
|
|
232
|
+
return missing.length === 0 ? undefined : refusal(missing, next_step_of(sources))
|
|
177
233
|
}
|
|
178
234
|
|
|
179
235
|
// **A record is written only by a bare invocation, and any argument at all withholds it.** A path
|
|
@@ -250,6 +306,7 @@ const scoped_green = {
|
|
|
250
306
|
SWITCH_ENV_KEY,
|
|
251
307
|
TEST_COMMAND,
|
|
252
308
|
TEST_SCRIPT,
|
|
309
|
+
green_scripts,
|
|
253
310
|
is_recordable_scope,
|
|
254
311
|
is_unmoved,
|
|
255
312
|
missing_checks,
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { FileMapStampAccess } from '#scripts/josh/file-map-stamp'
|
|
2
|
+
import { gate_tree, type GateTree } from './gate-tree'
|
|
3
|
+
import { moved_paths, type MovedParts } from './moved-paths'
|
|
4
|
+
import { verification_inputs } from './verification-inputs'
|
|
5
|
+
|
|
6
|
+
// **A scoped check re-run reads only what moved since its last green run on this checkout**
|
|
7
|
+
// (joshuafolkken/kit#4393). A lane's ship retry — after a review fix or a preflight stop — re-ran
|
|
8
|
+
// `josh lint:related` and `josh test:related` (the gate's unit step too) over the whole branch diff,
|
|
9
|
+
// though everything outside the fix had been green on the tree before it.
|
|
10
|
+
//
|
|
11
|
+
// **The check is no weaker.** The green record (`scoped-green.ts`) vouches that the check passed over
|
|
12
|
+
// the branch diff of the tree it names; what moved since is every path whose content can differ from
|
|
13
|
+
// that tree (`moved-paths.ts`), a main sync's own changes included. A record written by a narrowed run
|
|
14
|
+
// vouches for the same thing, by the same argument one run earlier — except a bare `josh test:related`
|
|
15
|
+
// over a file every test imports, which ran only its direct importers, so the gate's unit leg never
|
|
16
|
+
// narrows by it while the branch changes one (`is_green_narrowable` in `test-related.ts`, #5122).
|
|
17
|
+
//
|
|
18
|
+
// **Whatever cannot be narrowed answers `undefined`**, and the caller reads the whole branch change as
|
|
19
|
+
// before: no record, one that cannot be compared, one written under other tools or environment, or a
|
|
20
|
+
// moved file the check's declaration names a configuration — a file green under the old configuration
|
|
21
|
+
// says nothing under the new one. An empty list is
|
|
22
|
+
// the positive fact that nothing moved: the gate's unit step on the tree the preflight just passed.
|
|
23
|
+
|
|
24
|
+
// Why a command that found nothing moved ran nothing, in the words both scoped commands print.
|
|
25
|
+
const UNMOVED_REASON = 'nothing moved since its last green run on this checkout'
|
|
26
|
+
|
|
27
|
+
// The narrowing line each command prints before it runs, so a since-green run is never read as one
|
|
28
|
+
// over the whole branch.
|
|
29
|
+
function describe(label: string, moved: ReadonlyArray<string>): string {
|
|
30
|
+
return `${label}: reading only the ${String(moved.length)} file(s) changed since its last green run on this checkout.`
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function is_narrowable(label: string, parts: MovedParts | undefined): parts is MovedParts {
|
|
34
|
+
return parts !== undefined && !verification_inputs.configures(label, moved_paths.union_of(parts))
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// What moved with a main sync's part kept apart, for a caller that records how much of its input the
|
|
38
|
+
// sync brought in (`josh test:related`, joshuafolkken/kit#4465). `label` names the gate check whose
|
|
39
|
+
// declaration (`verification-inputs.ts`) the record vouches for. `tree` is the caller's own reading of
|
|
40
|
+
// the gate tree, so a run that also records its green tree reads it once (joshuafolkken/kit#4655).
|
|
41
|
+
async function read_moved_parts(
|
|
42
|
+
stamp: FileMapStampAccess,
|
|
43
|
+
label: string,
|
|
44
|
+
source?: string,
|
|
45
|
+
tree?: GateTree,
|
|
46
|
+
): Promise<MovedParts | undefined> {
|
|
47
|
+
const record = stamp.read(source)
|
|
48
|
+
|
|
49
|
+
if (record === undefined || !stamp.describes_inputs(record)) return undefined
|
|
50
|
+
|
|
51
|
+
const parts = await moved_paths.moved_parts(record, tree ?? (await gate_tree.read_gate_tree()))
|
|
52
|
+
|
|
53
|
+
return is_narrowable(label, parts) ? parts : undefined
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Repository-root-relative paths, or `undefined` when the caller has to read the whole branch change.
|
|
57
|
+
async function read_moved(
|
|
58
|
+
stamp: FileMapStampAccess,
|
|
59
|
+
label: string,
|
|
60
|
+
source?: string,
|
|
61
|
+
tree?: GateTree,
|
|
62
|
+
): Promise<ReadonlyArray<string> | undefined> {
|
|
63
|
+
const parts = await read_moved_parts(stamp, label, source, tree)
|
|
64
|
+
|
|
65
|
+
return parts === undefined ? undefined : moved_paths.union_of(parts)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const since_green = { UNMOVED_REASON, describe, read_moved, read_moved_parts }
|
|
69
|
+
|
|
70
|
+
export { since_green }
|