@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,17 +1,17 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
1
2
|
import { agent_session_role } from '#scripts/agent/agent-session-role'
|
|
2
|
-
import { CONTEXT_CUT_THRESHOLD } from '#scripts/cost-runtime/context-cut-threshold'
|
|
3
3
|
import { cost_cli, type CostVerdict } from '#scripts/cost-runtime/cost-cli'
|
|
4
|
-
import { cost_format } from '#scripts/cost-runtime/cost-format'
|
|
5
4
|
import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
|
|
6
5
|
import type { GuardRun } from '#scripts/josh/hook-decision'
|
|
7
6
|
import { lane_child_marker, type MarkerSource } from '#scripts/lane/lane-child-marker'
|
|
8
7
|
import { lane_paths } from '#scripts/lane/lane-paths'
|
|
8
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
9
9
|
import { run_cut, type RunCut } from '#scripts/run/cut/run-cut'
|
|
10
10
|
import { run_cut_decline } from '#scripts/run/cut/run-cut-decline'
|
|
11
11
|
import { run_cut_handoff } from '#scripts/run/cut/run-cut-handoff'
|
|
12
12
|
import { run_cut_ready } from '#scripts/run/cut/run-cut-ready'
|
|
13
13
|
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
14
|
-
import {
|
|
14
|
+
import { edit_tool } from './edit-tool'
|
|
15
15
|
import { implementation_cut_verdict } from './implementation-cut-verdict'
|
|
16
16
|
import { shell_segments } from './shell-segments'
|
|
17
17
|
|
|
@@ -26,30 +26,34 @@ import { shell_segments } from './shell-segments'
|
|
|
26
26
|
// rather than approximating it — the same statistic and the same threshold, never a second
|
|
27
27
|
// measurement.
|
|
28
28
|
|
|
29
|
-
// The two edit tools the `PreToolUse` matcher routes here, and the working-tree
|
|
30
|
-
// taken at. A `PreToolUse` refusal fires *before* the edit lands, so the tree is at
|
|
31
|
-
// state the previous edit left it — the "between edit batches, never mid-edit" boundary
|
|
29
|
+
// The two edit tools the `PreToolUse` matcher routes here (`edit-tool.ts`), and the working-tree
|
|
30
|
+
// boundary the cut is taken at. A `PreToolUse` refusal fires *before* the edit lands, so the tree is at
|
|
31
|
+
// the consistent state the previous edit left it — the "between edit batches, never mid-edit" boundary
|
|
32
32
|
// `pre-gate-cut.md` requires, reached without waiting for a check to go green.
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
function is_edit_tool(name: string): boolean {
|
|
36
|
-
return EDIT_TOOLS.has(name)
|
|
37
|
-
}
|
|
33
|
+
const { is_edit_tool } = edit_tool
|
|
38
34
|
|
|
39
35
|
// The one spelling that takes this cut rather than the pre-gate one: `--impl`. A bare `pnpm josh
|
|
40
36
|
// run:cut <N>` is the pre-gate boundary and `--resume` / `--end` / `--json` ask about a cut rather than
|
|
41
|
-
// take one, so
|
|
37
|
+
// take one, so `cost-run-cut.ts` looks for the flag that makes it the implementation-phase cut.
|
|
42
38
|
const CUT_COMMANDS: ReadonlySet<string> = new Set(['run:cut'])
|
|
43
39
|
const IMPL_FLAG = /(?:^|\s)--impl(?:[=\s]|$)/u
|
|
40
|
+
const RESUME_FLAG = /(?:^|\s)--resume(?:[=\s]|$)/u
|
|
44
41
|
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
// Segment-wise so a spelling quoted inside a body is not read as the call.
|
|
43
|
+
function calls_cut_with(command: string, flag: RegExp): boolean {
|
|
44
|
+
return shell_segments
|
|
45
|
+
.segments_of(command)
|
|
46
|
+
.some((segment) => shell_segments.is_josh_command(segment, CUT_COMMANDS) && flag.test(segment))
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
// Whether this command takes the implementation-phase cut
|
|
50
|
-
// body is not read as the call.
|
|
49
|
+
// Whether this command takes the implementation-phase cut.
|
|
51
50
|
function takes_the_impl_cut(command: string): boolean {
|
|
52
|
-
return
|
|
51
|
+
return calls_cut_with(command, IMPL_FLAG)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Whether this command asks for a cut's resume verdict — the call a relaunched lane child opens with.
|
|
55
|
+
function resumes_a_cut(command: string): boolean {
|
|
56
|
+
return calls_cut_with(command, RESUME_FLAG)
|
|
53
57
|
}
|
|
54
58
|
|
|
55
59
|
// What the trigger has to know about the world, passed in so the decision is testable without a lane on
|
|
@@ -133,6 +137,32 @@ function uncut_run_issue(state: LaneCostState): string | undefined {
|
|
|
133
137
|
return state.carried()?.issue === issue ? undefined : issue
|
|
134
138
|
}
|
|
135
139
|
|
|
140
|
+
function file_path_of(call: GuardedCall): string {
|
|
141
|
+
if (!json_value.is_record(call.input)) return ''
|
|
142
|
+
|
|
143
|
+
const value = call.input['file_path']
|
|
144
|
+
|
|
145
|
+
return typeof value === 'string' ? value : ''
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// **The handoff the refusal asks for is never refused** (joshuafolkken/kit#4975). Only a reissue
|
|
149
|
+
// inside the window passed, so a run that ran a check between the refusal and the handoff `Write`
|
|
150
|
+
// could not write it, and `run:cut --impl` relaunched on the previous cut's stale handoff.
|
|
151
|
+
function is_handoff_write(call: GuardedCall, directory: string, issue: string): boolean {
|
|
152
|
+
const handoff = path.resolve(directory, run_cut_handoff.handoff_path_of(issue))
|
|
153
|
+
|
|
154
|
+
return path.resolve(directory, file_path_of(call)) === handoff
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// The uncut run an edit would be refused for — none where the edit is that run's own handoff.
|
|
158
|
+
function refusable_issue(call: GuardedCall, state: LaneCostState): string | undefined {
|
|
159
|
+
const issue = uncut_run_issue(state)
|
|
160
|
+
|
|
161
|
+
if (issue === undefined) return undefined
|
|
162
|
+
|
|
163
|
+
return is_handoff_write(call, state.directory, issue) ? undefined : issue
|
|
164
|
+
}
|
|
165
|
+
|
|
136
166
|
// **An unmeasurable session is cut in a lane and left alone outside one.** A lane child's safety net is
|
|
137
167
|
// the pre-gate direction below; a held run outside a lane is a person's own session, so only a measured
|
|
138
168
|
// `over` interrupts it — a provider with no transcript would otherwise refuse every edit it makes.
|
|
@@ -161,24 +191,24 @@ function is_over_threshold_edit(
|
|
|
161
191
|
): boolean {
|
|
162
192
|
if (!is_edit_tool(call.name)) return false
|
|
163
193
|
|
|
164
|
-
const issue =
|
|
194
|
+
const issue = refusable_issue(call, state)
|
|
165
195
|
|
|
166
196
|
if (issue === undefined) return false
|
|
167
197
|
|
|
168
198
|
return warrants_the_cut(state) && state.can_cut(issue)
|
|
169
199
|
}
|
|
170
200
|
|
|
171
|
-
// **The threshold in the refusal text is
|
|
172
|
-
//
|
|
173
|
-
//
|
|
174
|
-
const THRESHOLD_TEXT =
|
|
201
|
+
// **The threshold in the refusal text is named by its command, never spelled**. It is priced at the
|
|
202
|
+
// session's own model (`context-cut-payback.ts`), so no one number is right for every reader, and a
|
|
203
|
+
// spelled literal is left behind when the price list moves.
|
|
204
|
+
const THRESHOLD_TEXT = '`pnpm josh cost --cut`'
|
|
175
205
|
|
|
176
206
|
// The instruction in the shape a refusal can carry: the handoff in the format the parser reads, the
|
|
177
207
|
// cut, and the one verdict that ends the turn — `cut` is the only one, so a run told merely to "take
|
|
178
208
|
// the cut" is not left to look it up.
|
|
179
209
|
const IMPLEMENTATION_CUT_REASON =
|
|
180
|
-
`⛔ implementation-phase cut: refused on every edit
|
|
181
|
-
`Write \`${run_cut_handoff.HANDOFF_PATH}
|
|
210
|
+
`⛔ implementation-phase cut: refused on every edit over ${THRESHOLD_TEXT}. ` +
|
|
211
|
+
`Write \`${run_cut_handoff.HANDOFF_PATH}\`: ${run_cut_handoff.HANDOFF_FORMAT}, run ` +
|
|
182
212
|
'`pnpm josh run:cut --impl <N> --handoff <path>`; `cut`: end the turn immediately, no Telegram ' +
|
|
183
213
|
'is owed; else reissue the edit (`.claude/skills/workflow-commands/pre-gate-cut.md`).'
|
|
184
214
|
|
|
@@ -211,19 +241,29 @@ function decide(
|
|
|
211
241
|
}
|
|
212
242
|
|
|
213
243
|
// The row itself, so `delivered-rules.ts` spreads one entry. `decide` fires it per threshold crossing
|
|
214
|
-
// in a run that can cut
|
|
215
|
-
//
|
|
244
|
+
// in a run that can cut. It declares no `keeps`: the trigger is a budget threshold the child cannot
|
|
245
|
+
// observe, so no run takes `run:cut --impl` before crossing it unaided, and the row is reported
|
|
246
|
+
// unmeasured rather than scored 0% on an act it cannot make (`rule-value.ts` → "A rule with no
|
|
247
|
+
// `keeps` predicate is reported as unmeasured").
|
|
216
248
|
const ROW = {
|
|
217
249
|
id: 'implementation-cut',
|
|
218
250
|
is_trigger: is_over_threshold_edit,
|
|
219
251
|
reason: IMPLEMENTATION_CUT_REASON,
|
|
220
252
|
decide,
|
|
221
|
-
keeps: bash_triggers.on_bash_command(takes_the_impl_cut),
|
|
222
253
|
// The opening the reason carried before it was cut to the action and the next command.
|
|
223
254
|
former_reasons: [
|
|
224
255
|
'⛔ implementation-phase cut: this checkout is a lane dispatched',
|
|
225
256
|
"⛔ implementation-phase cut: this run's context crossed the",
|
|
226
257
|
],
|
|
258
|
+
about: {
|
|
259
|
+
title: 'The implementation-phase cut',
|
|
260
|
+
topic:
|
|
261
|
+
'`.claude/skills/workflow-commands/pre-gate-cut.md` → "It is a guard, fired at the edit that crosses the threshold"',
|
|
262
|
+
fires:
|
|
263
|
+
'an `Edit` / `Write` by an uncut lane child whose recent context is over the `pnpm josh cost --cut` threshold; it hands over `pnpm josh run:cut --impl <N> --handoff <path>`. At each threshold crossing',
|
|
264
|
+
quiet:
|
|
265
|
+
"not a lane child, a non-editing tool, the run's own handoff file, already cut, or under the threshold",
|
|
266
|
+
},
|
|
227
267
|
}
|
|
228
268
|
|
|
229
269
|
const implementation_cut = {
|
|
@@ -233,6 +273,7 @@ const implementation_cut = {
|
|
|
233
273
|
decide,
|
|
234
274
|
is_over_threshold_edit,
|
|
235
275
|
is_reissued_refusal,
|
|
276
|
+
resumes_a_cut,
|
|
236
277
|
takes_the_impl_cut,
|
|
237
278
|
uncut_run_issue,
|
|
238
279
|
}
|
|
@@ -46,7 +46,7 @@ function is_index_segment(segment: string): boolean {
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
function is_index_mutation(command: string): boolean {
|
|
49
|
-
return shell_segments.
|
|
49
|
+
return shell_segments.commands_of(command).some((segment) => is_index_segment(segment))
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
const INDEX_MUTATION_REASON =
|
|
@@ -61,6 +61,13 @@ const ROW = {
|
|
|
61
61
|
is_trigger: bash_triggers.on_bash_command(is_index_mutation),
|
|
62
62
|
reason: INDEX_MUTATION_REASON,
|
|
63
63
|
decide: (): boolean => true,
|
|
64
|
+
about: {
|
|
65
|
+
title: 'Index mutation',
|
|
66
|
+
topic: '`operating-rules.md`',
|
|
67
|
+
fires:
|
|
68
|
+
'`git add` / `commit` / `reset` / `rm` / `mv` / `restore --staged` in any spelling. Every occurrence',
|
|
69
|
+
quiet: '`pnpm josh git` — the approved commit flow',
|
|
70
|
+
},
|
|
64
71
|
}
|
|
65
72
|
|
|
66
73
|
const index_guard = { INDEX_MUTATION_REASON, ROW, is_index_mutation }
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { delegation_policy } from '#scripts/delegation/delegation-policy'
|
|
2
|
+
import { hook_decision, type GuardRun } from '#scripts/josh/hook-decision'
|
|
3
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
4
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
5
|
+
import {
|
|
6
|
+
time_transcript_line,
|
|
7
|
+
type Block,
|
|
8
|
+
type TranscriptLine,
|
|
9
|
+
} from '#scripts/time-runtime/time-transcript-line'
|
|
10
|
+
import { agent_model } from './agent-model'
|
|
11
|
+
import { implementation_cut } from './implementation-cut'
|
|
12
|
+
|
|
13
|
+
// An `investigator` dispatched without `run_in_background: false` is refused until it names it
|
|
14
|
+
// (joshuafolkken/kit#4721).
|
|
15
|
+
//
|
|
16
|
+
// **The background launch is the cost, not the dispatch.** The subagent tool launches in the
|
|
17
|
+
// background by default, so a main line with nothing else to do ends its turn on "waiting for the
|
|
18
|
+
// reply", and the finished result sits in the queue until a later turn — measured at 4 of 33 such
|
|
19
|
+
// dispatches over 7 days, 658 seconds idle, up to 287 in one plan. A foreground dispatch returns the
|
|
20
|
+
// result in the same turn; the edit-target reads that keep the main line busy go in the same message,
|
|
21
|
+
// where they run beside it.
|
|
22
|
+
//
|
|
23
|
+
// **It fires on every occurrence**: the remedy is one field on the same call.
|
|
24
|
+
//
|
|
25
|
+
// **A build whose subagent tool has no such field stands it down** (joshuafolkken/kit#4889). Claude
|
|
26
|
+
// Code 2.1.306 in VS Code declares no `run_in_background`: every dispatch there launched in the
|
|
27
|
+
// background (64 of 64), the model wrote the field as the string `"false"`, and the parsed hook input
|
|
28
|
+
// dropped it — so the refusal could never be met, and it blocked the very delegation the investigation
|
|
29
|
+
// guard demands. A string value is the tell: across 1,700 dispatches in builds that declare the field
|
|
30
|
+
// the model wrote a boolean every time. A first call written bare leaves no string anywhere, so the
|
|
31
|
+
// reissue it was refused into passes on the refused call's body instead (joshuafolkken/kit#4903).
|
|
32
|
+
//
|
|
33
|
+
// **The build is a fact of the session, not of the tail** (joshuafolkken/kit#4966). Each tell is
|
|
34
|
+
// recorded once against the transcript, so a stand-down outlives the 256 KiB window the tells are read
|
|
35
|
+
// from. A boolean `false` the parsed input dropped is a tell too: the transcript keeps what the model
|
|
36
|
+
// wrote, so a dispatch this row refused that wrote it there is one the field never reached.
|
|
37
|
+
//
|
|
38
|
+
// **This row's own refusal is the last tell** (joshuafolkken/kit#5148). The harness drops an undeclared
|
|
39
|
+
// argument before both the hook and the transcript see it, so a reissue rewritten after the refusal
|
|
40
|
+
// leaves no tell on the tail. A reissue that still carries no field passes, and is remembered for the
|
|
41
|
+
// session, when the last answered investigator dispatch on the tail is this row's refusal, alone in its
|
|
42
|
+
// message and inside the refusal-then-reissue window. A sibling of the refused call shares its message,
|
|
43
|
+
// a dispatch after an answered reissue follows a call that ran, and one past the window is a new one —
|
|
44
|
+
// each still refused where the build declares the field.
|
|
45
|
+
|
|
46
|
+
const INVESTIGATOR_FOREGROUND_REASON =
|
|
47
|
+
'⛔ investigator foreground: a background `investigator` leaves its result queued until a later turn. ' +
|
|
48
|
+
'Reissue the call with `run_in_background: false`, and put the reads of files this run will edit in the same message. ' +
|
|
49
|
+
'It fires on every occurrence (`.claude/skills/workflow-commands/delegation.md`).'
|
|
50
|
+
|
|
51
|
+
const BACKGROUND_FIELD = 'run_in_background'
|
|
52
|
+
// The fields that make a reissue the same dispatch as the call it repeats.
|
|
53
|
+
const BODY_FIELDS = ['description', 'prompt'] as const
|
|
54
|
+
const GUARD_LABEL = time_transcript_line.guard_from_refusal(INVESTIGATOR_FOREGROUND_REASON)
|
|
55
|
+
const NO_FIELD_STAMP = hook_decision.create_refusal_stamp('josh-investigator-no-field-')
|
|
56
|
+
|
|
57
|
+
// `kit:investigator` is the consumer's spelling of the same definition.
|
|
58
|
+
function is_investigator(call: GuardedCall): boolean {
|
|
59
|
+
if (!agent_model.SUBAGENT_TOOLS.has(call.name) || !json_value.is_record(call.input)) return false
|
|
60
|
+
|
|
61
|
+
const type = call.input['subagent_type']
|
|
62
|
+
|
|
63
|
+
return typeof type === 'string' && type.split(':').at(-1) === delegation_policy.INVESTIGATOR_AGENT
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function field_of(input: unknown, key: string): unknown {
|
|
67
|
+
return json_value.is_record(input) ? input[key] : undefined
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function is_foreground(call: GuardedCall): boolean {
|
|
71
|
+
return field_of(call.input, BACKGROUND_FIELD) === false
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function is_background_investigator(call: GuardedCall): boolean {
|
|
75
|
+
return is_investigator(call) && !is_foreground(call)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function keeps_foreground(call: GuardedCall): boolean {
|
|
79
|
+
return is_investigator(call) && is_foreground(call)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function is_untyped_field(name: string, input: unknown): boolean {
|
|
83
|
+
if (!agent_model.SUBAGENT_TOOLS.has(name) || !json_value.is_record(input)) return false
|
|
84
|
+
|
|
85
|
+
return typeof input[BACKGROUND_FIELD] === 'string'
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// The ids of the tail's calls that have a result, and of those this row refused with the refusal's
|
|
89
|
+
// instant.
|
|
90
|
+
interface TailResults {
|
|
91
|
+
answered: ReadonlySet<string>
|
|
92
|
+
refused: ReadonlyMap<string, number>
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// A block with the message it was written in, or the instant its line was written.
|
|
96
|
+
interface Placed {
|
|
97
|
+
block: Block
|
|
98
|
+
message_id: string
|
|
99
|
+
at_ms: number
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function placed_of(lines: ReadonlyArray<TranscriptLine>): Array<Placed> {
|
|
103
|
+
return lines.flatMap((line) =>
|
|
104
|
+
line.blocks.map((block) => ({ block, message_id: line.message_id, at_ms: line.timestamp_ms })),
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function results_of(placed: ReadonlyArray<Placed>): TailResults {
|
|
109
|
+
const results = placed.filter(({ block }) => block.result_id !== '')
|
|
110
|
+
const refused = results.filter(({ block }) => block.refusal_guard === GUARD_LABEL)
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
answered: new Set(results.map(({ block }) => block.result_id)),
|
|
114
|
+
refused: new Map(refused.map(({ block, at_ms }) => [block.result_id, at_ms])),
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// The field written `false`, in either spelling.
|
|
119
|
+
function writes_foreground(block: Block): boolean {
|
|
120
|
+
return String(field_of(block.input, BACKGROUND_FIELD)) === 'false'
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function has_same_body(block: Block, call: GuardedCall): boolean {
|
|
124
|
+
return BODY_FIELDS.every((key) => field_of(block.input, key) === field_of(call.input, key))
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// The call in hand is not answered yet, and its `false` there is the one the parsed input dropped.
|
|
128
|
+
function is_pending_foreground(block: Block, results: TailResults): boolean {
|
|
129
|
+
return !results.answered.has(block.id) && writes_foreground(block)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// The call in hand on the tail, or a dispatch this row refused that it repeats. A same-body dispatch
|
|
133
|
+
// that ran is not a tell: a build that declares the field still refuses a bare repeat of it past the
|
|
134
|
+
// reissue window `refuses` reads.
|
|
135
|
+
function is_same_dispatch(block: Block, call: GuardedCall, results: TailResults): boolean {
|
|
136
|
+
if (!is_investigator(block) || !has_same_body(block, call)) return false
|
|
137
|
+
|
|
138
|
+
return results.refused.has(block.id) || is_pending_foreground(block, results)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// A dispatch this row refused although it wrote the field `false`.
|
|
142
|
+
function is_dropped_foreground(block: Block, results: TailResults): boolean {
|
|
143
|
+
return results.refused.has(block.id) && is_investigator(block) && writes_foreground(block)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function refused_at_ms(dispatch: Placed | undefined, results: TailResults): number {
|
|
147
|
+
return results.refused.get(dispatch?.block.id ?? '') ?? hook_decision.NEVER_MS
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function is_alone(dispatch: Placed, dispatches: ReadonlyArray<Placed>): boolean {
|
|
151
|
+
return dispatches.filter(({ message_id }) => message_id === dispatch.message_id).length === 1
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// The call in hand reissues this row's refusal: the last investigator dispatch with a result is one
|
|
155
|
+
// this row refused, alone in its message, within the reissue window. A sibling launched beside the
|
|
156
|
+
// refused call shares its message, and a dispatch after an answered reissue follows a call that ran.
|
|
157
|
+
function is_reissue(placed: ReadonlyArray<Placed>, results: TailResults, now_ms: number): boolean {
|
|
158
|
+
const dispatches = placed.filter(({ block }) => is_investigator(block))
|
|
159
|
+
const last = dispatches.findLast(({ block }) => results.answered.has(block.id))
|
|
160
|
+
const at_ms = refused_at_ms(last, results)
|
|
161
|
+
|
|
162
|
+
if (last === undefined || at_ms === hook_decision.NEVER_MS) return false
|
|
163
|
+
|
|
164
|
+
return is_alone(last, dispatches) && now_ms - at_ms < implementation_cut.REISSUE_WINDOW_MS
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function tail_shows_no_field(tail: string, call: GuardedCall, now_ms: number): boolean {
|
|
168
|
+
const placed = placed_of(time_transcript_line.parse_text(tail))
|
|
169
|
+
const results = results_of(placed)
|
|
170
|
+
const has_block_tell = placed.some(
|
|
171
|
+
({ block }) =>
|
|
172
|
+
is_untyped_field(block.name, block.input) ||
|
|
173
|
+
is_same_dispatch(block, call, results) ||
|
|
174
|
+
is_dropped_foreground(block, results),
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
return has_block_tell || is_reissue(placed, results, now_ms)
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function remember_no_field(run: GuardRun): boolean {
|
|
181
|
+
NO_FIELD_STAMP.record(NO_FIELD_STAMP.path(run.transcript), run.now_ms)
|
|
182
|
+
|
|
183
|
+
return true
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function is_remembered(run: GuardRun): boolean {
|
|
187
|
+
return NO_FIELD_STAMP.last_ms(NO_FIELD_STAMP.path(run.transcript)) !== hook_decision.NEVER_MS
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// True when this session's subagent tool declares no `run_in_background`, so no dispatch in it can run
|
|
191
|
+
// in the foreground: the call in hand or a subagent call on the tail wrote the field as a string, the
|
|
192
|
+
// tail holds the call in hand (or the dispatch it reissues) with the field the parsed input dropped,
|
|
193
|
+
// or this row refused a dispatch that wrote it `false`. The first tell is recorded for the session. A
|
|
194
|
+
// call that names the background explicitly came through a build that declares the field.
|
|
195
|
+
function lacks_background_field(tail: string, call: GuardedCall, run: GuardRun): boolean {
|
|
196
|
+
if (field_of(call.input, BACKGROUND_FIELD) === true) return false
|
|
197
|
+
if (is_remembered(run)) return true
|
|
198
|
+
|
|
199
|
+
const has_tell =
|
|
200
|
+
is_untyped_field(call.name, call.input) || tail_shows_no_field(tail, call, run.now_ms)
|
|
201
|
+
|
|
202
|
+
return has_tell && remember_no_field(run)
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const ROW = {
|
|
206
|
+
id: 'investigator-foreground',
|
|
207
|
+
is_trigger: is_background_investigator,
|
|
208
|
+
reason: INVESTIGATOR_FOREGROUND_REASON,
|
|
209
|
+
already_satisfied: lacks_background_field,
|
|
210
|
+
decide: (): boolean => true,
|
|
211
|
+
keeps: keeps_foreground,
|
|
212
|
+
reaches: is_investigator,
|
|
213
|
+
about: {
|
|
214
|
+
title: 'Investigator dispatched in the foreground',
|
|
215
|
+
topic:
|
|
216
|
+
'`.claude/skills/workflow-commands/delegation.md` → "The pre-implementation reading — what goes to a unit, and from which file"',
|
|
217
|
+
fires:
|
|
218
|
+
'an `Agent` / `Task` call of the `investigator` type without `run_in_background: false`. Every occurrence',
|
|
219
|
+
quiet:
|
|
220
|
+
'another agent type, `run_in_background: false` set, or a session whose subagent tool declares no `run_in_background` (the field written as a string, the tail holding the same description and prompt, a refused dispatch that wrote it `false`, or a reissue still without the field just after this row refused a lone dispatch) — remembered for the session',
|
|
221
|
+
},
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const investigator_foreground = {
|
|
225
|
+
INVESTIGATOR_FOREGROUND_REASON,
|
|
226
|
+
ROW,
|
|
227
|
+
is_background_investigator,
|
|
228
|
+
lacks_background_field,
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export { investigator_foreground }
|
|
@@ -1,24 +1,19 @@
|
|
|
1
|
-
// The bare
|
|
2
|
-
//
|
|
3
|
-
// place.
|
|
1
|
+
// The printing-side formatter that keeps a bare `#N` out of session-facing output, and the bare-`#N`
|
|
2
|
+
// predicate it is checked against.
|
|
4
3
|
//
|
|
5
4
|
// **Session-facing output cites an Issue as a number-link, never a bare `#N`.** `CLAUDE.md` and
|
|
6
5
|
// `prompts/collaboration-workflow/issue-citation.md` require `[#<N>](https://github.com/<owner>/<repo>/issues/<N>) — <short summary>`
|
|
7
6
|
// in what the person reads: a bare `#123` is not clickable and does not say which repository's Issue
|
|
8
|
-
// it is.
|
|
9
|
-
// predicate answers whether a bare number slipped into it.
|
|
7
|
+
// it is.
|
|
10
8
|
//
|
|
11
|
-
// **
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// right after `PR` / `pull request` is not a citation slip and is skipped. The scan is line-based so
|
|
15
|
-
// each exclusion is decided from the one line the mention sits on.
|
|
9
|
+
// **The detection is what is genuinely a bare citation**: a `#N` inside a fenced code block, inside an
|
|
10
|
+
// inline-code span, on a quote line, or right after `PR` / `pull request` is not a citation slip and is
|
|
11
|
+
// skipped. The scan is line-based so each exclusion is decided from the one line the mention sits on.
|
|
16
12
|
//
|
|
17
|
-
// **`linkify` runs that same scan the other way**: a command whose stdout a
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
// same exclusions hold, so a `#N` in a fenced example or an already-linked reference is left untouched.
|
|
13
|
+
// **`linkify` runs that same scan the other way**: a command whose stdout a run copies into its reply
|
|
14
|
+
// passes the text through it, and every bare `#N` the predicate would flag is rewritten to `[#N](url)`
|
|
15
|
+
// — which the predicate then reads as linked, so the reference is fixed where it is printed. The same
|
|
16
|
+
// exclusions hold, so a `#N` in a fenced example or an already-linked reference is left untouched.
|
|
22
17
|
|
|
23
18
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
24
19
|
|
|
@@ -31,8 +26,8 @@ const ISSUE_NUMBER = /#\d+/gu
|
|
|
31
26
|
// scan stays linear.
|
|
32
27
|
const REFERENCE_BOUNDARY = /[\s#()[\]<>|]/u
|
|
33
28
|
// A well-formed `owner/repo`: exactly one slash between two non-empty segments — the same shape
|
|
34
|
-
// `issue:cite`'s parser accepts. A path-like run (`src/lib`, `a/b/c`) is not one, so it is not
|
|
35
|
-
// as a
|
|
29
|
+
// `issue:cite`'s parser accepts. A path-like run (`src/lib`, `a/b/c`) is not one, so it is not linked
|
|
30
|
+
// as a repository.
|
|
36
31
|
const OWNER_REPO = /^[^\s/#]+\/[^\s/#]+$/u
|
|
37
32
|
// A markdown link: `[text](target)`. Each class excludes *both* of its delimiters — no `[`/`]` in the
|
|
38
33
|
// text, no `(`/`)` in the target — so neither star is ambiguous against a nested bracket and there is
|
|
@@ -94,11 +89,6 @@ function lead_token(message: string, hash_index: number): string {
|
|
|
94
89
|
return message.slice(start, hash_index)
|
|
95
90
|
}
|
|
96
91
|
|
|
97
|
-
// **The message text alone, never a GitHub-bound artifact.** An Issue body or comment is passed to
|
|
98
|
-
// `gh` as a `Bash` argument, not spoken in `last_assistant_message`, so those never reach here — which
|
|
99
|
-
// is exactly the "silent on GitHub-bound artifacts" behavior the issue asks for, obtained by what the
|
|
100
|
-
// stop guard reads rather than by a second exclusion here.
|
|
101
|
-
//
|
|
102
92
|
// The `owner/repo` written immediately before a `#N`, or '' when the mention is bare — the run of
|
|
103
93
|
// non-boundary characters ending at the `#`, kept only when it holds a `/`. Read backwards a
|
|
104
94
|
// character at a time so a repository name of any length costs its own length and no more.
|
|
@@ -184,10 +174,9 @@ function prose_lines(message: string): ReadonlyArray<string> {
|
|
|
184
174
|
return lines_outside_fences(message).filter((line) => !QUOTE_LINE.test(line))
|
|
185
175
|
}
|
|
186
176
|
|
|
187
|
-
// The bare references in the message, in the order they appear and de-duplicated
|
|
188
|
-
//
|
|
189
|
-
//
|
|
190
|
-
// from an Issue body is not read as the run's own citation.
|
|
177
|
+
// The bare references in the message, in the order they appear and de-duplicated. Fenced-code blocks
|
|
178
|
+
// and quote lines are skipped, so a `#N` shown in an example or quoted from an Issue body is not read
|
|
179
|
+
// as the run's own citation.
|
|
191
180
|
function bare_references(message: string): ReadonlyArray<string> {
|
|
192
181
|
const found: Array<string> = []
|
|
193
182
|
|
|
@@ -196,42 +185,10 @@ function bare_references(message: string): ReadonlyArray<string> {
|
|
|
196
185
|
return [...new Set(found)]
|
|
197
186
|
}
|
|
198
187
|
|
|
199
|
-
// Every reference the prompt carries, each as written — `#N` or `owner/repo#N` — with none of the
|
|
200
|
-
// citation exclusions applied: a number pasted inside a fence or a quote is still the person's.
|
|
201
|
-
function prompt_references(prompt: string): ReadonlySet<string> {
|
|
202
|
-
const found = new Set<string>()
|
|
203
|
-
|
|
204
|
-
for (const match of prompt.matchAll(ISSUE_NUMBER)) {
|
|
205
|
-
found.add(repo_prefix(prompt, match.index) + match[0])
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
return found
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// **A number the person's prompt already carried is quoted, not cited**. A
|
|
212
|
-
// pasted log from another repository holds its own `#1`…`#7`; `issue:cite` would link them to this
|
|
213
|
-
// repository's unrelated Issues, so following the refusal would make the reply wrong. Only the exact
|
|
214
|
-
// reference the prompt wrote is exempt, so a bare `#N` the run brought in itself is still refused.
|
|
215
|
-
function unquoted_references(message: string, prompt: string): ReadonlyArray<string> {
|
|
216
|
-
const quoted = prompt_references(prompt)
|
|
217
|
-
|
|
218
|
-
return bare_references(message).filter((reference) => !quoted.has(reference))
|
|
219
|
-
}
|
|
220
|
-
|
|
221
188
|
function has_bare_reference(message: string): boolean {
|
|
222
189
|
return bare_references(message).length > 0
|
|
223
190
|
}
|
|
224
191
|
|
|
225
|
-
// The token `issue:cite` takes for one reference: a qualified `owner/repo#N` is passed as-is, a bare
|
|
226
|
-
// `#N` loses its `#` so the command reads `issue:cite 123` rather than `issue:cite #123`.
|
|
227
|
-
function cite_argument(reference: string): string {
|
|
228
|
-
return reference.startsWith('#') ? reference.slice(1) : reference
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
function cite_arguments(references: ReadonlyArray<string>): ReadonlyArray<string> {
|
|
232
|
-
return references.map((reference) => cite_argument(reference))
|
|
233
|
-
}
|
|
234
|
-
|
|
235
192
|
// One bare reference rewritten as a number-link: `[#N](url)` for a same-repo mention, or
|
|
236
193
|
// `[owner/repo#N](url)` for a qualified one — the label is the reference exactly as it was written, so
|
|
237
194
|
// the reader sees the number they would have, now clickable. The URL is `issue-cite`'s own assembly,
|
|
@@ -286,11 +243,9 @@ function linkify(message: string, slug: string): string {
|
|
|
286
243
|
|
|
287
244
|
const issue_citation = {
|
|
288
245
|
bare_references,
|
|
289
|
-
cite_arguments,
|
|
290
246
|
has_bare_reference,
|
|
291
247
|
linkify,
|
|
292
248
|
prose_lines,
|
|
293
|
-
unquoted_references,
|
|
294
249
|
}
|
|
295
250
|
|
|
296
251
|
export { issue_citation }
|
|
@@ -21,14 +21,14 @@ const ISSUE_VIEW_COMMAND = new RegExp(String.raw`^gh\s+${gh_api.GH_FLAGS}issue\s
|
|
|
21
21
|
// (`…/issues`) and every sub-resource under it (`…/issues/1319/comments`) are left alone.
|
|
22
22
|
const ISSUE_BODY_PATH = /repos\/[^\s'"]*\/issues\/\d+(?=$|["'\s])/u
|
|
23
23
|
// **A write to that path is not a read of it**, which is why the body read below asks `gh_api.is_read`:
|
|
24
|
-
// `gh api` sends POST as soon as any field flag appears, and
|
|
24
|
+
// `gh api` sends POST as soon as any field flag appears, and a run PATCHes `…/issues/<N>` to
|
|
25
25
|
// normalize a title and to fill a blank body — so without the read check the delivery would be spent
|
|
26
26
|
// refusing a write, and the genuine body read later in the same run would never be guarded.
|
|
27
27
|
// A segment that fetches comments: the flag, a `comments` field in a `--json` projection, or the
|
|
28
28
|
// comments endpoint. The short `-c` is deliberately absent — it belongs to `wc`, `grep` and `sort`
|
|
29
29
|
// far more often than to `gh`, and reading it as "comments included" silenced the rule on any line
|
|
30
30
|
// that ended in a pipe. A run that types it pays one round trip instead.
|
|
31
|
-
const FETCHES_COMMENTS = /--comments\b|--json
|
|
31
|
+
const FETCHES_COMMENTS = /--comments\b|--json[=\s]['"]?[\w,]*\bcomments\b|\/comments\b/u
|
|
32
32
|
const ISSUES_PATH = /repos\/[^\s'"]*\/issues\//u
|
|
33
33
|
|
|
34
34
|
// A field projection — `--jq` for `gh api`, `--json` for `gh issue view` — whose value never names the
|
|
@@ -38,11 +38,14 @@ const ISSUES_PATH = /repos\/[^\s'"]*\/issues\//u
|
|
|
38
38
|
// comma list `--json state,labels` and the expression `'{state, labels}'` are read the same way.
|
|
39
39
|
const FIELD_PROJECTION = /(?:--jq|--json)[= ]\s*('[^']*'|"[^"]*"|\S+)/u
|
|
40
40
|
const NAMES_THE_BODY = /\bbody\b/u
|
|
41
|
+
// A projection that names no field at all — `--jq .`, `--jq '.[]'` — passes every field through,
|
|
42
|
+
// the body with them, so it is a body read however it is spelled.
|
|
43
|
+
const NAMES_A_FIELD = /(?:^|[.{,\s'"])[A-Za-z_]/u
|
|
41
44
|
|
|
42
45
|
function projects_away_body(segment: string): boolean {
|
|
43
|
-
const
|
|
46
|
+
const value = FIELD_PROJECTION.exec(segment)?.[1]
|
|
44
47
|
|
|
45
|
-
return
|
|
48
|
+
return value !== undefined && NAMES_A_FIELD.test(value) && !NAMES_THE_BODY.test(value)
|
|
46
49
|
}
|
|
47
50
|
|
|
48
51
|
function is_body_read_segment(segment: string): boolean {
|
|
@@ -82,7 +85,7 @@ function reads_issue_comments(command: string): boolean {
|
|
|
82
85
|
}
|
|
83
86
|
|
|
84
87
|
const RULE_DOC = '`.claude/skills/workflow-commands/issue-comments.md`'
|
|
85
|
-
const COMMENTS_FALLBACK = 'gh api repos
|
|
88
|
+
const COMMENTS_FALLBACK = 'gh api repos/<owner>/<repo>/issues/<N>/comments'
|
|
86
89
|
|
|
87
90
|
// **The refusal hands over the command that fixes it**, because reading is not the same as
|
|
88
91
|
// obeying: a sentence saying "also read the comments" is prose that moves nothing, while a refused
|
|
@@ -164,6 +167,14 @@ const ROW = {
|
|
|
164
167
|
rewrite_note: COMMENTS_NOTE,
|
|
165
168
|
// The opening the reason carried before it led with the command.
|
|
166
169
|
former_reasons: ["⛔ an Issue's comments are part of the Issue: read them before implementing"],
|
|
170
|
+
about: {
|
|
171
|
+
title: 'Reading Issue comments',
|
|
172
|
+
topic: '`issue-comments.md`',
|
|
173
|
+
fires:
|
|
174
|
+
'a `Bash` that reads only the Issue body (`gh issue view <N>`, or a GET ending in `…/issues/<N>`). Refused until it is re-read with the comments',
|
|
175
|
+
quiet:
|
|
176
|
+
'no Issue read, or a read with `--comments` / `--json comments` / `…/comments` from the start',
|
|
177
|
+
},
|
|
167
178
|
}
|
|
168
179
|
|
|
169
180
|
const issue_comments = {
|
|
@@ -171,7 +182,9 @@ const issue_comments = {
|
|
|
171
182
|
ISSUE_COMMENTS_REASON,
|
|
172
183
|
ROW,
|
|
173
184
|
comments_input,
|
|
185
|
+
fetches_issue_comments,
|
|
174
186
|
is_body_only_issue_read,
|
|
187
|
+
projects_away_body,
|
|
175
188
|
}
|
|
176
189
|
|
|
177
190
|
export { issue_comments }
|
|
@@ -66,6 +66,13 @@ const ROW = {
|
|
|
66
66
|
is_trigger: bash_triggers.on_bash_command(is_bare_josh_git),
|
|
67
67
|
reason: JOSH_GIT_BARE_REASON,
|
|
68
68
|
decide: (): boolean => true,
|
|
69
|
+
about: {
|
|
70
|
+
title: 'Bare `pnpm josh git`',
|
|
71
|
+
topic: '`operating-rules.md` → "git-rules"',
|
|
72
|
+
fires:
|
|
73
|
+
'`pnpm josh git` without `-y`, whose staging prompt cancels with no TTY. Every occurrence',
|
|
74
|
+
quiet: '`pnpm josh git -y`',
|
|
75
|
+
},
|
|
69
76
|
}
|
|
70
77
|
|
|
71
78
|
const josh_git_bare = {
|