@joshuafolkken/kit 1.1514.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/investigator.md +1 -1
- 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/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- 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-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- 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 +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- 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 +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -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-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -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 +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- 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 +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- 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/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- 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 +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/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-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- 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 +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- 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-rank.ts +5 -0
- 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-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- 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 +85 -0
- 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/followup-review-gates.ts +81 -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 +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- 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 +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- 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/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- 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 +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- 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 +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -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 +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- 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-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- 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 +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- 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 +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -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 +38 -179
- 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/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- 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 +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- 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 +56 -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 +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -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 +114 -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-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- 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 +213 -0
- 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 +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -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 +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- 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 +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- 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/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- 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 +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -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 +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- 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 +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- 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-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -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-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -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 +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- 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-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- 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-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 +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- 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-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- 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/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/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- 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/token-shape.ts +111 -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-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -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 +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- 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/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- 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 +24 -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 +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -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 +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- 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-main.ts +12 -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-blobs.ts +221 -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 +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -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 +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -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-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- 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 +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -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 +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- 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 +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- 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 +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -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 +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- 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-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- 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 +54 -10
- 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-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- 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 +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- 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 +76 -48
- 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-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 +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- 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 +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -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 +6 -3
- 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 +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- 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 +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- 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 +44 -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-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- 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 +6 -11
- package/scripts/security/secretlint-scan.ts +42 -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 +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- 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 +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -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/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-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-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 +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- 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 +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -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 +64 -151
- 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 +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- 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 +40 -8
- 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 +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- 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/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -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 +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
2
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
3
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
4
|
+
|
|
5
|
+
// A dispatched lane child's whole `Read` of a spilled Bash result is refused and pointed at a narrowed
|
|
6
|
+
// read (joshuafolkken/kit#5040).
|
|
7
|
+
//
|
|
8
|
+
// **The spill is the largest single result a cut session carries.** A Bash result over the harness cap
|
|
9
|
+
// is saved to `tool-results/<id>.txt` and previewed; reading that file back whole put 10,000–18,000
|
|
10
|
+
// characters into the context in one call, 10–40% of a cut session's tool results. A `grep` or
|
|
11
|
+
// `sed -n` over the same file reads only the lines the run needs.
|
|
12
|
+
//
|
|
13
|
+
// **Lane children only, every occurrence.** The cut that the context growth triggers is a lane
|
|
14
|
+
// child's; a person in an interactive session keeps the whole read. A paginated `Read` (an `offset` or
|
|
15
|
+
// a `limit`) is already narrowed and passes.
|
|
16
|
+
|
|
17
|
+
const SPILLED_RESULT = /\/tool-results\/[^/]+\.txt$/u
|
|
18
|
+
|
|
19
|
+
function read_input(call: GuardedCall): Record<string, unknown> | undefined {
|
|
20
|
+
if (call.name !== 'Read' || !json_value.is_record(call.input)) return undefined
|
|
21
|
+
|
|
22
|
+
return call.input
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function reads_spilled_result(input: Record<string, unknown>): boolean {
|
|
26
|
+
const { file_path } = input
|
|
27
|
+
|
|
28
|
+
return typeof file_path === 'string' && SPILLED_RESULT.test(file_path)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function is_paginated(input: Record<string, unknown>): boolean {
|
|
32
|
+
return input['offset'] !== undefined || input['limit'] !== undefined
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// The occasion the rule governs: any `Read` of a spilled result, whole or narrowed.
|
|
36
|
+
function reaches_spilled_result(call: GuardedCall): boolean {
|
|
37
|
+
const input = read_input(call)
|
|
38
|
+
|
|
39
|
+
return input !== undefined && reads_spilled_result(input)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Keeping the rule: the spilled result read with a page, never whole.
|
|
43
|
+
function keeps_narrowed_read(call: GuardedCall): boolean {
|
|
44
|
+
const input = read_input(call)
|
|
45
|
+
|
|
46
|
+
return input !== undefined && reads_spilled_result(input) && is_paginated(input)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function is_whole_spilled_read(
|
|
50
|
+
call: GuardedCall,
|
|
51
|
+
is_lane_child: boolean = lane_child_marker.is_child_of(process.cwd()),
|
|
52
|
+
): boolean {
|
|
53
|
+
if (!reaches_spilled_result(call) || keeps_narrowed_read(call)) return false
|
|
54
|
+
|
|
55
|
+
return is_lane_child
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const LANE_SPILLED_READ_REASON =
|
|
59
|
+
'⛔ lane child reading a spilled Bash result whole: `tool-results/<id>.txt` is the output that ' +
|
|
60
|
+
'overflowed the cap, and reading it back whole fills the context the cut is measured on. Read only ' +
|
|
61
|
+
'the lines you need: `grep -n <pattern> <path>` or `sed -n <from>,<to>p <path>`. ' +
|
|
62
|
+
'Refused on every occurrence.'
|
|
63
|
+
|
|
64
|
+
// The row itself, so `delivered-rules.ts` spreads one entry; the shape is `lane-direct-tool.ts`'s, with
|
|
65
|
+
// the narrowed read as its compliance call.
|
|
66
|
+
const ROW = {
|
|
67
|
+
id: 'lane-spilled-read',
|
|
68
|
+
is_trigger: is_whole_spilled_read,
|
|
69
|
+
reason: LANE_SPILLED_READ_REASON,
|
|
70
|
+
decide: (): boolean => true,
|
|
71
|
+
keeps: keeps_narrowed_read,
|
|
72
|
+
reaches: reaches_spilled_result,
|
|
73
|
+
about: {
|
|
74
|
+
title: 'Lane child reading a spilled Bash result whole',
|
|
75
|
+
topic: '`prompts/collaboration-workflow/output-bounds.md`',
|
|
76
|
+
fires:
|
|
77
|
+
"a dispatched lane child's `Read` of a `tool-results/<id>.txt` file with no `offset` or `limit`. Every occurrence",
|
|
78
|
+
quiet: 'not a lane child, another file, or a paginated `Read`',
|
|
79
|
+
},
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const lane_spilled_read = {
|
|
83
|
+
LANE_SPILLED_READ_REASON,
|
|
84
|
+
ROW,
|
|
85
|
+
is_whole_spilled_read,
|
|
86
|
+
keeps_narrowed_read,
|
|
87
|
+
reaches_spilled_result,
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export { lane_spilled_read }
|
|
@@ -17,18 +17,19 @@ import { tail_commands } from './tail-commands'
|
|
|
17
17
|
// carries `epic` as a split (`run-merge.ts`), so the label is never what tells it.
|
|
18
18
|
//
|
|
19
19
|
// **The material is the run's own calls.** The promotion is a `josh epic --promote <N>` this run issued,
|
|
20
|
-
// read off the transcript tail as `
|
|
20
|
+
// read off the transcript tail as `turn-filings.ts` reads its filings — a tool call, never prose, so a
|
|
21
21
|
// child that merely read a document quoting the command is not mistaken for one that ran it. Only a
|
|
22
22
|
// promotion of the dispatched issue counts: the epic a mid-run split promotes is the child's own Issue.
|
|
23
23
|
|
|
24
24
|
// `josh epic`, named canonically — `shell_segments.is_josh_command` expands an alias before the match.
|
|
25
25
|
const EPIC_COMMANDS: ReadonlySet<string> = new Set(['epic'])
|
|
26
26
|
const PROMOTED_ISSUE = /--promote[=\s]+["']?(?<issue>\d+)\b/u
|
|
27
|
-
// The issue a label write targets, in the
|
|
28
|
-
// path `…/issues/<N>/labels
|
|
27
|
+
// The issue a label write targets, in the spellings `lane_park.records_the_park` accepts: the REST
|
|
28
|
+
// path `…/issues/<N>/labels`, `gh issue edit <N>` and `josh run:park <N>`.
|
|
29
29
|
const LABEL_TARGETS: ReadonlyArray<RegExp> = [
|
|
30
30
|
/\/issues\/(?<issue>\d+)\/labels\b/u,
|
|
31
31
|
/\bissue\s+edit\s+["']?(?<issue>\d+)\b/u,
|
|
32
|
+
/\brun:park\s+["']?(?<issue>\d+)\b/u,
|
|
32
33
|
]
|
|
33
34
|
// The issue a confirmation notify is about, read off its `--issue-url` the way `stop-rules.ts` spells it.
|
|
34
35
|
const ISSUE_URL = /--issue-url[=\s]+["']?([^\s"']+)/u
|
|
@@ -111,6 +112,13 @@ const ROW = {
|
|
|
111
112
|
is_trigger: bash_triggers.on_bash_command(is_candidate),
|
|
112
113
|
reason: LANE_SPLIT_PARK_REASON,
|
|
113
114
|
decide,
|
|
115
|
+
about: {
|
|
116
|
+
title: 'A split is not a park',
|
|
117
|
+
topic: '`.claude/skills/workflow-commands/backlogrun-park.md` → "Splitting a child mid-run"',
|
|
118
|
+
fires:
|
|
119
|
+
'a lane child that promoted its Issue to an epic this run parking it (`needs-decision`, `confirmation` notify). Every occurrence',
|
|
120
|
+
quiet: 'no promotion this run',
|
|
121
|
+
},
|
|
114
122
|
}
|
|
115
123
|
|
|
116
124
|
const lane_split_park = {
|
|
@@ -19,8 +19,8 @@ import { shell_segments } from './shell-segments'
|
|
|
19
19
|
//
|
|
20
20
|
// **It refuses rather than rewrites, because a `PreToolUse` guard can only `allow` / `deny` a command,
|
|
21
21
|
// never substitute a different one**. So the refusal hands back the next command: the lane is already on its own issue
|
|
22
|
-
// branch, branched from a fresh default before it opened, and the latest default is brought in
|
|
23
|
-
// gate by `
|
|
22
|
+
// branch, branched from a fresh default before it opened, and the latest default is brought in before the
|
|
23
|
+
// gate by `josh ship`'s sync — so skip the step and keep implementing on the current branch.
|
|
24
24
|
//
|
|
25
25
|
// **The branch is judged against the lane's own, not the name `main`.** `already used by worktree` is a
|
|
26
26
|
// property of any branch the primary work tree holds, not of the literal `main`, and the default branch
|
|
@@ -108,8 +108,8 @@ function is_switch_away_from_lane(
|
|
|
108
108
|
const LANE_SWITCH_MAIN_REASON =
|
|
109
109
|
'⛔ lane child on `git switch main`: this session is a dispatched lane child, and switching to the ' +
|
|
110
110
|
'default branch here always fails (`already used by worktree`: the primary checkout holds it). Skip ' +
|
|
111
|
-
|
|
112
|
-
'in
|
|
111
|
+
"this step and keep implementing on the current branch; `pnpm josh ship`'s sync brings the default " +
|
|
112
|
+
'in before its gate. Refused on every occurrence (`backlogrun-lanes.md`, `backlogrun-child.md`).'
|
|
113
113
|
|
|
114
114
|
// The row itself, so `delivered-rules.ts` spreads one entry. `is_trigger` reads the input through
|
|
115
115
|
// `on_bash_command` — the `Bash` tool-name gate every command row shares — and `decide` returns true so
|
|
@@ -120,6 +120,13 @@ const ROW = {
|
|
|
120
120
|
is_trigger: bash_triggers.on_bash_command(is_switch_away_from_lane),
|
|
121
121
|
reason: LANE_SWITCH_MAIN_REASON,
|
|
122
122
|
decide: (): boolean => true,
|
|
123
|
+
about: {
|
|
124
|
+
title: 'Lane child on `git switch main`',
|
|
125
|
+
topic: '`.claude/skills/workflow-commands/backlogrun-lanes.md`',
|
|
126
|
+
fires:
|
|
127
|
+
'a dispatched lane child switching to the default branch or running `josh main:sync`. Every occurrence',
|
|
128
|
+
quiet: 'not a lane child — `pnpm josh main:merge` brings the default in at the gate',
|
|
129
|
+
},
|
|
123
130
|
}
|
|
124
131
|
|
|
125
132
|
const lane_switch_main = {
|
|
@@ -1,32 +1,18 @@
|
|
|
1
1
|
import { json_value } from '#scripts/lib/json-value'
|
|
2
2
|
import { time_reported_failure } from '#scripts/time-runtime/time-reported-failure'
|
|
3
3
|
import { z } from 'zod'
|
|
4
|
-
import {
|
|
4
|
+
import { turn_filings } from './turn-filings'
|
|
5
5
|
|
|
6
|
-
// The
|
|
7
|
-
//
|
|
6
|
+
// The person's prompts on a transcript tail — what the stop guard reads to tell a question it answers
|
|
7
|
+
// and the pause a recorded notify belongs to.
|
|
8
8
|
//
|
|
9
|
-
// **A prompt is `
|
|
9
|
+
// **A prompt is `turn_filings`' prompt line, minus what the harness wrote there.** A skill's body is a
|
|
10
10
|
// `user` line with no tool result too, but it carries `isMeta`; a background task's completion notice
|
|
11
11
|
// and a subagent's hand-back carry an `origin` whose `kind` is not `human`. Each is the harness
|
|
12
|
-
// speaking, not the person
|
|
13
|
-
|
|
14
|
-
//
|
|
15
|
-
// **A workflow invocation quotes nothing.** `fullrun #2819` names this repository's own Issue, so a
|
|
16
|
-
// bare `#2819` in that run's report is a citation slip like any other, and the prompt yields no text —
|
|
17
|
-
// a resumed lane child's prompt included, since it ends on the same invocation.
|
|
18
|
-
|
|
19
|
-
const WORKFLOW_KEYWORDS: ReadonlySet<string> = new Set([
|
|
20
|
-
'kickoff',
|
|
21
|
-
'fullrun',
|
|
22
|
-
'halfrun',
|
|
23
|
-
'prrun',
|
|
24
|
-
'backlogrun',
|
|
25
|
-
])
|
|
12
|
+
// speaking, not the person, so only a line with no `origin` (an SDK prompt) or a `human` one is read.
|
|
13
|
+
|
|
26
14
|
const NO_PROMPT = ''
|
|
27
15
|
const HUMAN_ORIGIN = 'human'
|
|
28
|
-
// The word before the prompt's last one — where a trailing `fullrun #N` puts its keyword.
|
|
29
|
-
const KEYWORD_BEFORE_ARGUMENT = -2
|
|
30
16
|
|
|
31
17
|
const PROMPT_LINE_SCHEMA = z.object({
|
|
32
18
|
isMeta: z.boolean().nullish(),
|
|
@@ -61,45 +47,32 @@ function person_text(line: string): string | undefined {
|
|
|
61
47
|
return time_reported_failure.result_text(person.message.content)
|
|
62
48
|
}
|
|
63
49
|
|
|
64
|
-
// A keyword opening the prompt is what a person types; a keyword before its one trailing argument is a
|
|
65
|
-
// lane child's resume prompt, whose preamble ends on `fullrun #N` (`lane-child-invocation.ts`).
|
|
66
|
-
function is_invocation(prompt: string): boolean {
|
|
67
|
-
const words = prompt.trim().split(/\s+/u)
|
|
68
|
-
|
|
69
|
-
return [words.at(0), words.at(KEYWORD_BEFORE_ARGUMENT)].some((word) =>
|
|
70
|
-
WORKFLOW_KEYWORDS.has(word ?? NO_PROMPT),
|
|
71
|
-
)
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
function prompt_line_text(line: string): string | undefined {
|
|
75
|
-
return filing_cap.is_prompt_line(line) ? person_text(line) : undefined
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// The last person prompt on the tail; '' when none is on it or it is an invocation.
|
|
79
|
-
function prompt_text(tail: string): string {
|
|
80
|
-
const text = tail
|
|
81
|
-
.split('\n')
|
|
82
|
-
.map((line) => prompt_line_text(line))
|
|
83
|
-
.findLast((one) => one !== undefined)
|
|
84
|
-
|
|
85
|
-
return text === undefined || is_invocation(text) ? NO_PROMPT : text
|
|
86
|
-
}
|
|
87
|
-
|
|
88
50
|
// **The prompt that opened this turn, when a person typed it** — '' when the harness opened it (a task
|
|
89
51
|
// notification, a subagent's hand-back), so a question asked turns ago does not answer for a stop the
|
|
90
52
|
// run reached on its own since (`stop-decision.ts` → `is_question`).
|
|
91
53
|
function turn_prompt(tail: string): string {
|
|
92
|
-
const opener = tail.split('\n').findLast((line) =>
|
|
54
|
+
const opener = tail.split('\n').findLast((line) => turn_filings.is_prompt_line(line))
|
|
93
55
|
if (opener === undefined) return NO_PROMPT
|
|
94
56
|
|
|
95
57
|
return person_text(opener) ?? NO_PROMPT
|
|
96
58
|
}
|
|
97
59
|
|
|
60
|
+
// **The person's last prompt on the tail**, past what the harness wrote after it (a skill body, a task
|
|
61
|
+
// notification) — `undefined` when no prompt of theirs is on it, so an unread prompt is told apart
|
|
62
|
+
// from one that asked nothing.
|
|
63
|
+
function person_prompt(tail: string): string | undefined {
|
|
64
|
+
return tail
|
|
65
|
+
.split('\n')
|
|
66
|
+
.filter((line) => turn_filings.is_prompt_line(line))
|
|
67
|
+
.map((line) => person_text(line))
|
|
68
|
+
.findLast((text) => text !== undefined)
|
|
69
|
+
}
|
|
70
|
+
|
|
98
71
|
// When the person last prompted on the tail, or `undefined` when no prompt of theirs is on it.
|
|
99
72
|
function prompt_time(tail: string): string | undefined {
|
|
100
73
|
return tail
|
|
101
74
|
.split('\n')
|
|
102
|
-
.filter((line) =>
|
|
75
|
+
.filter((line) => turn_filings.is_prompt_line(line))
|
|
103
76
|
.map((line) => person_line(line)?.timestamp ?? undefined)
|
|
104
77
|
.findLast((time) => time !== undefined)
|
|
105
78
|
}
|
|
@@ -120,6 +93,6 @@ function pause_start(tail: string): string | undefined {
|
|
|
120
93
|
return prompt_time(tail) ?? tail_time(tail)
|
|
121
94
|
}
|
|
122
95
|
|
|
123
|
-
const last_prompt = { pause_start,
|
|
96
|
+
const last_prompt = { pause_start, person_prompt, turn_prompt }
|
|
124
97
|
|
|
125
98
|
export { last_prompt }
|
|
@@ -55,6 +55,15 @@ function reason_for(oracle: Oracle, firing_point: FiringPoint): string {
|
|
|
55
55
|
)
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
// One description for every generated row: the rule is the same act whichever oracle it names.
|
|
59
|
+
const ABOUT: DeliveredRule['about'] = {
|
|
60
|
+
title: 'An act its oracle was not asked about',
|
|
61
|
+
topic: '`decision-oracle.ts`',
|
|
62
|
+
fires:
|
|
63
|
+
'a `Bash` governed by an oracle that declared a firing point (`pkg:scout` governs `pnpm add`), issued without that `pnpm josh <command>`. Refused until it ran',
|
|
64
|
+
quiet: 'no governed act, or the oracle already ran',
|
|
65
|
+
}
|
|
66
|
+
|
|
58
67
|
function row_for(oracle: Oracle, firing_point: FiringPoint): DeliveredRule {
|
|
59
68
|
const names = command_names(oracle)
|
|
60
69
|
|
|
@@ -65,12 +74,13 @@ function row_for(oracle: Oracle, firing_point: FiringPoint): DeliveredRule {
|
|
|
65
74
|
already_satisfied: (tail: string, _call: GuardedCall): boolean =>
|
|
66
75
|
tail_commands.prior_bash_commands(tail).some((command) => runs_the_oracle(command, names)),
|
|
67
76
|
keeps: bash_triggers.on_bash_command((command: string) => runs_the_oracle(command, names)),
|
|
77
|
+
about: ABOUT,
|
|
68
78
|
}
|
|
69
79
|
}
|
|
70
80
|
|
|
71
81
|
// One row per oracle that declared a firing point, in registry order. Spread into `DELIVERED_RULES`
|
|
72
82
|
// after the filing rows, so a firing point that overlaps a filing (`issue:lint`) delivers on the
|
|
73
|
-
// reissue rather than ahead of
|
|
83
|
+
// reissue rather than ahead of the filing rows.
|
|
74
84
|
const ROWS: ReadonlyArray<DeliveredRule> = oracle_firing
|
|
75
85
|
.firing_oracles()
|
|
76
86
|
.map(({ oracle, firing_point }) => row_for(oracle, firing_point))
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { destructive_command } from './destructive-command'
|
|
2
2
|
import { direct_pr_create } from './direct-pr-create'
|
|
3
3
|
import { index_guard } from './index-guard'
|
|
4
|
+
import { pr_merge } from './pr-merge'
|
|
4
5
|
import { protected_files } from './protected-files'
|
|
6
|
+
import { repo_admin } from './repo-admin'
|
|
5
7
|
|
|
6
8
|
// The three rows that close the deny-list bypasses, gathered so
|
|
7
9
|
// `delivered-rules.ts` spreads one entry. Each reads argv or a file path rather than a glob: an index
|
|
@@ -10,11 +12,16 @@ import { protected_files } from './protected-files'
|
|
|
10
12
|
// other row's — `git restore` is split with `worktree-mutation` by `--staged` alone. The fourth row,
|
|
11
13
|
// `direct-pr-create`, closes the same kind of gap for `gh pr create`, which
|
|
12
14
|
// the deny list never listed: it claims `gh pr create` and a `gh api` write to the pulls collection.
|
|
15
|
+
// The fifth, `pr-merge`, claims a merge in every spelling the `gh pr merge*` glob misses. The sixth,
|
|
16
|
+
// `repo-admin`, claims a non-`DELETE` write to the repository's administration, which
|
|
17
|
+
// `destructive-command` leaves open.
|
|
13
18
|
const ROWS = [
|
|
14
19
|
index_guard.ROW,
|
|
15
20
|
destructive_command.ROW,
|
|
16
21
|
protected_files.ROW,
|
|
17
22
|
direct_pr_create.ROW,
|
|
23
|
+
pr_merge.ROW,
|
|
24
|
+
repo_admin.ROW,
|
|
18
25
|
] as const
|
|
19
26
|
|
|
20
27
|
const permission_guards = { ROWS }
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
2
|
+
import { time_transcript_line } from '#scripts/time-runtime/time-transcript-line'
|
|
3
|
+
import { piped_verification } from './piped-verification'
|
|
4
|
+
import { rule_value } from './rule-value'
|
|
5
|
+
import { shell_segments } from './shell-segments'
|
|
6
|
+
|
|
7
|
+
// The `piped-verification` refusals named by the filter that drew them, for `josh rule:value --fresh`.
|
|
8
|
+
//
|
|
9
|
+
// **Which shape to move from the refusal to the rewrite is read here, not in a transcript by hand.**
|
|
10
|
+
// The refusal text is one fixed reason, so the row's `refused` count says how often and never why; the
|
|
11
|
+
// command that drew it is the call the errored result answers, paired by its `tool_use_id`
|
|
12
|
+
// (joshuafolkken/kit#5266). A shape is named by the first that holds, in the order below: the filters
|
|
13
|
+
// that hide a verdict first, the chain — a line of more than one command, a heredoc's body lines
|
|
14
|
+
// included — only where no filter explains the refusal.
|
|
15
|
+
|
|
16
|
+
const SHAPE = {
|
|
17
|
+
head: 'head',
|
|
18
|
+
grep: 'grep',
|
|
19
|
+
script: 'awk|sed|tee',
|
|
20
|
+
chain: 'chain',
|
|
21
|
+
other: 'other',
|
|
22
|
+
} as const
|
|
23
|
+
|
|
24
|
+
type RefusalShape = (typeof SHAPE)[keyof typeof SHAPE]
|
|
25
|
+
type ShapeCounts = Map<RefusalShape, number>
|
|
26
|
+
|
|
27
|
+
const HEAD_FILTER = /^head\b/u
|
|
28
|
+
const SCRIPT_FILTER = /^(?:awk|sed|tee)\b/u
|
|
29
|
+
// The reason's opening, matched as `rule-value.ts` matches a refusal; a text without the cheap mark —
|
|
30
|
+
// the reason's ASCII words, which the rewrite note does not share — is skipped unparsed.
|
|
31
|
+
const SIGNATURE = piped_verification.PIPED_VERIFICATION_REASON.slice(
|
|
32
|
+
0,
|
|
33
|
+
rule_value.REASON_SIGNATURE_LENGTH,
|
|
34
|
+
)
|
|
35
|
+
const CHEAP_MARK = 'piped verification: a pipeline exits'
|
|
36
|
+
const HEADING = 'piped-verification refusals by shape:'
|
|
37
|
+
const SHAPE_GAP = ' · '
|
|
38
|
+
|
|
39
|
+
function filter_shape(filters: ReadonlyArray<string>): RefusalShape | undefined {
|
|
40
|
+
if (filters.some((piece) => HEAD_FILTER.test(piece))) return SHAPE.head
|
|
41
|
+
if (filters.some((piece) => piped_verification.EARLY_EXIT_GREP.test(piece))) return SHAPE.grep
|
|
42
|
+
|
|
43
|
+
return filters.some((piece) => SCRIPT_FILTER.test(piece)) ? SHAPE.script : undefined
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function shape_of(command: string): RefusalShape {
|
|
47
|
+
const by_filter = filter_shape(piped_verification.check_filters(command))
|
|
48
|
+
|
|
49
|
+
if (by_filter !== undefined) return by_filter
|
|
50
|
+
|
|
51
|
+
const segments = shell_segments.segments_of(time_shell.unquoted(command))
|
|
52
|
+
|
|
53
|
+
return segments.length > 1 ? SHAPE.chain : SHAPE.other
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
interface Pairing {
|
|
57
|
+
commands: Map<string, string>
|
|
58
|
+
refused: Array<string>
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
type Block = NonNullable<ReturnType<typeof time_transcript_line.parse_line>>['blocks'][number]
|
|
62
|
+
|
|
63
|
+
function is_refusal(block: Block): boolean {
|
|
64
|
+
if (block.error_text === '') return false
|
|
65
|
+
|
|
66
|
+
return time_transcript_line.refusal_body(block.error_text).startsWith(SIGNATURE)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function pair_block(block: Block, pairing: Pairing): void {
|
|
70
|
+
if (block.id !== '') pairing.commands.set(block.id, time_shell.bash_command(block.input))
|
|
71
|
+
if (is_refusal(block)) pairing.refused.push(block.result_id)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function blocks_of(text: string): Array<Block> {
|
|
75
|
+
return text.split('\n').flatMap((line) => time_transcript_line.parse_line(line)?.blocks ?? [])
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// The commands one transcript's `piped-verification` refusals answered.
|
|
79
|
+
function refused_commands(text: string): Array<string> {
|
|
80
|
+
if (!text.includes(CHEAP_MARK)) return []
|
|
81
|
+
|
|
82
|
+
const pairing: Pairing = { commands: new Map(), refused: [] }
|
|
83
|
+
|
|
84
|
+
for (const block of blocks_of(text)) pair_block(block, pairing)
|
|
85
|
+
|
|
86
|
+
return pairing.refused
|
|
87
|
+
.map((id) => pairing.commands.get(id) ?? '')
|
|
88
|
+
.filter((command) => command !== '')
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function count(text: string, counts: ShapeCounts): void {
|
|
92
|
+
for (const command of refused_commands(text)) {
|
|
93
|
+
const shape = shape_of(command)
|
|
94
|
+
|
|
95
|
+
counts.set(shape, (counts.get(shape) ?? 0) + 1)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function render(counts: ShapeCounts): string {
|
|
100
|
+
const cells = Object.values(SHAPE).map(
|
|
101
|
+
(shape) => `${shape} ${(counts.get(shape) ?? 0).toString()}`,
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
return `${HEADING} ${cells.join(SHAPE_GAP)}`
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const piped_verification_shapes = { HEADING, SHAPE, count, refused_commands, render, shape_of }
|
|
108
|
+
|
|
109
|
+
export { piped_verification_shapes }
|
|
110
|
+
export type { RefusalShape, ShapeCounts }
|
|
@@ -16,7 +16,7 @@ import { shell_segments } from './shell-segments'
|
|
|
16
16
|
// document, prompt and skill in this repository found exactly one piped verification example, and it
|
|
17
17
|
// was the repository's own explanation of this bug — so there were no examples to rewrite, and the
|
|
18
18
|
// pipe is invented each time rather than copied. The other candidate, a calling convention, had
|
|
19
|
-
// already been rejected in writing by `
|
|
19
|
+
// already been rejected in writing by `tools/time/time-reported-failure.ts`: a convention is obeyed
|
|
20
20
|
// or it is not. `prompts/collaboration-workflow/output-bounds.md` is the single source for the rule.
|
|
21
21
|
//
|
|
22
22
|
// It lives beside the enumeration rather than inside it because `delivered-rules.ts` is the list —
|
|
@@ -40,6 +40,7 @@ import { shell_segments } from './shell-segments'
|
|
|
40
40
|
// change. The Issue that filed this rule names `eval` for that reason.
|
|
41
41
|
const VERIFICATION_COMMANDS: ReadonlySet<string> = new Set([
|
|
42
42
|
'check',
|
|
43
|
+
'check:related',
|
|
43
44
|
'cspell',
|
|
44
45
|
'cspell:dot',
|
|
45
46
|
'eval',
|
|
@@ -97,6 +98,13 @@ function pipelines_of(command: string): Array<Array<string>> {
|
|
|
97
98
|
.map((segment) => segment.split('|').map((piece) => piece.trim()))
|
|
98
99
|
}
|
|
99
100
|
|
|
101
|
+
// The filters behind each check on the line — what a refusal is named by (`piped-verification-shapes.ts`).
|
|
102
|
+
function check_filters(command: string): Array<string> {
|
|
103
|
+
return pipelines_of(command).flatMap(([head = '', ...filters]) =>
|
|
104
|
+
is_verification_command(head) ? filters : [],
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
|
|
100
108
|
function command_pieces(command: string): Array<string> {
|
|
101
109
|
return pipelines_of(command).flat()
|
|
102
110
|
}
|
|
@@ -125,7 +133,12 @@ function keeps_verdict_intact(command: string): boolean {
|
|
|
125
133
|
// `grep` stopping at its first match — closes the pipe on a check still writing, and under `pipefail` the
|
|
126
134
|
// check's SIGPIPE turns a passing run into exit 141; `head` also cuts the verdict line josh prints last.
|
|
127
135
|
// `cut`, `sort`, `uniq` and `wc` read to the end as well, and a `grep … | cut -c1-250` narrowing was the
|
|
128
|
-
// commonest masking still refused after #3875 (joshuafolkken/kit#3920).
|
|
136
|
+
// commonest masking still refused after #3875 (joshuafolkken/kit#3920). `tee` passes every line on, and an
|
|
137
|
+
// `awk` or `sed` script reads to the end where it can neither exit nor reach past the pipe — read on the
|
|
138
|
+
// typed piece, since the script is quoted: an `awk` program with no `exit`, `nextfile`, `system`, `getline` or `|`,
|
|
139
|
+
// and a `sed` script of `p`, `d` and `s///` alone (joshuafolkken/kit#5266). A quoted `<`, `>` or `&`
|
|
140
|
+
// still refuses below: inside `awk` a `>` may be `print > "f"`, which no reading here tells from a
|
|
141
|
+
// comparison.
|
|
129
142
|
//
|
|
130
143
|
// **Each masked check is wrapped on its own, and the rest of the line runs as typed.** Most of the
|
|
131
144
|
// refusals left after #3570 were a check chained beside other work — `vitest …; pnpm josh lint:related
|
|
@@ -143,9 +156,18 @@ function keeps_verdict_intact(command: string): boolean {
|
|
|
143
156
|
const PIPEFAIL_OPEN = '(set -o pipefail; '
|
|
144
157
|
const PIPEFAIL_CLOSE = ')'
|
|
145
158
|
const COMMENT_START = /(?:^|\s)#/u
|
|
146
|
-
const FULL_READING_FILTER = /^(?:tail|grep|cut|sort|uniq|wc)
|
|
159
|
+
const FULL_READING_FILTER = /^(?:tail|grep|cut|sort|uniq|wc|tee)(?=\s|$)/u
|
|
147
160
|
const EARLY_EXIT_GREP =
|
|
148
161
|
/^grep\b.*\s(?:-[a-zA-Z]*[lLmq]|--(?:quiet|silent|max-count|files-with(?:out)?-match))/u
|
|
162
|
+
const AWK_PROGRAM = /^awk\s+(?:-F\s*\S+\s+)?'[^']*'$/u
|
|
163
|
+
const AWK_EARLY_EXIT = /\b(?:exit|nextfile|system|getline)\b|\|/u
|
|
164
|
+
const SED_TEXT = String.raw`(?:[^/\\']|\\.)*`
|
|
165
|
+
const SED_ADDRESS = String.raw`(?:\d+|\$|/${SED_TEXT}/)`
|
|
166
|
+
const SED_COMMAND = String.raw`(?:${SED_ADDRESS}(?:,${SED_ADDRESS})?)?!?(?:p|d|s/${SED_TEXT}/${SED_TEXT}/[gip\d]*)`
|
|
167
|
+
const SED_PROGRAM = new RegExp(
|
|
168
|
+
String.raw`^sed\s+(?:-[nEr]+\s+)*'${SED_COMMAND}(?:;\s*${SED_COMMAND})*'$`,
|
|
169
|
+
'u',
|
|
170
|
+
)
|
|
149
171
|
|
|
150
172
|
const ALLOWED_OPERATORS = /2>&1|&&/gu
|
|
151
173
|
const SIDE_EFFECT_SYNTAX = /[&<>`]|\$\(/u
|
|
@@ -156,14 +178,40 @@ const PIPEFAIL_NOTE =
|
|
|
156
178
|
"`(set -o pipefail; …)` to carry the check's status, and the rest of the line ran as typed. Read " +
|
|
157
179
|
'the printed verdict, never the exit code alone — `prompts/collaboration-workflow/output-bounds.md`.'
|
|
158
180
|
|
|
159
|
-
function
|
|
160
|
-
|
|
181
|
+
function is_full_reading_script(typed: string): boolean {
|
|
182
|
+
if (AWK_PROGRAM.test(typed)) return !AWK_EARLY_EXIT.test(typed)
|
|
183
|
+
|
|
184
|
+
return SED_PROGRAM.test(typed)
|
|
161
185
|
}
|
|
162
186
|
|
|
163
|
-
|
|
164
|
-
|
|
187
|
+
// A filter's name and flags are read on the blanked piece, its quoted script on the typed one.
|
|
188
|
+
function reads_to_the_end(piece: string, typed: string): boolean {
|
|
189
|
+
if (FULL_READING_FILTER.test(piece)) return !EARLY_EXIT_GREP.test(piece)
|
|
165
190
|
|
|
166
|
-
return
|
|
191
|
+
return is_full_reading_script(typed)
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// The typed text at the offsets of the blanked pieces, each `gap` characters apart — the blanked line
|
|
195
|
+
// keeps every offset, so a cut found there is the same cut in the typed one.
|
|
196
|
+
function typed_slices(raw: string, pieces: ReadonlyArray<string>, gap: number): Array<string> {
|
|
197
|
+
const offset = { at: 0 }
|
|
198
|
+
|
|
199
|
+
return pieces.map((piece) => {
|
|
200
|
+
const typed = raw.slice(offset.at, offset.at + piece.length)
|
|
201
|
+
|
|
202
|
+
offset.at += piece.length + gap
|
|
203
|
+
|
|
204
|
+
return typed
|
|
205
|
+
})
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function is_filtered_check(pieces: ReadonlyArray<string>, typed: ReadonlyArray<string>): boolean {
|
|
209
|
+
const [head = '', ...filters] = pieces.map((piece) => piece.trim())
|
|
210
|
+
|
|
211
|
+
return (
|
|
212
|
+
is_verification_command(head) &&
|
|
213
|
+
filters.every((piece, index) => reads_to_the_end(piece, typed[index + 1]?.trim() ?? ''))
|
|
214
|
+
)
|
|
167
215
|
}
|
|
168
216
|
|
|
169
217
|
function has_side_effect_syntax(command: string): boolean {
|
|
@@ -173,9 +221,13 @@ function has_side_effect_syntax(command: string): boolean {
|
|
|
173
221
|
// The side-effect syntax is read on the typed part, since a double-quoted `$(cmd)` still runs; the pipe
|
|
174
222
|
// cut and the grouping are read on the blanked one, since a quoted `|` or `(` is text.
|
|
175
223
|
function is_rewritable_part(raw: string, judged: string): boolean {
|
|
176
|
-
const
|
|
224
|
+
const pieces = judged.split('|')
|
|
177
225
|
|
|
178
|
-
return
|
|
226
|
+
return (
|
|
227
|
+
!has_side_effect_syntax(raw) &&
|
|
228
|
+
!GROUP_SYNTAX.test(judged) &&
|
|
229
|
+
is_filtered_check(pieces, typed_slices(raw, pieces, 1))
|
|
230
|
+
)
|
|
179
231
|
}
|
|
180
232
|
|
|
181
233
|
// Where the part's code ends: an unquoted `#` opens a comment, which would swallow the closing `)`.
|
|
@@ -210,14 +262,10 @@ function pipefail_command(command: string): string | undefined {
|
|
|
210
262
|
|
|
211
263
|
if (judged === undefined || !is_masked_verification(command)) return undefined
|
|
212
264
|
|
|
213
|
-
const
|
|
214
|
-
const parts =
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
offset.at += part.length
|
|
218
|
-
|
|
219
|
-
return rewritten_part(raw, part)
|
|
220
|
-
})
|
|
265
|
+
const pieces = shell_segments.parts_of(judged)
|
|
266
|
+
const parts = typed_slices(command, pieces, 0).map((raw, index) =>
|
|
267
|
+
rewritten_part(raw, pieces[index] ?? ''),
|
|
268
|
+
)
|
|
221
269
|
|
|
222
270
|
const rewritten = parts.includes(undefined) ? undefined : parts.join('')
|
|
223
271
|
|
|
@@ -236,9 +284,11 @@ function pipefail_input(call: GuardedCall): Record<string, unknown> | undefined
|
|
|
236
284
|
}
|
|
237
285
|
|
|
238
286
|
const piped_verification = {
|
|
287
|
+
EARLY_EXIT_GREP,
|
|
239
288
|
PIPED_VERIFICATION_REASON,
|
|
240
289
|
PIPEFAIL_NOTE,
|
|
241
290
|
VERIFICATION_COMMANDS,
|
|
291
|
+
check_filters,
|
|
242
292
|
is_masked_verification,
|
|
243
293
|
keeps_verdict_intact,
|
|
244
294
|
pipefail_input,
|