@joshuafolkken/kit 1.1514.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +5 -5
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +53 -6
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +30 -7
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +8 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +27 -24
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-write.ts +67 -29
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +2 -2
- package/scripts/git/main-merge.ts +25 -9
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +0 -8
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +1 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +2 -10
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +157 -158
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +103 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +2 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +81 -15
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +8 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +80 -2
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +9 -1
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +82 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +116 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +207 -265
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +6 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +34 -8
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +42 -24
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +61 -149
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +97 -10
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +4 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -3,10 +3,14 @@ import { fileURLToPath } from 'node:url'
|
|
|
3
3
|
import { core_budget } from '#scripts/gate/core-budget'
|
|
4
4
|
import {
|
|
5
5
|
CSPELL_COMMIT_CACHE_FLAGS,
|
|
6
|
+
ESLINT_COMMIT_CACHE_FILE,
|
|
6
7
|
ESLINT_COMMIT_CACHE_FLAGS,
|
|
7
8
|
PRETTIER_CACHE_FLAGS,
|
|
8
9
|
} from '#scripts/josh/josh-command-types'
|
|
10
|
+
import { FAIL_EXIT_CODE } from '#scripts/lib/buffered-process'
|
|
9
11
|
import { resolve_spawn_exit } from '#scripts/lib/spawn-exit'
|
|
12
|
+
import { eslint_cache_dependencies } from '#scripts/lint/eslint-cache-dependencies'
|
|
13
|
+
import { eslint_daemon } from '#scripts/lint/eslint-daemon'
|
|
10
14
|
import { execa } from 'execa'
|
|
11
15
|
|
|
12
16
|
// The pre-commit hook's cspell, prettier and eslint runs over the staged files. They go through here
|
|
@@ -21,6 +25,7 @@ import { execa } from 'execa'
|
|
|
21
25
|
const ARGV_OFFSET = 2
|
|
22
26
|
const USAGE_ERROR_EXIT_CODE = 2
|
|
23
27
|
const PNPM = 'pnpm'
|
|
28
|
+
const ESLINT = 'eslint'
|
|
24
29
|
|
|
25
30
|
const TOOL_ARGUMENTS: Readonly<Record<string, ReadonlyArray<string>>> = {
|
|
26
31
|
cspell: [
|
|
@@ -58,18 +63,40 @@ function build_arguments(
|
|
|
58
63
|
return [...tool_arguments, ...staged_files]
|
|
59
64
|
}
|
|
60
65
|
|
|
66
|
+
// eslint goes through the lane's warm daemon when one is reachable (joshuafolkken/kit#4358): the same
|
|
67
|
+
// argument list and the same cache file, without paying the config and plugin load per commit. It
|
|
68
|
+
// runs inside the tool's core-budget reservation like the cold route does.
|
|
69
|
+
//
|
|
70
|
+
// A merge or checkout can change only the files a staged file imports, and the content cache keeps
|
|
71
|
+
// the staged file's verdict: its entry is dropped first when they changed (joshuafolkken/kit#4415).
|
|
72
|
+
async function run_eslint(command_arguments: ReadonlyArray<string>): Promise<number> {
|
|
73
|
+
const result = await eslint_cache_dependencies.guard(
|
|
74
|
+
ESLINT_COMMIT_CACHE_FILE,
|
|
75
|
+
async () => await eslint_daemon.run_or_cold(command_arguments),
|
|
76
|
+
)
|
|
77
|
+
if (result.output !== '') process.stdout.write(result.output)
|
|
78
|
+
|
|
79
|
+
return result.exit_code ?? FAIL_EXIT_CODE
|
|
80
|
+
}
|
|
81
|
+
|
|
61
82
|
async function run_tool(command_arguments: ReadonlyArray<string>): Promise<number> {
|
|
62
83
|
const result = await execa(PNPM, command_arguments, { stdio: 'inherit', reject: false })
|
|
63
84
|
|
|
64
85
|
return resolve_spawn_exit(PNPM, result)
|
|
65
86
|
}
|
|
66
87
|
|
|
88
|
+
async function run_reserved(tool: string, staged_files: ReadonlyArray<string>): Promise<number> {
|
|
89
|
+
const command_arguments = build_arguments(tool, staged_files) ?? []
|
|
90
|
+
if (tool === ESLINT) return await run_eslint(command_arguments)
|
|
91
|
+
|
|
92
|
+
return await run_tool(command_arguments)
|
|
93
|
+
}
|
|
94
|
+
|
|
67
95
|
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
68
96
|
const [tool = '', ...staged_files] = argv
|
|
69
|
-
const command_arguments = build_arguments(tool, staged_files)
|
|
70
97
|
const budget = TOOL_BUDGETS[tool]
|
|
71
98
|
|
|
72
|
-
if (
|
|
99
|
+
if (budget === undefined) {
|
|
73
100
|
console.error(USAGE)
|
|
74
101
|
|
|
75
102
|
return USAGE_ERROR_EXIT_CODE
|
|
@@ -77,7 +104,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
77
104
|
|
|
78
105
|
return await core_budget.with_command_reservation(
|
|
79
106
|
core_budget.CORE_WEIGHTS[budget],
|
|
80
|
-
async () => await
|
|
107
|
+
async () => await run_reserved(tool, staged_files),
|
|
81
108
|
{ memory_mb: core_budget.MEMORY_MB[budget], command: `pre-commit ${tool}` },
|
|
82
109
|
)
|
|
83
110
|
}
|
|
@@ -130,10 +130,12 @@ function format_miss(reason: string): string {
|
|
|
130
130
|
// as foreign load (joshuafolkken/kit#3874). Only the miss reserves: a reused record runs nothing, and a
|
|
131
131
|
// claim there could make a push wait out a full ledger for a suite it then skips.
|
|
132
132
|
async function run_reserved_suite(vitest_arguments: ReadonlyArray<string>): Promise<number> {
|
|
133
|
+
const claim = gate_plan.DIRECT_UNIT_CLAIM
|
|
134
|
+
|
|
133
135
|
return await core_budget.with_command_reservation(
|
|
134
|
-
|
|
136
|
+
claim.core_weight(),
|
|
135
137
|
async () => await test_unit_guard.run_guarded_unit(process.cwd(), vitest_arguments),
|
|
136
|
-
{ memory_mb:
|
|
138
|
+
{ memory_mb: claim.memory_mb(), command: 'pre-push test:unit', is_unit: claim.is_unit_claim },
|
|
137
139
|
)
|
|
138
140
|
}
|
|
139
141
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
|
-
import { text } from 'node:stream/consumers'
|
|
3
2
|
import { fileURLToPath } from 'node:url'
|
|
4
3
|
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
5
4
|
import { pretool_guard } from './pretool-guard'
|
|
@@ -11,11 +10,5 @@ import { pretool_guard } from './pretool-guard'
|
|
|
11
10
|
// `dist/hooks/pretool-guard.js`, so the bundled hook ran no guard at all and every refusal failed open.
|
|
12
11
|
// An entry nothing imports keeps the self-invoke in the file that is actually launched.
|
|
13
12
|
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
14
|
-
|
|
15
|
-
else {
|
|
16
|
-
const raw_payload = await text(process.stdin)
|
|
17
|
-
|
|
18
|
-
hook_decision.load_environment_file()
|
|
19
|
-
await pretool_guard.respond(raw_payload)
|
|
20
|
-
}
|
|
13
|
+
await hook_decision.respond_from_stdin('pretool:guard', pretool_guard.respond)
|
|
21
14
|
}
|
|
@@ -11,6 +11,7 @@ import { run_poll_hook } from '#scripts/run/run-poll-hook'
|
|
|
11
11
|
import { run_watcher_hook } from '#scripts/run/run-watcher-hook'
|
|
12
12
|
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
13
13
|
import { batch_outcome } from './batch-guard'
|
|
14
|
+
import { shell_rules_notice } from './shell-rules-notice'
|
|
14
15
|
import { step_zero_notice } from './step-zero-notice'
|
|
15
16
|
|
|
16
17
|
// One PreToolUse process for the three guards that used to be three. A Bash
|
|
@@ -52,12 +53,13 @@ function combine_outcomes(
|
|
|
52
53
|
return outcomes.find((outcome) => !is_clear(outcome)) ?? CLEAR
|
|
53
54
|
}
|
|
54
55
|
|
|
55
|
-
// The
|
|
56
|
-
//
|
|
57
|
-
|
|
56
|
+
// The once-per-session reminders are the last word: asked only where every guard stayed clear, so a
|
|
57
|
+
// refusal or another notice never spends their stamps unseen. Step 0 answers an edit and the shell
|
|
58
|
+
// rules a Bash call, so at most one of them speaks on a call.
|
|
59
|
+
function with_session_notice(outcome: GuardOutcome, raw_payload: string): GuardOutcome {
|
|
58
60
|
if (!is_clear(outcome)) return outcome
|
|
59
61
|
|
|
60
|
-
const notice = step_zero_notice.notice(raw_payload)
|
|
62
|
+
const notice = step_zero_notice.notice(raw_payload) ?? shell_rules_notice.notice(raw_payload)
|
|
61
63
|
|
|
62
64
|
return notice === undefined ? outcome : { reason: undefined, notice, fault: undefined }
|
|
63
65
|
}
|
|
@@ -75,9 +77,9 @@ function guard_outcome(raw_payload: string): GuardOutcome {
|
|
|
75
77
|
return combine_outcomes(outcomes, delivered_rules.delivery(raw_payload))
|
|
76
78
|
}
|
|
77
79
|
|
|
78
|
-
// The synchronous verdict the Codex adapter asks for, with the
|
|
80
|
+
// The synchronous verdict the Codex adapter asks for, with the session reminders as its last layer.
|
|
79
81
|
function pretool_outcome(raw_payload: string): GuardOutcome {
|
|
80
|
-
return
|
|
82
|
+
return with_session_notice(guard_outcome(raw_payload), raw_payload)
|
|
81
83
|
}
|
|
82
84
|
|
|
83
85
|
// The Step 0 notice fires once, on the first runtime-file edit: the moment a lane child's plan turns
|
|
@@ -116,7 +118,7 @@ async function pretool_outcome_async(raw_payload: string): Promise<GuardOutcome>
|
|
|
116
118
|
|
|
117
119
|
if (reason !== undefined) return { reason, notice: undefined, fault: undefined }
|
|
118
120
|
|
|
119
|
-
const outcome =
|
|
121
|
+
const outcome = with_session_notice(base, raw_payload)
|
|
120
122
|
|
|
121
123
|
await mark_phase(outcome)
|
|
122
124
|
|
|
@@ -140,26 +142,36 @@ function rewrite_context(note: string, outcome: GuardOutcome): string {
|
|
|
140
142
|
return [note, outcome.notice ?? outcome.fault].filter(Boolean).join('\n\n')
|
|
141
143
|
}
|
|
142
144
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
145
|
+
function foreground_input_of(
|
|
146
|
+
raw_payload: string,
|
|
147
|
+
is_lane_child?: () => boolean,
|
|
148
|
+
): Record<string, unknown> | undefined {
|
|
149
|
+
const call = guarded_call(raw_payload)
|
|
150
|
+
|
|
151
|
+
return call === undefined ? undefined : lane_background.foreground_input(call, is_lane_child)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// The envelope that replaces the outcome's own when a lane child runs `josh ship` alone: the call is
|
|
155
|
+
// run in the foreground at the cap instead of being refused or moved aside. A refusal from any guard
|
|
156
|
+
// still wins, and a notice the outcome carried rides along in the same context. On top of a row's
|
|
157
|
+
// rewrite — `raw_payload` is then the rewritten call — it keeps that row's notes and its lack of a
|
|
158
|
+
// permission decision, so the cap is never lost to a pipefail or tail rewrite (joshuafolkken/kit#4101).
|
|
146
159
|
function foreground_rewrite(
|
|
147
160
|
outcome: GuardOutcome,
|
|
148
161
|
raw_payload: string,
|
|
149
162
|
is_lane_child?: () => boolean,
|
|
163
|
+
rewrite?: RuleRewrite,
|
|
150
164
|
): string | undefined {
|
|
151
|
-
if (outcome.reason !== undefined) return undefined
|
|
152
|
-
|
|
153
|
-
const call = guarded_call(raw_payload)
|
|
154
165
|
const input =
|
|
155
|
-
|
|
166
|
+
outcome.reason === undefined ? foreground_input_of(raw_payload, is_lane_child) : undefined
|
|
156
167
|
|
|
157
168
|
if (input === undefined) return undefined
|
|
158
169
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
170
|
+
const note = [rewrite?.note, lane_background.FOREGROUND_NOTE].filter(Boolean).join('\n\n')
|
|
171
|
+
const envelope_of =
|
|
172
|
+
rewrite === undefined ? hook_decision.rewrite_envelope : hook_decision.flow_rewrite_envelope
|
|
173
|
+
|
|
174
|
+
return envelope_of(input, rewrite_context(note, outcome))
|
|
163
175
|
}
|
|
164
176
|
|
|
165
177
|
// The rows' rewrite carries no permission decision: whatever else the line runs meets its own prompt.
|
|
@@ -174,7 +186,8 @@ function rule_envelope(
|
|
|
174
186
|
|
|
175
187
|
// The hook's one write: a rewrite where one applies, the outcome's own envelope otherwise.
|
|
176
188
|
function emit(raw_payload: string, outcome: GuardOutcome, rewrite?: RuleRewrite): void {
|
|
177
|
-
const envelope =
|
|
189
|
+
const envelope =
|
|
190
|
+
foreground_rewrite(outcome, raw_payload, undefined, rewrite) ?? rule_envelope(outcome, rewrite)
|
|
178
191
|
|
|
179
192
|
if (envelope === undefined) hook_decision.emit_outcome(outcome)
|
|
180
193
|
else process.stdout.write(`${envelope}\n`)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { command_memory } from '#scripts/gate/command-memory'
|
|
3
4
|
import { core_budget } from '#scripts/gate/core-budget'
|
|
4
5
|
import { unit_worker_share } from '#scripts/test/unit-worker-share'
|
|
5
6
|
import { execa } from 'execa'
|
|
@@ -18,6 +19,11 @@ import { execa } from 'execa'
|
|
|
18
19
|
// being rewritten around it — and a second copy of the claim-run-release dance is the clone
|
|
19
20
|
// `CLAUDE.md` prohibits. The weight is the caller's, passed on the command line beside the command, so
|
|
20
21
|
// the reservation these two conservative numbers stand for lives at the one place a person reads them.
|
|
22
|
+
//
|
|
23
|
+
// **The memory is read off the command, not left at zero** (joshuafolkken/kit#4582): a lane wrapped a
|
|
24
|
+
// four-worker typed eslint here and the 12 GB it held was admitted beside four other lanes. The
|
|
25
|
+
// wrapped command's tool and worker count give its `MEMORY_MB` (`command-memory.ts`); `--memory <MB>`
|
|
26
|
+
// overrides that estimate.
|
|
21
27
|
|
|
22
28
|
// `process.argv` is [runner, script, ...arguments].
|
|
23
29
|
const FIRST_ARGUMENT_INDEX = 2
|
|
@@ -30,24 +36,74 @@ const FAIL_EXIT_CODE = 1
|
|
|
30
36
|
// cumulative sum and let a later reservation admit past the budget the ledger exists to hold.
|
|
31
37
|
const MIN_WEIGHT = 1
|
|
32
38
|
|
|
39
|
+
const MEMORY_FLAG = '--memory'
|
|
40
|
+
// `--memory <MB>`: the flag and its value.
|
|
41
|
+
const MEMORY_OPTION_LENGTH = 2
|
|
42
|
+
// An explicit `--memory` claims at least one MB; zero is the absence the estimate already stands for.
|
|
43
|
+
const MIN_MEMORY_MB = 1
|
|
44
|
+
// An argument that is one shell word with no quoting.
|
|
45
|
+
const PLAIN_WORD = /^[\w./=:@%+,-]+$/u
|
|
46
|
+
// A single quote inside a single-quoted word: close, escaped quote, reopen.
|
|
47
|
+
const ESCAPED_QUOTE = String.raw`'\''`
|
|
48
|
+
|
|
33
49
|
interface ReservedCommand {
|
|
34
50
|
weight: number
|
|
51
|
+
// The explicit `--memory <MB>`, which overrides the estimate read off the command.
|
|
52
|
+
memory_mb: number | undefined
|
|
35
53
|
command: ReadonlyArray<string>
|
|
36
54
|
}
|
|
37
55
|
|
|
38
|
-
|
|
39
|
-
|
|
56
|
+
function is_integer_from(value: number, floor: number): boolean {
|
|
57
|
+
return Number.isSafeInteger(value) && value >= floor
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// The options between the weight and the separator: none, or `--memory <MB>` with a positive integer.
|
|
61
|
+
// `undefined` is a usage error.
|
|
62
|
+
function parse_memory(
|
|
63
|
+
options: ReadonlyArray<string>,
|
|
64
|
+
): { memory_mb: number | undefined } | undefined {
|
|
65
|
+
if (options.length === 0) return { memory_mb: undefined }
|
|
66
|
+
|
|
67
|
+
const memory_mb = Number(options[1])
|
|
68
|
+
const is_memory_option = options.length === MEMORY_OPTION_LENGTH && options[0] === MEMORY_FLAG
|
|
69
|
+
|
|
70
|
+
return is_memory_option && is_integer_from(memory_mb, MIN_MEMORY_MB) ? { memory_mb } : undefined
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// `<weight> [--memory <MB>] -- <command> [args...]`. `undefined` is a usage error: a missing
|
|
74
|
+
// separator, a weight that is not an integer of at least one core, a malformed `--memory`, or nothing
|
|
75
|
+
// to run.
|
|
40
76
|
function parse_arguments(argv: ReadonlyArray<string>): ReservedCommand | undefined {
|
|
41
77
|
const NOT_FOUND = -1
|
|
42
78
|
const separator = argv.indexOf(COMMAND_SEPARATOR)
|
|
43
79
|
const weight = Number(argv[WEIGHT_INDEX])
|
|
44
|
-
const
|
|
80
|
+
const memory = parse_memory(argv.slice(WEIGHT_INDEX + 1, Math.max(separator, 0)))
|
|
81
|
+
const command = argv.slice(separator + 1)
|
|
45
82
|
|
|
46
|
-
if (separator === NOT_FOUND || !
|
|
83
|
+
if (separator === NOT_FOUND || !is_integer_from(weight, MIN_WEIGHT)) return undefined
|
|
47
84
|
|
|
48
|
-
|
|
85
|
+
return memory !== undefined && command.length > 0 ? { weight, ...memory, command } : undefined
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// An argument as one shell word: a plain one as written, anything else single-quoted. **The estimate
|
|
89
|
+
// re-reads the command as a shell line**, so `git commit -m "a; eslint ."` joined bare would be cut at
|
|
90
|
+
// the `;` and reserved as an eslint run.
|
|
91
|
+
function shell_word(argument: string): string {
|
|
92
|
+
if (PLAIN_WORD.test(argument)) return argument
|
|
93
|
+
|
|
94
|
+
return `'${argument.split("'").join(ESCAPED_QUOTE)}'`
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// What the claim carries to the ledger: the command named on the waiting line, and the memory it
|
|
98
|
+
// holds — the explicit `--memory`, else the estimate read off the command (`command-memory.ts`), else
|
|
99
|
+
// none, the 0 MB a command the table does not know counted before.
|
|
100
|
+
function reservation_options(parsed: ReservedCommand): {
|
|
101
|
+
command: string
|
|
102
|
+
memory_mb: number | undefined
|
|
103
|
+
} {
|
|
104
|
+
const command = parsed.command.map((argument) => shell_word(argument)).join(' ')
|
|
49
105
|
|
|
50
|
-
return command
|
|
106
|
+
return { command, memory_mb: parsed.memory_mb ?? command_memory.estimated_memory_mb(command) }
|
|
51
107
|
}
|
|
52
108
|
|
|
53
109
|
// `stdio: 'inherit'` so the command's own progress reaches the push, and `reject: false` so a failing
|
|
@@ -64,7 +120,9 @@ async function run_reserved(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
64
120
|
const parsed = parse_arguments(argv)
|
|
65
121
|
|
|
66
122
|
if (parsed === undefined) {
|
|
67
|
-
process.stderr.write(
|
|
123
|
+
process.stderr.write(
|
|
124
|
+
'reserved-run: usage: reserved-run <weight> [--memory <MB>] -- <command> [args...]\n',
|
|
125
|
+
)
|
|
68
126
|
|
|
69
127
|
return FAIL_EXIT_CODE
|
|
70
128
|
}
|
|
@@ -78,7 +136,7 @@ async function run_reserved(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
78
136
|
return await core_budget.with_core_reservation(
|
|
79
137
|
parsed.weight,
|
|
80
138
|
async () => await run_command(parsed.command),
|
|
81
|
-
|
|
139
|
+
reservation_options(parsed),
|
|
82
140
|
)
|
|
83
141
|
}
|
|
84
142
|
|
|
@@ -86,6 +144,6 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
|
86
144
|
process.exitCode = await run_reserved(process.argv.slice(FIRST_ARGUMENT_INDEX))
|
|
87
145
|
}
|
|
88
146
|
|
|
89
|
-
const reserved_run = { parse_arguments, run_reserved }
|
|
147
|
+
const reserved_run = { parse_arguments, reservation_options, run_reserved }
|
|
90
148
|
|
|
91
149
|
export { reserved_run }
|
|
@@ -5,12 +5,15 @@
|
|
|
5
5
|
# A hook command in `.claude/settings.json` / `.codex/hooks.json` only moves to the project root
|
|
6
6
|
# (`scripts/init/hook-launch.ts`) and calls this script, so everything every hook shares lives here once:
|
|
7
7
|
#
|
|
8
|
-
# - The
|
|
9
|
-
#
|
|
8
|
+
# - The git location variables a git hook exports are cleared when the checkout resolves without
|
|
9
|
+
# them, so the hook's own git calls act on the checkout it stands in, and kept when the git metadata
|
|
10
|
+
# lives outside the work tree. `git` starts only when one of them is set — a hook runs on every tool
|
|
11
|
+
# call (joshuafolkken/kit#3946, joshuafolkken/kit#4187). The list is `GIT_LOCATION_VARIABLES`
|
|
12
|
+
# (`scripts/git/git-location-environment.ts`), held to it by `run-hook.test.ts`.
|
|
10
13
|
# - The pre-built bundle `dist/hooks/<name>.js` runs once its gate passes; otherwise the live source
|
|
11
14
|
# runs through josh, whose command is the name with its first `-` turned into `:`
|
|
12
15
|
# (`pretool-guard` → `pretool:guard`).
|
|
13
|
-
# - In kit's own checkout the gate is `hook-bundle-ready.ts`, which rebuilds stale bundles
|
|
16
|
+
# - In kit's own checkout the gate is the kit-only `tools/hooks/hook-bundle-ready.ts`, which rebuilds stale bundles
|
|
14
17
|
# (joshuafolkken/kit#2984) and then runs the bundle — or the josh fallback — itself, so a hook call
|
|
15
18
|
# starts node once (joshuafolkken/kit#3327). In an installed package it is a presence check: the
|
|
16
19
|
# published bundles cannot be stale against a source the consumer never edits, and Node strips no
|
|
@@ -20,6 +23,12 @@
|
|
|
20
23
|
# - An `if`/`else`, never `&&`/`||`: a guard's refusal is a non-zero exit, and a chain would read it as
|
|
21
24
|
# a missing bundle and run the hook twice.
|
|
22
25
|
|
|
26
|
+
location_variables='GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE'
|
|
27
|
+
if [ -n "$GIT_ALTERNATE_OBJECT_DIRECTORIES$GIT_COMMON_DIR$GIT_DIR$GIT_INDEX_FILE$GIT_NAMESPACE$GIT_OBJECT_DIRECTORY$GIT_WORK_TREE" ] &&
|
|
28
|
+
(unset $location_variables && git rev-parse --show-toplevel >/dev/null 2>&1); then
|
|
29
|
+
unset $location_variables
|
|
30
|
+
fi
|
|
31
|
+
|
|
23
32
|
hook_name=$1
|
|
24
33
|
shift
|
|
25
34
|
case $0 in
|
|
@@ -35,6 +44,6 @@ case $0 in
|
|
|
35
44
|
if [ -d "$package_dir/dist/hooks" ]; then exec node "$bundle" "$@"; else exec node "$package_dir/dist/josh.js" "$josh_command" "$@"; fi
|
|
36
45
|
;;
|
|
37
46
|
*)
|
|
38
|
-
exec node --disable-warning=ExperimentalWarning "$
|
|
47
|
+
exec node --disable-warning=ExperimentalWarning "$package_dir/tools/hooks/hook-bundle-ready.ts" "$hook_name" "$josh_command" "$@"
|
|
39
48
|
;;
|
|
40
49
|
esac
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
|
|
2
|
+
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
3
|
+
|
|
4
|
+
// The two most-refused Bash rows, `file-body` and `piped-verification`, delivered ahead of the call
|
|
5
|
+
// that would break them. A refusal teaches the rule only after the call was composed, and each
|
|
6
|
+
// refusal is a round trip spent rewriting it (joshuafolkken/kit#3996). The first Bash call of a
|
|
7
|
+
// session comes before any of those, so the hook that sees it carries the two rules as a notice.
|
|
8
|
+
//
|
|
9
|
+
// **The rows themselves are unchanged.** They still refuse on every occurrence; this only puts their
|
|
10
|
+
// text in front of the first call, the way `step-zero-notice.ts` delivers Step 0 at the first edit.
|
|
11
|
+
//
|
|
12
|
+
// **Once per session**, on a stamp keyed by the transcript. A stamp that cannot be written stays
|
|
13
|
+
// silent rather than repeating the notice on every call.
|
|
14
|
+
const STAMP_PREFIX = 'josh-shell-rules-notice-'
|
|
15
|
+
|
|
16
|
+
const NOTICE =
|
|
17
|
+
'Shell rules: change an existing file with Edit or Write, never a script or heredoc that writes it (file-edits.md); run a josh check with no pipe or under `set -o pipefail`, never `| head` (output-bounds.md).'
|
|
18
|
+
|
|
19
|
+
const STAMP = hook_decision.create_refusal_stamp(STAMP_PREFIX)
|
|
20
|
+
|
|
21
|
+
function notice(raw_payload: string): string | undefined {
|
|
22
|
+
const payload = hook_decision.parse_hook_payload(raw_payload)
|
|
23
|
+
|
|
24
|
+
if (payload?.tool_name !== cost_blocks.BASH_TOOL) return undefined
|
|
25
|
+
|
|
26
|
+
const target = STAMP.path(payload.transcript_path)
|
|
27
|
+
|
|
28
|
+
if (STAMP.last_ms(target) !== hook_decision.NEVER_MS || !STAMP.record(target, Date.now())) {
|
|
29
|
+
return undefined
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return NOTICE
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const shell_rules_notice = { NOTICE, notice, stamp_path: STAMP.path }
|
|
36
|
+
|
|
37
|
+
export { shell_rules_notice }
|
|
@@ -3,6 +3,7 @@ import { issue_cite } from '#scripts/issue/issue-cite'
|
|
|
3
3
|
import { issue_cite_cli } from '#scripts/issue/issue-cite-cli'
|
|
4
4
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
5
5
|
import { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
6
|
+
import { stdout_on_stderr } from '#scripts/lib/stdout-on-stderr'
|
|
6
7
|
import { telegram_test } from '#scripts/notify/telegram-test'
|
|
7
8
|
import type { CliValues } from '#scripts/notify/telegram-test-logic'
|
|
8
9
|
import { issue_citation } from '#scripts/rules/issue-citation'
|
|
@@ -124,26 +125,6 @@ async function run_action(action: StopAction): Promise<string | undefined> {
|
|
|
124
125
|
return await cite(action.references)
|
|
125
126
|
}
|
|
126
127
|
|
|
127
|
-
// **The hook's stdout is the decision envelope, so nothing else may reach it**: the reused calls report
|
|
128
|
-
// on stdout (`josh run:release`'s verdict token, the notify's sent line) and are sent to stderr instead.
|
|
129
|
-
type StreamWrite = typeof process.stdout.write
|
|
130
|
-
|
|
131
|
-
function set_stdout_write(stream_write: StreamWrite): void {
|
|
132
|
-
process.stdout.write = stream_write
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
async function on_stderr<T>(work: () => Promise<T>): Promise<T> {
|
|
136
|
-
const saved = { write: process.stdout.write.bind(process.stdout) }
|
|
137
|
-
|
|
138
|
-
set_stdout_write(process.stderr.write.bind(process.stderr))
|
|
139
|
-
|
|
140
|
-
try {
|
|
141
|
-
return await work()
|
|
142
|
-
} finally {
|
|
143
|
-
set_stdout_write(saved.write)
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
128
|
// A throw is an action that did not take, the same as one that answered it had failed.
|
|
148
129
|
async function attempt(action: StopAction): Promise<string | undefined> {
|
|
149
130
|
try {
|
|
@@ -160,7 +141,7 @@ function is_notice(notice: string | undefined): notice is string {
|
|
|
160
141
|
// In order, one at a time: the notify reports the hold the release then ends. The first failure is the
|
|
161
142
|
// one refused with, as the rule order put it first.
|
|
162
143
|
async function settle(actions: ReadonlyArray<StopAction>): Promise<Settled> {
|
|
163
|
-
const notices = await
|
|
144
|
+
const notices = await stdout_on_stderr.run(
|
|
164
145
|
async () => await bounded_pool.bounded_map(actions, SEQUENTIAL, attempt),
|
|
165
146
|
)
|
|
166
147
|
const failed = actions.find((_action, index) => notices[index] === undefined)
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
|
-
import { text } from 'node:stream/consumers'
|
|
3
2
|
import { fileURLToPath } from 'node:url'
|
|
4
3
|
import { agent_headless } from '#scripts/agent/agent-headless'
|
|
5
4
|
import { backlog_ready } from '#scripts/backlog/backlog-ready'
|
|
@@ -10,6 +9,7 @@ import { hook_decision } from '#scripts/josh/hook-decision'
|
|
|
10
9
|
import { session_language } from '#scripts/josh/session-language'
|
|
11
10
|
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
12
11
|
import { lane_handoff } from '#scripts/lane/lane-handoff'
|
|
12
|
+
import { stdout_on_stderr } from '#scripts/lib/stdout-on-stderr'
|
|
13
13
|
import { filing_cap } from '#scripts/rules/filing-cap'
|
|
14
14
|
import { lane_background } from '#scripts/rules/lane-background'
|
|
15
15
|
import { lane_park } from '#scripts/rules/lane-park'
|
|
@@ -101,7 +101,7 @@ function is_cut_stop(tail: string): boolean {
|
|
|
101
101
|
)
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
// The session language the refusal is written for — `
|
|
104
|
+
// The session language the refusal is written for — `respond_from_stdin` has already loaded the `.env`.
|
|
105
105
|
function session_lang(): string {
|
|
106
106
|
return session_language.resolve_session_lang().lang
|
|
107
107
|
}
|
|
@@ -208,13 +208,18 @@ async function run_report_checks(): Promise<void> {
|
|
|
208
208
|
await run_stranded_detect.run_stranded_check()
|
|
209
209
|
}
|
|
210
210
|
|
|
211
|
-
|
|
212
|
-
// held or the hook acted on it (`stop-actions.ts`).
|
|
213
|
-
async function write_stop_decision(raw_payload: string): Promise<void> {
|
|
214
|
-
hook_decision.load_environment_file()
|
|
211
|
+
async function decided_envelope(raw_payload: string): Promise<string | undefined> {
|
|
215
212
|
await run_report_checks()
|
|
216
213
|
|
|
217
|
-
|
|
214
|
+
return await stop_actions.envelope_of(await outcome_of(raw_payload), session_lang())
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Nothing reaches stdout on an ordinary stop, so what the harness parses stays empty unless the stop is
|
|
218
|
+
// held or the hook acted on it (`stop-actions.ts`). The report checks print too — a strand's skipped
|
|
219
|
+
// notify line — and text ahead of the envelope makes the harness drop the refusal, as the #4091 child's
|
|
220
|
+
// lane-background block was (joshuafolkken/kit#4101), so everything before the write goes to stderr.
|
|
221
|
+
async function write_stop_decision(raw_payload: string): Promise<void> {
|
|
222
|
+
const envelope = await stdout_on_stderr.run(async () => await decided_envelope(raw_payload))
|
|
218
223
|
|
|
219
224
|
if (envelope === undefined) return
|
|
220
225
|
|
|
@@ -224,8 +229,7 @@ async function write_stop_decision(raw_payload: string): Promise<void> {
|
|
|
224
229
|
const stop_guard = { outcome_of, stop_outcome_for_payload }
|
|
225
230
|
|
|
226
231
|
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
227
|
-
|
|
228
|
-
else await write_stop_decision(await text(process.stdin))
|
|
232
|
+
await hook_decision.respond_from_stdin('stop:guard', write_stop_decision)
|
|
229
233
|
}
|
|
230
234
|
|
|
231
235
|
export { stop_guard, write_stop_decision }
|
|
@@ -49,8 +49,19 @@ const PLAIN_KIT_COMMANDS: ReadonlySet<string> = new Set(
|
|
|
49
49
|
'session:lang',
|
|
50
50
|
].map((command) => `${PNPM_JOSH_PREFIX}${command}`),
|
|
51
51
|
)
|
|
52
|
-
// The
|
|
53
|
-
|
|
52
|
+
// The root prefix kit wrote until joshuafolkken/kit#4187 moved the git location variables into the
|
|
53
|
+
// launcher. A consumer's file still carries it until its next sync, which replaces it with the current
|
|
54
|
+
// one. History, never edited; removable from kit 2.0.0.
|
|
55
|
+
const LOCATION_VARIABLES =
|
|
56
|
+
'GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE'
|
|
57
|
+
const ROOT_LOOKUP = 'git rev-parse --show-toplevel'
|
|
58
|
+
const LEGACY_ROOT_PREFIX = `if project_root="$(unset ${LOCATION_VARIABLES}; ${ROOT_LOOKUP} 2>/dev/null)"; then unset ${LOCATION_VARIABLES}; else project_root="$(${ROOT_LOOKUP})"; fi && cd "$project_root" && `
|
|
59
|
+
// The values below are matched inside raw JSON text, so each root prefix is taken in its escaped form.
|
|
60
|
+
const ROOT_PREFIXES: ReadonlyArray<string> = [
|
|
61
|
+
hook_launch.PROJECT_ROOT_PREFIX,
|
|
62
|
+
LEGACY_ROOT_PREFIX,
|
|
63
|
+
].map((prefix) => JSON.stringify(prefix).slice(1, -1))
|
|
64
|
+
const [PROJECT_ROOT_PREFIX = ''] = ROOT_PREFIXES
|
|
54
65
|
// Capture the value of every `"command"` field, escapes and all, so the rewrites below touch command
|
|
55
66
|
// values alone — never an echo reminder's prose or a `"description"` that merely mentions the string.
|
|
56
67
|
const COMMAND_FIELD = /("command":\s*")((?:[^"\\]|\\.)*)(")/gu
|
|
@@ -76,10 +87,13 @@ function rewrite_command_value(value: string): string {
|
|
|
76
87
|
}
|
|
77
88
|
|
|
78
89
|
// kit's own commands already start from the root (`hook-launch.ts`), and so does an already-rewritten
|
|
79
|
-
// value. The prefix
|
|
80
|
-
// behind the `cd` it depends on and a second
|
|
90
|
+
// value. The prefix — the current one or the one before it — is taken off before the rewrite and the
|
|
91
|
+
// current one put back after it, so the install guard sits behind the `cd` it depends on and a second
|
|
92
|
+
// pass never doubles the prefix.
|
|
81
93
|
function without_root_prefix(value: string): string {
|
|
82
|
-
|
|
94
|
+
const prefix = ROOT_PREFIXES.find((candidate) => value.startsWith(candidate)) ?? ''
|
|
95
|
+
|
|
96
|
+
return value.slice(prefix.length)
|
|
83
97
|
}
|
|
84
98
|
|
|
85
99
|
function rewrite_hook_commands(content: string, is_codex = false): string {
|
|
@@ -1,31 +1,29 @@
|
|
|
1
|
-
import { GIT_LOCATION_VARIABLES } from '#scripts/git/git-location-environment'
|
|
2
|
-
|
|
3
1
|
// The shell command a Claude Code hook is launched with, so it starts without a `pnpm` wrapper — and,
|
|
4
2
|
// for a consumer, without the `dist/josh.js` dispatcher re-spawning `tsx` for the hook's `.ts`.
|
|
5
3
|
// Each hook is pre-built to its own `dist/hooks/<name>.js`
|
|
6
4
|
// (`scripts/build/build-hooks.ts`) and launched directly with `node`.
|
|
7
5
|
//
|
|
8
6
|
// **The command starts from the project root, never from wherever the session happens to be**.
|
|
9
|
-
// Every path after the prefix is relative, so a hook fired from a
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// (
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
// **A hook runs on every tool call, so its launch spawns as little as it can** (joshuafolkken/kit#3946):
|
|
18
|
-
// the shell's own `unset` clears the variables rather than an `env` process, and that one lookup
|
|
19
|
-
// both finds the root and decides whether the variables stay — `git` starts once.
|
|
7
|
+
// Every path after the prefix is relative, so a hook fired from a subdirectory would otherwise miss its
|
|
8
|
+
// script. Claude Code names the root in `CLAUDE_PROJECT_DIR`, so its hooks start no `git` to find it;
|
|
9
|
+
// Codex runs a hook in the session's directory and names no root, so there the root is git's — asked
|
|
10
|
+
// first without the git location variables a git hook leaks, since a relative or bare `GIT_DIR` read
|
|
11
|
+
// from a subdirectory names the wrong work tree, and with them only when the checkout does not resolve
|
|
12
|
+
// without them (its metadata lives outside the work tree). A lookup that fails ends the command before
|
|
13
|
+
// the launcher (joshuafolkken/kit#4187).
|
|
20
14
|
//
|
|
21
|
-
// **Everything after the root is one script** (`scripts/hooks/run-hook.sh`): the
|
|
22
|
-
// the live-source fallback live there once, so
|
|
15
|
+
// **Everything after the root is one script** (`scripts/hooks/run-hook.sh`): the git location
|
|
16
|
+
// variables a git hook exports, the bundle-ready gate and the live-source fallback live there once, so
|
|
17
|
+
// each hook command names only its hook. The consumer rewrite (`hook-command-rewrite.ts`) keeps this
|
|
18
|
+
// prefix, so both sides stay one mechanism for Claude Code and Codex alike.
|
|
19
|
+
|
|
20
|
+
import { GIT_LOCATION_VARIABLES } from '#scripts/git/git-location-environment'
|
|
23
21
|
|
|
24
22
|
const HOOK_DIST_DIR = 'dist/hooks'
|
|
25
23
|
const RUN_HOOK_SCRIPT = 'scripts/hooks/run-hook.sh'
|
|
26
|
-
const LOCATION_VARIABLES = GIT_LOCATION_VARIABLES.join(' ')
|
|
27
24
|
const ROOT_LOOKUP = 'git rev-parse --show-toplevel'
|
|
28
|
-
const
|
|
25
|
+
const CODEX_ROOT = `$( (unset ${GIT_LOCATION_VARIABLES.join(' ')}; ${ROOT_LOOKUP} 2>/dev/null) || ${ROOT_LOOKUP})`
|
|
26
|
+
const PROJECT_ROOT_PREFIX = `project_root="\${CLAUDE_PROJECT_DIR:-${CODEX_ROOT}}" && cd "$project_root" && `
|
|
29
27
|
|
|
30
28
|
// `name` is the hook's bundle under `dist/hooks` without `.js` (e.g. `pretool-guard`), followed by any
|
|
31
29
|
// arguments it takes (e.g. `codex-hook-adapter pretool`).
|
|
@@ -2,7 +2,6 @@ import { readFileSync } from 'node:fs'
|
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { json_format } from '#scripts/config-merge/json-format'
|
|
4
4
|
import { string_array_schema, vscode_settings_schema } from '#scripts/lib/schemas'
|
|
5
|
-
import { basic_path_migration } from './basic-path-migration'
|
|
6
5
|
import { init_logic } from './init-logic'
|
|
7
6
|
import { package_path, PROJECT_ROOT } from './init-paths'
|
|
8
7
|
import type { ProjectShape } from './project-profile'
|
|
@@ -20,9 +19,6 @@ interface FileAction {
|
|
|
20
19
|
dest: string
|
|
21
20
|
create: () => string
|
|
22
21
|
merge?: (existing: string) => string
|
|
23
|
-
// A merge that only migrates a kit-written line, for a file kit otherwise leaves to the project:
|
|
24
|
-
// when it changes nothing, the file is reported with the sample to add, as one with no merge is.
|
|
25
|
-
should_show_sample_when_unchanged?: boolean
|
|
26
22
|
}
|
|
27
23
|
|
|
28
24
|
function read_package_file(relative_path: string): string {
|
|
@@ -215,8 +211,6 @@ function build_basic_actions(shape: ProjectShape): ReadonlyArray<FileAction> {
|
|
|
215
211
|
dest: BASIC_PRETTIER_CONFIG,
|
|
216
212
|
create: () =>
|
|
217
213
|
"import { config } from '@joshuafolkken/kit/prettier/basic'\n\nexport default config\n",
|
|
218
|
-
merge: (existing) => basic_path_migration.migrate_basic_paths(existing),
|
|
219
|
-
should_show_sample_when_unchanged: true,
|
|
220
214
|
})
|
|
221
215
|
}
|
|
222
216
|
|