@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,84 @@
|
|
|
1
|
+
import { delivered_rules, type MeasuredRule } from './delivered-rules'
|
|
2
|
+
import type { RuleReading } from './rule-value'
|
|
3
|
+
|
|
4
|
+
// The rules `rule:value`'s reading says can go or shrink — the evidence
|
|
5
|
+
// `prompts/collaboration-workflow/residency.md` lets a retirement or a condensation rest on. **It lists, never removes**: each candidate is retired or condensed in an
|
|
6
|
+
// Issue of its own, or kept with a recorded reason.
|
|
7
|
+
//
|
|
8
|
+
// - **Retire**: no run reached the rule, over a window large enough for "never" to mean something.
|
|
9
|
+
// Below it nothing is judged, since a fresh checkout reaches no rule at all. **Measurable rows
|
|
10
|
+
// only**: an unmeasured row's trigger is the violation itself, so its `reached 0` says the rule was
|
|
11
|
+
// never broken — the guard working — not that its situation never arose. A measurable row's trigger
|
|
12
|
+
// is a neutral act or it declares `reaches` (`rule-value.ts`, `RuleReading.sessions`).
|
|
13
|
+
// - **Condense**: the hook refuses the rule on every occurrence (`decide`) and has refused it at least
|
|
14
|
+
// once, so the prose need only point at the row — the hook, not the text, keeps it.
|
|
15
|
+
|
|
16
|
+
// The one threshold: the runs a reading must cover before a rule no run reached is a retirement
|
|
17
|
+
// candidate.
|
|
18
|
+
const MIN_RUNS_FOR_RETIREMENT = 20
|
|
19
|
+
const SEPARATOR = ', '
|
|
20
|
+
const NONE = 'none'
|
|
21
|
+
|
|
22
|
+
interface RuleCandidates {
|
|
23
|
+
retire: ReadonlyArray<string>
|
|
24
|
+
condense: ReadonlyArray<string>
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function retire_candidates(readings: ReadonlyArray<RuleReading>, runs: number): Array<string> {
|
|
28
|
+
if (runs < MIN_RUNS_FOR_RETIREMENT) return []
|
|
29
|
+
|
|
30
|
+
return readings
|
|
31
|
+
.filter((reading) => reading.is_measurable && reading.sessions === 0)
|
|
32
|
+
.map((reading) => reading.id)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function is_enforced_on_every_occurrence(id: string, rules: ReadonlyArray<MeasuredRule>): boolean {
|
|
36
|
+
return rules.some((rule) => rule.id === id && rule.decide !== undefined)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function condense_candidates(
|
|
40
|
+
readings: ReadonlyArray<RuleReading>,
|
|
41
|
+
rules: ReadonlyArray<MeasuredRule> = delivered_rules.MEASURED_RULES,
|
|
42
|
+
): Array<string> {
|
|
43
|
+
return readings
|
|
44
|
+
.filter((reading) => reading.refusals > 0)
|
|
45
|
+
.filter((reading) => is_enforced_on_every_occurrence(reading.id, rules))
|
|
46
|
+
.map((reading) => reading.id)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function judge(
|
|
50
|
+
readings: ReadonlyArray<RuleReading>,
|
|
51
|
+
runs: number,
|
|
52
|
+
rules: ReadonlyArray<MeasuredRule> = delivered_rules.MEASURED_RULES,
|
|
53
|
+
): RuleCandidates {
|
|
54
|
+
return {
|
|
55
|
+
retire: retire_candidates(readings, runs),
|
|
56
|
+
condense: condense_candidates(readings, rules),
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function listed(ids: ReadonlyArray<string>): string {
|
|
61
|
+
return ids.length === 0 ? NONE : ids.join(SEPARATOR)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function render(candidates: RuleCandidates, runs: number): string {
|
|
65
|
+
const window = `${runs.toString()} runs, threshold ${MIN_RUNS_FOR_RETIREMENT.toString()}`
|
|
66
|
+
|
|
67
|
+
return [
|
|
68
|
+
'candidates:',
|
|
69
|
+
` retire (reached 0; ${window}): ${listed(candidates.retire)}`,
|
|
70
|
+
` condense (refused on every occurrence by its hook): ${listed(candidates.condense)}`,
|
|
71
|
+
].join('\n')
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const rule_value_candidates = {
|
|
75
|
+
condense_candidates,
|
|
76
|
+
judge,
|
|
77
|
+
render,
|
|
78
|
+
retire_candidates,
|
|
79
|
+
MIN_RUNS_FOR_RETIREMENT,
|
|
80
|
+
NONE,
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export type { RuleCandidates }
|
|
84
|
+
export { rule_value_candidates }
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { cost_transcript, type SessionFile } from '#scripts/cost-runtime/cost-transcript'
|
|
4
4
|
import { delivered_rules } from './delivered-rules'
|
|
5
|
+
import { piped_verification_shapes, type ShapeCounts } from './piped-verification-shapes'
|
|
5
6
|
import { rule_value, type RuleReading } from './rule-value'
|
|
6
|
-
import { rule_value_cache } from './rule-value-cache'
|
|
7
|
+
import { rule_value_cache, type FreshReading } from './rule-value-cache'
|
|
8
|
+
import { rule_value_candidates } from './rule-value-candidates'
|
|
7
9
|
|
|
8
10
|
// `josh rule:value` — what each delivered rule earns on the channel that carries it, one row per rule.
|
|
9
11
|
// `rule_value.measure` was public but had no caller outside its own test, so
|
|
@@ -17,6 +19,8 @@ import { rule_value_cache } from './rule-value-cache'
|
|
|
17
19
|
|
|
18
20
|
const ARGV_OFFSET = 2
|
|
19
21
|
const REFRESH_FLAG = '--refresh'
|
|
22
|
+
const FRESH_FLAG = '--fresh'
|
|
23
|
+
const CACHED_NOTE = 'cached reading taken at'
|
|
20
24
|
const PERCENT_SIGN = '%'
|
|
21
25
|
const COLUMN_GAP = ' '
|
|
22
26
|
const NO_TARGETS = 'no measurement targets'
|
|
@@ -26,46 +30,65 @@ const UNMEASURED = 'unmeasured'
|
|
|
26
30
|
// A measurable rule no run reached: the denominator is zero, so no rate is taken over it.
|
|
27
31
|
const UNREACHED = 'unreached'
|
|
28
32
|
|
|
29
|
-
interface OwnedText {
|
|
30
|
-
owner: string
|
|
31
|
-
text: string
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function owned_text(file: SessionFile): OwnedText | undefined {
|
|
35
|
-
const text = cost_transcript.read_optional(file)
|
|
36
|
-
|
|
37
|
-
if (text === undefined) return undefined
|
|
38
|
-
|
|
39
|
-
return { owner: cost_transcript.owning_session_id(file), text }
|
|
40
|
-
}
|
|
41
|
-
|
|
42
33
|
// Every transcript grouped by the run it belongs to: a session's own file and the units it delegated
|
|
43
34
|
// share one `owning_session_id`, so a lane child is counted with its parent rather than as a run of
|
|
44
|
-
// its own — the unit `rule_value.measure` reads.
|
|
45
|
-
|
|
46
|
-
|
|
35
|
+
// its own — the unit `rule_value.measure` reads. **Paths only**: no text is read here, so the
|
|
36
|
+
// grouping never holds the corpus.
|
|
37
|
+
function group_by_run(files: ReadonlyArray<SessionFile>): Map<string, Array<SessionFile>> {
|
|
38
|
+
const runs = new Map<string, Array<SessionFile>>()
|
|
47
39
|
|
|
48
40
|
for (const file of files) {
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
if (owned === undefined) continue
|
|
41
|
+
const owner = cost_transcript.owning_session_id(file)
|
|
42
|
+
const owned = runs.get(owner) ?? []
|
|
52
43
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
texts.push(owned.text)
|
|
56
|
-
runs.set(owned.owner, texts)
|
|
44
|
+
owned.push(file)
|
|
45
|
+
runs.set(owner, owned)
|
|
57
46
|
}
|
|
58
47
|
|
|
59
48
|
return runs
|
|
60
49
|
}
|
|
61
50
|
|
|
51
|
+
function readable_texts(files: ReadonlyArray<SessionFile>): Array<string> {
|
|
52
|
+
return files
|
|
53
|
+
.map((file) => cost_transcript.read_optional(file))
|
|
54
|
+
.filter((text): text is string => text !== undefined)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// **One run read at a time.** Each run's text is read only when `measure` asks for it and released
|
|
58
|
+
// before the next is read, so the peak is the largest run rather than the whole corpus. A run whose
|
|
59
|
+
// every file is unreadable yields nothing, as it was never a measurement target.
|
|
60
|
+
function* runs_of(groups: Iterable<ReadonlyArray<SessionFile>>): Generator<Array<string>> {
|
|
61
|
+
for (const files of groups) {
|
|
62
|
+
const texts = readable_texts(files)
|
|
63
|
+
|
|
64
|
+
if (texts.length > 0) yield texts
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
62
68
|
// Every run reachable from the working tree — the session's own transcript directory and any lane
|
|
63
|
-
// slugs beneath its main checkout —
|
|
64
|
-
function gather_runs(cwd: string = process.cwd()):
|
|
69
|
+
// slugs beneath its main checkout — in the shape `rule_value.measure` reads.
|
|
70
|
+
function gather_runs(cwd: string = process.cwd()): Generator<Array<string>> {
|
|
65
71
|
const directories = cost_transcript.transcript_directories(cwd)
|
|
66
72
|
const files = cost_transcript.list_sessions_across(directories)
|
|
67
73
|
|
|
68
|
-
return
|
|
74
|
+
return runs_of(group_by_run(files).values())
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The `piped-verification` refusals are named by shape in the same pass, so the corpus is read once.
|
|
78
|
+
interface Tally {
|
|
79
|
+
runs: number
|
|
80
|
+
shapes: ShapeCounts
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function* counted(
|
|
84
|
+
runs: Iterable<ReadonlyArray<string>>,
|
|
85
|
+
tally: Tally,
|
|
86
|
+
): Generator<ReadonlyArray<string>> {
|
|
87
|
+
for (const texts of runs) {
|
|
88
|
+
tally.runs += 1
|
|
89
|
+
for (const text of texts) piped_verification_shapes.count(text, tally.shapes)
|
|
90
|
+
yield texts
|
|
91
|
+
}
|
|
69
92
|
}
|
|
70
93
|
|
|
71
94
|
// The id column, wide enough for the longest rule id, so the reading lines up whatever the registry
|
|
@@ -92,24 +115,65 @@ function row(reading: RuleReading): string {
|
|
|
92
115
|
return [id, reached, rate_text(reading), refused, ...rewritten].join(COLUMN_GAP)
|
|
93
116
|
}
|
|
94
117
|
|
|
118
|
+
// `candidates` is set only where something measurable was found, so `NO_TARGETS` stays the whole answer.
|
|
119
|
+
interface Rendered {
|
|
120
|
+
table: string
|
|
121
|
+
candidates?: string
|
|
122
|
+
}
|
|
123
|
+
|
|
95
124
|
// The reading as text, or `NO_TARGETS` when nothing measurable was found — never an empty output that
|
|
96
125
|
// would read as a broken command.
|
|
97
|
-
|
|
98
|
-
|
|
126
|
+
// The runs are counted as `measure` consumes them, since a lazy source cannot be asked its length
|
|
127
|
+
// up front.
|
|
128
|
+
function render_parts(runs: Iterable<ReadonlyArray<string>>): Rendered {
|
|
129
|
+
const tally: Tally = { runs: 0, shapes: new Map() }
|
|
130
|
+
const readings = rule_value.measure(counted(runs, tally))
|
|
131
|
+
|
|
132
|
+
if (tally.runs === 0) return { table: NO_TARGETS }
|
|
133
|
+
|
|
134
|
+
const judged = rule_value_candidates.judge(readings, tally.runs)
|
|
135
|
+
const shapes = piped_verification_shapes.render(tally.shapes)
|
|
99
136
|
|
|
100
|
-
return
|
|
101
|
-
.
|
|
102
|
-
.
|
|
103
|
-
|
|
137
|
+
return {
|
|
138
|
+
table: readings.map((reading) => row(reading)).join('\n'),
|
|
139
|
+
candidates: `${rule_value_candidates.render(judged, tally.runs)}\n${shapes}`,
|
|
140
|
+
}
|
|
104
141
|
}
|
|
105
142
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
143
|
+
function render(runs: Iterable<ReadonlyArray<string>>): string {
|
|
144
|
+
return render_parts(runs).table
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// The cached table and when it was taken. The cache holds the table alone, so the line names the flag
|
|
148
|
+
// that measures now for the `candidates:` section too.
|
|
149
|
+
function cached_text(fresh: FreshReading): string {
|
|
150
|
+
const taken_at = fresh.taken_at.toISOString()
|
|
110
151
|
|
|
111
|
-
|
|
112
|
-
|
|
152
|
+
return `${fresh.text.trimEnd()}\n\n${CACHED_NOTE} ${taken_at} — ${FRESH_FLAG} to measure now, with candidates`
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function print_measured(cwd: string): void {
|
|
156
|
+
const { table, candidates } = render_parts(gather_runs(cwd))
|
|
157
|
+
|
|
158
|
+
process.stdout.write(`${[table, candidates].filter(Boolean).join('\n\n')}\n`)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function print_reading(argv: ReadonlyArray<string>, cwd: string): void {
|
|
162
|
+
const fresh = argv.includes(FRESH_FLAG) ? undefined : rule_value_cache.read_fresh(cwd)
|
|
163
|
+
|
|
164
|
+
if (fresh === undefined) print_measured(cwd)
|
|
165
|
+
else process.stdout.write(`${cached_text(fresh)}\n`)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// `--refresh` is the detached measurement the `backlogrun` loop head starts: the table goes to the
|
|
169
|
+
// cache `backlog:offer` prints from, never to stdout (`rule-value-cache.ts`). The candidates are read
|
|
170
|
+
// when a rule is retired, not at the loop head, so they print to stdout only and the cache keeps its
|
|
171
|
+
// shape. Bare, a reading cached inside the refresh interval is printed instead of measuring again —
|
|
172
|
+
// the measurement re-reads every transcript and takes minutes (joshuafolkken/kit#5186); `--fresh`
|
|
173
|
+
// measures regardless.
|
|
174
|
+
function run_rule_value(argv: ReadonlyArray<string> = [], cwd: string = process.cwd()): number {
|
|
175
|
+
if (argv.includes(REFRESH_FLAG)) rule_value_cache.store(render_parts(gather_runs(cwd)).table, cwd)
|
|
176
|
+
else print_reading(argv, cwd)
|
|
113
177
|
|
|
114
178
|
return 0
|
|
115
179
|
}
|
|
@@ -121,8 +185,11 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
|
121
185
|
const rule_value_cli = {
|
|
122
186
|
group_by_run,
|
|
123
187
|
render,
|
|
188
|
+
render_parts,
|
|
124
189
|
row,
|
|
125
190
|
run_rule_value,
|
|
191
|
+
runs_of,
|
|
192
|
+
CACHED_NOTE,
|
|
126
193
|
NO_TARGETS,
|
|
127
194
|
UNMEASURED,
|
|
128
195
|
UNREACHED,
|
|
@@ -40,7 +40,7 @@ const PERCENT = 100
|
|
|
40
40
|
// **A refusal is an errored result, which is what separates it from a read of the file it is written
|
|
41
41
|
// in.** Every signature exists verbatim in the module its rule is written in — the six delivered
|
|
42
42
|
// rules in `scripts/rules/delivered-rules.ts`, the batching row's in
|
|
43
|
-
// `
|
|
43
|
+
// `tools/time/time-batch-guard.ts` — so a session that
|
|
44
44
|
// merely opened that file carries the text too — and did so in a result whose `is_error` is false.
|
|
45
45
|
//
|
|
46
46
|
// **That fact is read off the parsed block, never off the raw line**. The
|
|
@@ -159,7 +159,8 @@ function observe_call(
|
|
|
159
159
|
}
|
|
160
160
|
|
|
161
161
|
// One transcript line, parsed once, as the things a reading is taken from: the calls it issued, the
|
|
162
|
-
//
|
|
162
|
+
// refusals the harness wrote back (failed results and Stop-hook blocks), and the context a hook
|
|
163
|
+
// attached.
|
|
163
164
|
interface DatedLine {
|
|
164
165
|
at_ms: number
|
|
165
166
|
message_id: string
|
|
@@ -183,6 +184,14 @@ function errors_of(parsed: TranscriptLine): Array<string> {
|
|
|
183
184
|
.filter((text) => text !== '')
|
|
184
185
|
}
|
|
185
186
|
|
|
187
|
+
// **A Stop-hook block is a refusal too** — of ending the turn — so its reason joins the
|
|
188
|
+
// tool results the harness wrote back as failures (joshuafolkken/kit#4978).
|
|
189
|
+
function refusals_of(parsed: TranscriptLine): Array<string> {
|
|
190
|
+
const errors = errors_of(parsed)
|
|
191
|
+
|
|
192
|
+
return parsed.stop_feedback === '' ? errors : [...errors, parsed.stop_feedback]
|
|
193
|
+
}
|
|
194
|
+
|
|
186
195
|
function dated_line(line: string): DatedLine | undefined {
|
|
187
196
|
const parsed = line === '' ? undefined : time_transcript_line.parse_line(line)
|
|
188
197
|
|
|
@@ -192,7 +201,7 @@ function dated_line(line: string): DatedLine | undefined {
|
|
|
192
201
|
at_ms: parsed.timestamp_ms,
|
|
193
202
|
message_id: parsed.message_id,
|
|
194
203
|
calls: calls_of(parsed),
|
|
195
|
-
errors:
|
|
204
|
+
errors: refusals_of(parsed),
|
|
196
205
|
contexts: hook_context_line.hook_contexts_of(line),
|
|
197
206
|
}
|
|
198
207
|
}
|
|
@@ -250,10 +259,14 @@ function turns_by_key(entries: ReadonlyArray<DatedLine>): Map<string, Array<Issu
|
|
|
250
259
|
// each of them; the file opens with its imports, so under this test nothing claims it. Position is
|
|
251
260
|
// what separates the two, so no count of how many signatures appear is needed — and a body naming
|
|
252
261
|
// several can no longer be attributed to any of them.
|
|
262
|
+
//
|
|
263
|
+
// **The harness's own label is not the body.** It writes a deny as `PreToolUse:<Tool> hook error: ⛔ …`,
|
|
264
|
+
// so the label is stripped before the opening is read; compared raw, no recorded refusal matched
|
|
265
|
+
// (joshuafolkken/kit#4961).
|
|
253
266
|
function refused_id(text: string): string | undefined {
|
|
254
|
-
const body =
|
|
267
|
+
const body = time_transcript_line.refusal_body(text)
|
|
255
268
|
const found = delivered_rules.MEASURED_RULES.find((rule) =>
|
|
256
|
-
[rule.reason, ...(rule.former_reasons ?? [])].some((reason) =>
|
|
269
|
+
[rule.reason, ...(rule.former_reasons ?? []), ...(rule.stop_reasons ?? [])].some((reason) =>
|
|
257
270
|
body.startsWith(reason.slice(0, REASON_SIGNATURE_LENGTH)),
|
|
258
271
|
),
|
|
259
272
|
)
|
|
@@ -35,7 +35,7 @@ import { shell_segments } from './shell-segments'
|
|
|
35
35
|
// one command cannot disagree: an opening subshell parenthesis, environment assignments, and the
|
|
36
36
|
// package-manager wrapper in either of its spellings. Left out, `JOSH_CI_TIMEOUT_SECONDS=600 pnpm
|
|
37
37
|
// josh git -y` and `(pnpm josh git -y)` are silently not the push step, and the run pays the tail the
|
|
38
|
-
// rule exists to stop. `g` is the alias `josh-
|
|
38
|
+
// rule exists to stop. `g` is the alias `josh-aliases.ts` resolves to `git`.
|
|
39
39
|
const SEGMENT_PREFIX = String.raw`(?:\(\s*)?(?:[A-Za-z_][A-Za-z0-9_]*=\S*\s+)*(?:npx\s+|pnpm\s+(?:exec\s+|run\s+)?)?`
|
|
40
40
|
// A closing parenthesis ends a word as a space does, so every boundary below admits it — without
|
|
41
41
|
// that, a subshell defeats the flag test even where it does not defeat the command test.
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { file_reader } from '#scripts/lib/read-file'
|
|
2
|
+
import { bash_triggers } from './bash-triggers'
|
|
3
|
+
import { git_argv } from './git-argv'
|
|
4
|
+
import { shell_segments } from './shell-segments'
|
|
5
|
+
|
|
6
|
+
// The trigger and the delivered text behind the `sed-in-place` row of `delivered-rules.ts`: a `sed -i`
|
|
7
|
+
// that `file-edits.md`'s countable conditions do not clear (joshuafolkken/kit#5284).
|
|
8
|
+
//
|
|
9
|
+
// **The conditions are counts, so the guard counts them.** `file-edits.md` allows `sed -i` only for a
|
|
10
|
+
// single `s` command whose pattern carries no meta character and matches exactly once in each target
|
|
11
|
+
// file. Anything else — a meta character, a count other than one, a script that is not one `s` command —
|
|
12
|
+
// can rewrite a line the run never meant to touch, and `Edit` is the tool that cannot.
|
|
13
|
+
//
|
|
14
|
+
// It fires on every occurrence, for the reason `file-body.ts` does.
|
|
15
|
+
|
|
16
|
+
const SED = 'sed'
|
|
17
|
+
// `-i`, `-i.bak`, `-Ei`: a short cluster carrying the in-place switch; `--in-place[=suffix]` long.
|
|
18
|
+
const IN_PLACE_SHORT = /^-[A-Za-z]*i/u
|
|
19
|
+
const IN_PLACE_LONG = /^--in-place(?:=|$)/u
|
|
20
|
+
// A short cluster ending in the in-place switch: BSD reads its suffix from the next word.
|
|
21
|
+
const IN_PLACE_CLUSTER = /^-[A-Za-z]*i$/u
|
|
22
|
+
// `-E`, `-r`, `--regexp-extended`: the pattern is read as an extended regex, where `+ ? ( ) { } |`
|
|
23
|
+
// are meta characters too, so a plain-text count no longer says what sed matches.
|
|
24
|
+
const EXTENDED_SHORT = /^-[A-Za-z]*[Er]/u
|
|
25
|
+
const EXTENDED_LONG = '--regexp-extended'
|
|
26
|
+
// The `s` flags that keep the match plain text: none, or `g` (each line holds one match at most when
|
|
27
|
+
// the count is one). `I`, `w file`, a number and the rest change what or where sed writes.
|
|
28
|
+
const PLAIN_FLAGS: ReadonlySet<string> = new Set(['', 'g'])
|
|
29
|
+
const SCRIPT_FLAG = '-e'
|
|
30
|
+
const FLAG_PREFIX = '-'
|
|
31
|
+
const SURROUNDING_QUOTES = /^(['"])(.*)\1$/su
|
|
32
|
+
const QUOTED_BODY = 2
|
|
33
|
+
// `file-edits.md`'s meta characters: `/ & \ . * [ ] ^ $`.
|
|
34
|
+
const META_CHARACTER = /[/&\\.*[\]^$]/u
|
|
35
|
+
const SUBSTITUTE = 's'
|
|
36
|
+
const SUBSTITUTE_PARTS = 3
|
|
37
|
+
const ONE_MATCH = 1
|
|
38
|
+
|
|
39
|
+
interface SedCall {
|
|
40
|
+
scripts: Array<string>
|
|
41
|
+
files: Array<string>
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function unquoted(word: string): string {
|
|
45
|
+
return SURROUNDING_QUOTES.exec(word)?.[QUOTED_BODY] ?? word
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function is_in_place_flag(word: string): boolean {
|
|
49
|
+
return IN_PLACE_LONG.test(word) || IN_PLACE_SHORT.test(word)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// The words after the in-place flags: BSD's `-i ''` carries its suffix as the next (empty) word.
|
|
53
|
+
function without_suffix(words: ReadonlyArray<string>): Array<string> {
|
|
54
|
+
const index = words.findIndex((word) => IN_PLACE_CLUSTER.test(word))
|
|
55
|
+
|
|
56
|
+
if (index === -1 || words[index + 1] !== '') return [...words]
|
|
57
|
+
|
|
58
|
+
return words.toSpliced(index + 1, 1)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function sed_words(segment: string): Array<string> | undefined {
|
|
62
|
+
const words = git_argv.arguments_of(segment, SED)?.map((word) => unquoted(word))
|
|
63
|
+
|
|
64
|
+
return words?.some((word) => is_in_place_flag(word)) === true ? without_suffix(words) : undefined
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function is_script_value(words: ReadonlyArray<string>, index: number): boolean {
|
|
68
|
+
return words[index - 1] === SCRIPT_FLAG
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// The scripts (`-e <script>`, or the first operand without one) and the files of an in-place `sed`.
|
|
72
|
+
function sed_call(words: ReadonlyArray<string>): SedCall {
|
|
73
|
+
const scripts = words.filter((_word, index) => is_script_value(words, index))
|
|
74
|
+
const operands = words.filter(
|
|
75
|
+
(word, index) => !word.startsWith(FLAG_PREFIX) && !is_script_value(words, index),
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
if (scripts.length > 0) return { scripts, files: operands }
|
|
79
|
+
|
|
80
|
+
const [script, ...files] = operands
|
|
81
|
+
|
|
82
|
+
return { scripts: script === undefined ? [] : [script], files }
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// An `s` command split on its delimiter into the pattern, the replacement and the flags; `undefined`
|
|
86
|
+
// for any other script.
|
|
87
|
+
function substitute_parts(script: string): Array<string> | undefined {
|
|
88
|
+
if (!script.startsWith(SUBSTITUTE)) return undefined
|
|
89
|
+
|
|
90
|
+
const parts = script.slice(SUBSTITUTE.length + 1).split(script.charAt(SUBSTITUTE.length))
|
|
91
|
+
|
|
92
|
+
return parts.length === SUBSTITUTE_PARTS ? parts : undefined
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// `file-edits.md` condition 2 reads both sides: no meta character in the pattern or the replacement,
|
|
96
|
+
// and no flag that turns the plain-text match into something else.
|
|
97
|
+
function has_plain_flags(parts: ReadonlyArray<string>): boolean {
|
|
98
|
+
return PLAIN_FLAGS.has(parts.at(-1) ?? '')
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function is_plain(parts: ReadonlyArray<string>): boolean {
|
|
102
|
+
const [pattern = '', replacement = ''] = parts
|
|
103
|
+
|
|
104
|
+
return pattern !== '' && has_plain_flags(parts) && !META_CHARACTER.test(pattern + replacement)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function is_extended(words: ReadonlyArray<string>): boolean {
|
|
108
|
+
return words.some((word) => word === EXTENDED_LONG || EXTENDED_SHORT.test(word))
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// The one script of a basic-regex in-place `sed`; `undefined` for several, none, or `-E`.
|
|
112
|
+
function single_script(words: ReadonlyArray<string>): string | undefined {
|
|
113
|
+
if (is_extended(words)) return undefined
|
|
114
|
+
|
|
115
|
+
const { scripts } = sed_call(words)
|
|
116
|
+
|
|
117
|
+
return scripts.length === 1 ? scripts[0] : undefined
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// The pattern of a single plain `s` command; `undefined` for anything else.
|
|
121
|
+
function plain_pattern(words: ReadonlyArray<string>): string | undefined {
|
|
122
|
+
const script = single_script(words)
|
|
123
|
+
const parts = script === undefined ? undefined : substitute_parts(script)
|
|
124
|
+
|
|
125
|
+
return parts !== undefined && is_plain(parts) ? parts[0] : undefined
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function match_count(text: string, pattern: string): number {
|
|
129
|
+
return text.split(pattern).length - 1
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
type ReadFile = (file_path: string) => string
|
|
133
|
+
|
|
134
|
+
// The trigger: an in-place `sed` the conditions do not clear in any of its target files.
|
|
135
|
+
function is_unsafe_segment(segment: string, read: ReadFile): boolean {
|
|
136
|
+
const words = sed_words(segment)
|
|
137
|
+
|
|
138
|
+
if (words === undefined) return false
|
|
139
|
+
|
|
140
|
+
const { files } = sed_call(words)
|
|
141
|
+
const pattern = plain_pattern(words)
|
|
142
|
+
|
|
143
|
+
if (pattern === undefined || files.length === 0) return true
|
|
144
|
+
|
|
145
|
+
return files.some((file) => match_count(read(file), pattern) !== ONE_MATCH)
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function is_unsafe_sed(command: string, read: ReadFile = file_reader.read_file_or_empty): boolean {
|
|
149
|
+
return shell_segments.segments_of(command).some((segment) => is_unsafe_segment(segment, read))
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// The occasion the rule governs: any in-place `sed`.
|
|
153
|
+
function is_in_place_sed(command: string): boolean {
|
|
154
|
+
return shell_segments.segments_of(command).some((segment) => sed_words(segment) !== undefined)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Keeping the rule: an in-place `sed` whose script clears the static conditions. The per-file count
|
|
158
|
+
// is not re-read here, so a transcript is measured without the file as it stood then.
|
|
159
|
+
function keeps_plain_sed(command: string): boolean {
|
|
160
|
+
return shell_segments.segments_of(command).some((segment) => {
|
|
161
|
+
const words = sed_words(segment)
|
|
162
|
+
|
|
163
|
+
return words !== undefined && plain_pattern(words) !== undefined
|
|
164
|
+
})
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const SED_IN_PLACE_REASON =
|
|
168
|
+
'⛔ unsafe `sed -i`: its pattern or replacement carries a meta character (`/ & \\ . * [ ] ^ $`), ' +
|
|
169
|
+
'it is not one plain `s` command (a flag other than `g`, or `-E`), or it does not match exactly once in each target file, so it can rewrite a line you did ' +
|
|
170
|
+
'not mean to. Change the region with the Edit tool. This rule fires on every occurrence ' +
|
|
171
|
+
'(`prompts/collaboration-workflow/file-edits.md`).'
|
|
172
|
+
|
|
173
|
+
const ROW = {
|
|
174
|
+
id: 'sed-in-place',
|
|
175
|
+
is_trigger: bash_triggers.on_bash_command((command: string) => is_unsafe_sed(command)),
|
|
176
|
+
reason: SED_IN_PLACE_REASON,
|
|
177
|
+
decide: (): boolean => true,
|
|
178
|
+
keeps: bash_triggers.on_bash_command(keeps_plain_sed),
|
|
179
|
+
reaches: bash_triggers.on_bash_command(is_in_place_sed),
|
|
180
|
+
about: {
|
|
181
|
+
title: 'No `sed -i` its countable conditions do not clear',
|
|
182
|
+
topic: '`file-edits.md`',
|
|
183
|
+
fires:
|
|
184
|
+
'a `sed -i` whose script is not one `s` command, whose pattern or replacement has a meta character, or which does not match exactly once in a target file. Every occurrence',
|
|
185
|
+
quiet: 'not in place, or one plain `s` command matching once in each file',
|
|
186
|
+
},
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const sed_in_place = {
|
|
190
|
+
ROW,
|
|
191
|
+
is_in_place_sed,
|
|
192
|
+
is_unsafe_sed,
|
|
193
|
+
keeps_plain_sed,
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export { sed_in_place }
|
|
@@ -16,11 +16,51 @@ import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
|
16
16
|
const SEGMENT_SEPARATOR = /&&|\|\||;|\n/u
|
|
17
17
|
const SEGMENT_PARTS = new RegExp(`(${SEGMENT_SEPARATOR.source})`, 'u')
|
|
18
18
|
|
|
19
|
+
// **The rows that read a segment as argv cut at the pipe and the background `&` as well.** Their
|
|
20
|
+
// question is which program a segment launches, and `true | git push -f` or `x & git push -f`
|
|
21
|
+
// launches git all the same; a `--jq` fragment cut off by a `|` begins with no program word, so it
|
|
22
|
+
// launches nothing they look for. A `&` that belongs to a redirection (`2>&1`, `&>file`, `<&3`) does
|
|
23
|
+
// not cut, nor does the `|` of the clobber redirect `>|`.
|
|
24
|
+
const COMMAND_SEPARATOR = /&&|\|\||;|\n|(?<!>)\|&?|(?<![<>])&(?!>)/u
|
|
25
|
+
|
|
19
26
|
/** The line's commands, trimmed. Empty segments are kept: a caller anchoring at `^` rejects them. */
|
|
20
27
|
function segments_of(command: string): Array<string> {
|
|
21
28
|
return command.split(SEGMENT_SEPARATOR).map((segment) => segment.trim())
|
|
22
29
|
}
|
|
23
30
|
|
|
31
|
+
/** The line's commands as separate programs: the `segments_of` cut plus a pipe and a background `&`. */
|
|
32
|
+
function commands_of(command: string): Array<string> {
|
|
33
|
+
return command.split(COMMAND_SEPARATOR).map((segment) => segment.trim())
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const COMMAND_SEPARATORS = new RegExp(COMMAND_SEPARATOR.source, 'gu')
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The `commands_of` cut taken where the quote-blanked line puts each separator, so a `|` or `;`
|
|
40
|
+
* inside a quoted argument does not cut it; a heredoc line falls back to `commands_of`.
|
|
41
|
+
*/
|
|
42
|
+
function quote_aware_commands_of(command: string): Array<string> {
|
|
43
|
+
const plain = time_shell.blanked(command)
|
|
44
|
+
|
|
45
|
+
if (plain === undefined) return commands_of(command)
|
|
46
|
+
|
|
47
|
+
const cuts = [...plain.matchAll(COMMAND_SEPARATORS)].map((match) => ({
|
|
48
|
+
begin: match.index,
|
|
49
|
+
end: match.index + match[0].length,
|
|
50
|
+
}))
|
|
51
|
+
const starts = [0, ...cuts.map((cut) => cut.end)]
|
|
52
|
+
const stops = cuts.map((cut) => cut.begin)
|
|
53
|
+
|
|
54
|
+
return starts.map((start, index) => command.slice(start, stops[index] ?? command.length).trim())
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const LINE_CONTINUATION = /\\\n/gu
|
|
58
|
+
|
|
59
|
+
/** The line with each backslash-newline joined, so a continued call stays one command at a `\n` cut. */
|
|
60
|
+
function joined_continuations(command: string): string {
|
|
61
|
+
return command.replaceAll(LINE_CONTINUATION, ' ')
|
|
62
|
+
}
|
|
63
|
+
|
|
24
64
|
/** The same cut, untrimmed and with each separator kept between its commands, so the parts join back to the line. */
|
|
25
65
|
function parts_of(command: string): Array<string> {
|
|
26
66
|
return command.split(SEGMENT_PARTS)
|
|
@@ -55,9 +95,12 @@ function is_josh_command(segment: string, names: ReadonlySet<string>): boolean {
|
|
|
55
95
|
}
|
|
56
96
|
|
|
57
97
|
const shell_segments = {
|
|
98
|
+
commands_of,
|
|
58
99
|
first_of,
|
|
59
100
|
is_josh_command,
|
|
101
|
+
joined_continuations,
|
|
60
102
|
parts_of,
|
|
103
|
+
quote_aware_commands_of,
|
|
61
104
|
segments_of,
|
|
62
105
|
}
|
|
63
106
|
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { DeliveredRule } from './delivered-rules'
|
|
2
|
+
|
|
3
|
+
// The `Stop` hook's rows; `stop:guard` judges every stop. A row with a fixed answer runs it itself and
|
|
4
|
+
// blocks only when that fails; a row that needs judgement blocks the stop while it holds. They have no
|
|
5
|
+
// guard row, so the listing reads their description from here.
|
|
6
|
+
|
|
7
|
+
type StopRule = Pick<DeliveredRule, 'about' | 'id'>
|
|
8
|
+
|
|
9
|
+
const STOP_GUARD = 'pnpm josh stop:guard'
|
|
10
|
+
|
|
11
|
+
const ROWS: ReadonlyArray<StopRule> = [
|
|
12
|
+
{
|
|
13
|
+
id: 'stop-notify',
|
|
14
|
+
about: {
|
|
15
|
+
title: 'Stop notification',
|
|
16
|
+
topic: '`rule-delivery.md` → "stop-notify"',
|
|
17
|
+
entry: STOP_GUARD,
|
|
18
|
+
fires:
|
|
19
|
+
'a stop with the work tree held and no `confirmation` notify that turn. Sends the notify itself; blocks only when the send fails',
|
|
20
|
+
quiet: 'no hold, a `confirmation` notify on the tail, or a pre-gate cut taken',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
id: 'hold-release',
|
|
25
|
+
about: {
|
|
26
|
+
title: 'Hold release',
|
|
27
|
+
topic: '`.claude/skills/workflow-commands/working-tree-hold.md`',
|
|
28
|
+
entry: STOP_GUARD,
|
|
29
|
+
fires:
|
|
30
|
+
'a stop on a clean tree with the `run:hold` record still in place. Releases the hold itself; blocks only when that fails',
|
|
31
|
+
quiet:
|
|
32
|
+
'a dirty tree (a `halfrun` stop before the commit, a `needs-human-review` stop) or already released',
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: 'filing-offer',
|
|
37
|
+
about: {
|
|
38
|
+
title: 'Offer to file',
|
|
39
|
+
topic: '`.claude/skills/workflow-commands/observation-filing.md`',
|
|
40
|
+
entry: STOP_GUARD,
|
|
41
|
+
fires:
|
|
42
|
+
'an unattended run (a kit-launched headless session, a lane child, a `backlogrun` parent) whose last reply offers to file without filing. Blocks the stop',
|
|
43
|
+
quiet:
|
|
44
|
+
'an interactive session, already filed, inside a fence or quote, a named third-party `owner/repo`, or an unknown owner',
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
]
|
|
48
|
+
|
|
49
|
+
const stop_rule_rows = { ROWS }
|
|
50
|
+
|
|
51
|
+
export type { StopRule }
|
|
52
|
+
export { stop_rule_rows }
|