@joshuafolkken/kit 1.1240.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 +19 -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 +26 -16
- package/.claude/skills/workflow-commands/latest-gate.md +17 -28
- 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/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +29 -47
- 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-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-ZQGD4GBY.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-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
- 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 +216 -202
- 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 -187
- package/dist/josh.js +281 -94
- 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 +3 -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 +2 -2
- package/scripts/gate/core-budget.ts +15 -26
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +70 -35
- package/scripts/gate/gate-report.ts +14 -15
- 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 +168 -30
- 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 +53 -51
- 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 +7 -7
- 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 +1 -1
- 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 +24 -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 +52 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +9 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +34 -38
- 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 +17 -7
- package/scripts/issue/issue-release.ts +3 -3
- 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 +30 -35
- 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 +25 -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 +4 -5
- package/scripts/josh/josh-commands-lane.ts +14 -4
- package/scripts/josh/josh-commands-lint.ts +1 -1
- 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 +6 -7
- 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 +12 -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 +2 -2
- 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 +20 -19
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +12 -11
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +16 -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 +1 -1
- 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-runs.ts +1 -1
- 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 +54 -36
- 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 +9 -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 +171 -46
- 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 +58 -47
- 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 -32
- package/scripts/run/wake/run-wake-describe.ts +24 -28
- 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 +9 -9
- 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 -279
- 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 +26 -26
- 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/dist/hooks/chunk-KHX4U3BG.js +0 -6400
- 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
|
@@ -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()
|
|
@@ -4,13 +4,13 @@ import { gate_skip, type GateReuse } from './gate-skip'
|
|
|
4
4
|
import type { GateTree } from './gate-tree'
|
|
5
5
|
|
|
6
6
|
// What the two git hooks share when they decline to re-run a check `pnpm josh gate` already passed on
|
|
7
|
-
// this tree
|
|
7
|
+
// this tree.
|
|
8
8
|
//
|
|
9
|
-
// The pre-push hook got this behavior first
|
|
9
|
+
// The pre-push hook got this behavior first and the pre-commit type check is
|
|
10
10
|
// the second reader of the same record. Everything that is the same in both lives here rather than in
|
|
11
11
|
// each of them: the escape hatch, the pre-filter in front of the record, and the one `git status`
|
|
12
12
|
// reading both narrow themselves from. **The record comparison itself is not here either** — it is
|
|
13
|
-
// `gate_skip.reusable_green_gate`,
|
|
13
|
+
// `gate_skip.reusable_green_gate`, so a hook cannot answer "is this tree
|
|
14
14
|
// still the recorded one" differently from the gate printing its answer beside it.
|
|
15
15
|
//
|
|
16
16
|
// **Every condition added here only ever narrows.** The gate's own three — the file map matches, the
|
|
@@ -19,7 +19,7 @@ import type { GateTree } from './gate-tree'
|
|
|
19
19
|
// git operation is about to carry. Where the two can differ, the hook runs the check. Any reading that
|
|
20
20
|
// could not be taken fails the same way: "we could not tell" must never resolve to "no need to check".
|
|
21
21
|
|
|
22
|
-
// The `josh` targets that decline a check on the strength of this record
|
|
22
|
+
// The `josh` targets that decline a check on the strength of this record.
|
|
23
23
|
//
|
|
24
24
|
// **It is declared beside the mechanism rather than beside the reader.** `josh layers` reports which
|
|
25
25
|
// checks run in more than one layer, and two of the rows it prints are not the repetition they look
|
|
@@ -51,13 +51,13 @@ function is_force_requested(force_environment: string): boolean {
|
|
|
51
51
|
// `undefined` rather than an empty list when the reading failed, so a caller cannot mistake "git said
|
|
52
52
|
// nothing" for "git could not be asked". Every predicate below treats the two differently.
|
|
53
53
|
//
|
|
54
|
-
// **The observation ledger is dropped from the reading, and it is the one line that may be
|
|
55
|
-
//
|
|
54
|
+
// **The observation ledger is dropped from the reading, and it is the one line that may be**.
|
|
55
|
+
// Lines are appended throughout a run — a review's record lands after its
|
|
56
56
|
// gate — and every condition below reads a non-empty status as "this operation carries a tree no
|
|
57
57
|
// check has read". Left in, one ledger line would send every commit and every push in the primary
|
|
58
58
|
// checkout back to the full gate, which is the reuse this module exists to grant. **Dropping it is
|
|
59
59
|
// sound because the ledger is no code any check runs**: `pnpm josh git` stages it with the run's
|
|
60
|
-
// commit only after its grammar has been parsed
|
|
60
|
+
// commit only after its grammar has been parsed, and the rest of its content
|
|
61
61
|
// is checked by the CI of the pull request that carries it.
|
|
62
62
|
async function read_status_lines(): Promise<ReadonlyArray<string> | undefined> {
|
|
63
63
|
try {
|
|
@@ -93,7 +93,7 @@ interface HookReuse {
|
|
|
93
93
|
// The hook-specific narrowing: whether what this git operation carries is the tree the record
|
|
94
94
|
// describes. `is_worktree_clean` for a push, `is_index_matching_worktree` for a commit.
|
|
95
95
|
is_tree_carried: boolean
|
|
96
|
-
// The reason a refusal on that narrowing reports, in the hook's own words
|
|
96
|
+
// The reason a refusal on that narrowing reports, in the hook's own words.
|
|
97
97
|
carry_miss: string
|
|
98
98
|
extra_arguments: ReadonlyArray<string>
|
|
99
99
|
force_env: string
|
|
@@ -105,7 +105,7 @@ interface HookReuse {
|
|
|
105
105
|
|
|
106
106
|
// The stamp rather than a boolean, for the same reason `gate_skip.gate_reuse` hands one back: the
|
|
107
107
|
// caller prints `taken_at`, and a record that does not describe this tree has no timestamp worth
|
|
108
|
-
// printing. A refusal carries its reason instead
|
|
108
|
+
// printing. A refusal carries its reason instead.
|
|
109
109
|
//
|
|
110
110
|
// **Any argument at all refuses the reuse**, not only the force flag. A caller who narrowed the run
|
|
111
111
|
// asked for that run rather than for a recorded result about a whole tree, and a hook's own line passes
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises'
|
|
2
2
|
import { availableParallelism, cpus, totalmem } from 'node:os'
|
|
3
|
+
import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
3
4
|
import { execa } from 'execa'
|
|
4
5
|
|
|
5
|
-
// What the machine has free right now, read for the core budget's admission
|
|
6
|
+
// What the machine has free right now, read for the core budget's admission.
|
|
6
7
|
//
|
|
7
8
|
// **The budget used to be the core count, and that count is not what is free.** The ledger in
|
|
8
9
|
// `core-budget.ts` admits against `availableParallelism()`, so the load it never sees — Claude sessions,
|
|
@@ -10,8 +11,8 @@ import { execa } from 'execa'
|
|
|
10
11
|
// spent. On 2026-10-07, three lanes on the 11-core / 18 GB machine reached a load average of 16.8 with
|
|
11
12
|
// 31% of the CPU in the kernel, compressing and swapping 4.4 GB of memory the ledger never counted.
|
|
12
13
|
//
|
|
13
|
-
// **This is a closed loop, not
|
|
14
|
-
//
|
|
14
|
+
// **This is a closed loop, not an open-loop formula.** An open loop would derive a share from the
|
|
15
|
+
// core count up front; this reads what is busy and free at the moment of
|
|
15
16
|
// admission and subtracts only the part the ledger does not already account for.
|
|
16
17
|
//
|
|
17
18
|
// **The busy cores are the CPU-time difference over a short window, not the load average.** The load
|
|
@@ -21,6 +22,11 @@ import { execa } from 'execa'
|
|
|
21
22
|
// **A reading that fails answers undefined, and undefined is the old behavior.** A CI runner or a
|
|
22
23
|
// container — where the host's CPU times are not this process's quota — budgets by the core count and
|
|
23
24
|
// admits without looking at memory, exactly as before.
|
|
25
|
+
//
|
|
26
|
+
// **`run:board` draws its machine gauges from the same reading**, so what the
|
|
27
|
+
// board shows a person is what the gate admits against. The board takes a sample with no window and
|
|
28
|
+
// draws the difference from its previous one. `lane:sample` records the memory half of it, so the
|
|
29
|
+
// lane-limit measurement sets the same figures beside the lane count.
|
|
24
30
|
|
|
25
31
|
// The window the busy cores are measured over: long enough that one scheduler tick does not dominate it,
|
|
26
32
|
// short enough that a solo admission is not visibly delayed.
|
|
@@ -35,18 +41,40 @@ const BYTES_PER_MB = 1_048_576
|
|
|
35
41
|
const KB_PER_MB = 1024
|
|
36
42
|
const PERCENT = 100
|
|
37
43
|
const MEMINFO_PATH = '/proc/meminfo'
|
|
44
|
+
const VMSTAT_PATH = '/proc/vmstat'
|
|
38
45
|
const LINUX_AVAILABLE = /^MemAvailable:\s+(?<kb>\d+) kB/mu
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
46
|
+
const LINUX_SWAP_IN = /^pswpin (?<pages>\d+)$/mu
|
|
47
|
+
const LINUX_SWAP_OUT = /^pswpout (?<pages>\d+)$/mu
|
|
48
|
+
const PAGE_SIZE_ARGUMENTS = ['PAGESIZE']
|
|
49
|
+
// The whole memory reading in one `sysctl`, cheap enough for `run:board` to take
|
|
50
|
+
// every second. `kern.memorystatus_level` is the kernel's own memory-pressure figure: the percentage of
|
|
51
|
+
// memory still available, compressible and purgeable pages included — what `os.freemem()` leaves out on
|
|
52
|
+
// macOS, where it reads near zero on a machine with gigabytes to spare. The swapper counters are the
|
|
53
|
+
// pages swapped in and out since boot, `vm_stat`'s `Swapins` / `Swapouts`. The names stay in the output
|
|
54
|
+
// (no `-n`), so a name an older macOS lacks drops only its own line.
|
|
55
|
+
const LEVEL_NAME = 'kern.memorystatus_level'
|
|
56
|
+
const SWAP_IN_NAME = 'vm.compressor.swapper.swapins_total'
|
|
57
|
+
const SWAP_OUT_NAME = 'vm.compressor.swapper.swapouts_total'
|
|
58
|
+
const PAGE_SIZE_NAME = 'hw.pagesize'
|
|
59
|
+
// The kernel's memory-pressure verdict — 1 normal, 2 warning, 4 critical — the one Activity Monitor
|
|
60
|
+
// colors its "memory pressure" graph by.
|
|
61
|
+
const PRESSURE_NAME = 'kern.memorystatus_vm_pressure_level'
|
|
62
|
+
const SYSCTL_ARGUMENTS = [LEVEL_NAME, SWAP_IN_NAME, SWAP_OUT_NAME, PAGE_SIZE_NAME, PRESSURE_NAME]
|
|
63
|
+
const SYSCTL_LINE = /^(?<name>[\w.]+): (?<value>\d+)$/gmu
|
|
44
64
|
|
|
45
65
|
interface MachineReading {
|
|
46
66
|
busy_cores: number | undefined
|
|
47
67
|
available_mb: number | undefined
|
|
48
68
|
}
|
|
49
69
|
|
|
70
|
+
// The memory half of a reading. `swapped_mb` is a counter — every page swapped in or out since boot —
|
|
71
|
+
// so a rate is the difference between two readings. `pressure_level` is read on macOS only.
|
|
72
|
+
interface MemoryReading {
|
|
73
|
+
available_mb: number | undefined
|
|
74
|
+
swapped_mb: number | undefined
|
|
75
|
+
pressure_level: number | undefined
|
|
76
|
+
}
|
|
77
|
+
|
|
50
78
|
// What the ledger's admitted reservations declare — the part of the machine's load already accounted for.
|
|
51
79
|
interface LedgerLoad {
|
|
52
80
|
cores: number
|
|
@@ -63,6 +91,13 @@ interface CpuTimes {
|
|
|
63
91
|
total: number
|
|
64
92
|
}
|
|
65
93
|
|
|
94
|
+
// One moment of the machine for `run:board`: CPU times and the memory reading, no window waited out.
|
|
95
|
+
interface MachineSample {
|
|
96
|
+
cpu: CpuTimes
|
|
97
|
+
memory: MemoryReading
|
|
98
|
+
total_mb: number
|
|
99
|
+
}
|
|
100
|
+
|
|
66
101
|
function cpu_times(): CpuTimes {
|
|
67
102
|
let busy = 0
|
|
68
103
|
let idle = 0
|
|
@@ -75,21 +110,65 @@ function cpu_times(): CpuTimes {
|
|
|
75
110
|
return { busy, total: busy + idle }
|
|
76
111
|
}
|
|
77
112
|
|
|
78
|
-
|
|
113
|
+
// The busy share of the CPU between two readings, from 0 to 1.
|
|
114
|
+
function busy_share_between(before: CpuTimes, after: CpuTimes): number | undefined {
|
|
79
115
|
const total = after.total - before.total
|
|
80
116
|
|
|
81
117
|
if (total <= 0) return undefined
|
|
82
118
|
|
|
83
|
-
return (
|
|
119
|
+
return (after.busy - before.busy) / total
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function busy_cores_between(before: CpuTimes, after: CpuTimes, cores: number): number | undefined {
|
|
123
|
+
const share = busy_share_between(before, after)
|
|
124
|
+
|
|
125
|
+
return share === undefined ? undefined : share * cores
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function sysctl_values(output: string): Map<string, number> {
|
|
129
|
+
const values = [...output.matchAll(SYSCTL_LINE)].map(
|
|
130
|
+
(match) => [match.groups?.['name'] ?? '', Number(match.groups?.['value'])] as const,
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
return new Map(values)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// The pages swapped in and out since boot; either count unread leaves the sum unread.
|
|
137
|
+
function swapped_pages(
|
|
138
|
+
pages_in: number | undefined,
|
|
139
|
+
pages_out: number | undefined,
|
|
140
|
+
): number | undefined {
|
|
141
|
+
return pages_in === undefined || pages_out === undefined ? undefined : pages_in + pages_out
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function swapped_mb(pages: number | undefined, page_bytes: number | undefined): number | undefined {
|
|
145
|
+
if (pages === undefined || page_bytes === undefined) return undefined
|
|
146
|
+
|
|
147
|
+
return (pages * page_bytes) / BYTES_PER_MB
|
|
84
148
|
}
|
|
85
149
|
|
|
86
|
-
//
|
|
87
|
-
|
|
88
|
-
|
|
150
|
+
// What was swapped between two readings of the counter. A counter that went back — a reboot between
|
|
151
|
+
// them — is read as nothing swapped.
|
|
152
|
+
function swapped_between(from: number | undefined, to: number | undefined): number | undefined {
|
|
153
|
+
if (from === undefined || to === undefined) return undefined
|
|
154
|
+
|
|
155
|
+
return Math.max(0, to - from)
|
|
156
|
+
}
|
|
89
157
|
|
|
90
|
-
|
|
158
|
+
// `kern.memorystatus_level: 58` → 58% of physical memory still available, beside the swapped pages.
|
|
159
|
+
function parse_darwin_memory(output: string, total_bytes: number): MemoryReading {
|
|
160
|
+
const values = sysctl_values(output)
|
|
161
|
+
const level = values.get(LEVEL_NAME)
|
|
91
162
|
|
|
92
|
-
return
|
|
163
|
+
return {
|
|
164
|
+
available_mb:
|
|
165
|
+
level === undefined ? undefined : (level / PERCENT) * (total_bytes / BYTES_PER_MB),
|
|
166
|
+
swapped_mb: swapped_mb(
|
|
167
|
+
swapped_pages(values.get(SWAP_IN_NAME), values.get(SWAP_OUT_NAME)),
|
|
168
|
+
values.get(PAGE_SIZE_NAME),
|
|
169
|
+
),
|
|
170
|
+
pressure_level: values.get(PRESSURE_NAME),
|
|
171
|
+
}
|
|
93
172
|
}
|
|
94
173
|
|
|
95
174
|
function parse_linux_available(meminfo: string): number | undefined {
|
|
@@ -98,24 +177,73 @@ function parse_linux_available(meminfo: string): number | undefined {
|
|
|
98
177
|
return kb === undefined ? undefined : Number(kb) / KB_PER_MB
|
|
99
178
|
}
|
|
100
179
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
): Promise<number | undefined> {
|
|
104
|
-
try {
|
|
105
|
-
if (platform === 'darwin') {
|
|
106
|
-
const { stdout } = await execa('sysctl', PRESSURE_ARGUMENTS)
|
|
180
|
+
function pages_of(pattern: RegExp, vmstat: string): number | undefined {
|
|
181
|
+
const pages = pattern.exec(vmstat)?.groups?.['pages']
|
|
107
182
|
|
|
108
|
-
|
|
109
|
-
|
|
183
|
+
return pages === undefined ? undefined : Number(pages)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// `pswpin` and `pswpout` in `/proc/vmstat` are the pages swapped in and out since boot.
|
|
187
|
+
function parse_linux_swapped(vmstat: string, page_bytes: number): number | undefined {
|
|
188
|
+
const pages = swapped_pages(pages_of(LINUX_SWAP_IN, vmstat), pages_of(LINUX_SWAP_OUT, vmstat))
|
|
189
|
+
|
|
190
|
+
return swapped_mb(pages, page_bytes)
|
|
191
|
+
}
|
|
110
192
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
193
|
+
async function settled<T>(read: () => Promise<T>): Promise<T | undefined> {
|
|
194
|
+
try {
|
|
195
|
+
return await read()
|
|
114
196
|
} catch {
|
|
115
197
|
return undefined
|
|
116
198
|
}
|
|
117
199
|
}
|
|
118
200
|
|
|
201
|
+
// A name `sysctl` does not know fails the command but still prints the others, so the exit is not read.
|
|
202
|
+
async function read_darwin_memory(): Promise<MemoryReading> {
|
|
203
|
+
const { stdout } = await execa('sysctl', SYSCTL_ARGUMENTS, {
|
|
204
|
+
reject: false,
|
|
205
|
+
timeout: PROBE_TIMEOUT_MS,
|
|
206
|
+
})
|
|
207
|
+
|
|
208
|
+
return parse_darwin_memory(stdout, totalmem())
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
async function read_page_size(): Promise<string> {
|
|
212
|
+
const { stdout } = await execa('getconf', PAGE_SIZE_ARGUMENTS, { timeout: PROBE_TIMEOUT_MS })
|
|
213
|
+
|
|
214
|
+
return stdout
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
async function read_linux_memory(): Promise<MemoryReading> {
|
|
218
|
+
const [meminfo, vmstat, page_size] = await Promise.all([
|
|
219
|
+
settled(async () => await readFile(MEMINFO_PATH, 'utf8')),
|
|
220
|
+
settled(async () => await readFile(VMSTAT_PATH, 'utf8')),
|
|
221
|
+
settled(read_page_size),
|
|
222
|
+
])
|
|
223
|
+
const page_bytes = page_size === undefined ? undefined : Number(page_size)
|
|
224
|
+
|
|
225
|
+
return {
|
|
226
|
+
available_mb: meminfo === undefined ? undefined : parse_linux_available(meminfo),
|
|
227
|
+
swapped_mb:
|
|
228
|
+
vmstat === undefined || page_bytes === undefined
|
|
229
|
+
? undefined
|
|
230
|
+
: parse_linux_swapped(vmstat, page_bytes),
|
|
231
|
+
pressure_level: undefined,
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const UNREAD_MEMORY: MemoryReading = {
|
|
236
|
+
available_mb: undefined,
|
|
237
|
+
swapped_mb: undefined,
|
|
238
|
+
pressure_level: undefined,
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
async function read_memory(): Promise<MemoryReading> {
|
|
242
|
+
if (process.platform === 'darwin') return (await settled(read_darwin_memory)) ?? UNREAD_MEMORY
|
|
243
|
+
|
|
244
|
+
return process.platform === 'linux' ? await read_linux_memory() : UNREAD_MEMORY
|
|
245
|
+
}
|
|
246
|
+
|
|
119
247
|
// A CPU quota narrower than the host makes the host-wide CPU times the wrong machine, so the busy cores
|
|
120
248
|
// are read only where the quota and the host agree.
|
|
121
249
|
function is_unquoted(): boolean {
|
|
@@ -132,12 +260,16 @@ async function read_machine(
|
|
|
132
260
|
sleep: (ms: number) => Promise<void> = default_sleep,
|
|
133
261
|
): Promise<MachineReading> {
|
|
134
262
|
const before = cpu_times()
|
|
135
|
-
const [
|
|
263
|
+
const [memory] = await Promise.all([read_memory(), sleep(SAMPLE_WINDOW_MS)])
|
|
136
264
|
const busy_cores = is_unquoted()
|
|
137
265
|
? busy_cores_between(before, cpu_times(), cpus().length)
|
|
138
266
|
: undefined
|
|
139
267
|
|
|
140
|
-
return { busy_cores, available_mb }
|
|
268
|
+
return { busy_cores, available_mb: memory.available_mb }
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
async function read_sample(): Promise<MachineSample> {
|
|
272
|
+
return { cpu: cpu_times(), memory: await read_memory(), total_mb: totalmem() / BYTES_PER_MB }
|
|
141
273
|
}
|
|
142
274
|
|
|
143
275
|
// The busy cores the ledger does not account for, beyond the baseline the weights were measured beside,
|
|
@@ -165,11 +297,17 @@ function machine_budget(cores: number, reading: MachineReading, ledger: LedgerLo
|
|
|
165
297
|
const machine_capacity = {
|
|
166
298
|
BASELINE_CORES,
|
|
167
299
|
busy_cores_between,
|
|
300
|
+
busy_share_between,
|
|
301
|
+
external_cores,
|
|
168
302
|
machine_budget,
|
|
169
|
-
|
|
303
|
+
parse_darwin_memory,
|
|
170
304
|
parse_linux_available,
|
|
305
|
+
parse_linux_swapped,
|
|
171
306
|
read_machine,
|
|
307
|
+
read_memory,
|
|
308
|
+
read_sample,
|
|
309
|
+
swapped_between,
|
|
172
310
|
}
|
|
173
311
|
|
|
174
|
-
export type { LedgerLoad, MachineBudget, MachineReading }
|
|
312
|
+
export type { CpuTimes, LedgerLoad, MachineBudget, MachineReading, MachineSample, MemoryReading }
|
|
175
313
|
export { machine_capacity }
|
|
@@ -9,7 +9,7 @@ import { hook_gate_reuse } from './hook-gate-reuse'
|
|
|
9
9
|
import { DEFAULT_TYPE_CHECK_ARGS, type_check_step } from './type-check-step'
|
|
10
10
|
|
|
11
11
|
// The pre-commit hook's type check, which no longer re-runs a project-wide `tsc --noEmit` that a green
|
|
12
|
-
// gate already covers
|
|
12
|
+
// gate already covers.
|
|
13
13
|
//
|
|
14
14
|
// Measured on this repository: `pnpm exec tsc --noEmit` over the whole project takes 3.8–4.4s warm, and
|
|
15
15
|
// `pnpm josh git -y` pays it on every commit — a `fullrun` commits twice — seconds after `pnpm josh
|
|
@@ -22,8 +22,8 @@ import { DEFAULT_TYPE_CHECK_ARGS, type_check_step } from './type-check-step'
|
|
|
22
22
|
// recorded wide one. So they are untouched, and so are `prevent-main-commit` and `secretlint`, which
|
|
23
23
|
// the gate does not run at all and which are therefore duplicates of nothing.
|
|
24
24
|
//
|
|
25
|
-
// **The decision is
|
|
26
|
-
// carries what this shares with the pre-push hook
|
|
25
|
+
// **The decision is the gate's, imported rather than restated** — `hook_gate_reuse`
|
|
26
|
+
// carries what this shares with the pre-push hook and defers the record
|
|
27
27
|
// comparison itself to `gate_skip.reusable_green_gate`. A hook answering "is this still the recorded
|
|
28
28
|
// tree" differently from the gate beside it would be two commands disagreeing about one tree.
|
|
29
29
|
//
|
|
@@ -54,7 +54,7 @@ interface CommitTree extends GateTree {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
// **The record says the gate's four checks were green; it does not say *which* type check ran.**
|
|
57
|
-
// `type-check-step.ts` resolves that per project
|
|
57
|
+
// `type-check-step.ts` resolves that per project: a project carrying a
|
|
58
58
|
// `josh-app` / `josh-game` shim has the toolkit's `check:ci` as its gate step, and this hook's step is
|
|
59
59
|
// `tsc --noEmit`. Reusing across that difference would skip `tsc --noEmit` on the strength of a
|
|
60
60
|
// different check — a `.ts` file inside the root `tsconfig.json` but outside the one `svelte-check` is
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { existsSync, globSync, readFileSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { find_local_bin_upwards } from '#scripts/build/local-bin'
|
|
4
|
+
import { doctor_consumer } from '#scripts/doctor/doctor-consumer'
|
|
4
5
|
import { project_profile } from '#scripts/init/project-profile'
|
|
5
6
|
import { ancestor_directories } from '#scripts/lib/ancestor-directories'
|
|
6
7
|
import { json_value } from '#scripts/lib/json-value'
|
|
@@ -51,6 +52,12 @@ function project_root(directory: string): string {
|
|
|
51
52
|
)
|
|
52
53
|
}
|
|
53
54
|
|
|
55
|
+
// The kit repository itself rather than a consumer of it — the gate's and the detached ship's one
|
|
56
|
+
// answer to whether kit-only checks run.
|
|
57
|
+
function is_kit_repository(directory: string): boolean {
|
|
58
|
+
return !doctor_consumer.is_kit_consumer(project_root(directory))
|
|
59
|
+
}
|
|
60
|
+
|
|
54
61
|
function is_ignored(entry: string): boolean {
|
|
55
62
|
return entry.split(/[/\\]/u).some((part) => IGNORED_DIRS.has(part))
|
|
56
63
|
}
|
|
@@ -106,7 +113,7 @@ function is_declared(directory: string, package_name: string): boolean {
|
|
|
106
113
|
}
|
|
107
114
|
|
|
108
115
|
// A tool the manifest lists but `node_modules` lacks is a project that has not run `pnpm install`
|
|
109
|
-
// yet — typically right after `josh init` added it
|
|
116
|
+
// yet — typically right after `josh init` added it. Skipping it would pass a
|
|
110
117
|
// check the configuration asks for without running it, so only an undeclared tool is skipped; a
|
|
111
118
|
// declared one is run and fails until it is installed.
|
|
112
119
|
function missing_tool_reason(
|
|
@@ -124,7 +131,7 @@ function skip_notice(check: string, reason: string): string {
|
|
|
124
131
|
}
|
|
125
132
|
|
|
126
133
|
// Shared by `josh check` and the gate's type-check step, so neither reaches `tsc` on a basic
|
|
127
|
-
// project that has nothing to type-check
|
|
134
|
+
// project that has nothing to type-check.
|
|
128
135
|
function type_check_skip_reason(directory: string): string | undefined {
|
|
129
136
|
if (!is_basic(directory)) return undefined
|
|
130
137
|
if (!has_files(directory, TYPE_FILES)) return 'no TypeScript files were found'
|
|
@@ -135,7 +142,7 @@ function type_check_skip_reason(directory: string): string | undefined {
|
|
|
135
142
|
|
|
136
143
|
// Shared by `josh lint`, `josh lint:related` and `josh format`, so a basic project without Web
|
|
137
144
|
// files — a Python or Rust project, which `josh init` gives no Prettier — is skipped for the same
|
|
138
|
-
// reason by all three
|
|
145
|
+
// reason by all three.
|
|
139
146
|
function prettier_skip_reason(directory: string): string | undefined {
|
|
140
147
|
if (!is_basic(directory)) return undefined
|
|
141
148
|
if (!has_files(directory, WEB_FILES)) return 'no HTML, CSS or JavaScript files were found'
|
|
@@ -144,7 +151,7 @@ function prettier_skip_reason(directory: string): string | undefined {
|
|
|
144
151
|
}
|
|
145
152
|
|
|
146
153
|
// Shared by `josh lint`, `josh lint:related` and `josh format`, so a basic project without ESLint
|
|
147
|
-
// is skipped for the same reason by all three
|
|
154
|
+
// is skipped for the same reason by all three.
|
|
148
155
|
function eslint_skip_reason(directory: string): string | undefined {
|
|
149
156
|
if (!is_basic(directory)) return undefined
|
|
150
157
|
if (!has_files(directory, SCRIPT_FILES)) return 'no JavaScript or TypeScript files were found'
|
|
@@ -163,6 +170,7 @@ const project_checks = {
|
|
|
163
170
|
has_config,
|
|
164
171
|
has_files,
|
|
165
172
|
is_basic,
|
|
173
|
+
is_kit_repository,
|
|
166
174
|
prettier_skip_reason,
|
|
167
175
|
project_root,
|
|
168
176
|
skip_notice,
|
|
@@ -6,22 +6,16 @@ import { test_unit_guard } from '#scripts/test/test-unit-guard'
|
|
|
6
6
|
import { gate_tree, type GateTree } from './gate-tree'
|
|
7
7
|
|
|
8
8
|
// Whether the two scoped checks have been green on *this exact tree* by the time the review is
|
|
9
|
-
// briefed
|
|
9
|
+
// briefed.
|
|
10
10
|
//
|
|
11
|
-
// **
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// None of them says the pair has to have answered before the review starts, and `fullrun #1503` is
|
|
15
|
-
// what that costs: the gate and round 1 were started on a tree neither check had ever read, three
|
|
16
|
-
// findings then arrived on three separate round trips with fourteen edits between them, and the
|
|
17
|
-
// rework ran 282 seconds — 31% of a 905-second run. The same run proves the cheap half: the one call
|
|
18
|
-
// that ran both checks together took 13.8 seconds and produced two of the three findings at once.
|
|
11
|
+
// **It fixes when `lint:related` and `test:related` run.** A gate and a review round started on a
|
|
12
|
+
// tree neither check has read return their findings one round trip at a time; one call running both
|
|
13
|
+
// checks first returns most of them at once.
|
|
19
14
|
//
|
|
20
15
|
// **It fixes when the checks run, never whether they run, and never what they check.** Nothing here
|
|
21
16
|
// skips a check, narrows one, or reinterprets its output — a green record buys ordering and nothing
|
|
22
|
-
// else, and `josh gate` still runs its four checks exactly as before.
|
|
23
|
-
//
|
|
24
|
-
// instead of re-running it and was closed as not needed, and this record does not revive it.
|
|
17
|
+
// else, and `josh gate` still runs its four checks exactly as before. It never *reuses* a scoped
|
|
18
|
+
// check's result in place of re-running it.
|
|
25
19
|
//
|
|
26
20
|
// **The judgement is the gate's own, not a second one.** "There is a record and nothing it covers has
|
|
27
21
|
// moved" is `review_brief.matching_stamp` plus the base equality `gate_skip.reusable_green_gate`
|
|
@@ -29,8 +23,8 @@ import { gate_tree, type GateTree } from './gate-tree'
|
|
|
29
23
|
// definition of "this tree is unchanged" is the clone `CLAUDE.md` prohibits, and it is exactly where
|
|
30
24
|
// two commands would start disagreeing about one working tree.
|
|
31
25
|
//
|
|
32
|
-
// **It refuses `josh review:brief`, and now the local `josh gate` too, but never CI's
|
|
33
|
-
//
|
|
26
|
+
// **It refuses `josh review:brief`, and now the local `josh gate` too, but never CI's**.
|
|
27
|
+
// The brief was the first refusal point because it is where `review:attest`
|
|
34
28
|
// mints the nonce a round is counted against, so no countable review round bypasses it. But the gate
|
|
35
29
|
// itself runs *before* the brief, and a run that reached it on a tree the scoped pair had never read
|
|
36
30
|
// paid for the gap anyway — so `verification-gate.ts` reads this same record one step earlier and
|
|
@@ -69,7 +63,7 @@ interface ScopedSources {
|
|
|
69
63
|
is_unit_skipped?: boolean
|
|
70
64
|
}
|
|
71
65
|
|
|
72
|
-
// **`test:related` is required only where it can ever answer
|
|
66
|
+
// **`test:related` is required only where it can ever answer**. In a project
|
|
73
67
|
// whose unit guard skips — vitest absent, or a basic project with no test file — `test:related` runs
|
|
74
68
|
// nothing and so writes no record, and requiring one refused the gate forever with no way through.
|
|
75
69
|
// The guard's own decision is asked rather than re-derived, so the writer and this reader agree; a
|
|
@@ -142,7 +136,7 @@ function missing_checks(
|
|
|
142
136
|
}
|
|
143
137
|
|
|
144
138
|
// The same answer as `missing_checks`, as the `josh` script names a caller runs rather than the
|
|
145
|
-
// command lines a refusal prints — so the ship supervisor
|
|
139
|
+
// command lines a refusal prints — so the ship supervisor meets the
|
|
146
140
|
// precondition itself by running exactly what the refusal would have asked for.
|
|
147
141
|
function missing_scripts(
|
|
148
142
|
tree: Record<string, string>,
|
|
@@ -230,8 +224,7 @@ interface GreenRecord {
|
|
|
230
224
|
// Where the record lands, defaulted by the stamp itself. It exists for the same reason
|
|
231
225
|
// `record_green` and `gate_skip.reusable_green_gate` take one: without it this function can only
|
|
232
226
|
// write the real per-checkout record, so a suite exercising it would vouch for the surrounding
|
|
233
|
-
// run's own tree — the second-writer trap
|
|
234
|
-
// closed for the gate and round-1 records.
|
|
227
|
+
// run's own tree — the second-writer trap the gate and round-1 records close the same way.
|
|
235
228
|
target?: string
|
|
236
229
|
}
|
|
237
230
|
|
|
@@ -6,8 +6,8 @@ import { project_checks } from './project-checks'
|
|
|
6
6
|
|
|
7
7
|
// `josh check` — the project-wide TypeScript check. It used to be a bare `tsc --noEmit` shell entry,
|
|
8
8
|
// so on a basic project with nothing to type-check it failed with `Command "tsc" not found` while
|
|
9
|
-
// the gate, which asks `type_check_skip_reason` first, skipped the same step
|
|
10
|
-
//
|
|
9
|
+
// the gate, which asks `type_check_skip_reason` first, skipped the same step.
|
|
10
|
+
// Both now read that one decision.
|
|
11
11
|
|
|
12
12
|
const ARGV_OFFSET = 2
|
|
13
13
|
const FAIL_EXIT_CODE = 1
|