@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,7 +1,8 @@
|
|
|
1
1
|
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
2
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
2
3
|
import { z } from 'zod'
|
|
4
|
+
import { concise_reply } from './concise-reply'
|
|
3
5
|
import { filing_offer } from './filing-offer'
|
|
4
|
-
import { issue_citation } from './issue-citation'
|
|
5
6
|
import { lane_background } from './lane-background'
|
|
6
7
|
import { reply_language } from './reply-language'
|
|
7
8
|
import { stop_decision, type StopDecision } from './stop-decision'
|
|
@@ -21,7 +22,7 @@ import { stop_decision, type StopDecision } from './stop-decision'
|
|
|
21
22
|
// `pretool-guard` is one — not a second copy of the plumbing.
|
|
22
23
|
//
|
|
23
24
|
// **A rule whose answer is fixed acts; only a rule that needs judgement refuses** (joshuafolkken/kit#3919).
|
|
24
|
-
// The stop notification
|
|
25
|
+
// The stop notification and the hold release are each one mechanical operation the
|
|
25
26
|
// hook can run itself, so they come back as `actions` and the stop goes through: a refusal is a whole
|
|
26
27
|
// model turn spent re-reading the context to run a command the hook already knew. `stop-actions.ts`
|
|
27
28
|
// runs them, and only an action that fails falls back to its refusal. The rest — the reply's language,
|
|
@@ -33,7 +34,7 @@ const SWITCH_ENV_KEY = 'JOSH_STOP_GUARD'
|
|
|
33
34
|
const BLOCK_DECISION = 'block'
|
|
34
35
|
|
|
35
36
|
// Only the fields the stop rules read. `last_assistant_message` is the turn's session-facing text —
|
|
36
|
-
// Claude Code hands it directly so the transcript's async lag is never in the
|
|
37
|
+
// Claude Code hands it directly so the transcript's async lag is never in the rules' path.
|
|
37
38
|
const stop_payload_schema = z.object({
|
|
38
39
|
transcript_path: z.string().min(1),
|
|
39
40
|
stop_hook_active: z.boolean().nullish(),
|
|
@@ -63,8 +64,8 @@ interface StopContext {
|
|
|
63
64
|
notified: boolean
|
|
64
65
|
// The turn's session-facing reply text.
|
|
65
66
|
message: string
|
|
66
|
-
// The person's last prompt —
|
|
67
|
-
prompt: string
|
|
67
|
+
// The person's last prompt on the tail — `undefined` when none is on it (`last_prompt.person_prompt`).
|
|
68
|
+
prompt: string | undefined
|
|
68
69
|
// This stop already forced a continuation earlier in the prompt — the loop-breaker Claude Code
|
|
69
70
|
// documents, so a run that will not comply is not blocked forever.
|
|
70
71
|
stop_hook_active: boolean
|
|
@@ -73,7 +74,7 @@ interface StopContext {
|
|
|
73
74
|
// the cut holding the tree by design and hands off to a fresh process (`pre-gate-cut.md`), so that
|
|
74
75
|
// turn-end is an automatic continuation, not the person-waiting pause the block rules are for.
|
|
75
76
|
cut_pending: boolean
|
|
76
|
-
// An Issue filing no guard refused is on this run's transcript tail — `
|
|
77
|
+
// An Issue filing no guard refused is on this run's transcript tail — `turn_filings`' count.
|
|
77
78
|
filed: boolean
|
|
78
79
|
// The owner of the repository the session runs in, or `undefined` when it cannot be read.
|
|
79
80
|
session_owner: string | undefined
|
|
@@ -90,6 +91,9 @@ interface StopContext {
|
|
|
90
91
|
// A backgrounded subagent this run launched has not finished — `lane_background.pending_agent_ids`.
|
|
91
92
|
// Apart from `background_pending`, since only a subagent is sure to end.
|
|
92
93
|
agent_pending: boolean
|
|
94
|
+
// A backgrounded command this run launched has not finished — `lane_background.pending_command_ids`.
|
|
95
|
+
// Apart from `agent_pending`, since the two are waited on differently.
|
|
96
|
+
command_pending: boolean
|
|
93
97
|
// This lane child handed its region to a running detached ship — `lane_handoff.is_handed_off`.
|
|
94
98
|
// The supervisor notifies on its own outcome, so nobody waits on this stop.
|
|
95
99
|
handed_off: boolean
|
|
@@ -107,7 +111,6 @@ interface StopContext {
|
|
|
107
111
|
type StopAction =
|
|
108
112
|
| { kind: 'notify'; issue: string; message: string; decision: StopDecision }
|
|
109
113
|
| { kind: 'release'; issue: string }
|
|
110
|
-
| { kind: 'cite'; references: ReadonlyArray<string> }
|
|
111
114
|
|
|
112
115
|
// `reason` refuses the stop; otherwise `actions` run, and `blocks_on_failure` says whether a failed one
|
|
113
116
|
// falls back to its refusal — never past the loop-breaker.
|
|
@@ -127,8 +130,8 @@ const STOP_NOTIFY_REASON =
|
|
|
127
130
|
'⛔ mid-workflow stop notification: this working tree is still held by a run and no `confirmation` ' +
|
|
128
131
|
'Telegram was sent this turn. Send ' +
|
|
129
132
|
'`pnpm josh notify --task-type confirmation --issue-url "<url>" --body=$\'<reason>\' ' +
|
|
130
|
-
'--recommended "<choice>" --alternative "<choice>"` (`
|
|
131
|
-
'
|
|
133
|
+
'--recommended "<choice>" --alternative "<choice>"` (`rule-delivery.md` → "stop-notify"), ' +
|
|
134
|
+
'then confirm in one line that it was sent — do not repeat your previous reply.'
|
|
132
135
|
|
|
133
136
|
// **A clean tree that still holds is a tree the next run will trample.** `working-tree-hold.md`: a stop that
|
|
134
137
|
// leaves the tree clean releases the hold; a `halfrun` pre-commit stop and a `needs-human-review` stop
|
|
@@ -140,28 +143,6 @@ const HOLD_RELEASE_REASON =
|
|
|
140
143
|
'`working-tree-hold.md`), then confirm in one line that it was released — do not repeat your ' +
|
|
141
144
|
'previous reply.'
|
|
142
145
|
|
|
143
|
-
// **The fallback when the hook could not print the citation lines itself**. The bare `#N` is already
|
|
144
|
-
// on screen and the hook cannot unsay it, so the reason does the one thing that helps the *next* reply:
|
|
145
|
-
// it names the numbers it detected and hands over the exact `issue:cite` call that prints the
|
|
146
|
-
// paste-ready lines, then asks for the corrected citation lines alone — not the whole reply reissued.
|
|
147
|
-
// Reprinting the whole reply is what made the correction read as a duplicate;
|
|
148
|
-
// the bare copy already scrolled past stays, and the fix follows it as a short correction. The rule
|
|
149
|
-
// itself is not restated — it is resident in `CLAUDE.md` — only pointed at.
|
|
150
|
-
const ISSUE_CITATION_REASON =
|
|
151
|
-
'Session-facing output cites an Issue as a number-link so the reader can click through and see ' +
|
|
152
|
-
'which repository it is (`CLAUDE.md`, `prompts/collaboration-workflow/issue-citation.md`).'
|
|
153
|
-
|
|
154
|
-
function build_citation_reason(references: ReadonlyArray<string>): string {
|
|
155
|
-
const numbers = references.join(', ')
|
|
156
|
-
const command = `pnpm josh issue:cite ${issue_citation.cite_arguments(references).join(' ')}`
|
|
157
|
-
|
|
158
|
-
return (
|
|
159
|
-
`⛔ issue citation: your reply names an Issue as a bare \`#N\` (${numbers}). Run \`${command}\` ` +
|
|
160
|
-
`to print the paste-ready citation lines, then print the corrected citation lines alone — do not ` +
|
|
161
|
-
`repeat your previous reply. ${ISSUE_CITATION_REASON}`
|
|
162
|
-
)
|
|
163
|
-
}
|
|
164
|
-
|
|
165
146
|
// **An offer to file in an unattended run is a Tier A filing deferred to nobody**.
|
|
166
147
|
// The judgement is already made, so the reason hands over the filing chain rather than a question; the
|
|
167
148
|
// rule itself is resident in `observation-filing.md` and only pointed at. **An interactive session asks
|
|
@@ -169,7 +150,7 @@ function build_citation_reason(references: ReadonlyArray<string>): string {
|
|
|
169
150
|
const FILING_OFFER_REASON =
|
|
170
151
|
'⛔ filing offer: your reply offers to file an Issue instead of filing it, and this run is ' +
|
|
171
152
|
'unattended — nobody is there to answer. Run ' +
|
|
172
|
-
'`pnpm josh issue:file "<title>" --body-file <path
|
|
153
|
+
'`pnpm josh issue:file "<title>" --body-file <path>` (Tier A, ' +
|
|
173
154
|
'`observation-filing.md`), then end with the one-line citation of what was filed; do not repeat ' +
|
|
174
155
|
'your previous reply. If it is not worth filing after all, say so in one line instead.'
|
|
175
156
|
|
|
@@ -248,6 +229,13 @@ function language_reason(context: StopContext): string | undefined {
|
|
|
248
229
|
return build_language_reason(context.session_lang)
|
|
249
230
|
}
|
|
250
231
|
|
|
232
|
+
// **A reply's narrative over the limit is sent back once to be shortened** — `concise-reply.ts`.
|
|
233
|
+
function concise_reason(context: StopContext): string | undefined {
|
|
234
|
+
if (!concise_reply.is_over(context.message, context.prompt)) return undefined
|
|
235
|
+
|
|
236
|
+
return concise_reply.build_reason(context.message)
|
|
237
|
+
}
|
|
238
|
+
|
|
251
239
|
// The sessions no person answers: one kit launched under `claude -p` (a lane child, a woken session), a
|
|
252
240
|
// dispatched lane child, or the `backlogrun` parent the user handed the backlog to.
|
|
253
241
|
function is_unattended(context: StopContext): boolean {
|
|
@@ -294,24 +282,16 @@ function needs_release(context: StopContext): boolean {
|
|
|
294
282
|
return is_held_idle(context) && context.tree_clean && !context.prrun_stopped
|
|
295
283
|
}
|
|
296
284
|
|
|
297
|
-
// The
|
|
298
|
-
// its text lands in a stream-json log, so
|
|
299
|
-
//
|
|
300
|
-
// to the same rules by their own guards, not here.
|
|
301
|
-
function bare_references(context: StopContext): ReadonlyArray<string> {
|
|
302
|
-
if (context.headless_agent) return []
|
|
303
|
-
|
|
304
|
-
return issue_citation.unquoted_references(context.message, context.prompt)
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
// The two rules that read the reply and need the model, the filing offer first. A drifted reply
|
|
285
|
+
// The rules that read the reply and need the model: the filing offer, then the language, then the
|
|
286
|
+
// length. **A headless agent's reply has no reader**: its text lands in a stream-json log, so
|
|
287
|
+
// correcting its language costs a turn and reaches nobody. A drifted reply
|
|
308
288
|
// refused for another reason is not rewritten, but the drift still ends: `block_envelope` appends the
|
|
309
289
|
// session-language note to every refusal, so the turn it continues is written in the session language.
|
|
310
290
|
function reply_reason(context: StopContext): string | undefined {
|
|
311
291
|
if (needs_filing(context)) return FILING_OFFER_REASON
|
|
312
292
|
if (context.headless_agent) return undefined
|
|
313
293
|
|
|
314
|
-
return language_reason(context)
|
|
294
|
+
return language_reason(context) ?? concise_reason(context)
|
|
315
295
|
}
|
|
316
296
|
|
|
317
297
|
// Sent back once; past the loop-breaker the run has said nothing is awaited, and nothing is sent.
|
|
@@ -341,11 +321,19 @@ function needs_background_wait(context: StopContext): boolean {
|
|
|
341
321
|
return context.lane_child && context.background_pending
|
|
342
322
|
}
|
|
343
323
|
|
|
324
|
+
// **Only subagents left take their own wait**: their notice comes in when a tool call ends, while a
|
|
325
|
+
// command is waited on through the detached ship.
|
|
326
|
+
function background_wait_reason(context: StopContext): string {
|
|
327
|
+
if (context.command_pending) return lane_background.LANE_BACKGROUND_STOP_REASON
|
|
328
|
+
|
|
329
|
+
return lane_background.LANE_AGENT_STOP_REASON
|
|
330
|
+
}
|
|
331
|
+
|
|
344
332
|
// The two lane rules that mean the run is not pausing at all — ahead of every action, since the notify
|
|
345
333
|
// would announce a pause the run has no reason to take.
|
|
346
334
|
function lane_reason(context: StopContext): string | undefined {
|
|
347
335
|
if (needs_index_route(context)) return LANE_INDEX_REASON
|
|
348
|
-
if (needs_background_wait(context)) return
|
|
336
|
+
if (needs_background_wait(context)) return background_wait_reason(context)
|
|
349
337
|
|
|
350
338
|
return undefined
|
|
351
339
|
}
|
|
@@ -381,14 +369,6 @@ function hold_actions(context: StopContext): Array<StopAction> {
|
|
|
381
369
|
return needs_release(context) ? [...notify, { kind: 'release', issue }] : notify
|
|
382
370
|
}
|
|
383
371
|
|
|
384
|
-
// The actions in the order they run: the notify ahead of the release that ends the hold it reports.
|
|
385
|
-
function stop_actions(context: StopContext): ReadonlyArray<StopAction> {
|
|
386
|
-
const references = bare_references(context)
|
|
387
|
-
const cite: Array<StopAction> = references.length > 0 ? [{ kind: 'cite', references }] : []
|
|
388
|
-
|
|
389
|
-
return [...hold_actions(context), ...cite]
|
|
390
|
-
}
|
|
391
|
-
|
|
392
372
|
// First-wins across the refusals. `stop_hook_active` is the loop-breaker, so a run that already got one
|
|
393
373
|
// continuation this prompt may stop; the lane rules go first, then the filing offer, then the language.
|
|
394
374
|
//
|
|
@@ -417,7 +397,7 @@ function stop_outcome(context: StopContext): StopOutcome {
|
|
|
417
397
|
const reason = block_reason(context)
|
|
418
398
|
if (!runs_actions(context, reason)) return { ...NO_OUTCOME, reason }
|
|
419
399
|
|
|
420
|
-
const actions =
|
|
400
|
+
const actions = hold_actions(context)
|
|
421
401
|
if (actions.length === 0) return NO_OUTCOME
|
|
422
402
|
|
|
423
403
|
return { reason, actions, blocks_on_failure: !context.stop_hook_active }
|
|
@@ -425,10 +405,7 @@ function stop_outcome(context: StopContext): StopOutcome {
|
|
|
425
405
|
|
|
426
406
|
// The refusal an action falls back to when the hook could not run it.
|
|
427
407
|
function fallback_reason(action: StopAction): string {
|
|
428
|
-
|
|
429
|
-
if (action.kind === 'release') return HOLD_RELEASE_REASON
|
|
430
|
-
|
|
431
|
-
return build_citation_reason(action.references)
|
|
408
|
+
return action.kind === 'notify' ? STOP_NOTIFY_REASON : HOLD_RELEASE_REASON
|
|
432
409
|
}
|
|
433
410
|
|
|
434
411
|
// The documented shape a `Stop` hook blocks with: `reason` is fed back to Claude, which then continues
|
|
@@ -447,9 +424,7 @@ function notice_envelope(notice: string): string {
|
|
|
447
424
|
}
|
|
448
425
|
|
|
449
426
|
function parse_stop_payload(raw_payload: string): StopPayload | undefined {
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
return parsed.success ? parsed.data : undefined
|
|
427
|
+
return json_value.parse_with(raw_payload, stop_payload_schema)
|
|
453
428
|
}
|
|
454
429
|
|
|
455
430
|
function is_enabled(): boolean {
|
|
@@ -461,7 +436,6 @@ const stop_rules = {
|
|
|
461
436
|
HEADLESS_REFUSAL_CAP,
|
|
462
437
|
HEADLESS_WAIT_REASON,
|
|
463
438
|
HOLD_RELEASE_REASON,
|
|
464
|
-
ISSUE_CITATION_REASON,
|
|
465
439
|
LANE_INDEX_REASON,
|
|
466
440
|
NO_OUTCOME,
|
|
467
441
|
STOP_NOTIFY_REASON,
|
|
@@ -38,7 +38,17 @@ const REASON =
|
|
|
38
38
|
// The enumeration row itself, so `delivered-rules.ts` spreads one entry rather than restating the
|
|
39
39
|
// trigger and reason it already single-sources here. Once per run (the default delivery) for the
|
|
40
40
|
// reason above.
|
|
41
|
-
const ROW = {
|
|
41
|
+
const ROW = {
|
|
42
|
+
id: 'test-declared',
|
|
43
|
+
is_trigger: is_untested_commit,
|
|
44
|
+
reason: REASON,
|
|
45
|
+
about: {
|
|
46
|
+
title: 'Test declaration',
|
|
47
|
+
topic: '`testing-guide.md` → "0. Per-Requirement Test Coverage (MANDATORY)"',
|
|
48
|
+
fires: '`pnpm josh git -y` (`josh g`) while `pnpm josh test:declared` answers `required`',
|
|
49
|
+
quiet: '`exempt` (non-runtime only) or `satisfied` (tests included)',
|
|
50
|
+
},
|
|
51
|
+
}
|
|
42
52
|
|
|
43
53
|
const test_declared_commit = { REASON, ROW }
|
|
44
54
|
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { repo_party } from '#scripts/discovery/repo-party'
|
|
2
2
|
import { bash_triggers } from './bash-triggers'
|
|
3
3
|
import { gh_api } from './gh-api'
|
|
4
|
+
import { gh_repo_selector } from './gh-repo-selector'
|
|
5
|
+
import { git_argv } from './git-argv'
|
|
6
|
+
import { pr_merge } from './pr-merge'
|
|
7
|
+
import { repo_admin } from './repo-admin'
|
|
4
8
|
import { shell_segments } from './shell-segments'
|
|
5
9
|
|
|
6
10
|
// The trigger and the delivered text behind the `third-party-write` row of `delivered-rules.ts`.
|
|
@@ -70,44 +74,126 @@ function candidates_at(
|
|
|
70
74
|
return has_moved ? unreadable_candidates : resolve_placeholder_owners
|
|
71
75
|
}
|
|
72
76
|
|
|
73
|
-
//
|
|
74
|
-
//
|
|
77
|
+
// A merge or an administration write is refused by its own row whoever owns the target, and one
|
|
78
|
+
// refusal is what a PreToolUse hook carries — so the two readings this row added for
|
|
79
|
+
// joshuafolkken/kit#4659 leave those to the row that names them. Asked only of a candidate, so an
|
|
80
|
+
// ordinary shell line pays nothing for it.
|
|
81
|
+
function is_claimed_by_narrower_row(command: string): boolean {
|
|
82
|
+
return pr_merge.is_pr_merge(command) || repo_admin.is_repo_admin_write(command)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// **A GraphQL mutation names no repository this guard can read** (joshuafolkken/kit#4659): its target
|
|
86
|
+
// is a node id inside the body, so it is refused whoever owns the session — the disposition
|
|
87
|
+
// `pr-merge.ts` takes for a GraphQL body it cannot read, which that row already refuses for a body
|
|
88
|
+
// read from a file or computed by the shell. A query passes. The keyword is looked for in the whole
|
|
89
|
+
// line, because the segment cut ignores quotes and a multi-line query splits across it. A query field
|
|
90
|
+
// the shell expands (`query="$Q"`, or the whole argument quoted: `"query=$Q"`) hides its keyword the
|
|
91
|
+
// same way, so it is refused as a mutation; a single-quoted `query='query($o: String!) {…}'` is
|
|
92
|
+
// literal and still read. A body read from a file is `pr-merge.ts`'s, which refuses it already.
|
|
93
|
+
const GRAPHQL_MUTATION = /\bmutation\b/u
|
|
94
|
+
const EXPANDED_QUERY = /^(?:-[fF])?"?query=(?!')[\s\S]*\$/u
|
|
95
|
+
|
|
96
|
+
function is_hidden_or_mutation(command: string, args: ReadonlyArray<string>): boolean {
|
|
97
|
+
return GRAPHQL_MUTATION.test(command) || args.some((argument) => EXPANDED_QUERY.test(argument))
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// The arguments of a `gh api` GraphQL call, or `undefined` when the segment is not one.
|
|
101
|
+
function graphql_args(segment: string): ReadonlyArray<string> | undefined {
|
|
102
|
+
const call = git_argv.program_of(segment)
|
|
103
|
+
|
|
104
|
+
if (call === undefined || !gh_api.is_gh_api(segment)) return undefined
|
|
105
|
+
|
|
106
|
+
return pr_merge.is_graphql_call(call.name, call.args) ? call.args : undefined
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function is_graphql_mutation(command: string, segment: string): boolean {
|
|
110
|
+
const args = graphql_args(segment)
|
|
111
|
+
|
|
112
|
+
if (args === undefined) return false
|
|
113
|
+
|
|
114
|
+
return is_hidden_or_mutation(command, args) && !is_claimed_by_narrower_row(command)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// **A `gh <group> <action> -R <owner>/<repo>` write is judged by its selector** (kit#4659).
|
|
118
|
+
// A selector whose owner cannot be read (`-R "$REPO"`) is refused, like an unreadable placeholder
|
|
119
|
+
// candidate: it is a repository `gh` really writes to.
|
|
120
|
+
function is_third_party_selector_write(
|
|
121
|
+
command: string,
|
|
122
|
+
segments: ReadonlyArray<string>,
|
|
123
|
+
index: number,
|
|
124
|
+
session_owner: string | undefined,
|
|
125
|
+
): boolean {
|
|
126
|
+
const selectors = gh_repo_selector.write_selectors(segments, index)
|
|
127
|
+
const is_third_party = selectors.some((selector) => {
|
|
128
|
+
const owner = repo_party.selector_owner(selector)
|
|
129
|
+
|
|
130
|
+
return (
|
|
131
|
+
owner === undefined || repo_party.classify(session_owner, owner) === repo_party.THIRD_PARTY
|
|
132
|
+
)
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
return is_third_party && !is_claimed_by_narrower_row(command)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function is_owner_dependent_write(segments: ReadonlyArray<string>, index: number): boolean {
|
|
139
|
+
const segment = segments[index] ?? ''
|
|
140
|
+
|
|
141
|
+
if (gh_api.is_gh_api(segment)) return gh_api.is_write(segment)
|
|
142
|
+
|
|
143
|
+
return gh_repo_selector.write_selectors(segments, index).length > 0
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function writes_to_third_party_owner(
|
|
147
|
+
command: string,
|
|
148
|
+
segments: ReadonlyArray<string>,
|
|
149
|
+
resolve_owner: () => string | undefined,
|
|
150
|
+
resolve_placeholder_owners: () => Array<string | undefined>,
|
|
151
|
+
): boolean {
|
|
152
|
+
if (segments.every((_segment, index) => !is_owner_dependent_write(segments, index))) return false
|
|
153
|
+
|
|
154
|
+
const session_owner = resolve_owner()
|
|
155
|
+
|
|
156
|
+
return segments.some(
|
|
157
|
+
(segment, index) =>
|
|
158
|
+
is_third_party_selector_write(command, segments, index, session_owner) ||
|
|
159
|
+
is_third_party_write_segment(
|
|
160
|
+
segment,
|
|
161
|
+
session_owner,
|
|
162
|
+
candidates_at(segments, index, resolve_placeholder_owners),
|
|
163
|
+
),
|
|
164
|
+
)
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// The session owner is read only when a segment is actually a repository write — so an ordinary shell
|
|
168
|
+
// line, and every read, pays nothing for the local config read. `resolve_owner` and
|
|
75
169
|
// `resolve_placeholder_owners` are injected so the suite fixes the owners without touching the real
|
|
76
170
|
// remotes, the way `file-body.ts` injects `has_file`. Each segment is judged on its own, so a `gh api`
|
|
77
171
|
// write quoted inside another command's argument is read as the write it is not, exactly as every
|
|
78
|
-
// other trigger here reads its own.
|
|
172
|
+
// other trigger here reads its own. The cut is by program — a pipe and a background `&` cut too, a
|
|
173
|
+
// quoted one does not — after joining backslash-continued lines, so `echo hi | gh pr comment …` and a
|
|
174
|
+
// `gh api graphql \⏎ -f query=…` are each read as the one `gh` call they launch.
|
|
79
175
|
function writes_third_party(
|
|
80
176
|
command: string,
|
|
81
177
|
resolve_owner: () => string | undefined = repo_party.current_owner,
|
|
82
178
|
resolve_placeholder_owners: () => Array<string | undefined> = repo_party.placeholder_owners,
|
|
83
179
|
): boolean {
|
|
84
|
-
const segments = shell_segments.
|
|
85
|
-
|
|
86
|
-
(segment) => gh_api.is_gh_api(segment) && gh_api.is_write(segment),
|
|
180
|
+
const segments = shell_segments.quote_aware_commands_of(
|
|
181
|
+
shell_segments.joined_continuations(command),
|
|
87
182
|
)
|
|
88
183
|
|
|
89
|
-
if (
|
|
90
|
-
|
|
91
|
-
const session_owner = resolve_owner()
|
|
184
|
+
if (segments.some((segment) => is_graphql_mutation(command, segment))) return true
|
|
92
185
|
|
|
93
|
-
return
|
|
94
|
-
is_third_party_write_segment(
|
|
95
|
-
segment,
|
|
96
|
-
session_owner,
|
|
97
|
-
candidates_at(segments, index, resolve_placeholder_owners),
|
|
98
|
-
),
|
|
99
|
-
)
|
|
186
|
+
return writes_to_third_party_owner(command, segments, resolve_owner, resolve_placeholder_owners)
|
|
100
187
|
}
|
|
101
188
|
|
|
102
189
|
// The instruction in the shape a refusal can carry: what the command does, why it is Tier C, and what
|
|
103
190
|
// to do instead. The command that computes the party is handed over, because the whole point of this
|
|
104
191
|
// Issue is that the test is computed rather than judged.
|
|
105
192
|
const THIRD_PARTY_WRITE_REASON =
|
|
106
|
-
|
|
107
|
-
'
|
|
108
|
-
'
|
|
109
|
-
'
|
|
110
|
-
'(`prompts/collaboration-workflow/upstream-interrupt.md`).'
|
|
193
|
+
"⛔ third-party write: this `gh` call writes to another owner's repository, or one it cannot " +
|
|
194
|
+
'read (a GraphQL mutation, an unreadable `-R`) — Tier C. Check `pnpm josh repo:party ' +
|
|
195
|
+
'<owner/repo>`; first-party, use a REST `repos/<owner>/<repo>` path. Else record it on our ' +
|
|
196
|
+
'Issue and draft it for a person to post. Fires on every occurrence (`upstream-interrupt.md`).'
|
|
111
197
|
|
|
112
198
|
// `decide` returns true so it refuses every occurrence; it declares no `keeps` — not writing to
|
|
113
199
|
// another owner's tracker is the absence of a call, not a call, so the row is reported unmeasured
|
|
@@ -117,6 +203,14 @@ const ROW = {
|
|
|
117
203
|
is_trigger: bash_triggers.on_bash_command((command: string) => writes_third_party(command)),
|
|
118
204
|
reason: THIRD_PARTY_WRITE_REASON,
|
|
119
205
|
decide: (): boolean => true,
|
|
206
|
+
about: {
|
|
207
|
+
title: 'Third-party write',
|
|
208
|
+
topic: '`upstream-interrupt.md`',
|
|
209
|
+
fires:
|
|
210
|
+
'a `gh api` write (field flag or a write method) or a `gh <group> <action>` write selected by `-R` / `GH_REPO` to a repository whose owner is not this session, or a `gh api graphql` call whose line names `mutation` or whose query the shell expands, outside the merge and administration rows. Every occurrence',
|
|
211
|
+
quiet:
|
|
212
|
+
'a read, a GraphQL query, or a first-party owner (pinned at session start, `pnpm josh repo:party`)',
|
|
213
|
+
},
|
|
120
214
|
}
|
|
121
215
|
|
|
122
216
|
const third_party_write = {
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { bash_triggers } from './bash-triggers'
|
|
2
|
+
import { shell_segments } from './shell-segments'
|
|
3
|
+
|
|
4
|
+
// The trigger and the delivered text behind the `timed-rerun` row of `delivered-rules.ts`
|
|
5
|
+
// (joshuafolkken/kit#4356). A lane agent timed a whole-tree `eslint` twice to learn what CI already
|
|
6
|
+
// records, and each run took about 1.3 cores for seven minutes outside the core budget.
|
|
7
|
+
//
|
|
8
|
+
// **The timer is the trigger, not the tool.** What a run is after when it prefixes `time` or reaches
|
|
9
|
+
// for `hyperfine` is a duration, and a duration of CI or of the gate is already on record — the Actions
|
|
10
|
+
// jobs and the lane ledger. The tool under the timer can be anything, so reading the timer is the one
|
|
11
|
+
// trigger that does not have to enumerate them.
|
|
12
|
+
//
|
|
13
|
+
// **Once per run.** The rule allows one re-run when the record cannot answer, so the reissue goes
|
|
14
|
+
// through. On that reissue `lane-direct-tool` still refuses a lane child's `time`-prefixed heavy tool
|
|
15
|
+
// (`git_argv` skips the timer), never wrapping it, and points it at `pnpm josh reserved-run`, the overlap
|
|
16
|
+
// `delivered-rules.ts` admits. A `hyperfine "<command>"` carries the tool inside a quoted argument,
|
|
17
|
+
// which `lane-direct-tool` does not read, so in a lane that reissue is not budgeted.
|
|
18
|
+
|
|
19
|
+
// A segment that opens with a timer, behind any environment assignments: `time`, `/usr/bin/time -p`
|
|
20
|
+
// and `hyperfine`. Anchored at the segment start, so a quoted mention or an argument is not a timer.
|
|
21
|
+
const TIMED_SEGMENT = /^\s*(?:[A-Za-z_]\w*=\S*\s+)*(?:\S*\/)?(?:time|hyperfine)\s/u
|
|
22
|
+
|
|
23
|
+
function is_timed_run(command: string): boolean {
|
|
24
|
+
return shell_segments
|
|
25
|
+
.quote_aware_commands_of(command)
|
|
26
|
+
.some((segment) => TIMED_SEGMENT.test(segment))
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Reading the record: an Actions run or job listing, or the lane ledger's gate timings.
|
|
30
|
+
const RECORD_READ = /\bgh\s+api\b.*\/actions\/runs\b|\bjosh\s+(?:lane:stats|lst)\b/u
|
|
31
|
+
|
|
32
|
+
function reads_the_record(command: string): boolean {
|
|
33
|
+
return RECORD_READ.test(command)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function measures_duration(command: string): boolean {
|
|
37
|
+
return reads_the_record(command) || is_timed_run(command)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const TIMED_RERUN_REASON =
|
|
41
|
+
'⛔ timed re-run: a CI or gate duration is already on record — read the Actions jobs with ' +
|
|
42
|
+
'`gh api …/actions/runs/<run_id>/jobs` or the gate timings with `pnpm josh lane:stats`. Re-run ' +
|
|
43
|
+
'only when the record cannot answer: reissue the same command once, and post the result on the ' +
|
|
44
|
+
'Issue (`prompts/collaboration-workflow/measurement.md`).'
|
|
45
|
+
|
|
46
|
+
// The row itself, so `delivered-rules.ts` spreads one entry; once per run, so the one allowed re-run
|
|
47
|
+
// goes through on the reissue.
|
|
48
|
+
const ROW = {
|
|
49
|
+
id: 'timed-rerun',
|
|
50
|
+
is_trigger: bash_triggers.on_bash_command(is_timed_run),
|
|
51
|
+
reason: TIMED_RERUN_REASON,
|
|
52
|
+
keeps: bash_triggers.on_bash_command(reads_the_record),
|
|
53
|
+
reaches: bash_triggers.on_bash_command(measures_duration),
|
|
54
|
+
about: {
|
|
55
|
+
title: 'Timed re-run',
|
|
56
|
+
topic: '`measurement.md`',
|
|
57
|
+
fires: 'a command timed with `time` / `/usr/bin/time` / `hyperfine`',
|
|
58
|
+
quiet: 'the duration is read from the Actions jobs or `pnpm josh lane:stats`',
|
|
59
|
+
},
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const timed_rerun = {
|
|
63
|
+
ROW,
|
|
64
|
+
TIMED_RERUN_REASON,
|
|
65
|
+
is_timed_run,
|
|
66
|
+
reads_the_record,
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export { timed_rerun }
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
2
|
+
import { time_transcript_line, type Block } from '#scripts/time-runtime/time-transcript-line'
|
|
3
|
+
import { bash_triggers } from './bash-triggers'
|
|
4
|
+
import { tail_commands } from './tail-commands'
|
|
5
|
+
|
|
6
|
+
// The filings a turn made, read off the session transcript for the `Stop` hook's offer to file
|
|
7
|
+
// (`stop-guard.ts`). **No new predicate**: the filing is `bash_triggers.is_issue_filing`, reused
|
|
8
|
+
// verbatim. The filing cap is not this count — it is `issue:file`'s own step, per originating work item
|
|
9
|
+
// (`scripts/issue/issue-file-cap.ts`, joshuafolkken/kit#4750).
|
|
10
|
+
//
|
|
11
|
+
// **A guard-refused filing does not count.** Claude Code writes a denied call to the transcript as a
|
|
12
|
+
// `tool_use` block with an errored `tool_result` — the same exclusion `investigation-reads.ts` makes
|
|
13
|
+
// for a refused read. **Nor does one `issue:file` held itself**: a lint problem or an unacknowledged
|
|
14
|
+
// duplicate exits non-zero having filed nothing. The filing is counted only where its result did not
|
|
15
|
+
// fail.
|
|
16
|
+
|
|
17
|
+
interface TailFilings {
|
|
18
|
+
// The `tool_use` id of every filing on the tail.
|
|
19
|
+
filing_ids: Array<string>
|
|
20
|
+
// The id of every result that came back as a failure — a guard refusal, or `issue:file` holding the
|
|
21
|
+
// filing itself (a lint problem, an unacknowledged duplicate), which files nothing either.
|
|
22
|
+
failures: Set<string>
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function is_filing_use(block: Block): boolean {
|
|
26
|
+
if (!tail_commands.is_bash_use(block)) return false
|
|
27
|
+
|
|
28
|
+
return bash_triggers.is_issue_filing(time_shell.bash_command(block.input))
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function collect_block(block: Block, found: TailFilings): void {
|
|
32
|
+
if (block.result_id !== '' && block.is_error === true) found.failures.add(block.result_id)
|
|
33
|
+
if (is_filing_use(block)) found.filing_ids.push(block.id)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function collect_line(line: string, found: TailFilings): void {
|
|
37
|
+
const parsed = time_transcript_line.parse_line(line)
|
|
38
|
+
|
|
39
|
+
if (parsed === undefined) return
|
|
40
|
+
|
|
41
|
+
for (const block of parsed.blocks) collect_block(block, found)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function scan_tail(tail: string): TailFilings {
|
|
45
|
+
const found: TailFilings = { filing_ids: [], failures: new Set<string>() }
|
|
46
|
+
|
|
47
|
+
for (const line of tail.split('\n')) collect_line(line, found)
|
|
48
|
+
|
|
49
|
+
return found
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// How many Issues the tail filed, counting only filings whose result did not fail.
|
|
53
|
+
function filing_count(tail: string): number {
|
|
54
|
+
const { filing_ids, failures } = scan_tail(tail)
|
|
55
|
+
|
|
56
|
+
return filing_ids.filter((id) => !failures.has(id)).length
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// A person's prompt: a `user` line carrying no tool result. Tool results ride `user` lines too, so the
|
|
60
|
+
// absence of one is what marks the line as typed rather than returned.
|
|
61
|
+
function is_prompt_line(line: string): boolean {
|
|
62
|
+
const parsed = time_transcript_line.parse_line(line)
|
|
63
|
+
|
|
64
|
+
if (parsed?.type !== 'user') return false
|
|
65
|
+
|
|
66
|
+
return parsed.blocks.every((block) => block.result_id === '')
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// The tail from the last prompt on, so a filing an earlier turn made does not answer for this one.
|
|
70
|
+
// A tail with no prompt on it is returned whole.
|
|
71
|
+
function current_turn(tail: string): string {
|
|
72
|
+
const lines = tail.split('\n')
|
|
73
|
+
const start = lines.findLastIndex((line) => is_prompt_line(line))
|
|
74
|
+
|
|
75
|
+
return lines.slice(Math.max(start, 0)).join('\n')
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// How many Issues this turn has filed — `filing_count` read over `current_turn`.
|
|
79
|
+
function turn_filing_count(tail: string): number {
|
|
80
|
+
return filing_count(current_turn(tail))
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const turn_filings = {
|
|
84
|
+
current_turn,
|
|
85
|
+
filing_count,
|
|
86
|
+
is_prompt_line,
|
|
87
|
+
turn_filing_count,
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export { turn_filings }
|