@joshuafolkken/kit 1.1471.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 +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- 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 +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- 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-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- 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 +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- 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 +6 -7
- 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 +54 -7
- 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 +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +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 +69 -0
- 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 +137 -18
- 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 +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- 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 +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- 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 +31 -60
- 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 +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- 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 +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- 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 +65 -129
- 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-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- 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/gh/git-pr.ts +13 -1
- 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 +78 -0
- package/scripts/git/main-merge.ts +39 -14
- 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 +5 -16
- 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 +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- 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 +60 -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 +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- 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 +7 -13
- 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 +19 -25
- 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/markdown-section.ts +19 -5
- 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 +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- 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 +31 -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 +112 -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 +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- 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 +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- 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 +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- 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 +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- 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-preserve.ts +29 -1
- 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 +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- 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 +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- 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 +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- 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 +14 -5
- 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 +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -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 +12 -11
- 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 +4 -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-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -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 +82 -16
- 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 +67 -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 +90 -3
- 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 +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -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 +76 -7
- 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/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- 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 +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- 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 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- 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 +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- 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 +118 -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 +240 -61
- 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 +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- 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 -47
- 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 +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -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 +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- 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-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- 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 +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- 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-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- 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 +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- 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 +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- 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-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -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 +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- 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 +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- 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 +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- 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-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- 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 +55 -6
- 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 +54 -21
- 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 +71 -137
- 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 +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- 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 +10 -3
- 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-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- 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/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 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -3,14 +3,15 @@ import { investigation_outcome } from '#scripts/delegation/investigation-guard'
|
|
|
3
3
|
import { issue_watch_hook } from '#scripts/issue/issue-watch-hook'
|
|
4
4
|
import { hook_decision, type GuardOutcome } from '#scripts/josh/hook-decision'
|
|
5
5
|
import { lane_phase } from '#scripts/lane/lane-phase'
|
|
6
|
-
import { json_value } from '#scripts/lib/json-value'
|
|
7
6
|
import { delivered_rules } from '#scripts/rules/delivered-rules'
|
|
8
7
|
import { lane_background } from '#scripts/rules/lane-background'
|
|
9
|
-
import {
|
|
8
|
+
import { rule_rewrite, type RuleRewrite } from '#scripts/rules/rule-rewrite'
|
|
10
9
|
import { run_parent_cut_hook } from '#scripts/run/run-parent-cut-hook'
|
|
10
|
+
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
|
|
@@ -22,11 +23,12 @@ import { step_zero_notice } from './step-zero-notice'
|
|
|
22
23
|
//
|
|
23
24
|
// **The verdict is identical to running the three in turn**, and that is the whole point. Each guard
|
|
24
25
|
// self-gates on the tool name inside its own `is_candidate` / trigger, so running all three on the
|
|
25
|
-
// union matcher (`Bash|Edit|Read|Write|AskUserQuestion`) refuses exactly what the three
|
|
26
|
-
// entries did — `AskUserQuestion` is matched for the rule guard's lane-child interactive-ask
|
|
27
|
-
// and the batching and investigation guards self-gate
|
|
28
|
-
// refusal from any guard wins first; only when none refuses is a guard's non-blocking
|
|
29
|
-
// (the whole-file-write notice, a lane child's
|
|
26
|
+
// union matcher (`Bash|Edit|Read|Write|AskUserQuestion|Agent|Task`) refuses exactly what the three
|
|
27
|
+
// separate entries did — `AskUserQuestion` is matched for the rule guard's lane-child interactive-ask
|
|
28
|
+
// row and `Agent|Task` for its `agent-model` row, and the batching and investigation guards self-gate
|
|
29
|
+
// away from both. A refusal from any guard wins first; only when none refuses is a guard's non-blocking
|
|
30
|
+
// notice or fault (the whole-file-write notice, a lane child's duplicate-read notice) emitted. Each
|
|
31
|
+
// guard still honours its own
|
|
30
32
|
// switch (`JOSH_BATCH_GUARD` / `JOSH_INVESTIGATION_GUARD` / `JOSH_RULE_GUARD`) internally, so this
|
|
31
33
|
// process needs no switch of its own.
|
|
32
34
|
|
|
@@ -51,12 +53,13 @@ function combine_outcomes(
|
|
|
51
53
|
return outcomes.find((outcome) => !is_clear(outcome)) ?? CLEAR
|
|
52
54
|
}
|
|
53
55
|
|
|
54
|
-
// The
|
|
55
|
-
//
|
|
56
|
-
|
|
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 {
|
|
57
60
|
if (!is_clear(outcome)) return outcome
|
|
58
61
|
|
|
59
|
-
const notice = step_zero_notice.notice(raw_payload)
|
|
62
|
+
const notice = step_zero_notice.notice(raw_payload) ?? shell_rules_notice.notice(raw_payload)
|
|
60
63
|
|
|
61
64
|
return notice === undefined ? outcome : { reason: undefined, notice, fault: undefined }
|
|
62
65
|
}
|
|
@@ -74,9 +77,9 @@ function guard_outcome(raw_payload: string): GuardOutcome {
|
|
|
74
77
|
return combine_outcomes(outcomes, delivered_rules.delivery(raw_payload))
|
|
75
78
|
}
|
|
76
79
|
|
|
77
|
-
// 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.
|
|
78
81
|
function pretool_outcome(raw_payload: string): GuardOutcome {
|
|
79
|
-
return
|
|
82
|
+
return with_session_notice(guard_outcome(raw_payload), raw_payload)
|
|
80
83
|
}
|
|
81
84
|
|
|
82
85
|
// The Step 0 notice fires once, on the first runtime-file edit: the moment a lane child's plan turns
|
|
@@ -96,12 +99,14 @@ async function mark_phase(outcome: GuardOutcome): Promise<void> {
|
|
|
96
99
|
// **The parent hand-off guard is the second asynchronous rule, asked after the watcher's**.
|
|
97
100
|
// It reads the carry record to tell the `backlogrun` parent apart, so it sits
|
|
98
101
|
// beside the watcher rather than among the synchronous rows; a stale watcher is the cheaper fix and is
|
|
99
|
-
// surfaced first.
|
|
102
|
+
// surfaced first. **The poll guard is third**: it reads the same carry record, and only for a call that
|
|
103
|
+
// repeats a state read, so the hand-off still wins over it.
|
|
100
104
|
async function async_reason(raw_payload: string): Promise<string | undefined> {
|
|
101
105
|
const watcher = await run_watcher_hook.watcher_hook_reason(raw_payload)
|
|
102
106
|
const cut = watcher ?? (await run_parent_cut_hook.parent_cut_reason(raw_payload))
|
|
107
|
+
const poll = cut ?? (await run_poll_hook.safe_poll_reason(raw_payload))
|
|
103
108
|
|
|
104
|
-
return
|
|
109
|
+
return poll ?? (await issue_watch_hook.watch_reason())
|
|
105
110
|
}
|
|
106
111
|
|
|
107
112
|
async function pretool_outcome_async(raw_payload: string): Promise<GuardOutcome> {
|
|
@@ -113,7 +118,7 @@ async function pretool_outcome_async(raw_payload: string): Promise<GuardOutcome>
|
|
|
113
118
|
|
|
114
119
|
if (reason !== undefined) return { reason, notice: undefined, fault: undefined }
|
|
115
120
|
|
|
116
|
-
const outcome =
|
|
121
|
+
const outcome = with_session_notice(base, raw_payload)
|
|
117
122
|
|
|
118
123
|
await mark_phase(outcome)
|
|
119
124
|
|
|
@@ -137,81 +142,65 @@ function rewrite_context(note: string, outcome: GuardOutcome): string {
|
|
|
137
142
|
return [note, outcome.notice ?? outcome.fault].filter(Boolean).join('\n\n')
|
|
138
143
|
}
|
|
139
144
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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).
|
|
143
159
|
function foreground_rewrite(
|
|
144
160
|
outcome: GuardOutcome,
|
|
145
161
|
raw_payload: string,
|
|
146
162
|
is_lane_child?: () => boolean,
|
|
163
|
+
rewrite?: RuleRewrite,
|
|
147
164
|
): string | undefined {
|
|
148
|
-
if (outcome.reason !== undefined) return undefined
|
|
149
|
-
|
|
150
|
-
const call = guarded_call(raw_payload)
|
|
151
165
|
const input =
|
|
152
|
-
|
|
166
|
+
outcome.reason === undefined ? foreground_input_of(raw_payload, is_lane_child) : undefined
|
|
153
167
|
|
|
154
168
|
if (input === undefined) return undefined
|
|
155
169
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
)
|
|
160
|
-
}
|
|
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
|
|
161
173
|
|
|
162
|
-
|
|
163
|
-
payload: string
|
|
164
|
-
input: Record<string, unknown>
|
|
174
|
+
return envelope_of(input, rewrite_context(note, outcome))
|
|
165
175
|
}
|
|
166
176
|
|
|
167
|
-
//
|
|
168
|
-
|
|
169
|
-
// rule guard's delivery, so the rule guard's switch turns it off too.
|
|
170
|
-
function pipefail_rewrite(raw_payload: string): PipefailRewrite | undefined {
|
|
171
|
-
if (!delivered_rules.is_enabled()) return undefined
|
|
172
|
-
|
|
173
|
-
const call = guarded_call(raw_payload)
|
|
174
|
-
const input = call === undefined ? undefined : piped_verification.pipefail_input(call)
|
|
175
|
-
const payload = json_value.parse_or_undefined(raw_payload)
|
|
176
|
-
|
|
177
|
-
if (input === undefined || !json_value.is_record(payload)) return undefined
|
|
178
|
-
|
|
179
|
-
return { payload: JSON.stringify({ ...payload, tool_input: input }), input }
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
function pipefail_envelope(
|
|
177
|
+
// The rows' rewrite carries no permission decision: whatever else the line runs meets its own prompt.
|
|
178
|
+
function rule_envelope(
|
|
183
179
|
outcome: GuardOutcome,
|
|
184
|
-
|
|
180
|
+
rewrite: RuleRewrite | undefined,
|
|
185
181
|
): string | undefined {
|
|
186
|
-
if (
|
|
182
|
+
if (rewrite === undefined || outcome.reason !== undefined) return undefined
|
|
187
183
|
|
|
188
|
-
return hook_decision.flow_rewrite_envelope(
|
|
189
|
-
input,
|
|
190
|
-
rewrite_context(piped_verification.PIPEFAIL_NOTE, outcome),
|
|
191
|
-
)
|
|
184
|
+
return hook_decision.flow_rewrite_envelope(rewrite.input, rewrite_context(rewrite.note, outcome))
|
|
192
185
|
}
|
|
193
186
|
|
|
194
187
|
// The hook's one write: a rewrite where one applies, the outcome's own envelope otherwise.
|
|
195
|
-
function emit(
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
pipefail_input?: Record<string, unknown>,
|
|
199
|
-
): void {
|
|
200
|
-
const rewrite =
|
|
201
|
-
pipefail_envelope(outcome, pipefail_input) ?? foreground_rewrite(outcome, raw_payload)
|
|
188
|
+
function emit(raw_payload: string, outcome: GuardOutcome, rewrite?: RuleRewrite): void {
|
|
189
|
+
const envelope =
|
|
190
|
+
foreground_rewrite(outcome, raw_payload, undefined, rewrite) ?? rule_envelope(outcome, rewrite)
|
|
202
191
|
|
|
203
|
-
if (
|
|
204
|
-
else process.stdout.write(`${
|
|
192
|
+
if (envelope === undefined) hook_decision.emit_outcome(outcome)
|
|
193
|
+
else process.stdout.write(`${envelope}\n`)
|
|
205
194
|
}
|
|
206
195
|
|
|
207
|
-
// **The guards judge the call that will run.** A
|
|
208
|
-
//
|
|
209
|
-
//
|
|
196
|
+
// **The guards judge the call that will run.** A rewritten call reaches every guard already made
|
|
197
|
+
// right, so the rewriting row stays quiet on it while any other guard's refusal still wins over the
|
|
198
|
+
// rewrite. The Codex adapter cannot rewrite a call, so it goes on judging the call as typed.
|
|
210
199
|
async function respond(raw_payload: string): Promise<void> {
|
|
211
|
-
const
|
|
212
|
-
const judged =
|
|
200
|
+
const rewrite = rule_rewrite.rewrite(raw_payload)
|
|
201
|
+
const judged = rewrite?.payload ?? raw_payload
|
|
213
202
|
|
|
214
|
-
emit(judged, await pretool_outcome_async(judged),
|
|
203
|
+
emit(judged, await pretool_outcome_async(judged), rewrite)
|
|
215
204
|
}
|
|
216
205
|
|
|
217
206
|
const pretool_guard = {
|
|
@@ -219,7 +208,6 @@ const pretool_guard = {
|
|
|
219
208
|
emit,
|
|
220
209
|
foreground_rewrite,
|
|
221
210
|
mark_phase,
|
|
222
|
-
pipefail_rewrite,
|
|
223
211
|
pretool_outcome,
|
|
224
212
|
respond,
|
|
225
213
|
}
|
|
@@ -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,6 +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),
|
|
139
|
+
reservation_options(parsed),
|
|
81
140
|
)
|
|
82
141
|
}
|
|
83
142
|
|
|
@@ -85,6 +144,6 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
|
85
144
|
process.exitCode = await run_reserved(process.argv.slice(FIRST_ARGUMENT_INDEX))
|
|
86
145
|
}
|
|
87
146
|
|
|
88
|
-
const reserved_run = { parse_arguments, run_reserved }
|
|
147
|
+
const reserved_run = { parse_arguments, reservation_options, run_reserved }
|
|
89
148
|
|
|
90
149
|
export { reserved_run }
|
|
@@ -5,38 +5,45 @@
|
|
|
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 git location variables a git hook exports are cleared when the
|
|
9
|
-
# the hook's own git calls act on the checkout it stands in
|
|
10
|
-
# them —
|
|
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`.
|
|
11
13
|
# - The pre-built bundle `dist/hooks/<name>.js` runs once its gate passes; otherwise the live source
|
|
12
14
|
# runs through josh, whose command is the name with its first `-` turned into `:`
|
|
13
15
|
# (`pretool-guard` → `pretool:guard`).
|
|
14
|
-
# - 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
|
|
15
17
|
# (joshuafolkken/kit#2984) and then runs the bundle — or the josh fallback — itself, so a hook call
|
|
16
18
|
# starts node once (joshuafolkken/kit#3327). In an installed package it is a presence check: the
|
|
17
19
|
# published bundles cannot be stale against a source the consumer never edits, and Node strips no
|
|
18
20
|
# types under `node_modules`.
|
|
21
|
+
# - Nothing is spawned that the shell can do itself: the directory is a parameter expansion rather than
|
|
22
|
+
# `dirname`, and `node` replaces this shell through `exec` rather than running beside it.
|
|
19
23
|
# - An `if`/`else`, never `&&`/`||`: a guard's refusal is a non-zero exit, and a chain would read it as
|
|
20
24
|
# a missing bundle and run the hook twice.
|
|
21
25
|
|
|
22
26
|
location_variables='GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR GIT_DIR GIT_INDEX_FILE GIT_NAMESPACE GIT_OBJECT_DIRECTORY GIT_WORK_TREE'
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
|
27
31
|
|
|
28
32
|
hook_name=$1
|
|
29
33
|
shift
|
|
30
|
-
|
|
34
|
+
case $0 in
|
|
35
|
+
*/*) hooks_dir=${0%/*} ;;
|
|
36
|
+
*) hooks_dir=. ;;
|
|
37
|
+
esac
|
|
31
38
|
package_dir="$hooks_dir/../.."
|
|
32
39
|
bundle="$package_dir/dist/hooks/$hook_name.js"
|
|
33
40
|
josh_command="${hook_name%%-*}:${hook_name#*-}"
|
|
34
41
|
|
|
35
42
|
case $0 in
|
|
36
43
|
*node_modules/*)
|
|
37
|
-
if [ -d "$package_dir/dist/hooks" ]; then node "$bundle" "$@"; else node "$package_dir/dist/josh.js" "$josh_command" "$@"; fi
|
|
44
|
+
if [ -d "$package_dir/dist/hooks" ]; then exec node "$bundle" "$@"; else exec node "$package_dir/dist/josh.js" "$josh_command" "$@"; fi
|
|
38
45
|
;;
|
|
39
46
|
*)
|
|
40
|
-
node --disable-warning=ExperimentalWarning "$
|
|
47
|
+
exec node --disable-warning=ExperimentalWarning "$package_dir/tools/hooks/hook-bundle-ready.ts" "$hook_name" "$josh_command" "$@"
|
|
41
48
|
;;
|
|
42
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 }
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { git_gh_repo } from '#scripts/gh/git-gh-repo'
|
|
2
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
3
|
+
import { issue_cite_cli } from '#scripts/issue/issue-cite-cli'
|
|
4
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
5
|
+
import { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
6
|
+
import { stdout_on_stderr } from '#scripts/lib/stdout-on-stderr'
|
|
7
|
+
import { telegram_test } from '#scripts/notify/telegram-test'
|
|
8
|
+
import type { CliValues } from '#scripts/notify/telegram-test-logic'
|
|
9
|
+
import { issue_citation } from '#scripts/rules/issue-citation'
|
|
10
|
+
import { stop_rules, type StopAction, type StopOutcome } from '#scripts/rules/stop-rules'
|
|
11
|
+
import { run_hold } from '#scripts/run/hold/run-hold'
|
|
12
|
+
import { run_hold_cli } from '#scripts/run/hold/run-hold-cli'
|
|
13
|
+
import { run_hold_session } from '#scripts/run/hold/run-hold-session'
|
|
14
|
+
|
|
15
|
+
type NotifyAction = Extract<StopAction, { kind: 'notify' }>
|
|
16
|
+
|
|
17
|
+
// The `Stop` hook running the operations whose answer is fixed (joshuafolkken/kit#3919): the
|
|
18
|
+
// `confirmation` notify, the hold release and the citation lines, through the very calls
|
|
19
|
+
// `josh notify`, `josh run:release` and `josh issue:cite` make — in process, since three `pnpm`
|
|
20
|
+
// launches would spend most of the hook's 20-second budget. What each did reaches the person as a
|
|
21
|
+
// `systemMessage`; one that did not take falls back to the refusal it replaced (`stop_rules.fallback_reason`).
|
|
22
|
+
|
|
23
|
+
const SUCCESS_EXIT_CODE = 0
|
|
24
|
+
const NOTICE_SEPARATOR = '\n'
|
|
25
|
+
// The reply is the stop's reason, but a Telegram is read at a glance — its opening is enough.
|
|
26
|
+
const SUMMARY_CHARS = 600
|
|
27
|
+
// A `#N`, `owner/repo#N` or URL is a run of printable ASCII; a cut inside one would link the wrong Issue.
|
|
28
|
+
const TOKEN_CHAR = /^[!-~]$/u
|
|
29
|
+
const EMPTY_SUMMARY = 'The run stopped and is waiting for you.'
|
|
30
|
+
|
|
31
|
+
interface Settled {
|
|
32
|
+
notices: ReadonlyArray<string>
|
|
33
|
+
failure: string | undefined
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// One action at a time — the order is the rule order.
|
|
37
|
+
const SEQUENTIAL = 1
|
|
38
|
+
|
|
39
|
+
// Where the run of token characters `text` ends with starts.
|
|
40
|
+
function token_start(text: string): number {
|
|
41
|
+
let index = text.length
|
|
42
|
+
|
|
43
|
+
while (index > 0 && TOKEN_CHAR.test(text.charAt(index - 1))) index -= 1
|
|
44
|
+
|
|
45
|
+
return index
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Cut before linking, on a boundary that keeps every reference whole: the character past the cut shows
|
|
49
|
+
// whether the last token ran on, and a token that did is dropped rather than halved.
|
|
50
|
+
function summary_of(message: string): string {
|
|
51
|
+
const trimmed = message.trim()
|
|
52
|
+
if (trimmed === '') return EMPTY_SUMMARY
|
|
53
|
+
if (trimmed.length <= SUMMARY_CHARS) return trimmed
|
|
54
|
+
|
|
55
|
+
const overshoot = trimmed.slice(0, SUMMARY_CHARS + 1)
|
|
56
|
+
const cut = overshoot.slice(0, Math.min(token_start(overshoot), SUMMARY_CHARS))
|
|
57
|
+
|
|
58
|
+
return cut === '' ? trimmed.slice(0, SUMMARY_CHARS) : cut
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// The held Issue's URL, or `undefined` for a `new` entry or a repository that cannot be read.
|
|
62
|
+
async function issue_url_of(issue: string): Promise<string | undefined> {
|
|
63
|
+
if (issue === run_hold.UNNUMBERED_ISSUE) return undefined
|
|
64
|
+
|
|
65
|
+
const slug = await git_gh_repo.repo_get_name_with_owner()
|
|
66
|
+
|
|
67
|
+
return slug === undefined ? undefined : issue_cite.issue_url(slug, issue)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// The body is the reply's opening copied into a Telegram, so its bare `#N` are linked (`issue-citation.md`).
|
|
71
|
+
// The choices are the reply's own decision lines (joshuafolkken/kit#3961).
|
|
72
|
+
function notify_values(issue_url: string | undefined, action: NotifyAction): CliValues {
|
|
73
|
+
const { recommended, alternative } = action.decision
|
|
74
|
+
const values: CliValues = {
|
|
75
|
+
'task-type': 'confirmation',
|
|
76
|
+
body: session_cite.text(summary_of(action.message)),
|
|
77
|
+
recommended,
|
|
78
|
+
...(alternative !== undefined && { alternative: [alternative] }),
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return issue_url === undefined ? values : { ...values, 'issue-url': issue_url }
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// The send is stamped on the hold, so a later stop of the same pause does not announce it again. A
|
|
85
|
+
// stamp that fails does not fail the send: the Telegram is out, and a refused stop would send it twice.
|
|
86
|
+
async function mark_notified(): Promise<void> {
|
|
87
|
+
try {
|
|
88
|
+
const directory = await run_hold.worktree_directory()
|
|
89
|
+
|
|
90
|
+
if (directory !== undefined) run_hold_session.mark_notified(run_hold.hold_path(directory))
|
|
91
|
+
} catch (error) {
|
|
92
|
+
console.warn(`stop:guard could not stamp the notify on the hold: ${String(error)}`)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async function notify(action: NotifyAction): Promise<string> {
|
|
97
|
+
const issue_url = await issue_url_of(action.issue)
|
|
98
|
+
|
|
99
|
+
await telegram_test.send_values(notify_values(issue_url, action))
|
|
100
|
+
await mark_notified()
|
|
101
|
+
|
|
102
|
+
return `📱 stop:guard sent the confirmation notify (${issue_url ?? action.issue}).`
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async function release(issue: string): Promise<string | undefined> {
|
|
106
|
+
const argv = issue === run_hold.UNNUMBERED_ISSUE ? ['--release'] : ['--release', issue]
|
|
107
|
+
const code = await run_hold_cli.run(argv)
|
|
108
|
+
|
|
109
|
+
return code === SUCCESS_EXIT_CODE ? '🔓 stop:guard released the run:hold record.' : undefined
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Every line or none: a citation with a number missing is the half-fix the refusal exists to avoid.
|
|
113
|
+
async function cite(references: ReadonlyArray<string>): Promise<string | undefined> {
|
|
114
|
+
const cited = await issue_cite_cli.cite(issue_citation.cite_arguments(references))
|
|
115
|
+
if (cited === undefined || cited.failures.length > 0) return undefined
|
|
116
|
+
|
|
117
|
+
return ['Issue citations:', ...cited.lines].join(NOTICE_SEPARATOR)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// An action's line for the person, or `undefined` when it did not take.
|
|
121
|
+
async function run_action(action: StopAction): Promise<string | undefined> {
|
|
122
|
+
if (action.kind === 'notify') return await notify(action)
|
|
123
|
+
if (action.kind === 'release') return await release(action.issue)
|
|
124
|
+
|
|
125
|
+
return await cite(action.references)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// A throw is an action that did not take, the same as one that answered it had failed.
|
|
129
|
+
async function attempt(action: StopAction): Promise<string | undefined> {
|
|
130
|
+
try {
|
|
131
|
+
return await run_action(action)
|
|
132
|
+
} catch {
|
|
133
|
+
return undefined
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function is_notice(notice: string | undefined): notice is string {
|
|
138
|
+
return notice !== undefined
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// In order, one at a time: the notify reports the hold the release then ends. The first failure is the
|
|
142
|
+
// one refused with, as the rule order put it first.
|
|
143
|
+
async function settle(actions: ReadonlyArray<StopAction>): Promise<Settled> {
|
|
144
|
+
const notices = await stdout_on_stderr.run(
|
|
145
|
+
async () => await bounded_pool.bounded_map(actions, SEQUENTIAL, attempt),
|
|
146
|
+
)
|
|
147
|
+
const failed = actions.find((_action, index) => notices[index] === undefined)
|
|
148
|
+
|
|
149
|
+
return {
|
|
150
|
+
notices: notices.filter((notice) => is_notice(notice)),
|
|
151
|
+
failure: failed === undefined ? undefined : stop_rules.fallback_reason(failed),
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function joined(notices: ReadonlyArray<string>): string | undefined {
|
|
156
|
+
return notices.length === 0 ? undefined : notices.join(NOTICE_SEPARATOR)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// A failure refuses only where the outcome allows it — never past the loop-breaker.
|
|
160
|
+
function settled_envelope(
|
|
161
|
+
settled: Settled,
|
|
162
|
+
is_blocking: boolean,
|
|
163
|
+
lang: string,
|
|
164
|
+
): string | undefined {
|
|
165
|
+
const notice = joined(settled.notices)
|
|
166
|
+
|
|
167
|
+
if (is_blocking && settled.failure !== undefined) {
|
|
168
|
+
return stop_rules.block_envelope(settled.failure, lang, notice)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return notice === undefined ? undefined : stop_rules.notice_envelope(notice)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// What the hook writes for one stop's outcome, or `undefined` for a stop that writes nothing.
|
|
175
|
+
async function envelope_of(outcome: StopOutcome, lang: string): Promise<string | undefined> {
|
|
176
|
+
if (outcome.reason !== undefined) return stop_rules.block_envelope(outcome.reason, lang)
|
|
177
|
+
|
|
178
|
+
const settled = await settle(outcome.actions)
|
|
179
|
+
|
|
180
|
+
return settled_envelope(settled, outcome.blocks_on_failure, lang)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const stop_actions = { envelope_of, summary_of }
|
|
184
|
+
|
|
185
|
+
export { stop_actions }
|