@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
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
2
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
2
3
|
import { z } from 'zod'
|
|
3
4
|
import { filing_offer } from './filing-offer'
|
|
4
5
|
import { issue_citation } from './issue-citation'
|
|
5
6
|
import { lane_background } from './lane-background'
|
|
6
7
|
import { reply_language } from './reply-language'
|
|
8
|
+
import { stop_decision, type StopDecision } from './stop-decision'
|
|
7
9
|
|
|
8
10
|
// The stop-time rules, delivered on the `Stop` hook.
|
|
9
11
|
//
|
|
@@ -19,11 +21,14 @@ import { reply_language } from './reply-language'
|
|
|
19
21
|
// permission envelope. The stop guard is a second *entry* on the one foundation, exactly as
|
|
20
22
|
// `pretool-guard` is one — not a second copy of the plumbing.
|
|
21
23
|
//
|
|
22
|
-
// **
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
//
|
|
24
|
+
// **A rule whose answer is fixed acts; only a rule that needs judgement refuses** (joshuafolkken/kit#3919).
|
|
25
|
+
// The stop notification, the hold release and the citation lines are each one mechanical operation the
|
|
26
|
+
// hook can run itself, so they come back as `actions` and the stop goes through: a refusal is a whole
|
|
27
|
+
// model turn spent re-reading the context to run a command the hook already knew. `stop-actions.ts`
|
|
28
|
+
// runs them, and only an action that fails falls back to its refusal. The rest — the reply's language,
|
|
29
|
+
// an unattended filing offer, a lane's index request or running task, a headless parent's wait — need
|
|
30
|
+
// the model, so they still block with `{"decision":"block"}`, the one channel a `Stop` hook has to it;
|
|
31
|
+
// `stop_hook_active` caps a false positive at a single wasted turn.
|
|
27
32
|
|
|
28
33
|
const SWITCH_ENV_KEY = 'JOSH_STOP_GUARD'
|
|
29
34
|
const BLOCK_DECISION = 'block'
|
|
@@ -40,14 +45,22 @@ type StopPayload = z.infer<typeof stop_payload_schema>
|
|
|
40
45
|
|
|
41
46
|
// What one stop looks like to the rules, computed once by the CLI from the payload and the world.
|
|
42
47
|
interface StopContext {
|
|
43
|
-
// The `run:hold` record for this working tree
|
|
44
|
-
|
|
48
|
+
// The Issue the `run:hold` record for this working tree names (`held` or `stale`) — `new` for an
|
|
49
|
+
// unnumbered entry — or `undefined` when no record is in place.
|
|
50
|
+
hold_issue: string | undefined
|
|
51
|
+
// That record is this session's own run's, or its owner cannot be told (`run-hold-session.ts`). A
|
|
52
|
+
// hold another run took is that run's pause to announce and release, never this session's.
|
|
53
|
+
hold_owned: boolean
|
|
54
|
+
// The person opened this turn with a question: the reply answers someone at the session, not a
|
|
55
|
+
// pause waiting on them (`stop-decision.ts` → `is_question`).
|
|
56
|
+
answers_question: boolean
|
|
45
57
|
// `git status --porcelain` came back empty.
|
|
46
58
|
tree_clean: boolean
|
|
47
59
|
// That record carries a `prrun` stop mark: the run stopped at a green pull
|
|
48
60
|
// request and keeps the hold over a clean tree on purpose, so a person can look before it merges.
|
|
49
61
|
prrun_stopped: boolean
|
|
50
|
-
// A `confirmation` notify is on this run's transcript tail
|
|
62
|
+
// A `confirmation` notify is on this run's transcript tail, or the hook's own send is recorded on the
|
|
63
|
+
// hold since the pause began (`run-hold-session.ts` → `is_notified_since`).
|
|
51
64
|
notified: boolean
|
|
52
65
|
// The turn's session-facing reply text.
|
|
53
66
|
message: string
|
|
@@ -56,7 +69,8 @@ interface StopContext {
|
|
|
56
69
|
// This stop already forced a continuation earlier in the prompt — the loop-breaker Claude Code
|
|
57
70
|
// documents, so a run that will not comply is not blocked forever.
|
|
58
71
|
stop_hook_active: boolean
|
|
59
|
-
//
|
|
72
|
+
// This turn ended at a cut — its record is in place, or this turn relaunched the successor that may
|
|
73
|
+
// already have cleared it (`stop-guard.ts` → `is_cut_stop`). A dispatched lane child ends its turn at
|
|
60
74
|
// the cut holding the tree by design and hands off to a fresh process (`pre-gate-cut.md`), so that
|
|
61
75
|
// turn-end is an automatic continuation, not the person-waiting pause the block rules are for.
|
|
62
76
|
cut_pending: boolean
|
|
@@ -90,15 +104,26 @@ interface StopContext {
|
|
|
90
104
|
backlog_parent: boolean
|
|
91
105
|
}
|
|
92
106
|
|
|
107
|
+
// The operations the hook runs itself instead of refusing — each carries what it acts on.
|
|
108
|
+
type StopAction =
|
|
109
|
+
| { kind: 'notify'; issue: string; message: string; decision: StopDecision }
|
|
110
|
+
| { kind: 'release'; issue: string }
|
|
111
|
+
| { kind: 'cite'; references: ReadonlyArray<string> }
|
|
112
|
+
|
|
113
|
+
// `reason` refuses the stop; otherwise `actions` run, and `blocks_on_failure` says whether a failed one
|
|
114
|
+
// falls back to its refusal — never past the loop-breaker.
|
|
93
115
|
interface StopOutcome {
|
|
94
116
|
reason: string | undefined
|
|
117
|
+
actions: ReadonlyArray<StopAction>
|
|
118
|
+
blocks_on_failure: boolean
|
|
95
119
|
}
|
|
96
120
|
|
|
97
|
-
const NO_OUTCOME: StopOutcome = { reason: undefined }
|
|
121
|
+
const NO_OUTCOME: StopOutcome = { reason: undefined, actions: [], blocks_on_failure: false }
|
|
98
122
|
|
|
99
123
|
// **A mid-workflow stop is announced off-screen before it happens.** `CLAUDE.md` → "Mid-workflow stop
|
|
100
124
|
// notification" requires the `confirmation` Telegram before any pause; the hold is what says a run is
|
|
101
|
-
// mid-workflow, and the transcript is what says the notify was sent.
|
|
125
|
+
// mid-workflow, and the transcript is what says the notify was sent. The hook sends it; this reason is
|
|
126
|
+
// only the fallback for a send that failed.
|
|
102
127
|
const STOP_NOTIFY_REASON =
|
|
103
128
|
'⛔ mid-workflow stop notification: this working tree is still held by a run and no `confirmation` ' +
|
|
104
129
|
'Telegram was sent this turn. Send ' +
|
|
@@ -109,13 +134,14 @@ const STOP_NOTIFY_REASON =
|
|
|
109
134
|
// **A clean tree that still holds is a tree the next run will trample.** `working-tree-hold.md`: a stop that
|
|
110
135
|
// leaves the tree clean releases the hold; a `halfrun` pre-commit stop and a `needs-human-review` stop
|
|
111
136
|
// keep it because their tree is dirty, which is why this row is silent whenever the tree is not clean.
|
|
137
|
+
// The hook releases it; this reason is only the fallback for a release that failed.
|
|
112
138
|
const HOLD_RELEASE_REASON =
|
|
113
139
|
'⛔ working-tree hold not released: this working tree is clean but its `run:hold` record is still in ' +
|
|
114
140
|
'place. Release it with `pnpm josh run:release <N>` (bare for a `new` entry; ' +
|
|
115
141
|
'`working-tree-hold.md`), then confirm in one line that it was released — do not repeat your ' +
|
|
116
142
|
'previous reply.'
|
|
117
143
|
|
|
118
|
-
// **
|
|
144
|
+
// **The fallback when the hook could not print the citation lines itself**. The bare `#N` is already
|
|
119
145
|
// on screen and the hook cannot unsay it, so the reason does the one thing that helps the *next* reply:
|
|
120
146
|
// it names the numbers it detected and hands over the exact `issue:cite` call that prints the
|
|
121
147
|
// paste-ready lines, then asks for the corrected citation lines alone — not the whole reply reissued.
|
|
@@ -144,7 +170,7 @@ function build_citation_reason(references: ReadonlyArray<string>): string {
|
|
|
144
170
|
const FILING_OFFER_REASON =
|
|
145
171
|
'⛔ filing offer: your reply offers to file an Issue instead of filing it, and this run is ' +
|
|
146
172
|
'unattended — nobody is there to answer. Run ' +
|
|
147
|
-
'`pnpm josh issue:file "<title>" --body-file <path
|
|
173
|
+
'`pnpm josh issue:file "<title>" --body-file <path>` (Tier A, ' +
|
|
148
174
|
'`observation-filing.md`), then end with the one-line citation of what was filed; do not repeat ' +
|
|
149
175
|
'your previous reply. If it is not worth filing after all, say so in one line instead.'
|
|
150
176
|
|
|
@@ -246,42 +272,52 @@ function needs_filing(context: StopContext): boolean {
|
|
|
246
272
|
//
|
|
247
273
|
// **A lane handed to the detached ship stands them down too**: the hold now
|
|
248
274
|
// belongs to the supervisor driving the merge, and the person hears from that supervisor's own notify.
|
|
275
|
+
//
|
|
276
|
+
// **Another run's hold stands them down as well**: the pause and the claim are that run's.
|
|
249
277
|
function is_held_idle(context: StopContext): boolean {
|
|
250
|
-
|
|
278
|
+
if (context.hold_issue === undefined || !context.hold_owned) return false
|
|
279
|
+
|
|
280
|
+
return !context.agent_pending && !context.handed_off
|
|
251
281
|
}
|
|
252
282
|
|
|
283
|
+
// **A stop that answers the person's question is no pause** (joshuafolkken/kit#3961): they are reading
|
|
284
|
+
// the reply where it was written, whatever the tree's hold says.
|
|
253
285
|
function needs_notify(context: StopContext): boolean {
|
|
254
|
-
return is_held_idle(context) && !context.notified
|
|
286
|
+
return is_held_idle(context) && !context.notified && !context.answers_question
|
|
255
287
|
}
|
|
256
288
|
|
|
257
|
-
|
|
258
|
-
|
|
289
|
+
// The notify a stop owes but cannot send: its reply names no decision to announce.
|
|
290
|
+
function needs_decision(context: StopContext): boolean {
|
|
291
|
+
return needs_notify(context) && stop_decision.decision_of(context.message) === undefined
|
|
259
292
|
}
|
|
260
293
|
|
|
261
|
-
function
|
|
262
|
-
|
|
263
|
-
if (references.length === 0) return undefined
|
|
264
|
-
|
|
265
|
-
return build_citation_reason(references)
|
|
294
|
+
function needs_release(context: StopContext): boolean {
|
|
295
|
+
return is_held_idle(context) && context.tree_clean && !context.prrun_stopped
|
|
266
296
|
}
|
|
267
297
|
|
|
268
|
-
// The
|
|
269
|
-
// its text lands in a stream-json log, so correcting its citations or its
|
|
270
|
-
//
|
|
271
|
-
//
|
|
272
|
-
function
|
|
273
|
-
if (context.headless_agent) return
|
|
298
|
+
// The bare references the citation lines are printed for. **A headless agent's reply has no reader**:
|
|
299
|
+
// its text lands in a stream-json log, so correcting its citations or its language costs a turn and
|
|
300
|
+
// reaches nobody. The artifacts a person does read — a Telegram, an Issue, a pull request — are held
|
|
301
|
+
// to the same rules by their own guards, not here.
|
|
302
|
+
function bare_references(context: StopContext): ReadonlyArray<string> {
|
|
303
|
+
if (context.headless_agent) return []
|
|
274
304
|
|
|
275
|
-
return
|
|
305
|
+
return issue_citation.unquoted_references(context.message, context.prompt)
|
|
276
306
|
}
|
|
277
307
|
|
|
278
|
-
// The
|
|
308
|
+
// The two rules that read the reply and need the model, the filing offer first. A drifted reply
|
|
279
309
|
// refused for another reason is not rewritten, but the drift still ends: `block_envelope` appends the
|
|
280
310
|
// session-language note to every refusal, so the turn it continues is written in the session language.
|
|
281
311
|
function reply_reason(context: StopContext): string | undefined {
|
|
282
312
|
if (needs_filing(context)) return FILING_OFFER_REASON
|
|
313
|
+
if (context.headless_agent) return undefined
|
|
283
314
|
|
|
284
|
-
return
|
|
315
|
+
return language_reason(context)
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// Sent back once; past the loop-breaker the run has said nothing is awaited, and nothing is sent.
|
|
319
|
+
function decision_reason(context: StopContext): string | undefined {
|
|
320
|
+
return needs_decision(context) ? stop_decision.DECISION_REASON : undefined
|
|
285
321
|
}
|
|
286
322
|
|
|
287
323
|
// The headless wait holds past the loop-breaker until the spin bound is reached.
|
|
@@ -306,24 +342,56 @@ function needs_background_wait(context: StopContext): boolean {
|
|
|
306
342
|
return context.lane_child && context.background_pending
|
|
307
343
|
}
|
|
308
344
|
|
|
309
|
-
// The two
|
|
310
|
-
//
|
|
311
|
-
|
|
312
|
-
function hold_reason(context: StopContext): string | undefined {
|
|
345
|
+
// The two lane rules that mean the run is not pausing at all — ahead of every action, since the notify
|
|
346
|
+
// would announce a pause the run has no reason to take.
|
|
347
|
+
function lane_reason(context: StopContext): string | undefined {
|
|
313
348
|
if (needs_index_route(context)) return LANE_INDEX_REASON
|
|
314
349
|
if (needs_background_wait(context)) return lane_background.LANE_BACKGROUND_STOP_REASON
|
|
315
|
-
if (needs_notify(context)) return STOP_NOTIFY_REASON
|
|
316
|
-
if (needs_release(context)) return HOLD_RELEASE_REASON
|
|
317
350
|
|
|
318
351
|
return undefined
|
|
319
352
|
}
|
|
320
353
|
|
|
321
|
-
//
|
|
322
|
-
//
|
|
323
|
-
//
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
354
|
+
// The refusals that need the model: the lane rules alone, else the reply's own and the decision
|
|
355
|
+
// together. **Joined, since the loop-breaker grants one continuation**: a decision refusal queued behind
|
|
356
|
+
// a language or filing refusal would never be sent, and its stop would pass with no notify.
|
|
357
|
+
function model_reason(context: StopContext): string | undefined {
|
|
358
|
+
const lane = lane_reason(context)
|
|
359
|
+
if (lane !== undefined) return lane
|
|
360
|
+
|
|
361
|
+
const reasons = [reply_reason(context), decision_reason(context)].filter(
|
|
362
|
+
(reason) => reason !== undefined,
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
return reasons.length === 0 ? undefined : reasons.join('\n\n')
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// The notify carries the reply's own decision; a reply with none sends nothing (`needs_decision`).
|
|
369
|
+
function notify_actions(context: StopContext, issue: string): Array<StopAction> {
|
|
370
|
+
const decision = stop_decision.decision_of(context.message)
|
|
371
|
+
if (decision === undefined || !needs_notify(context)) return []
|
|
372
|
+
|
|
373
|
+
return [{ kind: 'notify', issue, message: context.message, decision }]
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
function hold_actions(context: StopContext): Array<StopAction> {
|
|
377
|
+
const issue = context.hold_issue
|
|
378
|
+
if (issue === undefined) return []
|
|
379
|
+
|
|
380
|
+
const notify = notify_actions(context, issue)
|
|
381
|
+
|
|
382
|
+
return needs_release(context) ? [...notify, { kind: 'release', issue }] : notify
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// The actions in the order they run: the notify ahead of the release that ends the hold it reports.
|
|
386
|
+
function stop_actions(context: StopContext): ReadonlyArray<StopAction> {
|
|
387
|
+
const references = bare_references(context)
|
|
388
|
+
const cite: Array<StopAction> = references.length > 0 ? [{ kind: 'cite', references }] : []
|
|
389
|
+
|
|
390
|
+
return [...hold_actions(context), ...cite]
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// First-wins across the refusals. `stop_hook_active` is the loop-breaker, so a run that already got one
|
|
394
|
+
// continuation this prompt may stop; the lane rules go first, then the filing offer, then the language.
|
|
327
395
|
//
|
|
328
396
|
// **The headless wait comes first and outlasts `stop_hook_active` up to its spin bound**.
|
|
329
397
|
// The loop-breaker exists so a person is not wedged behind a rule the run will not satisfy; a headless
|
|
@@ -334,24 +402,53 @@ function block_reason(context: StopContext): string | undefined {
|
|
|
334
402
|
if (is_headless_held(context)) return HEADLESS_WAIT_REASON
|
|
335
403
|
if (context.stop_hook_active || context.cut_pending) return undefined
|
|
336
404
|
|
|
337
|
-
return
|
|
405
|
+
return model_reason(context)
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// **The actions run only on the stop that goes through**, so a refused stop never notifies a pause its
|
|
409
|
+
// continuation then cancels, while the continuation's own stop, past the loop-breaker, still runs them
|
|
410
|
+
// and a failure there no longer refuses. A lane child still waiting on its own work runs none, and a
|
|
411
|
+
// pre-gate cut in flight stands everything but the headless wait down: it is a lane child's automatic
|
|
412
|
+
// turn-end, not a person-waiting pause.
|
|
413
|
+
function runs_actions(context: StopContext, reason: string | undefined): boolean {
|
|
414
|
+
return reason === undefined && !context.cut_pending && lane_reason(context) === undefined
|
|
338
415
|
}
|
|
339
416
|
|
|
340
417
|
function stop_outcome(context: StopContext): StopOutcome {
|
|
341
|
-
|
|
418
|
+
const reason = block_reason(context)
|
|
419
|
+
if (!runs_actions(context, reason)) return { ...NO_OUTCOME, reason }
|
|
420
|
+
|
|
421
|
+
const actions = stop_actions(context)
|
|
422
|
+
if (actions.length === 0) return NO_OUTCOME
|
|
423
|
+
|
|
424
|
+
return { reason, actions, blocks_on_failure: !context.stop_hook_active }
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// The refusal an action falls back to when the hook could not run it.
|
|
428
|
+
function fallback_reason(action: StopAction): string {
|
|
429
|
+
if (action.kind === 'notify') return STOP_NOTIFY_REASON
|
|
430
|
+
if (action.kind === 'release') return HOLD_RELEASE_REASON
|
|
431
|
+
|
|
432
|
+
return build_citation_reason(action.references)
|
|
342
433
|
}
|
|
343
434
|
|
|
344
435
|
// The documented shape a `Stop` hook blocks with: `reason` is fed back to Claude, which then continues
|
|
345
436
|
// instead of stopping. Plain stdout is not it — only this envelope holds the stop. Every reason leaves
|
|
346
437
|
// with the session-language note, so no rule can hand the model an English-only turn.
|
|
347
|
-
|
|
348
|
-
|
|
438
|
+
// `notice` is what the hook already did on this stop, shown to the person alongside.
|
|
439
|
+
function block_envelope(reason: string, lang: string, notice?: string): string {
|
|
440
|
+
const refusal = { decision: BLOCK_DECISION, reason: `${reason} ${language_note(lang)}` }
|
|
441
|
+
|
|
442
|
+
return JSON.stringify(notice === undefined ? refusal : { ...refusal, systemMessage: notice })
|
|
349
443
|
}
|
|
350
444
|
|
|
351
|
-
|
|
352
|
-
|
|
445
|
+
// The shape a `Stop` hook shows the person a line in without holding the stop: `systemMessage` alone.
|
|
446
|
+
function notice_envelope(notice: string): string {
|
|
447
|
+
return JSON.stringify({ systemMessage: notice })
|
|
448
|
+
}
|
|
353
449
|
|
|
354
|
-
|
|
450
|
+
function parse_stop_payload(raw_payload: string): StopPayload | undefined {
|
|
451
|
+
return json_value.parse_with(raw_payload, stop_payload_schema)
|
|
355
452
|
}
|
|
356
453
|
|
|
357
454
|
function is_enabled(): boolean {
|
|
@@ -371,10 +468,12 @@ const stop_rules = {
|
|
|
371
468
|
block_envelope,
|
|
372
469
|
build_language_reason,
|
|
373
470
|
count_headless_refusals,
|
|
471
|
+
fallback_reason,
|
|
374
472
|
is_enabled,
|
|
473
|
+
notice_envelope,
|
|
375
474
|
parse_stop_payload,
|
|
376
475
|
stop_outcome,
|
|
377
476
|
}
|
|
378
477
|
|
|
379
|
-
export type { StopContext, StopOutcome }
|
|
478
|
+
export type { StopAction, StopContext, StopOutcome }
|
|
380
479
|
export { stop_rules }
|
|
@@ -30,6 +30,20 @@ function prior_bash_commands(tail: string): ReadonlyArray<string> {
|
|
|
30
30
|
return tail.split('\n').flatMap((line) => bash_commands_of(line))
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
// **Whether a call `is_call` names answered with the `token` line** — the call and its own result
|
|
34
|
+
// paired off parsed blocks, so a transcript that merely quotes the command or the token does not
|
|
35
|
+
// count. An unreadable text reads as no answer.
|
|
36
|
+
function answered(text: string, is_call: (command: string) => boolean, token: string): boolean {
|
|
37
|
+
const blocks = time_transcript_line.parse_text(text).flatMap((line) => line.blocks)
|
|
38
|
+
const call_ids = new Set(
|
|
39
|
+
blocks
|
|
40
|
+
.filter((block) => is_call(time_shell.bash_command(block.input)))
|
|
41
|
+
.map((block) => block.id),
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
return blocks.some((block) => call_ids.has(block.result_id) && block.token_lines.includes(token))
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const tail_commands = { answered, is_bash_use, prior_bash_commands }
|
|
34
48
|
|
|
35
49
|
export { tail_commands }
|
|
@@ -38,7 +38,17 @@ const REASON =
|
|
|
38
38
|
// The enumeration row itself, so `delivered-rules.ts` spreads one entry rather than restating the
|
|
39
39
|
// trigger and reason it already single-sources here. Once per run (the default delivery) for the
|
|
40
40
|
// reason above.
|
|
41
|
-
const ROW = {
|
|
41
|
+
const ROW = {
|
|
42
|
+
id: 'test-declared',
|
|
43
|
+
is_trigger: is_untested_commit,
|
|
44
|
+
reason: REASON,
|
|
45
|
+
about: {
|
|
46
|
+
title: 'Test declaration',
|
|
47
|
+
topic: '`CLAUDE.md` → Code Change Rules',
|
|
48
|
+
fires: '`pnpm josh git -y` (`josh g`) while `pnpm josh test:declared` answers `required`',
|
|
49
|
+
quiet: '`exempt` (non-runtime only) or `satisfied` (tests included)',
|
|
50
|
+
},
|
|
51
|
+
}
|
|
42
52
|
|
|
43
53
|
const test_declared_commit = { REASON, ROW }
|
|
44
54
|
|
|
@@ -117,6 +117,13 @@ const ROW = {
|
|
|
117
117
|
is_trigger: bash_triggers.on_bash_command((command: string) => writes_third_party(command)),
|
|
118
118
|
reason: THIRD_PARTY_WRITE_REASON,
|
|
119
119
|
decide: (): boolean => true,
|
|
120
|
+
about: {
|
|
121
|
+
title: 'Third-party write',
|
|
122
|
+
topic: '`upstream-interrupt.md`',
|
|
123
|
+
fires:
|
|
124
|
+
'a `gh api` write (field flag or a write method) to a repository whose owner is not this session. Every occurrence',
|
|
125
|
+
quiet: 'a read, or a first-party owner (`pnpm josh repo:party`)',
|
|
126
|
+
},
|
|
120
127
|
}
|
|
121
128
|
|
|
122
129
|
const third_party_write = {
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { bash_triggers } from './bash-triggers'
|
|
2
|
+
import { shell_segments } from './shell-segments'
|
|
3
|
+
|
|
4
|
+
// The trigger and the delivered text behind the `timed-rerun` row of `delivered-rules.ts`
|
|
5
|
+
// (joshuafolkken/kit#4356). A lane agent timed a whole-tree `eslint` twice to learn what CI already
|
|
6
|
+
// records, and each run took about 1.3 cores for seven minutes outside the core budget.
|
|
7
|
+
//
|
|
8
|
+
// **The timer is the trigger, not the tool.** What a run is after when it prefixes `time` or reaches
|
|
9
|
+
// for `hyperfine` is a duration, and a duration of CI or of the gate is already on record — the Actions
|
|
10
|
+
// jobs and the lane ledger. The tool under the timer can be anything, so reading the timer is the one
|
|
11
|
+
// trigger that does not have to enumerate them.
|
|
12
|
+
//
|
|
13
|
+
// **Once per run.** The rule allows one re-run when the record cannot answer, so the reissue goes
|
|
14
|
+
// through. On that reissue `lane-direct-tool` still refuses a lane child's `time`-prefixed heavy tool
|
|
15
|
+
// (`git_argv` skips the timer) and points it at `pnpm josh reserved-run`, the overlap
|
|
16
|
+
// `delivered-rules.ts` admits. A `hyperfine "<command>"` carries the tool inside a quoted argument,
|
|
17
|
+
// which `lane-direct-tool` does not read, so in a lane that reissue is not budgeted.
|
|
18
|
+
|
|
19
|
+
// A segment that opens with a timer, behind any environment assignments: `time`, `/usr/bin/time -p`
|
|
20
|
+
// and `hyperfine`. Anchored at the segment start, so a quoted mention or an argument is not a timer.
|
|
21
|
+
const TIMED_SEGMENT = /^\s*(?:[A-Za-z_]\w*=\S*\s+)*(?:\S*\/)?(?:time|hyperfine)\s/u
|
|
22
|
+
|
|
23
|
+
function is_timed_run(command: string): boolean {
|
|
24
|
+
return shell_segments
|
|
25
|
+
.quote_aware_commands_of(command)
|
|
26
|
+
.some((segment) => TIMED_SEGMENT.test(segment))
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Reading the record: an Actions run or job listing, or the lane ledger's gate timings.
|
|
30
|
+
const RECORD_READ = /\bgh\s+api\b.*\/actions\/runs\b|\bjosh\s+(?:lane:stats|lst)\b/u
|
|
31
|
+
|
|
32
|
+
function reads_the_record(command: string): boolean {
|
|
33
|
+
return RECORD_READ.test(command)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function measures_duration(command: string): boolean {
|
|
37
|
+
return reads_the_record(command) || is_timed_run(command)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const TIMED_RERUN_REASON =
|
|
41
|
+
'⛔ timed re-run: a CI or gate duration is already on record — read the Actions jobs with ' +
|
|
42
|
+
'`gh api …/actions/runs/<run_id>/jobs` or the gate timings with `pnpm josh lane:stats`. Re-run ' +
|
|
43
|
+
'only when the record cannot answer: reissue the same command once, and post the result on the ' +
|
|
44
|
+
'Issue (`prompts/collaboration-workflow/measurement.md`).'
|
|
45
|
+
|
|
46
|
+
// The row itself, so `delivered-rules.ts` spreads one entry; once per run, so the one allowed re-run
|
|
47
|
+
// goes through on the reissue.
|
|
48
|
+
const ROW = {
|
|
49
|
+
id: 'timed-rerun',
|
|
50
|
+
is_trigger: bash_triggers.on_bash_command(is_timed_run),
|
|
51
|
+
reason: TIMED_RERUN_REASON,
|
|
52
|
+
keeps: bash_triggers.on_bash_command(reads_the_record),
|
|
53
|
+
reaches: bash_triggers.on_bash_command(measures_duration),
|
|
54
|
+
about: {
|
|
55
|
+
title: 'Timed re-run',
|
|
56
|
+
topic: '`measurement.md`',
|
|
57
|
+
fires: 'a command timed with `time` / `/usr/bin/time` / `hyperfine`',
|
|
58
|
+
quiet: 'the duration is read from the Actions jobs or `pnpm josh lane:stats`',
|
|
59
|
+
},
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const timed_rerun = {
|
|
63
|
+
ROW,
|
|
64
|
+
TIMED_RERUN_REASON,
|
|
65
|
+
is_timed_run,
|
|
66
|
+
reads_the_record,
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export { timed_rerun }
|
|
@@ -17,7 +17,9 @@ import { shell_segments } from './shell-segments'
|
|
|
17
17
|
// that stash findable and poppable by `pnpm josh stash:pop`, which is the whole of `operating-rules.md`'s
|
|
18
18
|
// safety argument; the forms it warns against are the *positional/bare* ones. So `git stash push -m`
|
|
19
19
|
// (with or without `-u`) and the read-only `git stash list` / `show` pass, and everything else — bare
|
|
20
|
-
// `git stash`, a message-less push, `pop` / `apply` / `drop` / `save` / `clear` — is refused.
|
|
20
|
+
// `git stash`, a message-less push, `pop` / `apply` / `drop` / `save` / `clear` — is refused. Those
|
|
21
|
+
// flows now push with `pnpm josh stash:push` (joshuafolkken/kit#4131), invisible here; the raw message
|
|
22
|
+
// form still passes for a procedure written before it.
|
|
21
23
|
//
|
|
22
24
|
// **The refusal names the way on for a handed-over stash.** joshuafolkken/kit#3630's plan restored a
|
|
23
25
|
// stash with `git stash apply`, and the lane parked on how to apply it instead of popping by message;
|
|
@@ -117,7 +119,7 @@ function is_unauthorized_segment(segment: string): boolean {
|
|
|
117
119
|
}
|
|
118
120
|
|
|
119
121
|
function is_unauthorized_worktree_change(command: string): boolean {
|
|
120
|
-
return shell_segments.
|
|
122
|
+
return shell_segments.commands_of(command).some((segment) => is_unauthorized_segment(segment))
|
|
121
123
|
}
|
|
122
124
|
|
|
123
125
|
// The instruction in the shape a refusal can carry: what the command touches, the authorized route,
|
|
@@ -125,7 +127,7 @@ function is_unauthorized_worktree_change(command: string): boolean {
|
|
|
125
127
|
// invisible to this trigger, so a run that uses them is never refused.
|
|
126
128
|
const WORKTREE_MUTATION_REASON =
|
|
127
129
|
'⛔ unauthorized working-tree change: `git checkout --`, `git restore`, `git clean -f`, ' +
|
|
128
|
-
'`git stash`. A documented flow stashes with `
|
|
130
|
+
'`git stash`. A documented flow stashes with `pnpm josh stash:push "<message>"`; a handed-over ' +
|
|
129
131
|
'stash is `pnpm josh stash:pop "<message>"`; record the substitution on the Issue (Tier A) unless ' +
|
|
130
132
|
'the plan says why the owner keeps the stash: then stop and confirm. It fires on every occurrence ' +
|
|
131
133
|
'(`operating-rules.md`).'
|
|
@@ -135,6 +137,14 @@ const ROW = {
|
|
|
135
137
|
is_trigger: bash_triggers.on_bash_command(is_unauthorized_worktree_change),
|
|
136
138
|
reason: WORKTREE_MUTATION_REASON,
|
|
137
139
|
decide: (): boolean => true,
|
|
140
|
+
about: {
|
|
141
|
+
title: 'Unauthorized work-tree mutation',
|
|
142
|
+
topic: '`operating-rules.md`',
|
|
143
|
+
fires:
|
|
144
|
+
'`git checkout -- <path>` / `git restore <path>` / forced `git clean -f` / an unauthorized `git stash` (bare, push without a message, positional pop). Every occurrence',
|
|
145
|
+
quiet:
|
|
146
|
+
'`git stash push -m`, `git stash list`, `pnpm josh git`, `pnpm josh stash:push`, `pnpm josh stash:pop`',
|
|
147
|
+
},
|
|
138
148
|
}
|
|
139
149
|
|
|
140
150
|
const worktree_guard = {
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
|
|
3
|
+
// The name an app is drawn under on `run:board`'s 💻 processes section, computed from its command.
|
|
4
|
+
// `run-board-process-groups.ts` remembers each command's answer, so a redraw names only the processes
|
|
5
|
+
// new since the last one (joshuafolkken/kit#4263).
|
|
6
|
+
|
|
7
|
+
const APP_SUFFIX = '.app'
|
|
8
|
+
const COMMAND_SEPARATOR = ' '
|
|
9
|
+
|
|
10
|
+
// An app's name: the outermost `.app` bundle its executable sits in, else its command's own name.
|
|
11
|
+
function app_of(command: string): string {
|
|
12
|
+
const bundle = command.split(path.sep).find((part) => part.endsWith(APP_SUFFIX))
|
|
13
|
+
|
|
14
|
+
if (bundle !== undefined) return bundle.slice(0, -APP_SUFFIX.length)
|
|
15
|
+
|
|
16
|
+
const executable = command.startsWith(path.sep) ? command : command.split(COMMAND_SEPARATOR)[0]
|
|
17
|
+
|
|
18
|
+
return path.basename(executable ?? command)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const run_board_app_name = { app_of }
|
|
22
|
+
|
|
23
|
+
export { run_board_app_name }
|