@joshuafolkken/kit 1.1229.0 → 1.1370.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 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +50 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +24 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +27 -16
- package/.claude/skills/workflow-commands/latest-gate.md +18 -29
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.github/workflows/publish.yml +2 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +38 -57
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +213 -197
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -201
- package/dist/josh.js +540 -137
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +16 -10
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +4 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +26 -2
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +162 -0
- package/scripts/gate/core-budget.ts +134 -91
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +103 -35
- package/scripts/gate/gate-report.ts +39 -21
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +313 -0
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +60 -53
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +12 -8
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +35 -0
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +49 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +75 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +14 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +46 -37
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +165 -0
- package/scripts/issue/issue-release.ts +58 -0
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +32 -34
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +33 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +11 -5
- package/scripts/josh/josh-commands-lane.ts +16 -5
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-maintenance.ts +2 -2
- package/scripts/josh/josh-commands-run.ts +20 -6
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +10 -10
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +20 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +44 -30
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +25 -24
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +22 -8
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +27 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +140 -0
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-environment.ts +1 -0
- package/scripts/release/github-release-runs.ts +115 -0
- package/scripts/release/github-release.ts +13 -67
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +5 -6
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +68 -37
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +10 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +172 -43
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +25 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +13 -15
- package/scripts/run/run-step.ts +62 -48
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -33
- package/scripts/run/wake/run-wake-describe.ts +76 -29
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +13 -21
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -328
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +129 -98
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/templates/workflows/github-release.yml +4 -0
- package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
package/scripts/gate/gate-log.ts
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
2
2
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
3
3
|
|
|
4
|
-
// The verification gate's full output, kept somewhere the console's size limit cannot reach
|
|
5
|
-
// (joshuafolkken/kit#1227).
|
|
4
|
+
// The verification gate's full output, kept somewhere the console's size limit cannot reach.
|
|
6
5
|
//
|
|
7
|
-
// **The
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
// check by hand, which is a judgement the reader has to make about output they cannot see.
|
|
6
|
+
// **The console cannot be the only copy of a failure's detail.** `josh gate` buffers every check and
|
|
7
|
+
// prints the failing ones whole, and `BASH_MAX_OUTPUT_LENGTH` caps what a command may carry into an
|
|
8
|
+
// agent's context. The verdict is the last line and so always survives, which is why a red gate can
|
|
9
|
+
// never read as green; what does not survive is the middle, and the middle is where the failure says
|
|
10
|
+
// what it was. Re-running one check by hand is a judgement the reader would have to make about output
|
|
11
|
+
// they cannot see.
|
|
14
12
|
//
|
|
15
13
|
// So the gate writes every check's output to a file and prints where it is. Nothing about the
|
|
16
14
|
// verdict changes; what changes is that the detail behind it no longer exists only in a window that
|
|
@@ -4,7 +4,7 @@ import { unit_worker_share } from '#scripts/test/unit-worker-share'
|
|
|
4
4
|
import { core_budget } from './core-budget'
|
|
5
5
|
|
|
6
6
|
// How many of the gate's checks run at once, and how wide the one elastic check may fan out —
|
|
7
|
-
// both derived from the machine rather than fixed at four
|
|
7
|
+
// both derived from the machine rather than fixed at four.
|
|
8
8
|
//
|
|
9
9
|
// **The measurement this table is built from.** Apple M3 Pro, 11 logical cores (5 performance +
|
|
10
10
|
// 6 efficiency, about 9 cores of aggregate throughput on this workload), warm caches, each check
|
|
@@ -19,10 +19,8 @@ import { core_budget } from './core-budget'
|
|
|
19
19
|
//
|
|
20
20
|
// Two things follow. **The concurrent gate is already the faster shape** — 15.1s together against
|
|
21
21
|
// 19.1s back to back, the median of three interleaved runs on the same tree, and the one pair
|
|
22
|
-
// `
|
|
23
|
-
//
|
|
24
|
-
// real when the type check and the spell check cost 6.9s and 3.6s of CPU, and joshuafolkken/kit#1256
|
|
25
|
-
// removed it by giving both a cache. **And the unit suite is the only check worth sizing**: it
|
|
22
|
+
// `docs/josh-commands.md` quotes too — so this is a widening of an existing win. **And the unit
|
|
23
|
+
// suite is the only check worth sizing**: it
|
|
26
24
|
// alone accounts for 107 of the 122 CPU-seconds, because vitest opens one worker per core while
|
|
27
25
|
// the other three are one or two processes each.
|
|
28
26
|
|
|
@@ -30,63 +28,97 @@ interface GateCheck {
|
|
|
30
28
|
label: string
|
|
31
29
|
// The `josh` sub-command that defines the check, and the one an appended argument belongs to.
|
|
32
30
|
target: string
|
|
31
|
+
// Arguments the gate always hands the target, before any appended one.
|
|
32
|
+
args?: ReadonlyArray<string>
|
|
33
33
|
// Cores this check holds for as long as it runs — the measured ratio above, floored to whole
|
|
34
34
|
// cores and never below one. Floored rather than rounded because this is the share the *other*
|
|
35
35
|
// checks must give up: over-reserving costs the elastic check workers it would have used.
|
|
36
36
|
// The unit suite reserves nothing: it sizes its own pool from the machine, so it is capped
|
|
37
37
|
// instead of reserved, and counting it here would reserve cores against itself.
|
|
38
38
|
reserved_cores: number
|
|
39
|
+
// The memory this check holds while it runs, `core_budget.MEMORY_MB`'s measured peak; none declared is
|
|
40
|
+
// none waited for. The unit suite's is per worker, so it is derived instead.
|
|
41
|
+
memory_mb?: number
|
|
42
|
+
// A check whose `josh` command is kit-only, so a consumer's gate leaves it out rather than running
|
|
43
|
+
// a command that is not in the published package. It restates the command
|
|
44
|
+
// entry's own `is_kit_only`, because the command map imports this module; `gate-plan.test.ts` pins
|
|
45
|
+
// that the two agree.
|
|
46
|
+
is_kit_only?: boolean
|
|
39
47
|
}
|
|
40
48
|
|
|
41
49
|
const LINT_LABEL = 'lint'
|
|
42
50
|
const TYPE_CHECK_LABEL = 'check'
|
|
43
51
|
const UNIT_LABEL = 'test:unit'
|
|
44
52
|
const BEHAVIOR_LABEL = 'behavior'
|
|
53
|
+
const METRICS_LABEL = 'metrics'
|
|
45
54
|
|
|
46
55
|
// The checks whose warnings must survive the green record: eslint (the `lint` step) and svelte-check
|
|
47
56
|
// (the `check` step) both exit 0 while reporting per-tree warnings a developer needs to see again, so
|
|
48
|
-
// reusing a record taken from such a run would hide them
|
|
57
|
+
// reusing a record taken from such a run would hide them. Every other step's
|
|
49
58
|
// warning-shaped output — a Vite config deprecation printed by `test:unit`, say — is not a per-tree
|
|
50
|
-
// finding and repeats every run, so it must not withhold the record.
|
|
51
|
-
//
|
|
59
|
+
// finding and repeats every run, so it must not withhold the record. `has_checker_warning` narrows
|
|
60
|
+
// the withholding path down to these.
|
|
52
61
|
const WARNING_CHECKER_LABELS: ReadonlyArray<string> = [LINT_LABEL, TYPE_CHECK_LABEL]
|
|
53
62
|
|
|
54
63
|
// The checks that do not fan out across every core, in the order their output is printed. They are
|
|
55
|
-
// named apart from the unit suite because CI runs them on their own runner
|
|
64
|
+
// named apart from the unit suite because CI runs them on their own runner:
|
|
56
65
|
// the unit suite is the only check that fans out across every core, so on a 4-core GitHub runner it
|
|
57
66
|
// and the others spent the whole job taking cores off each other.
|
|
58
67
|
//
|
|
59
|
-
// **The behavior check belongs here, and it reserves no core
|
|
68
|
+
// **The behavior check belongs here, and it reserves no core**. It reads one
|
|
60
69
|
// recorded transcript rather than the tree, so it is I/O-bound and a zero reservation leaves
|
|
61
70
|
// `RESERVED_CORES` and the unit worker cap exactly where the other three were measured. Being a static
|
|
62
71
|
// check rather than one appended after the unit suite is what keeps the plan's shape intact: the
|
|
63
72
|
// `--no-unit` set stays "the whole gate minus the unit suite", and a CI runner — which has no recorded
|
|
64
73
|
// transcripts — runs it as a trivial green rather than skipping it.
|
|
65
74
|
//
|
|
66
|
-
// **The three reserving weights are `core_budget.CORE_WEIGHTS
|
|
75
|
+
// **The three reserving weights are `core_budget.CORE_WEIGHTS`**, the same
|
|
67
76
|
// numbers the `josh lint`, `josh check` and `josh cspell:dot` commands claim when run directly.
|
|
68
77
|
//
|
|
69
|
-
// **The two zero weights
|
|
70
|
-
//
|
|
78
|
+
// **The two zero weights are measured, and they stay zero.** These are warm runs on the 11-core
|
|
79
|
+
// machine. `behavior` took 0.6s of wall for 0.7s of CPU, which
|
|
71
80
|
// is node starting up. `exports:unused` took 5.5s of wall for 9.0s of CPU, about 1.6 cores. Floored,
|
|
72
81
|
// that would be one core, but a reservation lasts the whole gate's plan, not the check's five seconds.
|
|
73
82
|
// It would lower `RESERVED_CORES` from 4 to 5 and cut the solo unit cap from 7 workers to 6 for the
|
|
74
83
|
// full length of the unit suite, to cover a burst that ends before lint does. Nothing has measured
|
|
75
84
|
// that trade, so the measured shape stays.
|
|
76
85
|
const STATIC_CHECKS: ReadonlyArray<GateCheck> = [
|
|
77
|
-
{
|
|
86
|
+
{
|
|
87
|
+
label: LINT_LABEL,
|
|
88
|
+
target: 'lint',
|
|
89
|
+
reserved_cores: core_budget.CORE_WEIGHTS.lint,
|
|
90
|
+
memory_mb: core_budget.MEMORY_MB.lint,
|
|
91
|
+
},
|
|
78
92
|
{
|
|
79
93
|
label: TYPE_CHECK_LABEL,
|
|
80
94
|
target: 'check',
|
|
81
95
|
reserved_cores: core_budget.CORE_WEIGHTS.type_check,
|
|
96
|
+
memory_mb: core_budget.MEMORY_MB.type_check,
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
label: 'cspell',
|
|
100
|
+
target: 'cspell:dot',
|
|
101
|
+
reserved_cores: core_budget.CORE_WEIGHTS.spell_check,
|
|
102
|
+
memory_mb: core_budget.MEMORY_MB.spell_check,
|
|
82
103
|
},
|
|
83
|
-
{ label: 'cspell', target: 'cspell:dot', reserved_cores: core_budget.CORE_WEIGHTS.spell_check },
|
|
84
104
|
{ label: BEHAVIOR_LABEL, target: BEHAVIOR_LABEL, reserved_cores: 0 },
|
|
85
|
-
// **The unused-member check reserves no core
|
|
105
|
+
// **The unused-member check reserves no core**: it builds one TypeScript
|
|
86
106
|
// program and walks it for about 5s, and it is over well before lint and the type check. A
|
|
87
107
|
// reservation would only take a place from the four-core CI runner's fan-out and a worker from the
|
|
88
108
|
// unit suite for the whole gate.
|
|
89
109
|
{ label: 'exports', target: 'exports:unused', reserved_cores: 0 },
|
|
110
|
+
// **The metrics ratchet is kit's own**: it holds kit's repository-wide
|
|
111
|
+
// totals to the merge-base's. It is one in-process eslint pass with only `max-lines` enabled, over
|
|
112
|
+
// in a few seconds, so it reserves no core for the reason the unused-member check above does not.
|
|
113
|
+
// It times no startup here: beside the unit suite that reads the load, not josh.
|
|
114
|
+
{
|
|
115
|
+
label: METRICS_LABEL,
|
|
116
|
+
target: METRICS_LABEL,
|
|
117
|
+
args: ['--no-startup'],
|
|
118
|
+
reserved_cores: 0,
|
|
119
|
+
memory_mb: core_budget.MEMORY_MB.eslint_scan,
|
|
120
|
+
is_kit_only: true,
|
|
121
|
+
},
|
|
90
122
|
]
|
|
91
123
|
|
|
92
124
|
// The checks, in the order their output is printed — the static set, then the unit suite last (the
|
|
@@ -102,8 +134,15 @@ const GATE_CHECKS: ReadonlyArray<GateCheck> = [
|
|
|
102
134
|
// set safe is that nothing downstream may mistake it for the full gate: `verification-gate.ts`
|
|
103
135
|
// withholds both the green-gate record and the in-flight marker on a partial run, so a `--no-unit`
|
|
104
136
|
// gate can never tell `josh review:brief` that the unit suite passed on this tree.
|
|
105
|
-
|
|
106
|
-
|
|
137
|
+
//
|
|
138
|
+
// A consumer's gate also drops the kit-only checks, whose commands its installed kit does not have.
|
|
139
|
+
function select_gate_checks(
|
|
140
|
+
is_unit_included: boolean,
|
|
141
|
+
is_kit_repository = true,
|
|
142
|
+
): ReadonlyArray<GateCheck> {
|
|
143
|
+
const checks = is_unit_included ? GATE_CHECKS : STATIC_CHECKS
|
|
144
|
+
|
|
145
|
+
return is_kit_repository ? checks : checks.filter((check) => check.is_kit_only !== true)
|
|
107
146
|
}
|
|
108
147
|
|
|
109
148
|
// Asked of the plan rather than of the flag, so the one question "did this gate run the unit suite"
|
|
@@ -155,7 +194,7 @@ interface GatePlan {
|
|
|
155
194
|
}
|
|
156
195
|
|
|
157
196
|
// This gate's share of the machine — the cores it may plan against once the other gates in flight
|
|
158
|
-
// have theirs
|
|
197
|
+
// have theirs.
|
|
159
198
|
//
|
|
160
199
|
// **At one run this is the identity, and that is the whole argument that solo behavior is
|
|
161
200
|
// unchanged.** `Math.floor(cores / 1)` is `cores`, so a solo gate and a CI runner hand the admission
|
|
@@ -183,8 +222,8 @@ function shared_cores(available_cores: number, concurrent_runs: number): number
|
|
|
183
222
|
// difference between two checks sharing a core and four fighting over it.
|
|
184
223
|
//
|
|
185
224
|
// **Under concurrency it is the only lever there is, and that is a measurement rather than a
|
|
186
|
-
// preference
|
|
187
|
-
//
|
|
225
|
+
// preference**. `josh gate` starts four checks at once and sizing only the unit suite let six lanes
|
|
226
|
+
// put 18 unbounded checks on 11 cores: measured on that machine,
|
|
188
227
|
// one gate took 254.1s with lint alone at 252.9s against the 5.2s the table above records for it
|
|
189
228
|
// solo. The obvious repair — hand each of the other three a worker count the way the unit suite gets
|
|
190
229
|
// one — **does not exist to be applied**: eslint 10's `--concurrency` defaults to `off` and is
|
|
@@ -221,7 +260,7 @@ function resolve_concurrency(
|
|
|
221
260
|
// 107s). A machine smaller than the measured one is left uncapped; see `MEASURED_CORES`.
|
|
222
261
|
//
|
|
223
262
|
// **The table above is a measurement of one gate on an idle machine, and `concurrent_runs` is what
|
|
224
|
-
// says whether that is the situation
|
|
263
|
+
// says whether that is the situation**. Six lanes each reading "11 cores,
|
|
225
264
|
// take 7" put 42 workers on 11 cores, at a load average of 14.97, and the gate had no way to know the
|
|
226
265
|
// other five existed. Where more than one unit run is in flight the machine is divided between them
|
|
227
266
|
// instead, by `unit-worker-share.ts`, which is the same answer `test-unit-guard.ts` gives the pre-push
|
|
@@ -237,11 +276,11 @@ function resolve_concurrency(
|
|
|
237
276
|
// oversubscription for an unmeasured starvation is not an improvement anyone can defend. What *is*
|
|
238
277
|
// measured is the unit half — six concurrent suites went from ten timeouts to none at this share.
|
|
239
278
|
//
|
|
240
|
-
//
|
|
241
|
-
//
|
|
242
|
-
//
|
|
243
|
-
//
|
|
244
|
-
//
|
|
279
|
+
// **`resolve_concurrency` narrows the gate and leaves this number alone.** A narrowed gate no longer
|
|
280
|
+
// runs its three siblings *beside* its unit step, so the paragraph above over-states what the share
|
|
281
|
+
// is competing with — which is an argument for widening it, and widening it is exactly the
|
|
282
|
+
// unmeasured move that paragraph refuses. The measured number stays until something measures a
|
|
283
|
+
// better one on this machine.
|
|
245
284
|
//
|
|
246
285
|
// **The count is a parameter rather than a read.** This module stays a pure function of its inputs, so
|
|
247
286
|
// its own assertions are about arithmetic and not about what happened to be running while they ran;
|
|
@@ -263,7 +302,7 @@ function solo_unit_weight(available_cores: number): number {
|
|
|
263
302
|
return Math.max(0, available_cores - RESERVED_CORES)
|
|
264
303
|
}
|
|
265
304
|
|
|
266
|
-
// The cores a check reserves from the machine-wide budget while it runs
|
|
305
|
+
// The cores a check reserves from the machine-wide budget while it runs. The
|
|
267
306
|
// static checks declare their measured reservation; the unit suite declares the pool it will open,
|
|
268
307
|
// which `unit_worker_cap` has already sized against the runs in flight. **This is the same table, read
|
|
269
308
|
// once**: no second set of weights is introduced, so a change to the measured reservation moves the
|
|
@@ -280,7 +319,19 @@ function check_weight(check: GateCheck, plan: GatePlan, available_cores: number)
|
|
|
280
319
|
return plan.unit_worker_cap ?? solo_unit_weight(available_cores)
|
|
281
320
|
}
|
|
282
321
|
|
|
283
|
-
|
|
322
|
+
function unit_memory(workers: number): number {
|
|
323
|
+
return workers * core_budget.MEMORY_MB.unit_worker
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// The memory a check holds: its declared figure, or for the unit suite one
|
|
327
|
+
// worker's peak for each core it reserves — its weight is its worker count.
|
|
328
|
+
function check_memory(check: GateCheck, plan: GatePlan, available_cores: number): number {
|
|
329
|
+
if (check.label !== UNIT_LABEL) return check.memory_mb ?? 0
|
|
330
|
+
|
|
331
|
+
return unit_memory(check_weight(check, plan, available_cores))
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// The cores a unit run started directly reserves: the share it will pass to
|
|
284
335
|
// vitest while other runs are live, and otherwise the gate's own solo unit weight. **Not the whole
|
|
285
336
|
// machine**, though a lone vitest sizes its own pool: FIFO admission lets a claim of every core in only
|
|
286
337
|
// once the ledger is empty, so a one-file `josh test:related` would wait out every other lane's gate
|
|
@@ -298,6 +349,21 @@ function direct_unit_weight(
|
|
|
298
349
|
return Math.max(unit_worker_share.MIN_WORKERS, weight)
|
|
299
350
|
}
|
|
300
351
|
|
|
352
|
+
// What a unit run started directly holds: one worker's peak for each worker `direct_unit_weight` gives it.
|
|
353
|
+
function direct_unit_memory(): number {
|
|
354
|
+
return unit_memory(direct_unit_weight())
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
function unit_cap_for(
|
|
358
|
+
checks: ReadonlyArray<GateCheck>,
|
|
359
|
+
available_cores: number,
|
|
360
|
+
concurrent_runs: number,
|
|
361
|
+
): number | undefined {
|
|
362
|
+
if (!has_unit_check(checks)) return undefined
|
|
363
|
+
|
|
364
|
+
return resolve_unit_worker_cap(available_cores, concurrent_runs)
|
|
365
|
+
}
|
|
366
|
+
|
|
301
367
|
// `availableParallelism()` rather than `cpus().length`: it reports what this process may actually
|
|
302
368
|
// use, so a container with a CPU quota is sized by the quota rather than by the host.
|
|
303
369
|
// The three fields together, for a caller that has already decided the numbers. The gate's own
|
|
@@ -320,29 +386,28 @@ function resolve_gate_plan(
|
|
|
320
386
|
available_cores: number = availableParallelism(),
|
|
321
387
|
concurrent_runs: number = unit_worker_share.SOLO_RUNS,
|
|
322
388
|
is_unit_included = true,
|
|
389
|
+
is_kit_repository = true,
|
|
323
390
|
): GatePlan {
|
|
324
|
-
const checks = select_gate_checks(is_unit_included)
|
|
391
|
+
const checks = select_gate_checks(is_unit_included, is_kit_repository)
|
|
325
392
|
|
|
326
393
|
return {
|
|
327
394
|
checks,
|
|
328
395
|
concurrency: resolve_concurrency(available_cores, concurrent_runs, checks),
|
|
329
|
-
unit_worker_cap:
|
|
330
|
-
? resolve_unit_worker_cap(available_cores, concurrent_runs)
|
|
331
|
-
: undefined,
|
|
396
|
+
unit_worker_cap: unit_cap_for(checks, available_cores, concurrent_runs),
|
|
332
397
|
}
|
|
333
398
|
}
|
|
334
399
|
|
|
335
400
|
// Printed once per run, so a gate that was slow on someone else's machine can be read without
|
|
336
401
|
// re-deriving the plan from their core count.
|
|
337
402
|
//
|
|
338
|
-
// **The two fragments come from `josh-verdict.ts
|
|
403
|
+
// **The two fragments come from `josh-verdict.ts`.** `josh time` matches
|
|
339
404
|
// this line to tell where a gate run's output begins — it is the one line the gate prints before any
|
|
340
405
|
// check body exists — so the printer and the detector build it from the same strings, exactly as they
|
|
341
406
|
// already do for the verdict.
|
|
342
407
|
// **The machine is described as shared only when it is.** A solo gate prints exactly the line it
|
|
343
408
|
// always printed — which is what keeps `josh time`'s detector, and every reader used to the old
|
|
344
409
|
// output, unaffected — while a narrowed one says why it is narrow, so a lane owner reading a slow
|
|
345
|
-
// gate is not left deriving the reason from a worker count that looks wrong
|
|
410
|
+
// gate is not left deriving the reason from a worker count that looks wrong.
|
|
346
411
|
function format_machine(available_cores: number, concurrent_runs: number): string {
|
|
347
412
|
const cores = `${String(available_cores)} cores`
|
|
348
413
|
|
|
@@ -378,12 +443,15 @@ const gate_plan = {
|
|
|
378
443
|
GATE_CHECKS,
|
|
379
444
|
LINT_LABEL,
|
|
380
445
|
MEASURED_CORES,
|
|
446
|
+
METRICS_LABEL,
|
|
381
447
|
RESERVED_CORES,
|
|
382
448
|
STATIC_CHECKS,
|
|
383
449
|
TYPE_CHECK_LABEL,
|
|
384
450
|
UNIT_LABEL,
|
|
385
451
|
WARNING_CHECKER_LABELS,
|
|
452
|
+
check_memory,
|
|
386
453
|
check_weight,
|
|
454
|
+
direct_unit_memory,
|
|
387
455
|
direct_unit_weight,
|
|
388
456
|
format_gate_plan,
|
|
389
457
|
format_machine,
|
|
@@ -7,7 +7,7 @@ import { gate_log } from './gate-log'
|
|
|
7
7
|
import { gate_plan } from './gate-plan'
|
|
8
8
|
|
|
9
9
|
// The gate's console reporting, split out of `verification-gate.ts` so that file stays under its line
|
|
10
|
-
// ceiling while it grows the scoped pre-check and the failure summary
|
|
10
|
+
// ceiling while it grows the scoped pre-check and the failure summary. Nothing
|
|
11
11
|
// about what is printed changes in the move: the four blocks, the log notice and the verdict come out
|
|
12
12
|
// exactly as before, with one addition — the per-failure action lines below.
|
|
13
13
|
|
|
@@ -25,6 +25,8 @@ interface GateStepResult extends BufferedProcessResult {
|
|
|
25
25
|
// What was actually run. The type check's command is resolved per project, so a failure on the
|
|
26
26
|
// `check` step is only reproducible if the header names the command rather than the label.
|
|
27
27
|
command: string
|
|
28
|
+
// Set when the check started past the machine-wide budget at the wait cap.
|
|
29
|
+
budget_note?: string | undefined
|
|
28
30
|
}
|
|
29
31
|
|
|
30
32
|
function is_gate_step_failed(result: GateStepResult): boolean {
|
|
@@ -34,8 +36,7 @@ function is_gate_step_failed(result: GateStepResult): boolean {
|
|
|
34
36
|
// A passing check's output is not read. What a green gate has to say is "all four passed", and
|
|
35
37
|
// `print_gate_summary` already says it in one line — while the four bodies, vitest's per-file
|
|
36
38
|
// listing among them, run to tens of kilobytes that then sit in the conversation and are re-read on
|
|
37
|
-
// every later turn. The gate runs more than once per Issue, so the cost is per run, not per Issue
|
|
38
|
-
// (joshuafolkken/kit#967).
|
|
39
|
+
// every later turn. The gate runs more than once per Issue, so the cost is per run, not per Issue.
|
|
39
40
|
//
|
|
40
41
|
// A failing check keeps its whole output: that is the one time the body is the answer. So does a
|
|
41
42
|
// check that **passed without running** — `test-unit-guard` exits 0 with a notice when vitest is
|
|
@@ -59,8 +60,8 @@ function has_warnings(result: GateStepResult): boolean {
|
|
|
59
60
|
return WARNING_MARKERS.some((marker) => result.output.includes(marker))
|
|
60
61
|
}
|
|
61
62
|
|
|
62
|
-
// The withholding path's counterpart to `has_warnings`, and deliberately narrower than it
|
|
63
|
-
//
|
|
63
|
+
// The withholding path's counterpart to `has_warnings`, and deliberately narrower than it.
|
|
64
|
+
// `has_warnings` is read by `should_print_body`, where a false positive
|
|
64
65
|
// costs one printed body — the loose match above is right there. `record_green_gate` reads *this*
|
|
65
66
|
// one, where a false positive is not one printed line but the whole green record withheld, which
|
|
66
67
|
// turns a green gate's `run:review --join` red. So the record is withheld only for a warning from a
|
|
@@ -68,7 +69,7 @@ function has_warnings(result: GateStepResult): boolean {
|
|
|
68
69
|
// from another tool that happens to contain the word — a Vite config deprecation on `test:unit` was
|
|
69
70
|
// the line that stopped a green gate's commit chain.
|
|
70
71
|
//
|
|
71
|
-
// **The safe-chain shim's banner is not the checker's either
|
|
72
|
+
// **The safe-chain shim's banner is not the checker's either**. Where
|
|
72
73
|
// `setup-ci` installed the shims but the binary cannot be reached, every `pnpm` a check spawns prints
|
|
73
74
|
// "Warning: safe-chain is not available …" into that check's output, so a green lint withheld the
|
|
74
75
|
// record on every CI run. The banner's lines are dropped before the match; a real warning on any
|
|
@@ -95,7 +96,7 @@ function should_print_body(result: GateStepResult, is_verbose: boolean): boolean
|
|
|
95
96
|
|
|
96
97
|
// Seconds to one decimal, which is the resolution the answer is read at: the question a gate's
|
|
97
98
|
// timing answers is "which of the four is the long pole", and no check is ever separated from
|
|
98
|
-
// another by less than a tenth of a second
|
|
99
|
+
// another by less than a tenth of a second.
|
|
99
100
|
const MS_PER_SECOND = 1000
|
|
100
101
|
const SECONDS_DECIMALS = 1
|
|
101
102
|
|
|
@@ -107,8 +108,8 @@ function format_seconds(elapsed_ms: number): string {
|
|
|
107
108
|
// naming the one command to re-run while fixing (`docs/josh-commands.md` → `josh gate`), and a
|
|
108
109
|
// number spliced in front of it would push that name out of the place a reader scans for it.
|
|
109
110
|
//
|
|
110
|
-
// Built rather than inlined because the log file names each section with the same string
|
|
111
|
-
//
|
|
111
|
+
// Built rather than inlined because the log file names each section with the same string:
|
|
112
|
+
// a header written twice is a header the two copies can disagree about,
|
|
112
113
|
// and the log exists precisely to be read when the console's copy has been elided.
|
|
113
114
|
function gate_step_header(result: GateStepResult): string {
|
|
114
115
|
const icon = is_gate_step_failed(result) ? FAIL_ICON : PASS_ICON
|
|
@@ -125,7 +126,7 @@ function print_gate_step(result: GateStepResult, is_verbose: boolean): void {
|
|
|
125
126
|
}
|
|
126
127
|
|
|
127
128
|
// **One line per failed check, naming the command that reproduces it, printed at the tail just above
|
|
128
|
-
// the verdict
|
|
129
|
+
// the verdict**. A red gate used to report every failing check only in its
|
|
129
130
|
// bodies, which is where truncation lands: the run picked one failure at a time across separate gate
|
|
130
131
|
// runs because it could not read the rest. The verdict names *which* checks failed; this names *what
|
|
131
132
|
// to run* for each, and it sits in the same tail window the verdict and the log notice already
|
|
@@ -141,25 +142,42 @@ function format_failure_actions(failed: ReadonlyArray<GateStepResult>): string {
|
|
|
141
142
|
return `${GATE_COMMAND} — next:\n${lines.join('\n')}\n`
|
|
142
143
|
}
|
|
143
144
|
|
|
145
|
+
// **A check that started past the core budget is said in the summary, not only in the log**.
|
|
146
|
+
// The wait cap admits a check that waited two minutes whatever the budget says,
|
|
147
|
+
// so a gate that ran over-subscribed would otherwise look exactly like one that fitted. The icon is
|
|
148
|
+
// local rather than in `status-icons.ts` because nothing reads this line back.
|
|
149
|
+
const WARN_ICON = '⚠'
|
|
150
|
+
|
|
151
|
+
function format_budget_notes(results: ReadonlyArray<GateStepResult>): string {
|
|
152
|
+
const lines = results.flatMap((result) =>
|
|
153
|
+
result.budget_note === undefined
|
|
154
|
+
? []
|
|
155
|
+
: ` ${WARN_ICON} ${result.label} — ${result.budget_note}`,
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
return lines.length === 0 ? '' : `${lines.join('\n')}\n`
|
|
159
|
+
}
|
|
160
|
+
|
|
144
161
|
// The total is wall-clock for the whole command, not the sum of the four — they run concurrently,
|
|
145
162
|
// so a sum would report about three times what the caller waited.
|
|
146
163
|
//
|
|
147
164
|
// The failure actions and the log path are printed with the summary and immediately **above** the
|
|
148
|
-
// verdict line, which stays last for the reason `josh-verdict.ts` gives
|
|
165
|
+
// verdict line, which stays last for the reason `josh-verdict.ts` gives.
|
|
149
166
|
function print_gate_summary(
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
step_count: string,
|
|
167
|
+
results: ReadonlyArray<GateStepResult>,
|
|
168
|
+
report: GateReport,
|
|
153
169
|
log_path?: string,
|
|
154
170
|
): void {
|
|
155
|
-
const
|
|
171
|
+
const failed = results.filter((result) => is_gate_step_failed(result))
|
|
172
|
+
const total = format_seconds(report.elapsed_ms)
|
|
156
173
|
const verdict =
|
|
157
174
|
failed.length === 0
|
|
158
|
-
? josh_verdict.format_gate_passed(step_count, total)
|
|
175
|
+
? josh_verdict.format_gate_passed(report.step_count, total)
|
|
159
176
|
: josh_verdict.format_gate_failed(failed.map((result) => result.label).join(', '), total)
|
|
177
|
+
const notes = format_budget_notes(results)
|
|
160
178
|
|
|
161
179
|
process.stdout.write(
|
|
162
|
-
`\n${format_failure_actions(failed)}${gate_log.format_log_notice(log_path)}${verdict}\n`,
|
|
180
|
+
`\n${notes}${format_failure_actions(failed)}${gate_log.format_log_notice(log_path)}${verdict}\n`,
|
|
163
181
|
)
|
|
164
182
|
}
|
|
165
183
|
|
|
@@ -172,7 +190,7 @@ interface GateReport {
|
|
|
172
190
|
|
|
173
191
|
// Everything a finished run says, in the order a reader meets it: the four blocks, then the log the
|
|
174
192
|
// blocks may have been elided out of, then the failure actions and the verdict. **Every check's whole
|
|
175
|
-
// output goes into the log, the ones the console dropped included
|
|
193
|
+
// output goes into the log, the ones the console dropped included**.
|
|
176
194
|
function report_gate_steps(
|
|
177
195
|
results: ReadonlyArray<GateStepResult>,
|
|
178
196
|
report: GateReport,
|
|
@@ -183,15 +201,15 @@ function report_gate_steps(
|
|
|
183
201
|
header: gate_step_header(result),
|
|
184
202
|
output: result.output,
|
|
185
203
|
}))
|
|
186
|
-
const failed = results.filter((result) => is_gate_step_failed(result))
|
|
187
204
|
const written_log = gate_log.write_gate_log(entries, report.log_path)
|
|
188
205
|
|
|
189
|
-
print_gate_summary(
|
|
206
|
+
print_gate_summary(results, report, written_log)
|
|
190
207
|
|
|
191
|
-
return
|
|
208
|
+
return results.filter((result) => is_gate_step_failed(result)).map((result) => result.label)
|
|
192
209
|
}
|
|
193
210
|
|
|
194
211
|
const gate_report = {
|
|
212
|
+
format_budget_notes,
|
|
195
213
|
format_failure_actions,
|
|
196
214
|
has_checker_warning,
|
|
197
215
|
is_gate_step_failed,
|
|
@@ -2,13 +2,12 @@ import type { FileMapStamp } from '#scripts/josh/file-map-stamp'
|
|
|
2
2
|
import { review_brief } from '#scripts/review/review-brief'
|
|
3
3
|
import { review_stamps } from '#scripts/review/review-stamps'
|
|
4
4
|
|
|
5
|
-
// Whether `josh gate` already has the answer it is about to spend 47–50 seconds computing again
|
|
6
|
-
// (joshuafolkken/kit#1328).
|
|
5
|
+
// Whether `josh gate` already has the answer it is about to spend 47–50 seconds computing again.
|
|
7
6
|
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
7
|
+
// `record_green_gate` writes the digest of every changed file the four checks were green on, and
|
|
8
|
+
// `josh review:brief` reads it back to print `Already verified`. The gate reads it too, so a second
|
|
9
|
+
// run over an unedited tree does not start four processes to reach a conclusion already on disk.
|
|
10
|
+
// **This is reuse of a result, not a check
|
|
12
11
|
// dropped**: the bytes the skip answers for are the bytes the record was written from, compared one
|
|
13
12
|
// by one.
|
|
14
13
|
//
|
|
@@ -17,8 +16,7 @@ import { review_stamps } from '#scripts/review/review-stamps'
|
|
|
17
16
|
// differently from the brief printed beside it would be two commands disagreeing about the same tree.
|
|
18
17
|
//
|
|
19
18
|
// **A file map does not describe a tree on its own, because it is a diff.** It lists what differs
|
|
20
|
-
// from the commit the branch was cut from — its merge base with the default branch
|
|
21
|
-
// joshuafolkken/kit#1527 — so everything the record says stays true while that base moves underneath
|
|
19
|
+
// from the commit the branch was cut from — its merge base with the default branch — so everything the record says stays true while that base moves underneath
|
|
22
20
|
// it. Two shapes of that, one obvious and one not:
|
|
23
21
|
//
|
|
24
22
|
// - Straight after `git switch main && git pull` the map is **empty**, and an empty map compares
|
|
@@ -29,8 +27,8 @@ import { review_stamps } from '#scripts/review/review-stamps'
|
|
|
29
27
|
// every other file has been replaced by code no check has read. The rebase moves `HEAD`, so it
|
|
30
28
|
// moves the merge base with it, and the base check still catches this.
|
|
31
29
|
//
|
|
32
|
-
// **What no longer refuses a reuse is another lane merging into the shared default branch
|
|
33
|
-
//
|
|
30
|
+
// **What no longer refuses a reuse is another lane merging into the shared default branch**.
|
|
31
|
+
// In a linked work tree the default branch's ref is shared, but the merge
|
|
34
32
|
// base is a commit: an advance this branch is an ancestor of does not move it, and nothing this
|
|
35
33
|
// checkout's four checks read has changed — so refusing there would have discarded a record that
|
|
36
34
|
// still describes the tree exactly.
|
|
@@ -40,7 +38,7 @@ import { review_stamps } from '#scripts/review/review-stamps'
|
|
|
40
38
|
// worth the argument: a tree with no changed file is not where a run spends its gate time.
|
|
41
39
|
//
|
|
42
40
|
// Two refusals need no code here. A gate that went red writes no record at all, so the re-verification
|
|
43
|
-
// after a fix finds nothing to reuse; and
|
|
41
|
+
// after a fix finds nothing to reuse; and the join before the commit follows a
|
|
44
42
|
// `josh bump`, which edits `package.json` into the map.
|
|
45
43
|
//
|
|
46
44
|
// **What is reused is a silent green run.** `record_green_gate` withholds the record from a run that
|
|
@@ -61,7 +59,7 @@ const FORCE_FLAG = '--force'
|
|
|
61
59
|
// A `base` that could not be read is `undefined`, and an older record carries none: both compare
|
|
62
60
|
// unequal to anything, so the gate runs its checks. No base means no reuse, never reuse without one.
|
|
63
61
|
//
|
|
64
|
-
// **A refusal carries its reason
|
|
62
|
+
// **A refusal carries its reason**: a pre-push hook that fell back to the
|
|
65
63
|
// whole unit suite said nothing about why, so a merge base moved by ship's main sync and a lock file
|
|
66
64
|
// rewritten by the hook's own install each cost minutes before anyone could tell them apart.
|
|
67
65
|
type GateReuse = { stamp: FileMapStamp } | { miss: string }
|
|
@@ -103,7 +101,7 @@ function reusable_green_gate(
|
|
|
103
101
|
// goes on to a commit on the strength of it. So the line says what passed, on which tree and when,
|
|
104
102
|
// and names the flag or the variable that runs the checks anyway.
|
|
105
103
|
//
|
|
106
|
-
// **One sentence, every reader of the record
|
|
104
|
+
// **One sentence, every reader of the record**. The gate says it, the
|
|
107
105
|
// pre-push hook says it and the pre-commit hook says it, and three copies of a claim this load-bearing
|
|
108
106
|
// would not have stayed the same sentence — the clone `CLAUDE.md` prohibits. What differs between them
|
|
109
107
|
// is four fragments and nothing else, so those are the parameters and the shape is not.
|
|
@@ -13,6 +13,10 @@ function unit_worker_args(check: GateCheck, plan: GatePlan): ReadonlyArray<strin
|
|
|
13
13
|
return [`${UNIT_WORKER_FLAG}=${String(plan.unit_worker_cap)}`]
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
+
function check_args(check: GateCheck, plan: GatePlan): ReadonlyArray<string> {
|
|
17
|
+
return [...(check.args ?? []), ...unit_worker_args(check, plan)]
|
|
18
|
+
}
|
|
19
|
+
|
|
16
20
|
// Resolve the type checker per project and run every static check from its package root.
|
|
17
21
|
async function build_gate_step(
|
|
18
22
|
check: GateCheck,
|
|
@@ -26,7 +30,7 @@ async function build_gate_step(
|
|
|
26
30
|
if (check.label !== TYPE_CHECK_LABEL) {
|
|
27
31
|
return {
|
|
28
32
|
label: check.label,
|
|
29
|
-
command_args: [JOSH, check.target, ...
|
|
33
|
+
command_args: [JOSH, check.target, ...check_args(check, plan)],
|
|
30
34
|
cwd,
|
|
31
35
|
}
|
|
32
36
|
}
|
|
@@ -2,12 +2,11 @@ import { change_base } from '#scripts/git/change-base'
|
|
|
2
2
|
import { review_tree } from '#scripts/review/review-tree'
|
|
3
3
|
|
|
4
4
|
// The two readings a green-gate record is written from and compared against: the digest of every
|
|
5
|
-
// changed file, and the commit that map is a diff against
|
|
6
|
-
// joshuafolkken/kit#1328).
|
|
5
|
+
// changed file, and the commit that map is a diff against.
|
|
7
6
|
//
|
|
8
7
|
// They live here rather than inside `verification-gate.ts` because there are now two readers — the
|
|
9
8
|
// gate, which reuses a green record instead of re-running its four checks, and the pre-push hook,
|
|
10
|
-
// which reuses the same record instead of re-running the unit suite
|
|
9
|
+
// which reuses the same record instead of re-running the unit suite. A
|
|
11
10
|
// second copy of the pair would be the clone `CLAUDE.md` prohibits, and it would not have stayed
|
|
12
11
|
// identical: what these functions really encode is which failure direction is safe, and a copy is
|
|
13
12
|
// where that decision gets made twice.
|
|
@@ -30,7 +29,7 @@ async function read_changed_files(): Promise<Record<string, string>> {
|
|
|
30
29
|
}
|
|
31
30
|
}
|
|
32
31
|
|
|
33
|
-
// The resolver lives in `git/change-base.ts
|
|
32
|
+
// The resolver lives in `git/change-base.ts`, because the review brief
|
|
34
33
|
// needs exactly this reading and a second copy of it is the clone `CLAUDE.md` prohibits.
|
|
35
34
|
async function read_base(): Promise<string | undefined> {
|
|
36
35
|
return await change_base.resolved()
|