@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
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
2
2
|
import { bash_triggers } from './bash-triggers'
|
|
3
|
+
import { early_heartbeat } from './early-heartbeat'
|
|
4
|
+
import { shell_segments } from './shell-segments'
|
|
3
5
|
|
|
4
6
|
// The trigger and the delivered text behind the `poll-loop` row of `delivered-rules.ts`.
|
|
5
7
|
// The hand-written wait loop a lane child improvises over a backgrounded
|
|
@@ -23,8 +25,7 @@ import { bash_triggers } from './bash-triggers'
|
|
|
23
25
|
// back on the run's self-restraint — the thing that let these loops through in the first place.
|
|
24
26
|
|
|
25
27
|
// A `while` or `until` header, in either spelling a poll loop reaches for. The trailing whitespace is
|
|
26
|
-
// what separates the keyword from a path that merely begins with it (`until.txt`)
|
|
27
|
-
// by omission — it iterates a fixed list rather than probing a state.
|
|
28
|
+
// what separates the keyword from a path that merely begins with it (`until.txt`).
|
|
28
29
|
const LOOP_KEYWORD = /\b(?:while|until)\s/u
|
|
29
30
|
// A `sleep` command with any argument — the pause between probes that makes a loop a poll rather than
|
|
30
31
|
// a stream reader. Read anywhere in the line rather than at a command position, because the loop body
|
|
@@ -52,10 +53,72 @@ const PROBE_HEADERS: ReadonlyArray<RegExp> = [
|
|
|
52
53
|
String.raw`grep\s+-[A-Za-z]*q`,
|
|
53
54
|
].map((probe) => new RegExp(`${WHILE_HEADER}${probe}`, 'u'))
|
|
54
55
|
|
|
56
|
+
// **A counted `for` that sleeps is a poll with a deadline** (joshuafolkken/kit#4800). A lane child
|
|
57
|
+
// waited out a backgrounded reviewer with `for i in $(seq 1 30); do sleep 10; done`, and the
|
|
58
|
+
// completion notification sat queued until the loop returned — the same held-back exit a `while` poll
|
|
59
|
+
// costs, spelled as a count. A header that counts — `$(seq …)`, a `{1..N}` range, or `((…))` — has no
|
|
60
|
+
// list to work through, so its `sleep` is the whole point. A `for` over a real list (`for f in *.ts`)
|
|
61
|
+
// is ordinary work and passes, sleep or not. The `sleep` is read in the loop's body only — from the
|
|
62
|
+
// header to its first `done` — so a counted loop beside an unrelated `sleep` is not a wait (review
|
|
63
|
+
// round 1); a nested loop's inner `done` cuts the body short, which under-refuses and so fails safe.
|
|
64
|
+
const COUNTED_FOR = new RegExp(
|
|
65
|
+
String.raw`${COMMAND_POSITION}for(?:\s*\(\(|\s+\w+\s+in\s+(?:\$\(\s*seq\b|\{\d+\.\.))`,
|
|
66
|
+
'u',
|
|
67
|
+
)
|
|
68
|
+
const THROUGH_FIRST_DONE = /^[\s\S]*?\bdone\b/u
|
|
69
|
+
|
|
70
|
+
// **A sleep chain in front of a read is the same poll, unrolled** (joshuafolkken/kit#5115). A lane
|
|
71
|
+
// child watched a backgrounded task with `sleep 20; sleep 20; sleep 20; tail -c 1500 …/x.output` and
|
|
72
|
+
// `sleep 20; ps -p 123`: no loop keyword, so the rows above miss it, and a read segment makes it
|
|
73
|
+
// work rather than a bare timer, so `early-heartbeat` stands down. Its sleep is only there for the
|
|
74
|
+
// read after it, which the completion notification makes unnecessary. The call is cut where the shell
|
|
75
|
+
// starts a program (`shell_segments.commands_of`), and every cut is a sleep, an inert marker
|
|
76
|
+
// (`early-heartbeat`'s own reading of both), or a read of a file or a process — at least one read,
|
|
77
|
+
// which is what keeps it disjoint from `early-heartbeat`'s bare timer. A short settle (`sleep 3; tail`)
|
|
78
|
+
// is below the threshold and passes.
|
|
79
|
+
const SETTLE_SECONDS = 10
|
|
80
|
+
const NO_SECONDS = 0
|
|
81
|
+
const READ_COMMAND = /^(?:tail|cat|head|ps|stat|grep|wc|ls|pgrep|test|kill\s+-0|\[\[?)(?=\s|$)/u
|
|
82
|
+
|
|
83
|
+
function slept_seconds(segments: ReadonlyArray<string>): number {
|
|
84
|
+
return segments.reduce(
|
|
85
|
+
(total, segment) => total + (early_heartbeat.sleep_seconds(segment) ?? NO_SECONDS),
|
|
86
|
+
NO_SECONDS,
|
|
87
|
+
)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Only the sleep in front of the first read counts: `tail x; sleep 20` reads first and waits after,
|
|
91
|
+
// which is not a wait *for* the read.
|
|
92
|
+
function is_sleep_then_read(plain: string): boolean {
|
|
93
|
+
const segments = shell_segments.commands_of(plain).filter((segment) => segment !== '')
|
|
94
|
+
const first_work = segments.findIndex((segment) => !early_heartbeat.is_wait_or_inert(segment))
|
|
95
|
+
const waited = first_work === -1 ? NO_SECONDS : slept_seconds(segments.slice(0, first_work))
|
|
96
|
+
|
|
97
|
+
if (waited < SETTLE_SECONDS) return false
|
|
98
|
+
|
|
99
|
+
return segments
|
|
100
|
+
.slice(first_work)
|
|
101
|
+
.every((segment) => early_heartbeat.is_wait_or_inert(segment) || READ_COMMAND.test(segment))
|
|
102
|
+
}
|
|
103
|
+
|
|
55
104
|
function is_state_wait(plain: string): boolean {
|
|
56
105
|
return UNTIL_HEADER.test(plain) || PROBE_HEADERS.some((header) => header.test(plain))
|
|
57
106
|
}
|
|
58
107
|
|
|
108
|
+
function is_counted_sleep(plain: string): boolean {
|
|
109
|
+
const header = COUNTED_FOR.exec(plain)
|
|
110
|
+
|
|
111
|
+
if (header === null) return false
|
|
112
|
+
|
|
113
|
+
const rest = plain.slice(header.index)
|
|
114
|
+
|
|
115
|
+
return SLEEP_COMMAND.test(THROUGH_FIRST_DONE.exec(rest)?.[0] ?? rest)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function is_sleeping_loop(plain: string): boolean {
|
|
119
|
+
return (LOOP_KEYWORD.test(plain) && SLEEP_COMMAND.test(plain)) || is_counted_sleep(plain)
|
|
120
|
+
}
|
|
121
|
+
|
|
59
122
|
// **A `while read … done < file` is a stream reader, not a poll**, even when its body sleeps to
|
|
60
123
|
// throttle processing. Its condition consumes input rather
|
|
61
124
|
// than probing for a state — a poll never reads its condition, it *tests* it (grep, wc, a file check)
|
|
@@ -80,18 +143,18 @@ function is_poll_loop(command: string): boolean {
|
|
|
80
143
|
if (is_stream_reader(plain)) return false
|
|
81
144
|
if (is_state_wait(plain)) return true
|
|
82
145
|
|
|
83
|
-
return
|
|
146
|
+
return is_sleeping_loop(plain) || is_sleep_then_read(plain)
|
|
84
147
|
}
|
|
85
148
|
|
|
86
149
|
// The instruction in the shape a refusal can carry: why the command's exit is the thing to wait on,
|
|
87
150
|
// and the one route that delivers that exit. The measurement behind it is in
|
|
88
151
|
// `docs/maintainers/rule-delivery-rationale.md`.
|
|
89
152
|
const POLL_LOOP_REASON =
|
|
90
|
-
|
|
91
|
-
'
|
|
92
|
-
'
|
|
93
|
-
'`pnpm josh
|
|
94
|
-
'every occurrence.'
|
|
153
|
+
'⛔ output poll loop: a `while`/`until` or counted `for` loop, or a `sleep` chain before a read, ' +
|
|
154
|
+
'does not know when the task finished. `run_in_background` and end the turn — its exit ' +
|
|
155
|
+
're-invokes you; a background `Agent` is waited on by its completion notification (lane child: ' +
|
|
156
|
+
'bare `sleep 20`, `pnpm josh run:liveness`); CI by `pnpm josh followup` ' +
|
|
157
|
+
'(`background-commands.md`). Fires on every occurrence.'
|
|
95
158
|
|
|
96
159
|
// The row itself, so `delivered-rules.ts` spreads one entry. `decide` returns true so it refuses every
|
|
97
160
|
// occurrence; it declares no `keeps` — waiting on the task exit is the *absence* of a loop, not a
|
|
@@ -102,6 +165,13 @@ const ROW = {
|
|
|
102
165
|
is_trigger: bash_triggers.on_bash_command(is_poll_loop),
|
|
103
166
|
reason: POLL_LOOP_REASON,
|
|
104
167
|
decide: (): boolean => true,
|
|
168
|
+
about: {
|
|
169
|
+
title: 'Output poll loop',
|
|
170
|
+
topic: '`.claude/skills/workflow-commands/background-commands.md`',
|
|
171
|
+
fires:
|
|
172
|
+
"a hand-written `while` / `until` wait loop over a command's output, a marker file or a process, a counted `for` that sleeps, or a `sleep` chain of 10 s or more before a read of a file or process. Every occurrence",
|
|
173
|
+
quiet: 'the command started with `run_in_background` — its exit ends the wait',
|
|
174
|
+
},
|
|
105
175
|
}
|
|
106
176
|
|
|
107
177
|
const poll_loop = {
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { bash_triggers } from './bash-triggers'
|
|
2
|
+
import { direct_pr_create } from './direct-pr-create'
|
|
3
|
+
import { git_argv } from './git-argv'
|
|
4
|
+
import { shell_segments } from './shell-segments'
|
|
5
|
+
|
|
6
|
+
// The trigger and the delivered text behind the `pr-merge` row of `delivered-rules.ts`: a pull
|
|
7
|
+
// request merged by the agent's own `Bash` call. A merge is Tier C, and the one authorized route is
|
|
8
|
+
// `pnpm josh followup` (and `pnpm josh observations:flush`), which merges inside its own process —
|
|
9
|
+
// the word after the wrapper is `josh`, so neither is claimed here.
|
|
10
|
+
//
|
|
11
|
+
// **The deny list matches globs; this reads the program.** `Bash(gh pr merge*)` and
|
|
12
|
+
// `Bash(gh api *pulls/*/merge*)` miss `curl -X PUT …/pulls/5/merge`, a GraphQL body read from a file
|
|
13
|
+
// (`gh api graphql -F query=@merge.graphql`), and `enablePullRequestAutoMerge`, which merges once
|
|
14
|
+
// the checks pass. A body kept in a file or computed by the shell cannot be read here, so such a
|
|
15
|
+
// GraphQL call is refused whatever it holds — kit's own GitHub calls are REST (`gh-rest.md`).
|
|
16
|
+
//
|
|
17
|
+
// **It fires on every occurrence**, for the reason `git-force.ts` does.
|
|
18
|
+
|
|
19
|
+
const GH_COMMAND = 'gh'
|
|
20
|
+
const CURL_COMMAND = 'curl'
|
|
21
|
+
const PR_GROUP = 'pr'
|
|
22
|
+
const MERGE_ACTION = 'merge'
|
|
23
|
+
const API_SUBCOMMAND = 'api'
|
|
24
|
+
const GRAPHQL_ENDPOINT = 'graphql'
|
|
25
|
+
// The REST merge endpoint, in any spelling of the number (`5`, `$N`, `${PR}`).
|
|
26
|
+
const MERGE_PATH = /pulls\/[^/\s'"]+\/merge(?![\w-])/u
|
|
27
|
+
const MERGE_MUTATIONS = /\b(?:mergePullRequest|enablePullRequestAutoMerge)\b/u
|
|
28
|
+
const GRAPHQL_URL = /\/graphql\b/u
|
|
29
|
+
// A body read from a file or stdin: `@file` / `field=@file` for `gh api -F` and curl's `-d`, a
|
|
30
|
+
// short flag with the value attached (`-d@file`), and the flags that upload a whole file.
|
|
31
|
+
const FILE_BODY_VALUE = /^(?:-[A-Za-z]|[^=\s]*=)?['"]?@/u
|
|
32
|
+
const FILE_BODY_FLAGS: ReadonlySet<string> = new Set(['--input', '-T', '--upload-file'])
|
|
33
|
+
// A body the shell computes (`query="$(cat merge.graphql)"`, backticks) is no more readable here.
|
|
34
|
+
const SUBSTITUTED_BODY = /\$\(|`/u
|
|
35
|
+
|
|
36
|
+
type ApiCall = NonNullable<ReturnType<typeof git_argv.program_of>>
|
|
37
|
+
|
|
38
|
+
// The words that are neither a flag nor a flag's value, with `gh api`'s value-taking flags, so
|
|
39
|
+
// `gh api -X POST graphql` reaches `graphql` as the endpoint.
|
|
40
|
+
function positional_words(args: ReadonlyArray<string>): Array<string> {
|
|
41
|
+
return direct_pr_create.positional_words(args, direct_pr_create.API_VALUE_TAKING_FLAGS)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function is_pr_merge_cli_call(args: ReadonlyArray<string>): boolean {
|
|
45
|
+
const [group, action] = positional_words(args)
|
|
46
|
+
|
|
47
|
+
return group === PR_GROUP && action === MERGE_ACTION
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function is_github_api_call(name: string, args: ReadonlyArray<string>): boolean {
|
|
51
|
+
if (name === CURL_COMMAND) return true
|
|
52
|
+
|
|
53
|
+
return name === GH_COMMAND && positional_words(args)[0] === API_SUBCOMMAND
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// `gh api` reaches GraphQL through its `graphql` endpoint or, like curl, through the `/graphql` path
|
|
57
|
+
// or URL (`gh api /graphql --input body.json`).
|
|
58
|
+
function is_graphql_call(name: string, args: ReadonlyArray<string>): boolean {
|
|
59
|
+
if (args.some((argument) => GRAPHQL_URL.test(argument))) return true
|
|
60
|
+
|
|
61
|
+
return name === GH_COMMAND && positional_words(args)[1] === GRAPHQL_ENDPOINT
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function is_unreadable_body(argument: string): boolean {
|
|
65
|
+
if (FILE_BODY_FLAGS.has(argument)) return true
|
|
66
|
+
|
|
67
|
+
return FILE_BODY_VALUE.test(argument) || SUBSTITUTED_BODY.test(argument)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// The segment cut ignores quotes, so a multi-line `-f query='mutation {⏎ mergePullRequest…'` leaves
|
|
71
|
+
// the mutation name in a later segment: a GraphQL call's mutation is looked for in the whole line.
|
|
72
|
+
function is_graphql_merge(command: string, name: string, args: ReadonlyArray<string>): boolean {
|
|
73
|
+
if (!is_graphql_call(name, args)) return false
|
|
74
|
+
|
|
75
|
+
return MERGE_MUTATIONS.test(command) || args.some((argument) => is_unreadable_body(argument))
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function is_api_merge(command: string, segment: string, call: ApiCall): boolean {
|
|
79
|
+
if (MERGE_PATH.test(segment) || MERGE_MUTATIONS.test(segment)) return true
|
|
80
|
+
|
|
81
|
+
return is_graphql_merge(command, call.name, call.args)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function is_pr_merge_segment(command: string, segment: string): boolean {
|
|
85
|
+
const call = git_argv.program_of(segment)
|
|
86
|
+
|
|
87
|
+
if (call === undefined) return false
|
|
88
|
+
if (call.name === GH_COMMAND && is_pr_merge_cli_call(call.args)) return true
|
|
89
|
+
|
|
90
|
+
return is_github_api_call(call.name, call.args) && is_api_merge(command, segment, call)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function is_pr_merge(command: string): boolean {
|
|
94
|
+
return shell_segments
|
|
95
|
+
.commands_of(command)
|
|
96
|
+
.some((segment) => is_pr_merge_segment(command, segment))
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const PR_MERGE_REASON =
|
|
100
|
+
'⛔ direct PR merge: `gh pr merge`, a `gh api` / `curl` call to `…/pulls/<N>/merge`, a ' +
|
|
101
|
+
'`mergePullRequest` / `enablePullRequestAutoMerge` mutation, or a GraphQL body read from a file ' +
|
|
102
|
+
'merges outside the verified route, and a merge is Tier C. Merge with `pnpm josh followup` if the ' +
|
|
103
|
+
'run authorizes it; otherwise leave it to the user (`operating-rules.md` → git-rules). This rule ' +
|
|
104
|
+
'fires on every occurrence.'
|
|
105
|
+
|
|
106
|
+
const ROW = {
|
|
107
|
+
id: 'pr-merge',
|
|
108
|
+
is_trigger: bash_triggers.on_bash_command(is_pr_merge),
|
|
109
|
+
reason: PR_MERGE_REASON,
|
|
110
|
+
decide: (): boolean => true,
|
|
111
|
+
about: {
|
|
112
|
+
title: 'Direct PR merge',
|
|
113
|
+
topic: '`operating-rules.md` → "git-rules"',
|
|
114
|
+
fires:
|
|
115
|
+
'`gh pr merge`, a `gh api` / `curl` call to `…/pulls/<N>/merge`, a `mergePullRequest` / `enablePullRequestAutoMerge` mutation, or a GraphQL body read from a file. Every occurrence',
|
|
116
|
+
quiet:
|
|
117
|
+
'`pnpm josh followup` and `pnpm josh observations:flush`, which merge in their own process',
|
|
118
|
+
},
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const pr_merge = { PR_MERGE_REASON, ROW, is_graphql_call, is_pr_merge }
|
|
122
|
+
|
|
123
|
+
export { pr_merge }
|
|
@@ -139,7 +139,7 @@ function uncut_lane_issue(state: LaneCutState): string | undefined {
|
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
// **The cut is taken only when the current context is worth its resume**.
|
|
142
|
-
// Below the
|
|
142
|
+
// Below the model-priced `pnpm josh cost --cut` threshold a short lane has no accumulation a cut would drop, so the
|
|
143
143
|
// gate runs uncut rather than paying for a relaunch; an unmeasurable session keeps the old
|
|
144
144
|
// unconditional cut as the safety net. The verdict is
|
|
145
145
|
// `cost_cli.session_verdict`'s, the same statistic and threshold `run:cut` and the implementation-phase
|
|
@@ -163,8 +163,8 @@ function is_uncut_gate(command: string, state: LaneCutState = current_state()):
|
|
|
163
163
|
const PRE_GATE_CUT_REASON =
|
|
164
164
|
'⛔ pre-gate cut: this checkout is a lane dispatched for this issue and the gate is the boundary to ' +
|
|
165
165
|
'cut at. Issue `pnpm josh run:cut <N>`: on `cut`, end the turn immediately — no Telegram is owed; ' +
|
|
166
|
-
'on any other verdict (`not-a-lane`, `busy`, …),
|
|
167
|
-
'(`.claude/skills/workflow-commands/pre-gate-cut.md`).'
|
|
166
|
+
'on `split-unresolved`, answer its notice and rerun it; on any other verdict (`not-a-lane`, `busy`, …), ' +
|
|
167
|
+
'reissue the gate — this fires once per run (`.claude/skills/workflow-commands/pre-gate-cut.md`).'
|
|
168
168
|
|
|
169
169
|
// **The pre-gate cut is two acts, one call apart**, so its `rule:value`
|
|
170
170
|
// denominator is only the runs that reached the boundary: a run that issues the cut's entry check and,
|
|
@@ -2,7 +2,10 @@ import path from 'node:path'
|
|
|
2
2
|
import { doctor_consumer } from '#scripts/doctor/doctor-consumer'
|
|
3
3
|
import { json_value } from '#scripts/lib/json-value'
|
|
4
4
|
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
5
|
+
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
5
6
|
import { bash_triggers } from './bash-triggers'
|
|
7
|
+
import { edit_tool } from './edit-tool'
|
|
8
|
+
import { git_argv } from './git-argv'
|
|
6
9
|
import { shell_segments } from './shell-segments'
|
|
7
10
|
|
|
8
11
|
// The trigger and the delivered text behind the `protected-file` row of `delivered-rules.ts`:
|
|
@@ -21,7 +24,7 @@ import { shell_segments } from './shell-segments'
|
|
|
21
24
|
// It fires on every occurrence, for the reason `git-force.ts` does.
|
|
22
25
|
|
|
23
26
|
const READ_TOOL = 'Read'
|
|
24
|
-
const
|
|
27
|
+
const { is_edit_tool } = edit_tool
|
|
25
28
|
const SECRET_FILES: ReadonlySet<string> = new Set(['.env', '.dev.vars'])
|
|
26
29
|
const ENVIRONMENT_VARIANT_PREFIX = '.env.'
|
|
27
30
|
// The two variants `.gitignore` un-ignores: they are tracked and hold placeholders, not secrets. The
|
|
@@ -30,26 +33,57 @@ const TRACKED_VARIANTS: ReadonlySet<string> = new Set(['.env.example', '.env.tes
|
|
|
30
33
|
const SETTINGS_FILE = path.join('.claude', 'settings.json')
|
|
31
34
|
const WHITESPACE = /\s+/u
|
|
32
35
|
const TOKEN_QUOTES = /["']/gu
|
|
33
|
-
|
|
34
|
-
|
|
36
|
+
// Each character of a redirect operator (`<`, `>`, `>>`, `2>`, `&>`) — and the clobber `>|` whole —
|
|
37
|
+
// is spaced out to a mark, so the word after the last one is the file it reads or writes.
|
|
38
|
+
const REDIRECT = />\||[<>]/gu
|
|
39
|
+
const REDIRECT_MARK = '<'
|
|
40
|
+
// Programs that run their quoted argument as a script.
|
|
41
|
+
const SHELLS: ReadonlySet<string> = new Set(['bash', 'eval', 'sh', 'zsh'])
|
|
42
|
+
// The body of a `$(…)` (innermost) or a backtick command substitution.
|
|
43
|
+
const SUBSTITUTION = /\$\((?<dollar>[^()]*)\)|`(?<backtick>[^`]*)`/gu
|
|
44
|
+
// Programs that print a named file's bytes or run them, and programs that write one: a write could set
|
|
45
|
+
// a guard switch, so `cp .env.example .env` is refused too (kit #4660) — the person makes the file.
|
|
46
|
+
const SHELL_PROGRAMS: ReadonlySet<string> = new Set([
|
|
47
|
+
'cp',
|
|
48
|
+
'install',
|
|
49
|
+
'ln',
|
|
50
|
+
'mv',
|
|
51
|
+
'tee',
|
|
35
52
|
'.',
|
|
36
53
|
'awk',
|
|
54
|
+
'base64',
|
|
37
55
|
'bat',
|
|
38
56
|
'cat',
|
|
57
|
+
'cmp',
|
|
58
|
+
'column',
|
|
59
|
+
'comm',
|
|
39
60
|
'cut',
|
|
61
|
+
'diff',
|
|
62
|
+
'fold',
|
|
40
63
|
'grep',
|
|
41
64
|
'head',
|
|
65
|
+
'hexdump',
|
|
66
|
+
'jq',
|
|
42
67
|
'less',
|
|
43
68
|
'more',
|
|
44
69
|
'nl',
|
|
45
70
|
'od',
|
|
71
|
+
'paste',
|
|
72
|
+
'perl',
|
|
73
|
+
'python',
|
|
74
|
+
'python3',
|
|
75
|
+
'rev',
|
|
46
76
|
'rg',
|
|
77
|
+
'ruby',
|
|
47
78
|
'sed',
|
|
48
79
|
'sort',
|
|
49
80
|
'source',
|
|
50
81
|
'strings',
|
|
82
|
+
'tac',
|
|
51
83
|
'tail',
|
|
84
|
+
'uniq',
|
|
52
85
|
'xxd',
|
|
86
|
+
'yq',
|
|
53
87
|
])
|
|
54
88
|
|
|
55
89
|
function file_path_of(call: GuardedCall): string {
|
|
@@ -68,33 +102,82 @@ function is_environment_path(token: string): boolean {
|
|
|
68
102
|
return SECRET_FILES.has(name) || name.startsWith(ENVIRONMENT_VARIANT_PREFIX)
|
|
69
103
|
}
|
|
70
104
|
|
|
71
|
-
// A shell read reaches the same bytes a `Read` does,
|
|
72
|
-
//
|
|
73
|
-
// the
|
|
74
|
-
// 2.1.289, kit #3602), so
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
105
|
+
// A shell read reaches the same bytes a `Read` does, and a shell write changes the file an `Edit`
|
|
106
|
+
// would, so a segment that runs one of the programs (`cat .env`, `source .env`, `tee .env`) or
|
|
107
|
+
// redirects the file (`< .env`, `>> .env`) is refused too. Claude Code applies the `Read` deny rules to
|
|
108
|
+
// the readers it recognizes, but `source .env.local` passes them (measured on 2.1.289, kit #3602), so
|
|
109
|
+
// the variants are matched here as well.
|
|
110
|
+
//
|
|
111
|
+
// A quoted `>` is text (`git commit -m "x >> .env"`), so the marks are read on the quote-blanked
|
|
112
|
+
// segment, whose offsets match the original; a shell's quoted script (`sh -c "echo x > .env"`) runs,
|
|
113
|
+
// so its marks are read as written, as is a heredoc line, which `blanked` does not cut.
|
|
114
|
+
function redirect_marks_of(segment: string, program: string | undefined): string {
|
|
115
|
+
if (program !== undefined && SHELLS.has(program)) return segment
|
|
116
|
+
|
|
117
|
+
return time_shell.blanked(segment) ?? segment
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function spaced_redirects(segment: string, program: string | undefined): string {
|
|
121
|
+
const marks = redirect_marks_of(segment, program)
|
|
122
|
+
|
|
123
|
+
return segment.replaceAll(REDIRECT, (mark, offset: number) =>
|
|
124
|
+
marks.startsWith(mark, offset) ? ` ${REDIRECT_MARK} ` : mark,
|
|
125
|
+
)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function is_environment_shell_segment(segment: string): boolean {
|
|
129
|
+
const call = git_argv.program_of(segment)
|
|
130
|
+
const words = spaced_redirects(segment, call?.name)
|
|
78
131
|
.split(WHITESPACE)
|
|
79
132
|
.filter((word) => word !== '')
|
|
80
133
|
const is_redirected = words.some(
|
|
81
|
-
(word, index) => word ===
|
|
134
|
+
(word, index) => word === REDIRECT_MARK && is_environment_path(words[index + 1] ?? ''),
|
|
82
135
|
)
|
|
83
|
-
const [command = '', ...rest] = words
|
|
84
136
|
|
|
85
|
-
return
|
|
86
|
-
|
|
137
|
+
if (is_redirected || call === undefined) return is_redirected
|
|
138
|
+
|
|
139
|
+
return SHELL_PROGRAMS.has(call.name) && call.args.some((word) => is_environment_path(word))
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// A shell's quoted script holds commands of its own (`bash -c "true; cat .env"`), so it is cut again
|
|
143
|
+
// without regard to quotes.
|
|
144
|
+
function script_commands_of(segment: string): Array<string> {
|
|
145
|
+
const program = git_argv.program_of(segment)?.name
|
|
146
|
+
|
|
147
|
+
if (program === undefined || !SHELLS.has(program)) return []
|
|
148
|
+
|
|
149
|
+
return shell_segments.commands_of(segment)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// A command substitution runs even inside double quotes (`echo "$(echo x > .env)"`), which the
|
|
153
|
+
// quote-blanked reading takes for text, so its body is cut out as commands of their own.
|
|
154
|
+
function substitution_commands_of(segment: string): Array<string> {
|
|
155
|
+
return [...segment.matchAll(SUBSTITUTION)].flatMap((match) =>
|
|
156
|
+
shell_segments.commands_of(match.groups?.['dollar'] ?? match.groups?.['backtick'] ?? ''),
|
|
87
157
|
)
|
|
88
158
|
}
|
|
89
159
|
|
|
90
|
-
function
|
|
91
|
-
return shell_segments
|
|
160
|
+
function segments_of(command: string): Array<string> {
|
|
161
|
+
return shell_segments
|
|
162
|
+
.quote_aware_commands_of(command)
|
|
163
|
+
.flatMap((segment) => [
|
|
164
|
+
segment,
|
|
165
|
+
...script_commands_of(segment),
|
|
166
|
+
...substitution_commands_of(segment),
|
|
167
|
+
])
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function is_environment_shell_access(command: string): boolean {
|
|
171
|
+
return segments_of(command).some((segment) => is_environment_shell_segment(segment))
|
|
92
172
|
}
|
|
93
173
|
|
|
94
|
-
|
|
95
|
-
|
|
174
|
+
// A `Read` lands the secret in the transcript; an `Edit` / `Write` could set a guard switch.
|
|
175
|
+
function is_environment_access(call: GuardedCall): boolean {
|
|
176
|
+
if (call.name === READ_TOOL || is_edit_tool(call.name)) {
|
|
177
|
+
return is_environment_path(file_path_of(call))
|
|
178
|
+
}
|
|
96
179
|
|
|
97
|
-
return bash_triggers.on_bash_command(
|
|
180
|
+
return bash_triggers.on_bash_command(is_environment_shell_access)(call)
|
|
98
181
|
}
|
|
99
182
|
|
|
100
183
|
// The repository the settings file belongs to is two levels above it (`<root>/.claude/settings.json`).
|
|
@@ -102,7 +185,7 @@ function is_consumer_settings_edit(
|
|
|
102
185
|
call: GuardedCall,
|
|
103
186
|
is_kit_consumer: (root: string) => boolean,
|
|
104
187
|
): boolean {
|
|
105
|
-
if (!
|
|
188
|
+
if (!is_edit_tool(call.name)) return false
|
|
106
189
|
|
|
107
190
|
const file_path = path.resolve(file_path_of(call))
|
|
108
191
|
|
|
@@ -115,11 +198,12 @@ function is_protected_file_call(
|
|
|
115
198
|
call: GuardedCall,
|
|
116
199
|
is_kit_consumer: (root: string) => boolean = doctor_consumer.is_kit_consumer,
|
|
117
200
|
): boolean {
|
|
118
|
-
return
|
|
201
|
+
return is_environment_access(call) || is_consumer_settings_edit(call, is_kit_consumer)
|
|
119
202
|
}
|
|
120
203
|
|
|
121
204
|
const PROTECTED_FILE_REASON =
|
|
122
|
-
'⛔ protected file: `.env`, a `.env.*` variant and `.dev.vars` hold secrets
|
|
205
|
+
'⛔ protected file: `.env`, a `.env.*` variant and `.dev.vars` hold secrets and are written only ' +
|
|
206
|
+
'by the person, and a consumer ' +
|
|
123
207
|
'`.claude/settings.json` is owned by `josh sync` (a change belongs upstream in kit). Leave these ' +
|
|
124
208
|
'files alone, or ask the user. It fires on every occurrence.'
|
|
125
209
|
|
|
@@ -130,6 +214,13 @@ const ROW = {
|
|
|
130
214
|
decide: (): boolean => true,
|
|
131
215
|
// The opening the reason carried before it was cut to the action and the next command.
|
|
132
216
|
former_reasons: ['⛔ protected file: `.env` holds the Telegram bot token'],
|
|
217
|
+
about: {
|
|
218
|
+
title: 'Protected file',
|
|
219
|
+
topic: '`operating-rules.md`',
|
|
220
|
+
fires:
|
|
221
|
+
'a `Read`, `Edit` or `Write` of `.env` (or a shell read or write of it), or an `Edit` / `Write` of `.claude/settings.json` outside kit. Every occurrence',
|
|
222
|
+
quiet: "kit itself, or the user's `~/.claude/settings.json`",
|
|
223
|
+
},
|
|
133
224
|
}
|
|
134
225
|
|
|
135
226
|
const protected_files = { ROW, is_protected_file_call }
|
|
@@ -44,6 +44,12 @@ const ROW = {
|
|
|
44
44
|
is_trigger: bash_triggers.on_bash_command(posts_at_path_literally),
|
|
45
45
|
reason: RAW_FIELD_BODY_REASON,
|
|
46
46
|
decide: (): boolean => true,
|
|
47
|
+
about: {
|
|
48
|
+
title: 'Posting `@path` literally',
|
|
49
|
+
topic: '`shell-body.md`',
|
|
50
|
+
fires: 'a raw field (`-f` / `--raw-field`) passing `body=@<path>`. Every occurrence',
|
|
51
|
+
quiet: '`-F` / `--field body=@`, a body without `@`, or `pnpm josh issue:comment`',
|
|
52
|
+
},
|
|
47
53
|
}
|
|
48
54
|
|
|
49
55
|
const raw_field_body = { RAW_FIELD_BODY_REASON, ROW, posts_at_path_literally }
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { reply_prose } from './reply-prose'
|
|
2
|
+
|
|
1
3
|
// Whether a reply is written in the session language. The session-language
|
|
2
4
|
// line reaches a turn only through `UserPromptSubmit`, so a turn opened by a background completion or a
|
|
3
5
|
// Stop hook refusal answered in whatever language it was just shown, and kept answering in it.
|
|
@@ -31,14 +33,6 @@ const MATCH_SHARE_FLOOR = 0.5
|
|
|
31
33
|
// unless no line of the reply is longer.
|
|
32
34
|
const MIN_VOTING_LETTERS = 8
|
|
33
35
|
|
|
34
|
-
const CODE_PATTERNS: ReadonlyArray<RegExp> = [
|
|
35
|
-
/```[\s\S]*?(?:```|$)/gu,
|
|
36
|
-
/`[^`\n]*`/gu,
|
|
37
|
-
/\]\([^)\s]*\)/gu,
|
|
38
|
-
/https?:\/\/\S+/gu,
|
|
39
|
-
]
|
|
40
|
-
// A run of printable ASCII; one holding a slash is a bare path the reply printed outside backticks.
|
|
41
|
-
const ASCII_RUN_PATTERN = /[!-~]+/gu
|
|
42
36
|
const LETTER_PATTERN = /\p{L}/gu
|
|
43
37
|
// A letter of another script — `Common` and `Inherited` letters (`µ`) belong to no language of their own.
|
|
44
38
|
const NON_LATIN_LETTER_PATTERN = /(?![\p{Script=Latn}\p{Script=Common}\p{Script=Inherited}])\p{L}/u
|
|
@@ -63,14 +57,6 @@ function letter_pattern(script: string): RegExp | undefined {
|
|
|
63
57
|
}
|
|
64
58
|
}
|
|
65
59
|
|
|
66
|
-
function prose_of(message: string): string {
|
|
67
|
-
let text = message
|
|
68
|
-
|
|
69
|
-
for (const pattern of CODE_PATTERNS) text = text.replaceAll(pattern, ' ')
|
|
70
|
-
|
|
71
|
-
return text.replaceAll(ASCII_RUN_PATTERN, (run) => (run.includes('/') ? ' ' : run))
|
|
72
|
-
}
|
|
73
|
-
|
|
74
60
|
function letter_count(text: string): number {
|
|
75
61
|
return text.match(LETTER_PATTERN)?.length ?? 0
|
|
76
62
|
}
|
|
@@ -105,7 +91,7 @@ function is_mismatch(message: string, lang: string): boolean {
|
|
|
105
91
|
const pattern = letter_pattern(script)
|
|
106
92
|
if (pattern === undefined) return false
|
|
107
93
|
|
|
108
|
-
const prose = prose_of(message)
|
|
94
|
+
const prose = reply_prose.prose_of(message)
|
|
109
95
|
if (letter_count(prose) < MIN_PROSE_LETTERS) return false
|
|
110
96
|
|
|
111
97
|
return matches_share(prose, script, pattern) < MATCH_SHARE_FLOOR
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// The prose of a session-facing reply — the text a person reads as sentences, with code, links and
|
|
2
|
+
// bare paths taken out. Two Stop rules read it: the reply's language (`reply-language.ts`) and its
|
|
3
|
+
// length (`concise-reply.ts`).
|
|
4
|
+
|
|
5
|
+
const CODE_PATTERNS: ReadonlyArray<RegExp> = [
|
|
6
|
+
/```[\s\S]*?(?:```|$)/gu,
|
|
7
|
+
/`[^`\n]*`/gu,
|
|
8
|
+
/\]\([^)\s]*\)/gu,
|
|
9
|
+
/https?:\/\/\S+/gu,
|
|
10
|
+
]
|
|
11
|
+
// A run of printable ASCII; one holding a slash is a bare path the reply printed outside backticks.
|
|
12
|
+
const ASCII_RUN_PATTERN = /[!-~]+/gu
|
|
13
|
+
// A table row or a list item — the structure a reply's points are carried in, not its narrative.
|
|
14
|
+
const STRUCTURE_LINE_PATTERN = /^\s*(?:\||[-*+] |[・•] ?|\d+\. )/u
|
|
15
|
+
|
|
16
|
+
function prose_of(message: string): string {
|
|
17
|
+
let text = message
|
|
18
|
+
|
|
19
|
+
for (const pattern of CODE_PATTERNS) text = text.replaceAll(pattern, ' ')
|
|
20
|
+
|
|
21
|
+
return text.replaceAll(ASCII_RUN_PATTERN, (run) => (run.includes('/') ? ' ' : run))
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// The prose outside tables and lists: what a reply narrates around its one table or list.
|
|
25
|
+
function narrative_of(message: string): string {
|
|
26
|
+
return prose_of(message)
|
|
27
|
+
.split('\n')
|
|
28
|
+
.filter((line) => !STRUCTURE_LINE_PATTERN.test(line))
|
|
29
|
+
.join('\n')
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const reply_prose = { narrative_of, prose_of }
|
|
33
|
+
|
|
34
|
+
export { reply_prose }
|