@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
|
@@ -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
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises'
|
|
2
|
+
import { availableParallelism, cpus, totalmem } from 'node:os'
|
|
3
|
+
import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
4
|
+
import { execa } from 'execa'
|
|
5
|
+
|
|
6
|
+
// What the machine has free right now, read for the core budget's admission.
|
|
7
|
+
//
|
|
8
|
+
// **The budget used to be the core count, and that count is not what is free.** The ledger in
|
|
9
|
+
// `core-budget.ts` admits against `availableParallelism()`, so the load it never sees — Claude sessions,
|
|
10
|
+
// node processes that do not pass through `josh`, the window server — ran on top of a budget already
|
|
11
|
+
// spent. On 2026-10-07, three lanes on the 11-core / 18 GB machine reached a load average of 16.8 with
|
|
12
|
+
// 31% of the CPU in the kernel, compressing and swapping 4.4 GB of memory the ledger never counted.
|
|
13
|
+
//
|
|
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
|
|
16
|
+
// admission and subtracts only the part the ledger does not already account for.
|
|
17
|
+
//
|
|
18
|
+
// **The busy cores are the CPU-time difference over a short window, not the load average.** The load
|
|
19
|
+
// average trails by a minute, so a gate started just after another one finished would see the finished
|
|
20
|
+
// one's load as external and wait out the decay. `os.cpus()` is one read with no process spawned.
|
|
21
|
+
//
|
|
22
|
+
// **A reading that fails answers undefined, and undefined is the old behavior.** A CI runner or a
|
|
23
|
+
// container — where the host's CPU times are not this process's quota — budgets by the core count and
|
|
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.
|
|
30
|
+
|
|
31
|
+
// The window the busy cores are measured over: long enough that one scheduler tick does not dominate it,
|
|
32
|
+
// short enough that a solo admission is not visibly delayed.
|
|
33
|
+
const SAMPLE_WINDOW_MS = 250
|
|
34
|
+
// **The background a developer machine always carries, which the gate's weights were measured beside.**
|
|
35
|
+
// On 2026-10-07 the 11-core machine idled at about 1.5 cores outside `josh` — Claude sessions 0.55, the
|
|
36
|
+
// window server 0.47, a browser 0.5. The solo gate's weights sum to exactly the core count and were
|
|
37
|
+
// measured with that load present, so only what exceeds it is load the budget must give way to;
|
|
38
|
+
// counting the baseline would defer a solo gate's unit suite on every run.
|
|
39
|
+
const BASELINE_CORES = 2
|
|
40
|
+
const BYTES_PER_MB = 1_048_576
|
|
41
|
+
const KB_PER_MB = 1024
|
|
42
|
+
const PERCENT = 100
|
|
43
|
+
const MEMINFO_PATH = '/proc/meminfo'
|
|
44
|
+
const VMSTAT_PATH = '/proc/vmstat'
|
|
45
|
+
const LINUX_AVAILABLE = /^MemAvailable:\s+(?<kb>\d+) kB/mu
|
|
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
|
|
64
|
+
|
|
65
|
+
interface MachineReading {
|
|
66
|
+
busy_cores: number | undefined
|
|
67
|
+
available_mb: number | undefined
|
|
68
|
+
}
|
|
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
|
+
|
|
78
|
+
// What the ledger's admitted reservations declare — the part of the machine's load already accounted for.
|
|
79
|
+
interface LedgerLoad {
|
|
80
|
+
cores: number
|
|
81
|
+
memory_mb: number
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
interface MachineBudget {
|
|
85
|
+
cores: number
|
|
86
|
+
memory_mb: number
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
interface CpuTimes {
|
|
90
|
+
busy: number
|
|
91
|
+
total: number
|
|
92
|
+
}
|
|
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
|
+
|
|
101
|
+
function cpu_times(): CpuTimes {
|
|
102
|
+
let busy = 0
|
|
103
|
+
let idle = 0
|
|
104
|
+
|
|
105
|
+
for (const { times } of cpus()) {
|
|
106
|
+
busy += times.user + times.nice + times.sys + times.irq
|
|
107
|
+
idle += times.idle
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return { busy, total: busy + idle }
|
|
111
|
+
}
|
|
112
|
+
|
|
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 {
|
|
115
|
+
const total = after.total - before.total
|
|
116
|
+
|
|
117
|
+
if (total <= 0) return undefined
|
|
118
|
+
|
|
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
|
|
148
|
+
}
|
|
149
|
+
|
|
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
|
+
}
|
|
157
|
+
|
|
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)
|
|
162
|
+
|
|
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
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function parse_linux_available(meminfo: string): number | undefined {
|
|
175
|
+
const kb = LINUX_AVAILABLE.exec(meminfo)?.groups?.['kb']
|
|
176
|
+
|
|
177
|
+
return kb === undefined ? undefined : Number(kb) / KB_PER_MB
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function pages_of(pattern: RegExp, vmstat: string): number | undefined {
|
|
181
|
+
const pages = pattern.exec(vmstat)?.groups?.['pages']
|
|
182
|
+
|
|
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
|
+
}
|
|
192
|
+
|
|
193
|
+
async function settled<T>(read: () => Promise<T>): Promise<T | undefined> {
|
|
194
|
+
try {
|
|
195
|
+
return await read()
|
|
196
|
+
} catch {
|
|
197
|
+
return undefined
|
|
198
|
+
}
|
|
199
|
+
}
|
|
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
|
+
|
|
247
|
+
// A CPU quota narrower than the host makes the host-wide CPU times the wrong machine, so the busy cores
|
|
248
|
+
// are read only where the quota and the host agree.
|
|
249
|
+
function is_unquoted(): boolean {
|
|
250
|
+
return cpus().length > 0 && cpus().length === availableParallelism()
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
async function default_sleep(ms: number): Promise<void> {
|
|
254
|
+
await new Promise<void>((resolve) => {
|
|
255
|
+
setTimeout(resolve, ms)
|
|
256
|
+
})
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
async function read_machine(
|
|
260
|
+
sleep: (ms: number) => Promise<void> = default_sleep,
|
|
261
|
+
): Promise<MachineReading> {
|
|
262
|
+
const before = cpu_times()
|
|
263
|
+
const [memory] = await Promise.all([read_memory(), sleep(SAMPLE_WINDOW_MS)])
|
|
264
|
+
const busy_cores = is_unquoted()
|
|
265
|
+
? busy_cores_between(before, cpu_times(), cpus().length)
|
|
266
|
+
: undefined
|
|
267
|
+
|
|
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 }
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// The busy cores the ledger does not account for, beyond the baseline the weights were measured beside,
|
|
276
|
+
// in whole cores — the budget is in whole cores, and a fraction of a core is not a core to give up.
|
|
277
|
+
function external_cores(busy_cores: number | undefined, ledger_cores: number): number {
|
|
278
|
+
if (busy_cores === undefined) return 0
|
|
279
|
+
|
|
280
|
+
return Math.floor(Math.max(0, busy_cores - ledger_cores - BASELINE_CORES))
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// **The budget the ledger admits against: what is free plus what the ledger itself already holds.**
|
|
284
|
+
// The admitted reservations' load is inside the reading, and the admission walk counts their declared
|
|
285
|
+
// weight again, so it is added back — what is subtracted is only the load from outside the ledger. The
|
|
286
|
+
// caller passes every admitted claim's cores but only the memory of claims past
|
|
287
|
+
// `core_admission.RAMP_UP_MS`, whose tools have had time to allocate.
|
|
288
|
+
// Memory that could not be read is no limit at all, the behavior before memory was read.
|
|
289
|
+
function machine_budget(cores: number, reading: MachineReading, ledger: LedgerLoad): MachineBudget {
|
|
290
|
+
return {
|
|
291
|
+
cores: cores - external_cores(reading.busy_cores, ledger.cores),
|
|
292
|
+
memory_mb:
|
|
293
|
+
reading.available_mb === undefined ? Infinity : reading.available_mb + ledger.memory_mb,
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
const machine_capacity = {
|
|
298
|
+
BASELINE_CORES,
|
|
299
|
+
busy_cores_between,
|
|
300
|
+
busy_share_between,
|
|
301
|
+
external_cores,
|
|
302
|
+
machine_budget,
|
|
303
|
+
parse_darwin_memory,
|
|
304
|
+
parse_linux_available,
|
|
305
|
+
parse_linux_swapped,
|
|
306
|
+
read_machine,
|
|
307
|
+
read_memory,
|
|
308
|
+
read_sample,
|
|
309
|
+
swapped_between,
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
export type { CpuTimes, LedgerLoad, MachineBudget, MachineReading, MachineSample, MemoryReading }
|
|
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
|
|
@@ -2,10 +2,10 @@ import { find_local_bin_upwards } from '#scripts/build/local-bin'
|
|
|
2
2
|
import { COMMAND_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
3
3
|
import { execa } from 'execa'
|
|
4
4
|
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
5
|
+
// `josh gate`'s type-check step cannot be `tsc --noEmit` for every project. A SvelteKit project
|
|
6
|
+
// type-checks with `svelte-check` behind `svelte-kit sync`, so a fixed `tsc` step would both miss
|
|
7
|
+
// every `.svelte` type error and fail outright on a clean checkout, where `./$types` has not been
|
|
8
|
+
// generated yet.
|
|
9
9
|
//
|
|
10
10
|
// The step is therefore asked of the application layer rather than assumed. Two rules decide it:
|
|
11
11
|
//
|