@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
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { bash_triggers } from './bash-triggers'
|
|
2
|
+
import { direct_pr_create } from './direct-pr-create'
|
|
3
|
+
import { gh_api } from './gh-api'
|
|
4
|
+
import { git_argv } from './git-argv'
|
|
5
|
+
import { shell_segments } from './shell-segments'
|
|
6
|
+
|
|
7
|
+
// The `direct-issue-comment` row of `delivered-rules.ts`. A run's own comment has to carry
|
|
8
|
+
// `RUN_MARKER`, or `issue-watch-diff.ts` reads it as a person's update: the run's review then reads as
|
|
9
|
+
// briefed before the issue changed, and `josh followup` refuses the merge (joshuafolkken/kit#4221).
|
|
10
|
+
// `pnpm josh issue:comment` is the one path that writes the marker, so a hand-built `gh issue comment`
|
|
11
|
+
// or `gh api` write to `…/issues/<N>/comments` is refused and pointed there. It reads the argv through
|
|
12
|
+
// `direct-pr-create.ts`'s cut, so a quoted mention is not a call and `bash -c '…'` still is.
|
|
13
|
+
//
|
|
14
|
+
// **Only the checkout's own repository**: `issue:comment` posts there and nowhere else, so the row
|
|
15
|
+
// claims the spellings that target it — the `{owner}` placeholder, and `gh issue comment` with no
|
|
16
|
+
// repository selector. A comment to another repository named outright is left to `third-party-write`.
|
|
17
|
+
//
|
|
18
|
+
// **It fires on every occurrence**, for the reason `git-force.ts` does.
|
|
19
|
+
|
|
20
|
+
const ISSUE_GROUP = 'issue'
|
|
21
|
+
const COMMENT_ACTION = 'comment'
|
|
22
|
+
const API_SUBCOMMAND = 'api'
|
|
23
|
+
const REPO_SELECTOR = /^(?:-R|--repo)(?:=|$)/u
|
|
24
|
+
// One issue's (or pull request's — REST serves both as issues) comment collection. Anchored on the
|
|
25
|
+
// whole endpoint argument, so `…/issues/comments/<id>` and a listing elsewhere are not read as it. The
|
|
26
|
+
// number is any one segment, so `issues/$N/comments` is seen as well.
|
|
27
|
+
const SEGMENT = String.raw`[^/\s'"]+`
|
|
28
|
+
const QUOTE = `['"]?`
|
|
29
|
+
const API_ORIGIN = String.raw`(?:https://api\.github\.com)?/?`
|
|
30
|
+
const COMMENTS_PATH = new RegExp(
|
|
31
|
+
`^${QUOTE}${API_ORIGIN}repos/${SEGMENT}/${SEGMENT}/issues/${SEGMENT}/comments/?${QUOTE}$`,
|
|
32
|
+
'u',
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
function is_comment_cli_call(args: ReadonlyArray<string>): boolean {
|
|
36
|
+
if (args.some((argument) => REPO_SELECTOR.test(argument))) return false
|
|
37
|
+
|
|
38
|
+
const [group, action] = direct_pr_create.positional_words(
|
|
39
|
+
args,
|
|
40
|
+
direct_pr_create.VALUE_TAKING_FLAGS,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
return group === ISSUE_GROUP && action === COMMENT_ACTION
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function is_own_comments_endpoint(endpoint: string): boolean {
|
|
47
|
+
const owner = gh_api.repo_target(endpoint)?.owner ?? ''
|
|
48
|
+
|
|
49
|
+
return gh_api.is_owner_placeholder(owner) && COMMENTS_PATH.test(endpoint)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function is_comment_api_call(args: ReadonlyArray<string>): boolean {
|
|
53
|
+
const call = [direct_pr_create.GH_COMMAND, ...args].join(' ')
|
|
54
|
+
|
|
55
|
+
if (!gh_api.is_gh_api(call) || !gh_api.is_write(call)) return false
|
|
56
|
+
|
|
57
|
+
const [subcommand, endpoint = ''] = direct_pr_create.positional_words(
|
|
58
|
+
args,
|
|
59
|
+
direct_pr_create.API_VALUE_TAKING_FLAGS,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
return subcommand === API_SUBCOMMAND && is_own_comments_endpoint(endpoint)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function is_comment_segment(segment: string): boolean {
|
|
66
|
+
const args = git_argv.arguments_of(segment, direct_pr_create.GH_COMMAND)
|
|
67
|
+
|
|
68
|
+
if (args === undefined || direct_pr_create.is_help_call(args)) return false
|
|
69
|
+
|
|
70
|
+
return is_comment_cli_call(args) || is_comment_api_call(args)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function is_direct_issue_comment(command: string): boolean {
|
|
74
|
+
return direct_pr_create.has_run_segment(command, is_comment_segment)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// `pnpm josh issue:comment` — the act that keeps the rule, segment-wise so a spelling quoted inside
|
|
78
|
+
// another command's body is not read as one.
|
|
79
|
+
const COMMENT_NAMES: ReadonlySet<string> = new Set(['issue:comment'])
|
|
80
|
+
|
|
81
|
+
function is_josh_comment(command: string): boolean {
|
|
82
|
+
return shell_segments
|
|
83
|
+
.segments_of(command)
|
|
84
|
+
.some((segment) => shell_segments.is_josh_command(segment, COMMENT_NAMES))
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function is_any_comment(command: string): boolean {
|
|
88
|
+
return is_direct_issue_comment(command) || is_josh_comment(command)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const DIRECT_ISSUE_COMMENT_REASON =
|
|
92
|
+
'⛔ direct issue comment: `gh issue comment` (or a `gh api` write to `…/issues/<N>/comments`) posts ' +
|
|
93
|
+
'without the run marker, so the run reads its own comment as a person updating the issue — the ' +
|
|
94
|
+
'review goes stale and `pnpm josh followup` refuses the merge. Post with ' +
|
|
95
|
+
'`pnpm josh issue:comment <N> --body-file <path>` instead (`shell-body.md`). ' +
|
|
96
|
+
'**This rule fires on every occurrence, not once per run.**'
|
|
97
|
+
|
|
98
|
+
const ROW = {
|
|
99
|
+
id: 'direct-issue-comment',
|
|
100
|
+
is_trigger: bash_triggers.on_bash_command(is_direct_issue_comment),
|
|
101
|
+
reason: DIRECT_ISSUE_COMMENT_REASON,
|
|
102
|
+
decide: (): boolean => true,
|
|
103
|
+
keeps: bash_triggers.on_bash_command(is_josh_comment),
|
|
104
|
+
reaches: bash_triggers.on_bash_command(is_any_comment),
|
|
105
|
+
about: {
|
|
106
|
+
title: 'Direct issue comment',
|
|
107
|
+
topic: '`shell-body.md`',
|
|
108
|
+
fires:
|
|
109
|
+
"a comment to the checkout's own repository outside `josh issue:comment` (`gh issue comment` with no `--repo`, or a `gh api` write to `repos/{owner}/<r>/issues/<N>/comments`); it points at `pnpm josh issue:comment`. Every occurrence",
|
|
110
|
+
quiet:
|
|
111
|
+
'`pnpm josh issue:comment`, or reading the comments — the path that writes the run marker',
|
|
112
|
+
},
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const direct_issue_comment = { DIRECT_ISSUE_COMMENT_REASON, ROW, is_direct_issue_comment }
|
|
116
|
+
|
|
117
|
+
export { direct_issue_comment }
|
|
@@ -17,6 +17,7 @@ const PR_GROUP = 'pr'
|
|
|
17
17
|
// `new` is gh's own alias for `pr create`.
|
|
18
18
|
const PR_CREATE_ACTIONS: ReadonlySet<string> = new Set(['create', 'new'])
|
|
19
19
|
const FLAG_PREFIX = '-'
|
|
20
|
+
const HELP_FLAGS: ReadonlySet<string> = new Set(['-h', '--help'])
|
|
20
21
|
// The repository selector gh accepts before `pr` or between `pr` and its action; with no `=` it
|
|
21
22
|
// swallows the next word, so that word is not read as the group or the action.
|
|
22
23
|
const VALUE_TAKING_FLAGS: ReadonlySet<string> = new Set(['-R', '--repo'])
|
|
@@ -80,16 +81,64 @@ function is_pr_create_cli_call(args: ReadonlyArray<string>): boolean {
|
|
|
80
81
|
return group === PR_GROUP && PR_CREATE_ACTIONS.has(action)
|
|
81
82
|
}
|
|
82
83
|
|
|
84
|
+
// A help call prints the usage and creates nothing. A help flag right after another flag may be that
|
|
85
|
+
// flag's value (`--title -h`), so it is not read as one — a boolean flag before it errs toward refusal.
|
|
86
|
+
function is_help_call(args: ReadonlyArray<string>): boolean {
|
|
87
|
+
return args.some(
|
|
88
|
+
(argument, index) =>
|
|
89
|
+
HELP_FLAGS.has(argument) && !(args[index - 1] ?? '').startsWith(FLAG_PREFIX),
|
|
90
|
+
)
|
|
91
|
+
}
|
|
92
|
+
|
|
83
93
|
function is_pr_create_segment(segment: string): boolean {
|
|
84
94
|
const args = git_argv.arguments_of(segment, GH_COMMAND)
|
|
85
95
|
|
|
86
|
-
if (args === undefined) return false
|
|
96
|
+
if (args === undefined || is_help_call(args)) return false
|
|
87
97
|
|
|
88
98
|
return is_pr_create_cli_call(args) || is_pr_create_api_call(args)
|
|
89
99
|
}
|
|
90
100
|
|
|
101
|
+
// Quoted text the shell still runs: a command substitution, or the string `sh -c` (its `-c` alone or
|
|
102
|
+
// in a cluster such as `-lc`, after any other flags), `ssh` or `eval` executes. `ssh` and `eval` count
|
|
103
|
+
// only as the segment's program, so `grep -E "ssh|gh pr create"` stays one quoted pattern.
|
|
104
|
+
const RUNS_QUOTED_TEXT = /\$\(|`/u
|
|
105
|
+
const QUOTED_TEXT_RUNNERS: ReadonlySet<string> = new Set(['ssh', 'eval'])
|
|
106
|
+
const SHELL_DASH_C = /\b(?:ba|da|k|z)?sh\s+(?:-\S+\s+)*-[A-Za-z]*c\b/u
|
|
107
|
+
// A `#` comment hides its apostrophe from the shell but not from the quote pairing, so a multi-line
|
|
108
|
+
// segment holding one may be lines the pairing joined (`# don't` … `'`) rather than one quoted span.
|
|
109
|
+
const COMMENT_MARKER = /(?:^|\s)#/mu
|
|
110
|
+
const LINE_BREAK = '\n'
|
|
111
|
+
|
|
112
|
+
function is_run_by_shell(segment: string): boolean {
|
|
113
|
+
if (RUNS_QUOTED_TEXT.test(segment) || SHELL_DASH_C.test(segment)) return true
|
|
114
|
+
|
|
115
|
+
return QUOTED_TEXT_RUNNERS.has(git_argv.program_of(segment)?.name ?? '')
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function is_runs_quoted_text(segment: string): boolean {
|
|
119
|
+
if (is_run_by_shell(segment)) return true
|
|
120
|
+
|
|
121
|
+
return segment.includes(LINE_BREAK) && COMMENT_MARKER.test(segment)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// A segment whose quotes still run keeps the plain cut, so `bash -c 'git push && gh pr create --fill'`
|
|
125
|
+
// is refused as it was before the quote-aware cut.
|
|
126
|
+
function judged_segments(segment: string): Array<string> {
|
|
127
|
+
return is_runs_quoted_text(segment) ? shell_segments.commands_of(segment) : [segment]
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// The cut is quote-aware, so `grep -E "a|gh pr create|b"` stays one `grep` call rather than yielding
|
|
131
|
+
// a `gh pr create` segment from inside its pattern (joshuafolkken/kit#4091). Shared with the
|
|
132
|
+
// `direct-issue-comment` row, which judges a `gh` call by the same cut.
|
|
133
|
+
function has_run_segment(command: string, is_match: (segment: string) => boolean): boolean {
|
|
134
|
+
return shell_segments
|
|
135
|
+
.quote_aware_commands_of(command)
|
|
136
|
+
.flatMap((segment) => judged_segments(segment))
|
|
137
|
+
.some((segment) => is_match(segment))
|
|
138
|
+
}
|
|
139
|
+
|
|
91
140
|
function is_direct_pr_create(command: string): boolean {
|
|
92
|
-
return
|
|
141
|
+
return has_run_segment(command, is_pr_create_segment)
|
|
93
142
|
}
|
|
94
143
|
|
|
95
144
|
const DIRECT_PR_CREATE_REASON =
|
|
@@ -103,8 +152,25 @@ const ROW = {
|
|
|
103
152
|
is_trigger: bash_triggers.on_bash_command(is_direct_pr_create),
|
|
104
153
|
reason: DIRECT_PR_CREATE_REASON,
|
|
105
154
|
decide: (): boolean => true,
|
|
155
|
+
about: {
|
|
156
|
+
title: 'Direct PR creation',
|
|
157
|
+
topic: '`CLAUDE.md` → Git Rules',
|
|
158
|
+
fires:
|
|
159
|
+
'`gh pr create`, or a `gh api` write to `repos/<o>/<r>/pulls`; it points at `pnpm josh pr`. Every occurrence',
|
|
160
|
+
quiet: '`pnpm josh pr`, or reading a PR — the path that writes `closes #N`',
|
|
161
|
+
},
|
|
106
162
|
}
|
|
107
163
|
|
|
108
|
-
const direct_pr_create = {
|
|
164
|
+
const direct_pr_create = {
|
|
165
|
+
API_VALUE_TAKING_FLAGS,
|
|
166
|
+
DIRECT_PR_CREATE_REASON,
|
|
167
|
+
GH_COMMAND,
|
|
168
|
+
ROW,
|
|
169
|
+
VALUE_TAKING_FLAGS,
|
|
170
|
+
has_run_segment,
|
|
171
|
+
is_direct_pr_create,
|
|
172
|
+
is_help_call,
|
|
173
|
+
positional_words,
|
|
174
|
+
}
|
|
109
175
|
|
|
110
176
|
export { direct_pr_create }
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { hook_decision, type GuardRun } from '#scripts/josh/hook-decision'
|
|
2
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
2
3
|
import { run_progress } from '#scripts/run/progress/run-progress'
|
|
3
4
|
import { run_progress_clock } from '#scripts/run/progress/run-progress-clock'
|
|
4
5
|
import { run_progress_config } from '#scripts/run/progress/run-progress-config'
|
|
@@ -105,7 +106,7 @@ function wait_duration_ms(command: string): number {
|
|
|
105
106
|
NO_SECONDS,
|
|
106
107
|
)
|
|
107
108
|
|
|
108
|
-
return seconds *
|
|
109
|
+
return seconds * MS_PER_SECOND
|
|
109
110
|
}
|
|
110
111
|
|
|
111
112
|
function is_armed(target: string, now_ms: number): boolean {
|
|
@@ -184,6 +184,13 @@ const ROW = {
|
|
|
184
184
|
is_trigger: bash_triggers.on_bash_command((command: string) => carries_a_file_body(command)),
|
|
185
185
|
reason: FILE_BODY_REASON,
|
|
186
186
|
decide: (): boolean => true,
|
|
187
|
+
about: {
|
|
188
|
+
title: 'No file body on the shell',
|
|
189
|
+
topic: '`file-edits.md`',
|
|
190
|
+
fires:
|
|
191
|
+
'a heredoc write to an existing file, a writing `node -e` / interpreter heredoc, or `perl -0pi -e`. Every occurrence',
|
|
192
|
+
quiet: 'a new file, a read-only heredoc, or a short `sed -i`',
|
|
193
|
+
},
|
|
187
194
|
}
|
|
188
195
|
|
|
189
196
|
const file_body = {
|
|
@@ -117,12 +117,20 @@ const ROW = {
|
|
|
117
117
|
is_trigger: bash_triggers.on_bash_command(bash_triggers.is_issue_filing),
|
|
118
118
|
reason: FILING_CAP_REASON,
|
|
119
119
|
decide,
|
|
120
|
+
about: {
|
|
121
|
+
title: 'The 10-Issue filing cap per run',
|
|
122
|
+
topic: '`.claude/skills/workflow-commands/prerequisite.md`, `observation-filing.md`',
|
|
123
|
+
fires:
|
|
124
|
+
'the 11th `pnpm josh issue:file` in a run that already has 10 filings not refused; failed calls do not count. Every occurrence',
|
|
125
|
+
quiet: 'fewer than 10 filings not refused',
|
|
126
|
+
},
|
|
120
127
|
}
|
|
121
128
|
|
|
122
129
|
const filing_cap = {
|
|
123
130
|
FILING_CAP,
|
|
124
131
|
FILING_CAP_REASON,
|
|
125
132
|
ROW,
|
|
133
|
+
current_turn,
|
|
126
134
|
is_prompt_line,
|
|
127
135
|
prior_filing_count,
|
|
128
136
|
turn_filing_count,
|
|
@@ -9,15 +9,18 @@
|
|
|
9
9
|
// time is the whole point of the check.
|
|
10
10
|
|
|
11
11
|
// **The hook-deliverable set — the single source is the list `pnpm josh rule:list` renders.** The
|
|
12
|
-
// `PreToolUse` guard is wired to `Bash|Edit|Read|Write` (`scripts/hooks/pretool-guard.ts`),
|
|
13
|
-
// lane-child interactive-ask row triggers on `AskUserQuestion
|
|
14
|
-
// be delivered at the moment it binds; anything
|
|
12
|
+
// `PreToolUse` guard is wired to `Bash|Edit|Read|Write` (`scripts/hooks/pretool-guard.ts`), the
|
|
13
|
+
// lane-child interactive-ask row triggers on `AskUserQuestion`, and the `agent-model` row on
|
|
14
|
+
// `Agent|Task`. A firing point naming one of these can be delivered at the moment it binds; anything
|
|
15
|
+
// else cannot.
|
|
15
16
|
const HOOK_DELIVERABLE_TOOLS: ReadonlyArray<string> = [
|
|
16
17
|
'Bash',
|
|
17
18
|
'Edit',
|
|
18
19
|
'Read',
|
|
19
20
|
'Write',
|
|
20
21
|
'AskUserQuestion',
|
|
22
|
+
'Agent',
|
|
23
|
+
'Task',
|
|
21
24
|
]
|
|
22
25
|
|
|
23
26
|
// **Known Claude Code tool calls that a hook cannot deliver a rule on.** They are real tools, so a
|
|
@@ -31,8 +34,6 @@ const KNOWN_UNDELIVERABLE_TOOLS: ReadonlyArray<string> = [
|
|
|
31
34
|
'WebFetch',
|
|
32
35
|
'WebSearch',
|
|
33
36
|
'TodoWrite',
|
|
34
|
-
'Task',
|
|
35
|
-
'Agent',
|
|
36
37
|
'NotebookEdit',
|
|
37
38
|
]
|
|
38
39
|
|
|
@@ -13,8 +13,9 @@
|
|
|
13
13
|
|
|
14
14
|
// The wrapper words that may stand in front of `git`, the same ones `run-tail-rule.ts` skips in front of
|
|
15
15
|
// `josh`: environment assignments, the package-manager launchers, `sudo`, `env`, and an opening
|
|
16
|
-
// subshell parenthesis. Left in, `sudo git push --force`,
|
|
17
|
-
// silently not a git command
|
|
16
|
+
// subshell parenthesis — plus `time` with its flags, read here only. Left in, `sudo git push --force`,
|
|
17
|
+
// `env git commit` and `(git push -f)` are silently not a git command, and
|
|
18
|
+
// `/usr/bin/time -p pnpm exec eslint .` is not an `eslint` run (joshuafolkken/kit#4356).
|
|
18
19
|
const ENV_ASSIGNMENT = /^[A-Za-z_]\w*=/u
|
|
19
20
|
const WRAPPER_WORDS: ReadonlySet<string> = new Set([
|
|
20
21
|
'pnpm',
|
|
@@ -24,7 +25,13 @@ const WRAPPER_WORDS: ReadonlySet<string> = new Set([
|
|
|
24
25
|
'sudo',
|
|
25
26
|
'command',
|
|
26
27
|
'env',
|
|
28
|
+
'time',
|
|
27
29
|
])
|
|
30
|
+
// The wrappers whose own flags stand between them and the program (`time -p`), skipped with them.
|
|
31
|
+
const FLAGGED_WRAPPERS: ReadonlySet<string> = new Set(['time'])
|
|
32
|
+
// Their flags that consume a separate following value (`time -o <file>`, `time -f <format>`), so the
|
|
33
|
+
// value is not read as the program.
|
|
34
|
+
const WRAPPER_VALUE_FLAGS: ReadonlySet<string> = new Set(['-o', '-f', '--output', '--format'])
|
|
28
35
|
const SUBSHELL_OPEN = '('
|
|
29
36
|
|
|
30
37
|
// The git global options that consume a **separate** following token as their value, so the parser
|
|
@@ -50,18 +57,50 @@ interface GitCall {
|
|
|
50
57
|
args: ReadonlyArray<string>
|
|
51
58
|
}
|
|
52
59
|
|
|
53
|
-
// Split on whitespace
|
|
54
|
-
//
|
|
55
|
-
//
|
|
56
|
-
//
|
|
57
|
-
const
|
|
60
|
+
// Split on whitespace outside quotes, keeping each quote in its word. A quoted span is one word, so
|
|
61
|
+
// `c='x; gh pr create'` is one environment assignment rather than an assignment followed by a `gh`
|
|
62
|
+
// call (joshuafolkken/kit#4091); a backslash-escaped character outside quotes opens no span, and a
|
|
63
|
+
// quote left unclosed is read as a plain character.
|
|
64
|
+
const WORD = /(?:\\.|'[^']*'|"(?:\\.|[^"\\])*"|\S)+/gsu
|
|
58
65
|
|
|
59
66
|
function words_of(segment: string): Array<string> {
|
|
60
|
-
return segment.
|
|
67
|
+
return segment.match(WORD) ?? []
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const PATH_SEPARATOR = '/'
|
|
71
|
+
|
|
72
|
+
// The program a word launches, read off the path's last component, so `/usr/bin/git` is `git`.
|
|
73
|
+
function program_name(word: string): string {
|
|
74
|
+
return word.slice(word.lastIndexOf(PATH_SEPARATOR) + NEXT)
|
|
61
75
|
}
|
|
62
76
|
|
|
63
77
|
function is_wrapper_token(word: string): boolean {
|
|
64
|
-
return
|
|
78
|
+
return (
|
|
79
|
+
word === SUBSHELL_OPEN || ENV_ASSIGNMENT.test(word) || WRAPPER_WORDS.has(program_name(word))
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// The words a flagged wrapper's flag spans, its value included; 0 when the word is not a flag.
|
|
84
|
+
function wrapper_flag_width(word = ''): number {
|
|
85
|
+
if (!word.startsWith(FLAG_PREFIX)) return 0
|
|
86
|
+
|
|
87
|
+
return WRAPPER_VALUE_FLAGS.has(word) ? AFTER_VALUE : NEXT
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// The index after the wrapper word at `index`, past its own flags when it is a flagged wrapper.
|
|
91
|
+
function after_wrapper_word(words: ReadonlyArray<string>, index: number): number {
|
|
92
|
+
let next = index + NEXT
|
|
93
|
+
|
|
94
|
+
if (!FLAGGED_WRAPPERS.has(program_name(words[index] ?? ''))) return next
|
|
95
|
+
|
|
96
|
+
let width = wrapper_flag_width(words[next])
|
|
97
|
+
|
|
98
|
+
while (width > 0) {
|
|
99
|
+
next += width
|
|
100
|
+
width = wrapper_flag_width(words[next])
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return next
|
|
65
104
|
}
|
|
66
105
|
|
|
67
106
|
// Skip the wrapper: environment assignments, a launcher word, and a leading subshell parenthesis. The
|
|
@@ -69,7 +108,9 @@ function is_wrapper_token(word: string): boolean {
|
|
|
69
108
|
function after_wrapper(words: ReadonlyArray<string>): number {
|
|
70
109
|
let index = 0
|
|
71
110
|
|
|
72
|
-
while (index < words.length && is_wrapper_token(words[index] ?? ''))
|
|
111
|
+
while (index < words.length && is_wrapper_token(words[index] ?? '')) {
|
|
112
|
+
index = after_wrapper_word(words, index)
|
|
113
|
+
}
|
|
73
114
|
|
|
74
115
|
return index
|
|
75
116
|
}
|
|
@@ -94,14 +135,30 @@ function after_globals(words: ReadonlyArray<string>, start: number): number {
|
|
|
94
135
|
return index
|
|
95
136
|
}
|
|
96
137
|
|
|
138
|
+
interface ProgramCall {
|
|
139
|
+
name: string
|
|
140
|
+
args: Array<string>
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// The program the segment launches once the wrapper is skipped, with the words after it, or
|
|
144
|
+
// `undefined` for a segment with no program word.
|
|
145
|
+
function program_of(segment: string): ProgramCall | undefined {
|
|
146
|
+
const words = words_of(segment)
|
|
147
|
+
const command_index = after_wrapper(words)
|
|
148
|
+
const word = words[command_index]
|
|
149
|
+
|
|
150
|
+
if (word === undefined) return undefined
|
|
151
|
+
|
|
152
|
+
return { name: program_name(word), args: words.slice(command_index + NEXT) }
|
|
153
|
+
}
|
|
154
|
+
|
|
97
155
|
// The words after `command` once the wrapper is skipped, or `undefined` when the segment does not
|
|
98
156
|
// invoke it. `gh` and `rm` are judged by the same wrapper cut as `git`, so
|
|
99
157
|
// `env gh pr close` and `sudo rm -rf` are read as the calls they are.
|
|
100
158
|
function arguments_of(segment: string, command: string): Array<string> | undefined {
|
|
101
|
-
const
|
|
102
|
-
const command_index = after_wrapper(words)
|
|
159
|
+
const call = program_of(segment)
|
|
103
160
|
|
|
104
|
-
return
|
|
161
|
+
return call?.name === command ? call.args : undefined
|
|
105
162
|
}
|
|
106
163
|
|
|
107
164
|
// The subcommand and the arguments after it, or `undefined` when the segment is not a git invocation.
|
|
@@ -135,6 +192,7 @@ function short_cluster_has(token: string, letters: string): boolean {
|
|
|
135
192
|
return false
|
|
136
193
|
}
|
|
137
194
|
|
|
138
|
-
const git_argv = { arguments_of, parse, short_cluster_has }
|
|
195
|
+
const git_argv = { arguments_of, parse, program_of, short_cluster_has }
|
|
139
196
|
|
|
140
197
|
export { git_argv }
|
|
198
|
+
export type { ProgramCall }
|
|
@@ -24,6 +24,9 @@ import { shell_segments } from './shell-segments'
|
|
|
24
24
|
// deletes (`:branch`). Both open the refspec with a character the deny list cannot match as a literal.
|
|
25
25
|
const FORCE_LONG_PREFIX = '--force'
|
|
26
26
|
const DELETE_LONG = '--delete'
|
|
27
|
+
// `--mirror` force-updates every remote ref to the local set and deletes the rest; `--prune` deletes
|
|
28
|
+
// every remote branch with no local counterpart. Both are a delete with no refspec to read.
|
|
29
|
+
const DESTRUCTIVE_PUSH_LONG: ReadonlySet<string> = new Set([DELETE_LONG, '--mirror', '--prune'])
|
|
27
30
|
const PUSH_SHORT_LETTERS = 'fd'
|
|
28
31
|
const FORCE_OR_DELETE_REFSPEC = /^[+:]/u
|
|
29
32
|
|
|
@@ -31,7 +34,7 @@ function is_force_or_delete_push(args: ReadonlyArray<string>): boolean {
|
|
|
31
34
|
return args.some(
|
|
32
35
|
(argument) =>
|
|
33
36
|
argument.startsWith(FORCE_LONG_PREFIX) ||
|
|
34
|
-
argument
|
|
37
|
+
DESTRUCTIVE_PUSH_LONG.has(argument) ||
|
|
35
38
|
git_argv.short_cluster_has(argument, PUSH_SHORT_LETTERS) ||
|
|
36
39
|
FORCE_OR_DELETE_REFSPEC.test(argument),
|
|
37
40
|
)
|
|
@@ -66,7 +69,7 @@ function is_destructive_segment(segment: string): boolean {
|
|
|
66
69
|
// quoted inside another command's argument is read as the write it is not, exactly as every other
|
|
67
70
|
// trigger in this directory reads its own.
|
|
68
71
|
function is_force_or_delete(command: string): boolean {
|
|
69
|
-
return shell_segments.
|
|
72
|
+
return shell_segments.commands_of(command).some((segment) => is_destructive_segment(segment))
|
|
70
73
|
}
|
|
71
74
|
|
|
72
75
|
// The instruction in the shape a refusal can carry: what the command does and the one route left. The
|
|
@@ -87,6 +90,13 @@ const ROW = {
|
|
|
87
90
|
is_trigger: bash_triggers.on_bash_command(is_force_or_delete),
|
|
88
91
|
reason: GIT_FORCE_REASON,
|
|
89
92
|
decide: (): boolean => true,
|
|
93
|
+
about: {
|
|
94
|
+
title: 'Force push / branch delete',
|
|
95
|
+
topic: '`operating-rules.md`',
|
|
96
|
+
fires:
|
|
97
|
+
'a `git push` / `git branch` read as force (`--force` / `-f` / `-uf` …) or delete (`--delete` / `-d` / `-D` / `:branch`) in any spelling. Every occurrence',
|
|
98
|
+
quiet: 'a plain `git push` / `git branch`',
|
|
99
|
+
},
|
|
90
100
|
}
|
|
91
101
|
|
|
92
102
|
const git_force = {
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// Every `PreToolUse` and `Stop` guard, classed by what its refusal asks for (joshuafolkken/kit#3920),
|
|
2
|
+
// with the reason it cannot run itself instead.
|
|
3
|
+
//
|
|
4
|
+
// **A refusal whose right form follows from the call alone is a wasted round trip.** The model reissues
|
|
5
|
+
// the call the refusal already described, at the run's whole context. Where that form is mechanical
|
|
6
|
+
// and stays the same tool, the hook runs it instead (`rule-rewrite.ts`) and says what it changed. Every
|
|
7
|
+
// other refusal asks for something the call does not carry: another tool, another command and its
|
|
8
|
+
// arguments, or a decision.
|
|
9
|
+
//
|
|
10
|
+
// `rewrite` means the row rewrites where it can and refuses where it cannot; `judgment` means it always
|
|
11
|
+
// refuses. **`why` is required**: a guard is the third rung of `principles.md` → "automate-first", so
|
|
12
|
+
// each row says why a command or the hook running the step cannot replace it. `guard-remedy.test.ts`
|
|
13
|
+
// pins that every guard is classed with a non-empty `why` and that each `rewrite` row has one.
|
|
14
|
+
|
|
15
|
+
type Remedy = 'rewrite' | 'judgment'
|
|
16
|
+
|
|
17
|
+
interface GuardRemedy {
|
|
18
|
+
remedy: Remedy
|
|
19
|
+
// Why the hook cannot make the step itself — printed by `rule:list` as `not automated`.
|
|
20
|
+
why: string
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const REWRITTEN =
|
|
24
|
+
'the hook makes the same call right itself; it refuses only a spelling it cannot rewrite'
|
|
25
|
+
const ANOTHER_TOOL = 'the right form is another tool, which `updatedInput` cannot switch to'
|
|
26
|
+
const ANOTHER_COMMAND = 'the right act is another command, whose arguments the call does not carry'
|
|
27
|
+
const NO_RUN = "the call must not run at all, or only on a person's word — refusing is the remedy"
|
|
28
|
+
// The `Stop` rows that already run their step: each blocks only on the case the hook cannot finish.
|
|
29
|
+
const STOP_NOTIFY = 'the hook sends the notify itself; it blocks only when the send fails'
|
|
30
|
+
const HOLD_RELEASE = 'the hook releases the hold itself; it blocks only when that release fails'
|
|
31
|
+
const ISSUE_CITATION =
|
|
32
|
+
'the hook prints the citation lines itself; it blocks only on a number it cannot cite'
|
|
33
|
+
const FILING_OFFER = 'the filing needs a title and a body only the model can write'
|
|
34
|
+
|
|
35
|
+
function rewrite(): GuardRemedy {
|
|
36
|
+
return { remedy: 'rewrite', why: REWRITTEN }
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function judgment(why: string): GuardRemedy {
|
|
40
|
+
return { remedy: 'judgment', why }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const GUARD_REMEDIES: Readonly<Record<string, GuardRemedy>> = {
|
|
44
|
+
// The rewrites: each fix is the same call made right.
|
|
45
|
+
'piped-verification': rewrite(), // wrapped in `(set -o pipefail; …)`
|
|
46
|
+
'issue-comments': rewrite(), // the same Issue's comments read on the same line
|
|
47
|
+
'lane-background': rewrite(), // a lane child's `ship` run in the foreground (`pretool-guard.ts`)
|
|
48
|
+
'file-body': judgment(ANOTHER_TOOL), // Edit or Write
|
|
49
|
+
'shell-body': judgment(
|
|
50
|
+
"which part of the body the shell was meant to expand is the author's, not the hook's",
|
|
51
|
+
),
|
|
52
|
+
'raw-field-body': judgment('the body moves to a file the call does not name'),
|
|
53
|
+
'rule-body': judgment('a trigger-plus-pointer line is written, not derived'),
|
|
54
|
+
'direct-filing': judgment(ANOTHER_COMMAND),
|
|
55
|
+
'direct-issue-comment': judgment(ANOTHER_COMMAND),
|
|
56
|
+
'direct-pr-create': judgment(ANOTHER_COMMAND),
|
|
57
|
+
'pr-merge': judgment(ANOTHER_COMMAND),
|
|
58
|
+
'josh-git-bare': judgment(ANOTHER_COMMAND),
|
|
59
|
+
'run-tail': judgment(ANOTHER_COMMAND),
|
|
60
|
+
'pre-gate-cut': judgment(ANOTHER_COMMAND),
|
|
61
|
+
'implementation-cut': judgment(ANOTHER_COMMAND),
|
|
62
|
+
'early-heartbeat': judgment(ANOTHER_COMMAND),
|
|
63
|
+
'poll-loop': judgment(ANOTHER_COMMAND),
|
|
64
|
+
'lane-park': judgment(ANOTHER_COMMAND),
|
|
65
|
+
'lane-split-park': judgment(ANOTHER_COMMAND),
|
|
66
|
+
'lane-interactive-ask': judgment(ANOTHER_COMMAND),
|
|
67
|
+
'agent-model': judgment("which model fits the unit is the author's call"),
|
|
68
|
+
'lane-carry-conflict': judgment(ANOTHER_COMMAND),
|
|
69
|
+
'lane-switch-main': judgment(ANOTHER_COMMAND),
|
|
70
|
+
'lane-direct-tool': judgment(ANOTHER_COMMAND),
|
|
71
|
+
'timed-rerun': judgment(ANOTHER_COMMAND),
|
|
72
|
+
'oracle-consulted': judgment(ANOTHER_COMMAND),
|
|
73
|
+
'test-declared': judgment(ANOTHER_COMMAND),
|
|
74
|
+
batching: judgment(ANOTHER_COMMAND),
|
|
75
|
+
investigation: judgment(ANOTHER_COMMAND),
|
|
76
|
+
'duplicate-read': judgment(ANOTHER_COMMAND),
|
|
77
|
+
'run-watcher': judgment(ANOTHER_COMMAND),
|
|
78
|
+
'parent-cut': judgment(ANOTHER_COMMAND),
|
|
79
|
+
'issue-watch': judgment(ANOTHER_COMMAND),
|
|
80
|
+
'third-party-write': judgment(NO_RUN),
|
|
81
|
+
'filing-cap': judgment(NO_RUN),
|
|
82
|
+
'git-force': judgment(NO_RUN),
|
|
83
|
+
'worktree-mutation': judgment(NO_RUN),
|
|
84
|
+
'index-mutation': judgment(NO_RUN),
|
|
85
|
+
'destructive-command': judgment(NO_RUN),
|
|
86
|
+
'protected-file': judgment(NO_RUN),
|
|
87
|
+
// The `Stop` rows: the hook judges a finished reply, so it has no call to rewrite.
|
|
88
|
+
'stop-notify': judgment(STOP_NOTIFY),
|
|
89
|
+
'issue-citation': judgment(ISSUE_CITATION),
|
|
90
|
+
'filing-offer': judgment(FILING_OFFER),
|
|
91
|
+
'hold-release': judgment(HOLD_RELEASE),
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// A row family shares one class: `oracle-consulted:pkg:scout` is an `oracle-consulted` row.
|
|
95
|
+
const FAMILY_SEPARATOR = ':'
|
|
96
|
+
|
|
97
|
+
function entry_of(id: string): GuardRemedy | undefined {
|
|
98
|
+
return GUARD_REMEDIES[id] ?? GUARD_REMEDIES[id.split(FAMILY_SEPARATOR)[0] ?? '']
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function remedy_of(id: string): Remedy | undefined {
|
|
102
|
+
return entry_of(id)?.remedy
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function why_of(id: string): string | undefined {
|
|
106
|
+
return entry_of(id)?.why
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function is_rewrite(id: string): boolean {
|
|
110
|
+
return remedy_of(id) === 'rewrite'
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const guard_remedy = {
|
|
114
|
+
GUARD_REMEDIES,
|
|
115
|
+
is_rewrite,
|
|
116
|
+
remedy_of,
|
|
117
|
+
why_of,
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export type { GuardRemedy, Remedy }
|
|
121
|
+
export { guard_remedy }
|
|
@@ -11,7 +11,7 @@ import { z } from 'zod'
|
|
|
11
11
|
// threshold crossing rather than once per run, that read can no longer be paid on every edit, so the
|
|
12
12
|
// verdict is cached beside the instant it was read and a burst of edits shares one read.
|
|
13
13
|
//
|
|
14
|
-
// **An in-memory memo cannot span two edits.** `pnpm josh
|
|
14
|
+
// **An in-memory memo cannot span two edits.** `pnpm josh pretool:guard` runs as a fresh process on each
|
|
15
15
|
// `PreToolUse`, so the cache is a per-checkout stamp rather than a module variable — the same handoff
|
|
16
16
|
// shape the refusal stamp itself uses.
|
|
17
17
|
//
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { agent_session_role } from '#scripts/agent/agent-session-role'
|
|
2
2
|
import { CONTEXT_CUT_THRESHOLD } from '#scripts/cost-runtime/context-cut-threshold'
|
|
3
3
|
import { cost_cli, type CostVerdict } from '#scripts/cost-runtime/cost-cli'
|
|
4
|
-
import { cost_format } from '#scripts/cost-runtime/cost-format'
|
|
5
4
|
import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
|
|
6
5
|
import type { GuardRun } from '#scripts/josh/hook-decision'
|
|
7
6
|
import { lane_child_marker, type MarkerSource } from '#scripts/lane/lane-child-marker'
|
|
8
7
|
import { lane_paths } from '#scripts/lane/lane-paths'
|
|
8
|
+
import { figure_format } from '#scripts/lib/figure-format'
|
|
9
9
|
import { run_cut, type RunCut } from '#scripts/run/cut/run-cut'
|
|
10
10
|
import { run_cut_decline } from '#scripts/run/cut/run-cut-decline'
|
|
11
11
|
import { run_cut_handoff } from '#scripts/run/cut/run-cut-handoff'
|
|
@@ -170,8 +170,8 @@ function is_over_threshold_edit(
|
|
|
170
170
|
|
|
171
171
|
// **The threshold in the refusal text is assembled from the constant, never spelled**.
|
|
172
172
|
// A spelled literal is left behind when the shared threshold moves, telling agents the wrong number;
|
|
173
|
-
// building it from `CONTEXT_CUT_THRESHOLD` keeps the two from drifting. `
|
|
174
|
-
const THRESHOLD_TEXT = `${
|
|
173
|
+
// building it from `CONTEXT_CUT_THRESHOLD` keeps the two from drifting. `figure_format.format_tokens` renders it the way every cost report does.
|
|
174
|
+
const THRESHOLD_TEXT = `${figure_format.format_tokens(CONTEXT_CUT_THRESHOLD)}-token`
|
|
175
175
|
|
|
176
176
|
// The instruction in the shape a refusal can carry: the handoff in the format the parser reads, the
|
|
177
177
|
// cut, and the one verdict that ends the turn — `cut` is the only one, so a run told merely to "take
|
|
@@ -224,6 +224,14 @@ const ROW = {
|
|
|
224
224
|
'⛔ implementation-phase cut: this checkout is a lane dispatched',
|
|
225
225
|
"⛔ implementation-phase cut: this run's context crossed the",
|
|
226
226
|
],
|
|
227
|
+
about: {
|
|
228
|
+
title: 'The implementation-phase cut',
|
|
229
|
+
topic:
|
|
230
|
+
'`.claude/skills/workflow-commands/pre-gate-cut.md` → "It is a guard, fired at the edit that crosses the threshold"',
|
|
231
|
+
fires:
|
|
232
|
+
'an `Edit` / `Write` by an uncut lane child whose recent context is over the `pnpm josh cost --cut` threshold; it hands over `pnpm josh run:cut --impl <N> --handoff <path>`. At each threshold crossing',
|
|
233
|
+
quiet: 'not a lane child, a non-editing tool, already cut, or under the threshold',
|
|
234
|
+
},
|
|
227
235
|
}
|
|
228
236
|
|
|
229
237
|
const implementation_cut = {
|