@joshuafolkken/kit 1.1784.0 → 1.2114.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/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/workflow-commands/SKILL.md +6 -6
- package/.claude/skills/workflow-commands/background-commands.md +8 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +3 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-park.md +5 -2
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -3
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +41 -32
- package/.claude/skills/workflow-commands/delegation.md +6 -6
- package/.claude/skills/workflow-commands/entry-sequence.md +2 -2
- package/.claude/skills/workflow-commands/followup.md +7 -5
- package/.claude/skills/workflow-commands/fullrun-steps.md +6 -6
- package/.claude/skills/workflow-commands/fullrun.md +1 -1
- package/.claude/skills/workflow-commands/issue-comments.md +9 -4
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/kickoff.md +2 -2
- package/.claude/skills/workflow-commands/observation-filing.md +1 -1
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -7
- package/.claude/skills/workflow-commands/prerequisite.md +3 -2
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +7 -5
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-pnpm/action.yml +9 -16
- package/.github/dependabot.yml +16 -0
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +155 -15
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +59 -45
- package/.vscode/settings.json +19 -0
- package/CLAUDE.md +5 -12
- package/SECURITY.md +2 -2
- package/dist/CLAUDE.md +5 -12
- package/dist/commands/document-read-cli.js +2 -1
- package/dist/commands/document-section-main.js +2 -1
- package/dist/commands/read-set-cli.js +194 -134
- package/dist/commands/run-prep-main.js +9694 -10173
- package/dist/commands/run-step-cli.js +22138 -18285
- package/dist/hooks/audit-provision.js +23 -5
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/{chunk-CWMBGKYW.js → chunk-5PM2JRGV.js} +2153 -856
- package/dist/hooks/{chunk-WR2KQAYZ.js → chunk-7SIUNQXK.js} +1207 -1470
- package/dist/hooks/{chunk-O2YBIDSI.js → chunk-CQD4LJE6.js} +1682 -1130
- package/dist/hooks/{chunk-VWWCFGWK.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/{chunk-XGBNSWEI.js → chunk-UJ3FPMMM.js} +132 -49
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +8 -8
- package/dist/hooks/format-edited.js +4 -5
- package/dist/hooks/inputs.json +415 -389
- package/dist/hooks/pretool-guard.js +7 -6
- package/dist/hooks/session-lang.js +101 -258
- package/dist/hooks/stop-guard.js +1744 -2576
- package/dist/josh.js +7133 -6368
- package/dist/version/index.js +161 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/package.json +15 -8
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +14 -11
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +40 -21
- package/prompts/collaboration-workflow/lane-instructions.md +3 -1
- package/prompts/collaboration-workflow/measurement.md +8 -1
- package/prompts/collaboration-workflow/operating-rules.md +11 -2
- package/prompts/collaboration-workflow/output-bounds.md +6 -2
- package/prompts/collaboration-workflow/plan-comment.md +1 -1
- package/prompts/collaboration-workflow/principles.md +9 -0
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
- package/prompts/collaboration-workflow/wip-cap.md +3 -1
- package/prompts/review-rubric.md +8 -0
- package/prompts/review.md +31 -22
- package/prompts/testing-guide.md +1 -0
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +20 -9
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-cli.ts +6 -1
- package/scripts/backlog/backlog-drive-hold.ts +3 -3
- package/scripts/backlog/backlog-drive-idle.ts +10 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -30
- package/scripts/backlog/backlog-drive-named.ts +28 -7
- package/scripts/backlog/backlog-drive-paused.ts +5 -4
- package/scripts/backlog/backlog-drive-restore.ts +11 -3
- package/scripts/backlog/backlog-drive.ts +21 -60
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next.ts +39 -49
- package/scripts/backlog/backlog-occupied.ts +2 -2
- package/scripts/backlog/backlog-overlap.ts +42 -8
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +19 -6
- package/scripts/backlog/backlog-pool.ts +50 -12
- package/scripts/backlog/backlog-rank.ts +60 -13
- package/scripts/backlog/backlog-stalled-detect.ts +2 -1
- package/scripts/backlog/backlog-waves.ts +17 -2
- package/scripts/backlog/backlogrun-launch.ts +7 -4
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-cli.ts +37 -16
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +2 -2
- package/scripts/delegation/duplicate-read-guard.ts +1 -0
- package/scripts/delegation/investigation-guard.ts +14 -2
- package/scripts/delegation/investigation-reads.ts +45 -23
- package/scripts/dependabot/dependabot-cooldown.ts +3 -2
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +17 -7
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-cli-argv.ts +2 -2
- package/scripts/epic/epic-fetch.ts +4 -2
- package/scripts/epic/epic-graph.ts +7 -2
- package/scripts/epic/epic-issue.ts +3 -1
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +13 -10
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +41 -11
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
- package/scripts/followup/git-pr-followup.ts +62 -27
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +2 -2
- package/scripts/gate/busy-average.ts +34 -2
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/command-memory.ts +1 -1
- package/scripts/gate/core-admission.ts +24 -6
- package/scripts/gate/core-budget-timing.ts +20 -6
- package/scripts/gate/core-budget.ts +40 -11
- package/scripts/gate/core-wait-record.ts +3 -2
- package/scripts/gate/core-wait.ts +25 -2
- package/scripts/gate/core-weights.ts +15 -7
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +14 -6
- package/scripts/gate/gate-plan.ts +103 -58
- package/scripts/gate/gate-report.ts +9 -7
- package/scripts/gate/gate-run-steps.ts +26 -3
- package/scripts/gate/gate-skip.ts +45 -6
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +2 -1
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/scoped-green.ts +68 -15
- package/scripts/gate/since-green.ts +14 -6
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/verification-gate.ts +51 -16
- package/scripts/gate/verification-inputs.ts +21 -6
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +23 -2
- package/scripts/gh/git-ai-review-scan.ts +1 -1
- package/scripts/gh/git-gh-api-path.ts +12 -3
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +4 -2
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +8 -2
- package/scripts/gh/git-gh-issue.ts +12 -5
- package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +3 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +21 -7
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +3 -0
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/git/base-tree.ts +30 -0
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +16 -1
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +66 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-schemas.ts +13 -0
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +53 -5
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +11 -2
- package/scripts/git/stash/stash-push-cli.ts +10 -0
- package/scripts/hooks/batch-guard.ts +40 -21
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +22 -2
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +14 -1
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +76 -10
- package/scripts/hooks/pretool-guard.ts +2 -0
- package/scripts/hooks/reserved-run.ts +14 -1
- package/scripts/hooks/run-hook.sh +23 -8
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +3 -15
- package/scripts/hooks/stop-guard.ts +7 -6
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +5 -1
- package/scripts/init/hook-launch.ts +4 -2
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-line.ts +19 -1
- package/scripts/issue/defect-rate-cli.ts +5 -102
- package/scripts/issue/defect-report.ts +4 -4
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +64 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-body-or-comment.ts +38 -4
- package/scripts/issue/issue-cite-cli.ts +1 -3
- package/scripts/issue/issue-classification.ts +1 -0
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-evidence-exit.ts +4 -2
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +111 -38
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +43 -6
- package/scripts/issue/issue-labels.ts +19 -2
- package/scripts/issue/issue-lint-cli.ts +27 -2
- package/scripts/issue/issue-measured-cli.ts +13 -35
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-not-before-label.ts +2 -2
- package/scripts/issue/issue-not-before.ts +4 -1
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +174 -43
- package/scripts/issue/issue-rank.ts +21 -4
- package/scripts/issue/issue-read-cli.ts +32 -6
- package/scripts/issue/issue-read.ts +37 -12
- package/scripts/issue/issue-sample-gate.ts +95 -74
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +12 -11
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +31 -1
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -12
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -70
- package/scripts/issue/plan-consumers-section.ts +22 -1
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/command-usage.ts +3 -2
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -82
- package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
- package/scripts/josh/josh-commands-ai.ts +5 -5
- package/scripts/josh/josh-commands-development.ts +59 -58
- package/scripts/josh/josh-commands-issue-write.ts +23 -4
- package/scripts/josh/josh-commands-issue.ts +32 -0
- package/scripts/josh/josh-commands-lane.ts +87 -4
- package/scripts/josh/josh-commands-lint.ts +16 -3
- package/scripts/josh/josh-commands-maintenance.ts +15 -0
- package/scripts/josh/josh-commands-review.ts +41 -6
- package/scripts/josh/josh-commands-ship.ts +56 -8
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-workflow.ts +1 -1
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +5 -3
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/stamp-file.ts +11 -2
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +5 -8
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-check-stats.ts +29 -8
- package/scripts/lane/lane-child-invocation.ts +9 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-close.ts +8 -3
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +2 -2
- package/scripts/lane/lane-gap-stats.ts +7 -6
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +119 -36
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +31 -177
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +176 -59
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +16 -7
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +4 -1
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-registry.ts +14 -1
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-sampler.ts +23 -4
- package/scripts/lane/lane-session-action.ts +93 -18
- package/scripts/lane/lane-session-broker.ts +49 -21
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-spent.ts +1 -1
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +13 -1
- package/scripts/lane/lane-state.ts +41 -9
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +21 -5
- package/scripts/lane/lane-stop-stats.ts +51 -19
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-transcript-calls.ts +67 -10
- package/scripts/lane/lane-transcript-stats.ts +44 -12
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +108 -31
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +45 -6
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/import-graph.ts +141 -11
- package/scripts/lint/lint-gate-scope.ts +2 -2
- package/scripts/lint/lint-parallel.ts +54 -6
- package/scripts/lint/lint-related.ts +154 -33
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/telegram-notify.ts +12 -3
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush.ts +32 -9
- package/scripts/overrides/overrides-check.ts +9 -1
- package/scripts/release/release-approval-prune.ts +7 -1
- package/scripts/repo/required-checks-logic.ts +4 -1
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +15 -1
- package/scripts/report/report-labels.ts +12 -1
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +26 -7
- package/scripts/report/report-lint.ts +2 -20
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +68 -19
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +14 -7
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +85 -22
- package/scripts/review/review-finding-ledger.ts +109 -7
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +11 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +4 -2
- package/scripts/review/review-record-cli.ts +177 -54
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +91 -29
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +24 -8
- package/scripts/review/review-stamps.ts +7 -3
- package/scripts/review/review-stop-log.ts +20 -6
- package/scripts/review/review-stops-cli.ts +2 -1
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/rules/agent-model.ts +1 -1
- package/scripts/rules/bash-triggers.ts +3 -3
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle.ts +1 -1
- package/scripts/rules/delivered-rules.ts +36 -17
- package/scripts/rules/destructive-command.ts +3 -11
- package/scripts/rules/direct-issue-comment.ts +34 -12
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +4 -24
- package/scripts/rules/early-heartbeat.ts +2 -0
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/guard-remedy.ts +14 -5
- package/scripts/rules/implementation-cut.ts +61 -28
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +9 -4
- package/scripts/rules/josh-git-bare.ts +1 -1
- package/scripts/rules/lane-background.ts +41 -13
- package/scripts/rules/lane-direct-tool.ts +107 -9
- package/scripts/rules/lane-interactive-ask.ts +4 -1
- package/scripts/rules/lane-park.ts +4 -2
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +1 -1
- package/scripts/rules/lane-switch-main.ts +4 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/permission-guards.ts +5 -1
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +67 -17
- package/scripts/rules/poll-loop.ts +72 -9
- package/scripts/rules/pr-merge.ts +5 -5
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +88 -24
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +5 -15
- package/scripts/rules/rule-value-cache.ts +53 -5
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +59 -11
- package/scripts/rules/rule-value.ts +17 -4
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +10 -2
- package/scripts/rules/stop-rule-rows.ts +1 -13
- package/scripts/rules/stop-rules.ts +33 -58
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +110 -23
- package/scripts/rules/timed-rerun.ts +1 -1
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +22 -7
- package/scripts/run/board/run-board-ending-reason.ts +6 -2
- package/scripts/run/board/run-board-fit.ts +24 -1
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-header.ts +8 -0
- package/scripts/run/board/run-board-labels.ts +11 -1
- package/scripts/run/board/run-board-lane-time.ts +1 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-notes.ts +7 -1
- package/scripts/run/board/run-board-operation.ts +4 -2
- package/scripts/run/board/run-board-phase.ts +2 -5
- package/scripts/run/board/run-board-plan.ts +1 -1
- package/scripts/run/board/run-board-read.ts +46 -1
- package/scripts/run/board/run-board-reason.ts +20 -8
- package/scripts/run/board/run-board-render-checks.ts +3 -2
- package/scripts/run/board/run-board-render-drawn.ts +11 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-lead.ts +9 -0
- package/scripts/run/board/run-board-render-legend.ts +19 -0
- package/scripts/run/board/run-board-render-tail.ts +1 -1
- package/scripts/run/board/run-board-render.ts +82 -18
- package/scripts/run/board/run-board-spin.ts +1 -3
- package/scripts/run/board/run-board-status.ts +2 -0
- package/scripts/run/board/run-board-tick.ts +39 -10
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +3 -2
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +52 -8
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-filed.ts +9 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +4 -0
- package/scripts/run/event/run-event-stream.ts +25 -3
- package/scripts/run/hold/run-stop-notify.ts +3 -8
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +66 -23
- package/scripts/run/merge/run-merge-outcome.ts +2 -0
- package/scripts/run/merge/run-merge-ship.ts +13 -3
- package/scripts/run/merge/run-merge-signals.ts +40 -23
- package/scripts/run/merge/run-merge-steps.ts +56 -36
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +41 -14
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +26 -6
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-prep.ts +1 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +5 -2
- package/scripts/run/ship/run-ship-args.ts +19 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +131 -39
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +10 -4
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +27 -26
- package/scripts/run/ship/run-ship-overlap.ts +8 -3
- package/scripts/run/ship/run-ship-place.ts +9 -2
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
- package/scripts/run/ship/run-ship-preflight.ts +16 -4
- package/scripts/run/ship/run-ship-probe.ts +23 -9
- package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-return.ts +103 -29
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +230 -59
- package/scripts/run/ship/run-ship-review.ts +171 -51
- package/scripts/run/ship/run-ship-reviewer.ts +138 -42
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +49 -13
- package/scripts/run/ship/run-ship-steps.ts +24 -4
- package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-sync.ts +171 -30
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +16 -2
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +6 -113
- package/scripts/run/wake/run-wake-code.ts +53 -11
- package/scripts/run/wake/run-wake-driver.ts +5 -3
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +5 -3
- package/scripts/run/wake/run-wake-ports.ts +11 -3
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake.ts +3 -2
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/project-config.ts +3 -2
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-provision-main.ts +9 -1
- package/scripts/security/security-audit-provision.ts +1 -1
- package/scripts/security/security-audit.ts +21 -1
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/split/split-assess.ts +12 -3
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +20 -2
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +208 -20
- package/scripts/test/test-pinned-main.ts +84 -18
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +258 -47
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +35 -11
- package/scripts/test/test-read-recording.ts +17 -5
- package/scripts/test/test-read-trace.ts +26 -8
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red.ts +34 -14
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +4 -1
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +43 -23
- package/scripts/test/test-related-scope.ts +99 -34
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +167 -83
- package/scripts/test/test-unit-guard.ts +28 -5
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-worker-share.ts +5 -4
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +12 -1
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +36 -5
- package/scripts/time-runtime/time-markers.ts +2 -2
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +17 -5
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/latest-corepack.ts +2 -0
- package/templates/gitignore +2 -0
- package/templates/workflows/ci.yml +41 -0
- package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
- package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
- package/dist/hooks/chunk-TUIFS5E7.js +0 -72
- package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/rules/filing-cap.ts +0 -139
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
2
|
+
import { file_reader } from '#scripts/lib/read-file'
|
|
3
|
+
import { run_cut_handoff } from '#scripts/run/cut/run-cut-handoff'
|
|
4
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
5
|
+
import { edit_tool } from './edit-tool'
|
|
6
|
+
|
|
7
|
+
// The trigger and the delivered text behind the `file-rewrite` row of `delivered-rules.ts`: a `Write`
|
|
8
|
+
// over an existing file whose new body keeps most of the old one (joshuafolkken/kit#5284).
|
|
9
|
+
//
|
|
10
|
+
// **`file-edits.md`'s whole-rewrite conditions are countable, so the guard counts them.** A whole
|
|
11
|
+
// rewrite is allowed for a new file and for a rebuild that shares almost nothing with the original;
|
|
12
|
+
// a `Write` whose new body repeats most of the old lines is a region edit carried as a whole file, and
|
|
13
|
+
// its diff cannot be read. The share is the new body's non-blank lines found in the old body, each old
|
|
14
|
+
// line matched once.
|
|
15
|
+
//
|
|
16
|
+
// **The run's handoff is never refused**: `.josh/tmp/handoff-<N>.json` is rewritten whole by design,
|
|
17
|
+
// the way `implementation-cut.ts` lets it through.
|
|
18
|
+
//
|
|
19
|
+
// It fires on every occurrence, for the reason `file-body.ts` does.
|
|
20
|
+
|
|
21
|
+
const { WRITE, EDIT, is_edit_tool, string_field } = edit_tool
|
|
22
|
+
|
|
23
|
+
// Above this share of the new body's lines kept from the old body, the `Write` is a region edit.
|
|
24
|
+
// "Most" is the line `file-edits.md` draws: strictly more than half.
|
|
25
|
+
const MAX_SHARED_RATIO = 0.5
|
|
26
|
+
const PERCENT = 100
|
|
27
|
+
const LINE_BREAK = '\n'
|
|
28
|
+
|
|
29
|
+
const ISSUE_PLACEHOLDER = '<N>'
|
|
30
|
+
const REGEX_SPECIALS = /[.*+?^${}()|[\]\\]/gu
|
|
31
|
+
const ISSUE_DIGITS = String.raw`\d+`
|
|
32
|
+
|
|
33
|
+
// The handoff path as a pattern, built from `run-cut-handoff.ts`'s single spelling of it.
|
|
34
|
+
const HANDOFF_PATTERN = run_cut_handoff.HANDOFF_PATH.replaceAll(
|
|
35
|
+
REGEX_SPECIALS,
|
|
36
|
+
(special) => `\\${special}`,
|
|
37
|
+
).replace(ISSUE_PLACEHOLDER, () => ISSUE_DIGITS)
|
|
38
|
+
const HANDOFF = new RegExp(`(?:^|/)${HANDOFF_PATTERN}$`, 'u')
|
|
39
|
+
|
|
40
|
+
function body_lines(text: string): Array<string> {
|
|
41
|
+
return text
|
|
42
|
+
.split(LINE_BREAK)
|
|
43
|
+
.map((line) => line.trim())
|
|
44
|
+
.filter((line) => line !== '')
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function count_lines(lines: ReadonlyArray<string>): Map<string, number> {
|
|
48
|
+
const counts = new Map<string, number>()
|
|
49
|
+
|
|
50
|
+
for (const line of lines) counts.set(line, (counts.get(line) ?? 0) + 1)
|
|
51
|
+
|
|
52
|
+
return counts
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function take_line(counts: Map<string, number>, line: string): boolean {
|
|
56
|
+
const left = counts.get(line) ?? 0
|
|
57
|
+
|
|
58
|
+
if (left === 0) return false
|
|
59
|
+
counts.set(line, left - 1)
|
|
60
|
+
|
|
61
|
+
return true
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// The share of the new body's non-blank lines that the old body already carries, each old line
|
|
65
|
+
// matched at most once; `0` for an empty new body.
|
|
66
|
+
function shared_ratio(old_text: string, new_text: string): number {
|
|
67
|
+
const new_lines = body_lines(new_text)
|
|
68
|
+
|
|
69
|
+
if (new_lines.length === 0) return 0
|
|
70
|
+
|
|
71
|
+
const old_counts = count_lines(body_lines(old_text))
|
|
72
|
+
const shared = new_lines.filter((line) => take_line(old_counts, line)).length
|
|
73
|
+
|
|
74
|
+
return shared / new_lines.length
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The `Write` input over a path that is not the run's handoff; `undefined` for any other call.
|
|
78
|
+
function write_input(call: GuardedCall): Record<string, unknown> | undefined {
|
|
79
|
+
if (call.name !== WRITE || !json_value.is_record(call.input)) return undefined
|
|
80
|
+
|
|
81
|
+
return HANDOFF.test(string_field(call.input, 'file_path')) ? undefined : call.input
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// The file's current text, `undefined` for a new file. Injected so the suite controls it without
|
|
85
|
+
// touching the real filesystem, the way `file-body.ts` injects its existence check.
|
|
86
|
+
type ReadExisting = (file_path: string) => string | undefined
|
|
87
|
+
|
|
88
|
+
function rewrite_ratio(call: GuardedCall, read: ReadExisting): number | undefined {
|
|
89
|
+
const input = write_input(call)
|
|
90
|
+
const old_text = input === undefined ? undefined : read(string_field(input, 'file_path'))
|
|
91
|
+
|
|
92
|
+
if (input === undefined || old_text === undefined) return undefined
|
|
93
|
+
|
|
94
|
+
return shared_ratio(old_text, string_field(input, 'content'))
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// The trigger: a `Write` over an existing file keeping more than `MAX_SHARED_RATIO` of its lines.
|
|
98
|
+
function rewrites_kept_body(
|
|
99
|
+
call: GuardedCall,
|
|
100
|
+
read: ReadExisting = file_reader.read_optional,
|
|
101
|
+
): boolean {
|
|
102
|
+
return (rewrite_ratio(call, read) ?? 0) > MAX_SHARED_RATIO
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// The occasion the rule governs: any `Edit` or `Write`. Read off the call alone, so a transcript is
|
|
106
|
+
// measured without the file as it stood then.
|
|
107
|
+
function reaches_file_change(call: GuardedCall): boolean {
|
|
108
|
+
return is_edit_tool(call.name)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Keeping the rule: the region changed with `Edit`.
|
|
112
|
+
function keeps_region_edit(call: GuardedCall): boolean {
|
|
113
|
+
return call.name === EDIT
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const FILE_REWRITE_REASON =
|
|
117
|
+
`⛔ whole-file Write of an existing file: the new body keeps more than ${String(MAX_SHARED_RATIO * PERCENT)}% ` +
|
|
118
|
+
'of the old lines, so it is a region edit carried as a whole file and its diff cannot be read. ' +
|
|
119
|
+
'Change the region with the Edit tool; a Write stays for a new file or a rebuild sharing almost ' +
|
|
120
|
+
'nothing. This rule fires on every occurrence (`prompts/collaboration-workflow/file-edits.md`).'
|
|
121
|
+
|
|
122
|
+
const ROW = {
|
|
123
|
+
id: 'file-rewrite',
|
|
124
|
+
is_trigger: (call: GuardedCall): boolean => rewrites_kept_body(call),
|
|
125
|
+
reason: FILE_REWRITE_REASON,
|
|
126
|
+
decide: (): boolean => true,
|
|
127
|
+
keeps: keeps_region_edit,
|
|
128
|
+
reaches: reaches_file_change,
|
|
129
|
+
about: {
|
|
130
|
+
title: 'No whole-file Write that keeps most of the old body',
|
|
131
|
+
topic: '`file-edits.md`',
|
|
132
|
+
fires:
|
|
133
|
+
'a `Write` over an existing file whose new body shares more than half its non-blank lines with the old one. Every occurrence',
|
|
134
|
+
quiet: "a new file, the run's handoff, a rebuild sharing half or less, or an `Edit`",
|
|
135
|
+
},
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const file_rewrite = {
|
|
139
|
+
FILE_REWRITE_REASON,
|
|
140
|
+
MAX_SHARED_RATIO,
|
|
141
|
+
ROW,
|
|
142
|
+
rewrites_kept_body,
|
|
143
|
+
shared_ratio,
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export { file_rewrite }
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
// **The hook-deliverable set — the single source is the list `pnpm josh rule:list` renders.** The
|
|
12
12
|
// `PreToolUse` guard is wired to `Bash|Edit|Read|Write` (`scripts/hooks/pretool-guard.ts`), the
|
|
13
13
|
// lane-child interactive-ask row triggers on `AskUserQuestion`, and the `agent-model` row on
|
|
14
|
-
// `Agent|Task
|
|
15
|
-
// else cannot.
|
|
14
|
+
// `Agent|Task`; the `Stop` hook's `pnpm josh stop:guard` judges every finished reply. A firing point
|
|
15
|
+
// naming one of these can be delivered at the moment it binds; anything else cannot.
|
|
16
16
|
const HOOK_DELIVERABLE_TOOLS: ReadonlyArray<string> = [
|
|
17
17
|
'Bash',
|
|
18
18
|
'Edit',
|
|
@@ -21,6 +21,7 @@ const HOOK_DELIVERABLE_TOOLS: ReadonlyArray<string> = [
|
|
|
21
21
|
'AskUserQuestion',
|
|
22
22
|
'Agent',
|
|
23
23
|
'Task',
|
|
24
|
+
'Stop',
|
|
24
25
|
]
|
|
25
26
|
|
|
26
27
|
// **Known Claude Code tool calls that a hook cannot deliver a rule on.** They are real tools, so a
|
package/scripts/rules/gh-api.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { git_argv } from './git-argv'
|
|
2
|
+
|
|
1
3
|
// The one reading of a `gh api` segment shared by the rows of `delivered-rules.ts` that judge such a
|
|
2
4
|
// call by its spelling: the issue-body-read guard classifies read vs write,
|
|
3
5
|
// and the third-party-write guard needs the same classification plus the target `owner/repo`. Two
|
|
@@ -17,10 +19,39 @@ const GH_API_COMMAND = new RegExp(String.raw`^gh\s+${GH_FLAGS}api\s`, 'u')
|
|
|
17
19
|
// The method override, and the field flags that turn a bare `gh api` into a POST. **All four field
|
|
18
20
|
// spellings**, `-F` included — it is `--field`'s short form and reads as a different flag to a
|
|
19
21
|
// pattern that only knows `-f`. A body passed with `--input <file>` counts as a write too: it carries
|
|
20
|
-
// the fields inside the file.
|
|
21
|
-
|
|
22
|
-
|
|
22
|
+
// the fields inside the file. A short flag also takes its value attached (`-XPUT`, `-fname=x`), as
|
|
23
|
+
// `gh` accepts.
|
|
24
|
+
//
|
|
25
|
+
// **Read off the argv at flag positions, not the joined line**: a flag spelled inside a field value
|
|
26
|
+
// (`-f 'note=a -X GET'`) is that field's value, and reading it as the method would class a POST a
|
|
27
|
+
// read (joshuafolkken/kit#4650).
|
|
28
|
+
const GH_COMMAND = 'gh'
|
|
29
|
+
const METHOD_FLAGS: ReadonlySet<string> = new Set(['-X', '--method'])
|
|
30
|
+
const ATTACHED_METHOD = /^(?:-X=?|--method=)([A-Za-z]+)$/u
|
|
31
|
+
const FIELD_FLAGS: ReadonlySet<string> = new Set(['-f', '-F', '--field', '--raw-field', '--input'])
|
|
32
|
+
const ATTACHED_FIELD = /^(?:-[fF].|--(?:raw-field|field|input)=)/u
|
|
33
|
+
const QUOTES = /['"]/gu
|
|
34
|
+
const FLAG_PREFIX = '-'
|
|
35
|
+
const NEXT = 1
|
|
23
36
|
const READ_METHOD = 'GET'
|
|
37
|
+
// `gh api`'s flags that take a value as the next word, beside the repository selector — skipped so
|
|
38
|
+
// `-X POST` or `-f body=…` is not read as the endpoint, and a value is not read as a flag.
|
|
39
|
+
const API_VALUE_TAKING_FLAGS: ReadonlySet<string> = new Set([
|
|
40
|
+
'-R',
|
|
41
|
+
'--repo',
|
|
42
|
+
...METHOD_FLAGS,
|
|
43
|
+
...FIELD_FLAGS,
|
|
44
|
+
'-H',
|
|
45
|
+
'--header',
|
|
46
|
+
'-q',
|
|
47
|
+
'--jq',
|
|
48
|
+
'-t',
|
|
49
|
+
'--template',
|
|
50
|
+
'--hostname',
|
|
51
|
+
'-p',
|
|
52
|
+
'--preview',
|
|
53
|
+
'--cache',
|
|
54
|
+
])
|
|
24
55
|
|
|
25
56
|
// `repos/<owner>/<repo>` from an api path, with both halves captured. The path may carry a leading
|
|
26
57
|
// slash, a query string, or further segments (`…/issues/5/comments`), so the owner and repo are taken
|
|
@@ -44,24 +75,111 @@ function is_gh_api(segment: string): boolean {
|
|
|
44
75
|
return GH_API_COMMAND.test(segment)
|
|
45
76
|
}
|
|
46
77
|
|
|
78
|
+
// Each flag of the call with the word after it — a word that is a value-taking flag's value is not
|
|
79
|
+
// a flag itself.
|
|
80
|
+
function flags_of(segment: string): Array<[string, string]> {
|
|
81
|
+
const words = git_argv.arguments_of(segment, GH_COMMAND) ?? []
|
|
82
|
+
|
|
83
|
+
return words
|
|
84
|
+
.map((word, index): [string, string] => [word, words[index + NEXT] ?? ''])
|
|
85
|
+
.filter(([word], index) => {
|
|
86
|
+
if (!word.startsWith(FLAG_PREFIX)) return false
|
|
87
|
+
|
|
88
|
+
return !API_VALUE_TAKING_FLAGS.has(words[index - NEXT] ?? '')
|
|
89
|
+
})
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function method_value(flag: string, next: string): string | undefined {
|
|
93
|
+
if (METHOD_FLAGS.has(flag)) return next.replaceAll(QUOTES, '')
|
|
94
|
+
|
|
95
|
+
return ATTACHED_METHOD.exec(flag)?.[1]
|
|
96
|
+
}
|
|
97
|
+
|
|
47
98
|
// A read is a `GET` — explicit via a method flag, or implicit when no field flag makes it a POST.
|
|
48
|
-
// The explicit `-X` / `--method` value, upper-cased, or `undefined` when the call names none
|
|
99
|
+
// The explicit `-X` / `--method` value, upper-cased, or `undefined` when the call names none; the
|
|
100
|
+
// last one wins, as it does in `gh`.
|
|
49
101
|
function method_of(segment: string): string | undefined {
|
|
50
|
-
|
|
102
|
+
const methods = flags_of(segment).map(([flag, next]) => method_value(flag, next))
|
|
103
|
+
|
|
104
|
+
return methods.findLast((method) => method !== undefined)?.toUpperCase()
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function is_field_flag(flag: string): boolean {
|
|
108
|
+
return FIELD_FLAGS.has(flag) || ATTACHED_FIELD.test(flag)
|
|
51
109
|
}
|
|
52
110
|
|
|
53
111
|
function is_read(segment: string): boolean {
|
|
54
112
|
const method = method_of(segment)
|
|
55
113
|
|
|
56
|
-
if (method !== undefined) return method
|
|
114
|
+
if (method !== undefined) return method === READ_METHOD
|
|
57
115
|
|
|
58
|
-
return
|
|
116
|
+
return flags_of(segment).every(([flag]) => !is_field_flag(flag))
|
|
59
117
|
}
|
|
60
118
|
|
|
61
119
|
function is_write(segment: string): boolean {
|
|
62
120
|
return !is_read(segment)
|
|
63
121
|
}
|
|
64
122
|
|
|
123
|
+
// What one field flag sends: the value itself, or the file `gh` reads it from — `-F key=@<path>` and
|
|
124
|
+
// `--input <path>`, standard input (`-`) excepted. `-f` / `--raw-field` sends `@<path>` as text.
|
|
125
|
+
interface FieldSource {
|
|
126
|
+
kind: 'text' | 'file'
|
|
127
|
+
value: string
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const INPUT_FLAG = '--input'
|
|
131
|
+
const READS_FILE_FLAGS: ReadonlySet<string> = new Set(['-F', '--field'])
|
|
132
|
+
const ATTACHED_PARTS = /^(-[fF]|--(?:raw-field|field|input))=?(.+)$/u
|
|
133
|
+
const ATTACHED_FLAG_GROUP = 1
|
|
134
|
+
const ATTACHED_VALUE_GROUP = 2
|
|
135
|
+
const FILE_PREFIX = '@'
|
|
136
|
+
const STANDARD_INPUT = '-'
|
|
137
|
+
const FIELD_KEY_END = '='
|
|
138
|
+
|
|
139
|
+
// The flag and its value, attached (`-fname=x`, `--input=path`) or as the next word.
|
|
140
|
+
function field_parts(flag: string, next: string): [string, string] | undefined {
|
|
141
|
+
if (FIELD_FLAGS.has(flag)) return [flag, next]
|
|
142
|
+
|
|
143
|
+
const match = ATTACHED_PARTS.exec(flag)
|
|
144
|
+
|
|
145
|
+
if (match === null) return undefined
|
|
146
|
+
|
|
147
|
+
return [String(match[ATTACHED_FLAG_GROUP]), String(match[ATTACHED_VALUE_GROUP])]
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function field_value(value: string): string {
|
|
151
|
+
return value.slice(value.indexOf(FIELD_KEY_END) + NEXT)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// The path a field flag has `gh` read, or `undefined` when it sends its value as text.
|
|
155
|
+
function file_path(flag: string, value: string): string | undefined {
|
|
156
|
+
if (flag === INPUT_FLAG) return value
|
|
157
|
+
|
|
158
|
+
const sent = field_value(value)
|
|
159
|
+
|
|
160
|
+
if (!READS_FILE_FLAGS.has(flag) || !sent.startsWith(FILE_PREFIX)) return undefined
|
|
161
|
+
|
|
162
|
+
return sent.slice(FILE_PREFIX.length)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function field_source(flag: string, raw: string): FieldSource | undefined {
|
|
166
|
+
const value = raw.replaceAll(QUOTES, '')
|
|
167
|
+
const path = file_path(flag, value)
|
|
168
|
+
|
|
169
|
+
if (path === undefined) return { kind: 'text', value: field_value(value) }
|
|
170
|
+
|
|
171
|
+
return path === STANDARD_INPUT ? undefined : { kind: 'file', value: path }
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function field_sources(segment: string): Array<FieldSource> {
|
|
175
|
+
return flags_of(segment).flatMap(([flag, next]) => {
|
|
176
|
+
const parts = field_parts(flag, next)
|
|
177
|
+
const source = parts === undefined ? undefined : field_source(...parts)
|
|
178
|
+
|
|
179
|
+
return source === undefined ? [] : [source]
|
|
180
|
+
})
|
|
181
|
+
}
|
|
182
|
+
|
|
65
183
|
function repo_target(segment: string): RepoTarget | undefined {
|
|
66
184
|
const match = REPO_PATH.exec(segment)
|
|
67
185
|
|
|
@@ -75,7 +193,9 @@ function is_owner_placeholder(owner: string): boolean {
|
|
|
75
193
|
}
|
|
76
194
|
|
|
77
195
|
const gh_api = {
|
|
196
|
+
API_VALUE_TAKING_FLAGS,
|
|
78
197
|
GH_FLAGS,
|
|
198
|
+
field_sources,
|
|
79
199
|
is_gh_api,
|
|
80
200
|
is_owner_placeholder,
|
|
81
201
|
is_read,
|
|
@@ -84,4 +204,5 @@ const gh_api = {
|
|
|
84
204
|
repo_target,
|
|
85
205
|
}
|
|
86
206
|
|
|
207
|
+
export type { FieldSource }
|
|
87
208
|
export { gh_api }
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { direct_pr_create } from './direct-pr-create'
|
|
2
|
+
import { git_argv } from './git-argv'
|
|
3
|
+
|
|
4
|
+
// The `gh <group> <action> -R <owner>/<repo>` reading the third-party-write guard needs
|
|
5
|
+
// (joshuafolkken/kit#4659). `gh pr create -R other/x` and `gh issue comment -R other/x` write to the
|
|
6
|
+
// repository the selector names, so a guard that judged only `gh api`'s `repos/<owner>/` path let
|
|
7
|
+
// every such write through.
|
|
8
|
+
//
|
|
9
|
+
// **A write unless it is a known read.** The read actions are few and stable; the write actions are
|
|
10
|
+
// many and grow with `gh`. Listing the reads makes a new write subcommand refused by default instead
|
|
11
|
+
// of passed by default.
|
|
12
|
+
|
|
13
|
+
const GH_COMMAND = 'gh'
|
|
14
|
+
const API_GROUP = 'api'
|
|
15
|
+
const SELECTOR_FLAGS: ReadonlySet<string> = new Set(['-R', '--repo'])
|
|
16
|
+
const ATTACHED_SELECTOR = /^(?:-R=?|--repo=)(.+)$/u
|
|
17
|
+
const QUOTES = /['"]/gu
|
|
18
|
+
const NEXT = 1
|
|
19
|
+
// Groups that never write with a selector, whatever follows them.
|
|
20
|
+
const READ_GROUPS: ReadonlySet<string> = new Set(['browse', 'search', 'status'])
|
|
21
|
+
const READ_ACTIONS: ReadonlySet<string> = new Set([
|
|
22
|
+
'check',
|
|
23
|
+
'checkout',
|
|
24
|
+
'checks',
|
|
25
|
+
'clone',
|
|
26
|
+
'diff',
|
|
27
|
+
'download',
|
|
28
|
+
'get',
|
|
29
|
+
'list',
|
|
30
|
+
'status',
|
|
31
|
+
'verify',
|
|
32
|
+
'verify-asset',
|
|
33
|
+
'view',
|
|
34
|
+
'watch',
|
|
35
|
+
])
|
|
36
|
+
// `GH_REPO=<selector>` — inline before `gh`, or exported earlier in the line — selects the repository
|
|
37
|
+
// exactly as `-R` does.
|
|
38
|
+
const GH_REPO_ASSIGNMENT = /(?:^|\s)GH_REPO=(\S+)/gu
|
|
39
|
+
const SELECTOR_GROUP = 1
|
|
40
|
+
|
|
41
|
+
function selector_value(word: string, next: string | undefined): string | undefined {
|
|
42
|
+
if (SELECTOR_FLAGS.has(word)) return next
|
|
43
|
+
|
|
44
|
+
return ATTACHED_SELECTOR.exec(word)?.[1]
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Every `-R` / `--repo` value the call carries, quotes stripped. Each is a repository `gh` may send
|
|
48
|
+
// the write to, so the caller judges all of them rather than guessing which one `gh` keeps.
|
|
49
|
+
function selectors_of(args: ReadonlyArray<string>): Array<string> {
|
|
50
|
+
return args
|
|
51
|
+
.map((word, index) => selector_value(word, args[index + NEXT]))
|
|
52
|
+
.filter((value) => value !== undefined)
|
|
53
|
+
.map((value) => value.replaceAll(QUOTES, ''))
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function is_write_call(args: ReadonlyArray<string>): boolean {
|
|
57
|
+
const [group = '', action = ''] = direct_pr_create.positional_words(args, SELECTOR_FLAGS)
|
|
58
|
+
|
|
59
|
+
if (group === API_GROUP || READ_GROUPS.has(group)) return false
|
|
60
|
+
|
|
61
|
+
return !READ_ACTIONS.has(action)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Every `GH_REPO` value assigned in `segments` — the write's own segment and those before it.
|
|
65
|
+
function assigned_selectors(segments: ReadonlyArray<string>): Array<string> {
|
|
66
|
+
return segments
|
|
67
|
+
.flatMap((segment) => [...segment.matchAll(GH_REPO_ASSIGNMENT)])
|
|
68
|
+
.map((match) => (match[SELECTOR_GROUP] ?? '').replaceAll(QUOTES, ''))
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// The repository selectors of the `gh` write at `index` — its `-R` / `--repo` values and every
|
|
72
|
+
// `GH_REPO` assigned up to it — or none when the segment is not `gh`, is a `gh api` call (judged by
|
|
73
|
+
// its path), is a read, or names no selector.
|
|
74
|
+
function write_selectors(segments: ReadonlyArray<string>, index: number): Array<string> {
|
|
75
|
+
const args = git_argv.arguments_of(segments[index] ?? '', GH_COMMAND)
|
|
76
|
+
|
|
77
|
+
if (args === undefined || !is_write_call(args)) return []
|
|
78
|
+
|
|
79
|
+
return [...selectors_of(args), ...assigned_selectors(segments.slice(0, index + NEXT))]
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const gh_repo_selector = { write_selectors }
|
|
83
|
+
|
|
84
|
+
export { gh_repo_selector }
|
|
@@ -15,7 +15,7 @@ import { shell_segments } from './shell-segments'
|
|
|
15
15
|
//
|
|
16
16
|
// **It fires on every occurrence, not once per run.** A force push is destructive every time it is
|
|
17
17
|
// issued, so refused-once-and-free-after would put the second one back on the run's self-restraint —
|
|
18
|
-
// the disposition `run-tail-rule.ts`
|
|
18
|
+
// the disposition `run-tail-rule.ts` takes for the same reason.
|
|
19
19
|
|
|
20
20
|
// A force push. The long forms all open with `--force` (`--force`, `--force-with-lease[=ref]`,
|
|
21
21
|
// `--force-if-includes`); `-f` and any cluster carrying `f` are the short forms; a bare `--delete` and
|
|
@@ -84,7 +84,7 @@ const GIT_FORCE_REASON =
|
|
|
84
84
|
|
|
85
85
|
// The row itself, so `delivered-rules.ts` spreads one entry. `decide` returns true so it refuses every
|
|
86
86
|
// occurrence; it declares no `keeps` — not force-pushing is the absence of a call, not a call, so the
|
|
87
|
-
// row is reported unmeasured rather than scored on an act that does not exist
|
|
87
|
+
// row is reported unmeasured rather than scored on an act that does not exist.
|
|
88
88
|
const ROW = {
|
|
89
89
|
id: 'git-force',
|
|
90
90
|
is_trigger: bash_triggers.on_bash_command(is_force_or_delete),
|
|
@@ -28,9 +28,8 @@ const NO_RUN = "the call must not run at all, or only on a person's word — ref
|
|
|
28
28
|
// The `Stop` rows that already run their step: each blocks only on the case the hook cannot finish.
|
|
29
29
|
const STOP_NOTIFY = 'the hook sends the notify itself; it blocks only when the send fails'
|
|
30
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
31
|
const FILING_OFFER = 'the filing needs a title and a body only the model can write'
|
|
32
|
+
const CONCISE_REPLY = 'the shorter reply is prose only the model can write'
|
|
34
33
|
|
|
35
34
|
function rewrite(): GuardRemedy {
|
|
36
35
|
return { remedy: 'rewrite', why: REWRITTEN }
|
|
@@ -45,29 +44,39 @@ const GUARD_REMEDIES: Readonly<Record<string, GuardRemedy>> = {
|
|
|
45
44
|
'piped-verification': rewrite(), // wrapped in `(set -o pipefail; …)`
|
|
46
45
|
'issue-comments': rewrite(), // the same Issue's comments read on the same line
|
|
47
46
|
'lane-background': rewrite(), // a lane child's `ship` run in the foreground (`pretool-guard.ts`)
|
|
47
|
+
'reviewer-foreground': rewrite(), // a lane child's `reviewer` given `run_in_background: false`
|
|
48
48
|
'file-body': judgment(ANOTHER_TOOL), // Edit or Write
|
|
49
|
+
'file-rewrite': judgment(ANOTHER_TOOL), // Edit
|
|
50
|
+
'sed-in-place': judgment(ANOTHER_TOOL), // Edit
|
|
49
51
|
'shell-body': judgment(
|
|
50
52
|
"which part of the body the shell was meant to expand is the author's, not the hook's",
|
|
51
53
|
),
|
|
52
54
|
'raw-field-body': judgment('the body moves to a file the call does not name'),
|
|
55
|
+
'credential-body': judgment(
|
|
56
|
+
'which text is the credential, and what replaces it, is the author’s',
|
|
57
|
+
),
|
|
53
58
|
'rule-body': judgment('a trigger-plus-pointer line is written, not derived'),
|
|
54
59
|
'direct-filing': judgment(ANOTHER_COMMAND),
|
|
55
60
|
'direct-issue-comment': judgment(ANOTHER_COMMAND),
|
|
61
|
+
'direct-issue-read': judgment(ANOTHER_COMMAND),
|
|
56
62
|
'direct-pr-create': judgment(ANOTHER_COMMAND),
|
|
57
63
|
'pr-merge': judgment(ANOTHER_COMMAND),
|
|
58
64
|
'josh-git-bare': judgment(ANOTHER_COMMAND),
|
|
59
65
|
'run-tail': judgment(ANOTHER_COMMAND),
|
|
60
66
|
'pre-gate-cut': judgment(ANOTHER_COMMAND),
|
|
61
67
|
'implementation-cut': judgment(ANOTHER_COMMAND),
|
|
68
|
+
'round-one-check-related': judgment(ANOTHER_COMMAND),
|
|
62
69
|
'early-heartbeat': judgment(ANOTHER_COMMAND),
|
|
63
70
|
'poll-loop': judgment(ANOTHER_COMMAND),
|
|
64
71
|
'lane-park': judgment(ANOTHER_COMMAND),
|
|
65
72
|
'lane-split-park': judgment(ANOTHER_COMMAND),
|
|
66
73
|
'lane-interactive-ask': judgment(ANOTHER_COMMAND),
|
|
67
74
|
'agent-model': judgment("which model fits the unit is the author's call"),
|
|
75
|
+
'investigator-foreground': judgment('which reads go beside the dispatch is the author’s call'),
|
|
68
76
|
'lane-carry-conflict': judgment(ANOTHER_COMMAND),
|
|
69
77
|
'lane-switch-main': judgment(ANOTHER_COMMAND),
|
|
70
|
-
'lane-direct-tool':
|
|
78
|
+
'lane-direct-tool': rewrite(), // a one-command line behind `pnpm josh reserved-run <weight> --`
|
|
79
|
+
'lane-spilled-read': judgment(ANOTHER_COMMAND),
|
|
71
80
|
'timed-rerun': judgment(ANOTHER_COMMAND),
|
|
72
81
|
'oracle-consulted': judgment(ANOTHER_COMMAND),
|
|
73
82
|
'test-declared': judgment(ANOTHER_COMMAND),
|
|
@@ -78,17 +87,17 @@ const GUARD_REMEDIES: Readonly<Record<string, GuardRemedy>> = {
|
|
|
78
87
|
'parent-cut': judgment(ANOTHER_COMMAND),
|
|
79
88
|
'issue-watch': judgment(ANOTHER_COMMAND),
|
|
80
89
|
'third-party-write': judgment(NO_RUN),
|
|
81
|
-
'filing-cap': judgment(NO_RUN),
|
|
82
90
|
'git-force': judgment(NO_RUN),
|
|
83
91
|
'worktree-mutation': judgment(NO_RUN),
|
|
84
92
|
'index-mutation': judgment(NO_RUN),
|
|
85
93
|
'destructive-command': judgment(NO_RUN),
|
|
94
|
+
'repo-admin': judgment(NO_RUN),
|
|
86
95
|
'protected-file': judgment(NO_RUN),
|
|
87
96
|
// The `Stop` rows: the hook judges a finished reply, so it has no call to rewrite.
|
|
88
97
|
'stop-notify': judgment(STOP_NOTIFY),
|
|
89
|
-
'issue-citation': judgment(ISSUE_CITATION),
|
|
90
98
|
'filing-offer': judgment(FILING_OFFER),
|
|
91
99
|
'hold-release': judgment(HOLD_RELEASE),
|
|
100
|
+
'concise-reply': judgment(CONCISE_REPLY),
|
|
92
101
|
}
|
|
93
102
|
|
|
94
103
|
// A row family shares one class: `oracle-consulted:pkg:scout` is an `oracle-consulted` row.
|