@joshuafolkken/kit 1.1514.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { bash_triggers } from './bash-triggers'
|
|
2
|
+
import { direct_pr_create } from './direct-pr-create'
|
|
3
|
+
import { gh_api } from './gh-api'
|
|
4
|
+
import { git_argv } from './git-argv'
|
|
5
|
+
import { pr_merge } from './pr-merge'
|
|
6
|
+
import { shell_segments } from './shell-segments'
|
|
7
|
+
|
|
8
|
+
// The trigger and the delivered text behind the `repo-admin` row of `delivered-rules.ts`: a write to
|
|
9
|
+
// the repository's own administration — the rulesets and branch protection, the collaborators and
|
|
10
|
+
// their invitations, the secrets and variables, the webhooks and deploy keys, and the repository's
|
|
11
|
+
// settings. The server-side ruleset is one of the two real boundaries of an unattended run, and the
|
|
12
|
+
// trust gate reads write permission, so one injected call that adds a collaborator or disables the
|
|
13
|
+
// ruleset hands the backlog to an attacker (joshuafolkken/kit#4650).
|
|
14
|
+
//
|
|
15
|
+
// **A `DELETE` is `destructive-command`'s**, which refuses every `DELETE repos/…` already; this row
|
|
16
|
+
// takes the other write methods, so one row claims each call. `gh ruleset` has no write subcommand.
|
|
17
|
+
//
|
|
18
|
+
// **It fires on every occurrence**, for the reason `git-force.ts` does.
|
|
19
|
+
|
|
20
|
+
const GH_COMMAND = 'gh'
|
|
21
|
+
const DELETE_METHOD = 'DELETE'
|
|
22
|
+
const PATCH_METHOD = 'PATCH'
|
|
23
|
+
|
|
24
|
+
// `repos/<o>/<r>` as a path or a full URL (`https://api.github.com/repos/…`), anchored on the whole
|
|
25
|
+
// argument so a path smuggled into a field value (`-f x=repos/…/hooks`) is not read as the endpoint.
|
|
26
|
+
const REPOSITORY_PREFIX = String.raw`^['"]?(?:https?:\/\/[^/\s'"]+)?\/?repos\/[^/\s'"]+\/[^/\s'"]+`
|
|
27
|
+
// The administration endpoints under it — the environments whole, since their protection rules move
|
|
28
|
+
// the deployment boundary as their secrets do.
|
|
29
|
+
const ADMIN_PATH = new RegExp(
|
|
30
|
+
REPOSITORY_PREFIX +
|
|
31
|
+
String.raw`\/(?:rulesets|branches\/[^\s'"]+\/protection|collaborators|invitations|hooks|keys|` +
|
|
32
|
+
String.raw`transfer|actions\/permissions|environments|` +
|
|
33
|
+
String.raw`(?:actions|dependabot|codespaces)\/(?:secrets|variables))(?:[/?'"]|$)`,
|
|
34
|
+
'u',
|
|
35
|
+
)
|
|
36
|
+
// The repository itself — a `PATCH` here edits its settings (visibility, default branch, merge rules).
|
|
37
|
+
const REPOSITORY_BODY = new RegExp(String.raw`${REPOSITORY_PREFIX}\/?['"]?$`, 'u')
|
|
38
|
+
// The GraphQL mutations that do what the endpoints above do. Looked for in the whole line, as
|
|
39
|
+
// `pr-merge.ts` does, since the segment cut ignores quotes; a body read from a file is `pr-merge`'s.
|
|
40
|
+
const ADMIN_MUTATIONS =
|
|
41
|
+
/\b(?:updateRepository|archiveRepository|(?:create|update|delete)(?:BranchProtectionRule|RepositoryRuleset|Environment))\b/u
|
|
42
|
+
|
|
43
|
+
function is_admin_target(argument: string, method: string | undefined): boolean {
|
|
44
|
+
return ADMIN_PATH.test(argument) || (method === PATCH_METHOD && REPOSITORY_BODY.test(argument))
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function is_admin_graphql_call(command: string, args: ReadonlyArray<string>): boolean {
|
|
48
|
+
return pr_merge.is_graphql_call(GH_COMMAND, args) && ADMIN_MUTATIONS.test(command)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Judged on the call with its wrapper cut off, as `destructive-command.ts` does.
|
|
52
|
+
function is_admin_api_call(command: string, args: ReadonlyArray<string>): boolean {
|
|
53
|
+
const call = [GH_COMMAND, ...args].join(' ')
|
|
54
|
+
|
|
55
|
+
if (!gh_api.is_gh_api(call) || !gh_api.is_write(call)) return false
|
|
56
|
+
if (is_admin_graphql_call(command, args)) return true
|
|
57
|
+
|
|
58
|
+
const method = gh_api.method_of(call)
|
|
59
|
+
|
|
60
|
+
if (method === DELETE_METHOD) return false
|
|
61
|
+
|
|
62
|
+
return args.some((argument) => is_admin_target(argument, method))
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// The read subcommands of the groups whose every other subcommand writes.
|
|
66
|
+
const READ_ACTIONS: ReadonlySet<string> = new Set(['list', 'ls', 'get', 'view'])
|
|
67
|
+
const ACTION_POSITION = 1
|
|
68
|
+
const SUB_ACTION_POSITION = 2
|
|
69
|
+
// Where the word that decides read vs write sits, keyed by the group (`gh secret <verb>`) or by the
|
|
70
|
+
// group and action (`gh repo deploy-key <verb>`); `gh repo edit` is its own verb and only writes.
|
|
71
|
+
const VERB_POSITIONS: ReadonlyMap<string, number> = new Map([
|
|
72
|
+
['secret', ACTION_POSITION],
|
|
73
|
+
['variable', ACTION_POSITION],
|
|
74
|
+
['repo edit', ACTION_POSITION],
|
|
75
|
+
['repo deploy-key', SUB_ACTION_POSITION],
|
|
76
|
+
])
|
|
77
|
+
|
|
78
|
+
// The verb of an administration subcommand, or `undefined` for every other call. Read off the
|
|
79
|
+
// positional words, so a repository selector before the group (`gh -R o/r secret set`) is skipped.
|
|
80
|
+
function admin_verb(args: ReadonlyArray<string>): string | undefined {
|
|
81
|
+
const words = direct_pr_create.positional_words(args, direct_pr_create.API_VALUE_TAKING_FLAGS)
|
|
82
|
+
const position =
|
|
83
|
+
VERB_POSITIONS.get(words[0] ?? '') ??
|
|
84
|
+
VERB_POSITIONS.get(words.slice(0, SUB_ACTION_POSITION).join(' '))
|
|
85
|
+
|
|
86
|
+
if (position === undefined) return undefined
|
|
87
|
+
|
|
88
|
+
return words[position] ?? ''
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function is_admin_cli_call(args: ReadonlyArray<string>): boolean {
|
|
92
|
+
const verb = admin_verb(args)
|
|
93
|
+
|
|
94
|
+
return verb !== undefined && !READ_ACTIONS.has(verb)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function is_admin_segment(command: string, segment: string): boolean {
|
|
98
|
+
const args = git_argv.arguments_of(segment, GH_COMMAND)
|
|
99
|
+
|
|
100
|
+
if (args === undefined) return false
|
|
101
|
+
|
|
102
|
+
return is_admin_cli_call(args) || is_admin_api_call(command, args)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function is_repo_admin_write(command: string): boolean {
|
|
106
|
+
return shell_segments.commands_of(command).some((segment) => is_admin_segment(command, segment))
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const REPO_ADMIN_REASON =
|
|
110
|
+
'⛔ repository administration: a write to the rulesets, branch protection, collaborators, ' +
|
|
111
|
+
'invitations, secrets, variables, webhooks, deploy keys or repository settings moves the ' +
|
|
112
|
+
'boundary an unattended run relies on, which is Tier C. Ask the user to run it. It fires on every occurrence ' +
|
|
113
|
+
'(`prompts/collaboration-workflow/operating-rules.md`).'
|
|
114
|
+
|
|
115
|
+
const ROW = {
|
|
116
|
+
id: 'repo-admin',
|
|
117
|
+
is_trigger: bash_triggers.on_bash_command(is_repo_admin_write),
|
|
118
|
+
reason: REPO_ADMIN_REASON,
|
|
119
|
+
decide: (): boolean => true,
|
|
120
|
+
about: {
|
|
121
|
+
title: 'Repository administration',
|
|
122
|
+
topic: '`operating-rules.md`',
|
|
123
|
+
fires:
|
|
124
|
+
'a `gh api` POST / PUT / PATCH (path or URL) to the rulesets, branch protection, collaborators, invitations, secrets, variables, hooks, keys, environments, actions permissions or transfer, a `PATCH` of the repository, the matching GraphQL mutations, `gh secret` / `gh variable` writes, `gh repo edit` / `deploy-key` writes. Every occurrence',
|
|
125
|
+
quiet:
|
|
126
|
+
'`gh secret list`, `gh variable get`, a `gh api` read — a `DELETE` is `destructive-command`',
|
|
127
|
+
},
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const repo_admin = { REPO_ADMIN_REASON, ROW, is_repo_admin_write }
|
|
131
|
+
|
|
132
|
+
export { repo_admin }
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
2
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
3
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
4
|
+
import { agent_model } from './agent-model'
|
|
5
|
+
|
|
6
|
+
// A lane child's `reviewer` dispatched without `run_in_background: false` is run in the foreground
|
|
7
|
+
// instead (joshuafolkken/kit#5154).
|
|
8
|
+
//
|
|
9
|
+
// **A headless child's turn end kills a background reviewer**, so `chain-rule.md` → "A lane child" says
|
|
10
|
+
// not to background it. The subagent tool launches in the background by default, and 23 of 178 lanes
|
|
11
|
+
// did: #5129 polled the output file in a `sleep` loop, then waited again on `run:review --join`.
|
|
12
|
+
//
|
|
13
|
+
// **The fix is the same call with one field, so the hook makes it** (`guard-remedy.ts`): no round trip,
|
|
14
|
+
// and a build whose tool declares no `run_in_background` drops the added field as it drops the typed
|
|
15
|
+
// one. Lane children only — an interactive turn is re-invoked by the background result.
|
|
16
|
+
|
|
17
|
+
// `kit:reviewer` is the consumer's spelling of the same definitions.
|
|
18
|
+
const REVIEWER_AGENTS: ReadonlySet<string> = new Set(['reviewer', 'reviewer-verification'])
|
|
19
|
+
|
|
20
|
+
const BACKGROUND_FIELD = 'run_in_background'
|
|
21
|
+
|
|
22
|
+
const CHAIN_RULE_STEP = '`.claude/skills/workflow-commands/chain-rule.md` → "A lane child"'
|
|
23
|
+
|
|
24
|
+
const KILLED = 'reviewer foreground: a lane child’s turn end kills a background `reviewer`'
|
|
25
|
+
const FOREGROUND = `\`${BACKGROUND_FIELD}: false\``
|
|
26
|
+
|
|
27
|
+
const REVIEWER_FOREGROUND_NOTE = `↻ ${KILLED}, so the call ran with ${FOREGROUND} (${CHAIN_RULE_STEP}).`
|
|
28
|
+
|
|
29
|
+
// Delivered only where the rewrite cannot reach the call.
|
|
30
|
+
const REVIEWER_FOREGROUND_REASON = `⛔ ${KILLED}. Reissue the call with ${FOREGROUND} (${CHAIN_RULE_STEP}). It fires on every occurrence.`
|
|
31
|
+
|
|
32
|
+
function is_reviewer(call: GuardedCall): boolean {
|
|
33
|
+
if (!agent_model.SUBAGENT_TOOLS.has(call.name) || !json_value.is_record(call.input)) return false
|
|
34
|
+
|
|
35
|
+
const type = call.input['subagent_type']
|
|
36
|
+
|
|
37
|
+
return typeof type === 'string' && REVIEWER_AGENTS.has(type.split(':').at(-1) ?? '')
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function is_foreground(call: GuardedCall): boolean {
|
|
41
|
+
return json_value.is_record(call.input) && call.input[BACKGROUND_FIELD] === false
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function is_background_reviewer(
|
|
45
|
+
call: GuardedCall,
|
|
46
|
+
is_lane_child: boolean = lane_child_marker.is_child_of(process.cwd()),
|
|
47
|
+
): boolean {
|
|
48
|
+
return is_lane_child && is_reviewer(call) && !is_foreground(call)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function foreground_input(
|
|
52
|
+
call: GuardedCall,
|
|
53
|
+
is_lane_child: boolean = lane_child_marker.is_child_of(process.cwd()),
|
|
54
|
+
): Record<string, unknown> | undefined {
|
|
55
|
+
if (!is_background_reviewer(call, is_lane_child) || !json_value.is_record(call.input)) {
|
|
56
|
+
return undefined
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return { ...call.input, [BACKGROUND_FIELD]: false }
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const ROW = {
|
|
63
|
+
id: 'reviewer-foreground',
|
|
64
|
+
is_trigger: (call: GuardedCall): boolean => is_background_reviewer(call),
|
|
65
|
+
reason: REVIEWER_FOREGROUND_REASON,
|
|
66
|
+
decide: (): boolean => true,
|
|
67
|
+
keeps: (call: GuardedCall): boolean => is_reviewer(call) && is_foreground(call),
|
|
68
|
+
reaches: is_reviewer,
|
|
69
|
+
rewrite: (call: GuardedCall): Record<string, unknown> | undefined => foreground_input(call),
|
|
70
|
+
rewrite_note: REVIEWER_FOREGROUND_NOTE,
|
|
71
|
+
about: {
|
|
72
|
+
title: 'Lane child reviewer dispatched in the foreground',
|
|
73
|
+
topic: CHAIN_RULE_STEP,
|
|
74
|
+
fires:
|
|
75
|
+
'a dispatched lane child’s `Agent` / `Task` call of the `reviewer` or `reviewer-verification` type without `run_in_background: false` — rewritten with it, every occurrence',
|
|
76
|
+
quiet: 'not a lane child, another agent type, or `run_in_background: false` set',
|
|
77
|
+
},
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const reviewer_foreground = {
|
|
81
|
+
REVIEWER_FOREGROUND_NOTE,
|
|
82
|
+
REVIEWER_FOREGROUND_REASON,
|
|
83
|
+
ROW,
|
|
84
|
+
foreground_input,
|
|
85
|
+
is_background_reviewer,
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export { reviewer_foreground }
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import type { GuardRun } from '#scripts/josh/hook-decision'
|
|
2
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
3
|
+
import { time_density_hook } from '#scripts/time-runtime/time-density-hook'
|
|
4
|
+
import { time_markers } from '#scripts/time-runtime/time-markers'
|
|
5
|
+
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
6
|
+
import { time_transcript_line, type Block } from '#scripts/time-runtime/time-transcript-line'
|
|
7
|
+
import { bash_triggers } from './bash-triggers'
|
|
8
|
+
import { shell_segments } from './shell-segments'
|
|
9
|
+
import { tail_commands } from './tail-commands'
|
|
10
|
+
|
|
11
|
+
// A lane child is stopped from running `check:related` on round 1's fixes before it joins the review.
|
|
12
|
+
//
|
|
13
|
+
// **Ship reruns the scoped pair on the fixed tree.** `chain-rule.md` → "A lane child" says the round's
|
|
14
|
+
// fixes take no `check:related` unless a brief follows: `josh ship`'s pre-detach checks the tree the
|
|
15
|
+
// fixes left. The #5168 lane fixed two findings between its brief and `run:review --join` and ran
|
|
16
|
+
// `check:related` after each, 12 of its 70 minutes, because the sentence was prose with no delivery.
|
|
17
|
+
//
|
|
18
|
+
// **The material is the run's own calls, read in order off the transcript tail.** The brief is a
|
|
19
|
+
// `run:review` in its writing mode, the fix an `Edit` / `Write` after it, and the round closes at
|
|
20
|
+
// `run:review --join` or `ship --detach`. Neither the brief file nor the join leaves a record on disk
|
|
21
|
+
// that tells "briefed, not yet joined" apart, so the tail is the one source that can answer.
|
|
22
|
+
|
|
23
|
+
// Named canonically — `shell_segments.is_josh_command` expands an alias (`josh cr`) before the match.
|
|
24
|
+
const CHECK_COMMANDS: ReadonlySet<string> = new Set(['check:related'])
|
|
25
|
+
const REVIEW_COMMANDS: ReadonlySet<string> = new Set(['run:review'])
|
|
26
|
+
const SHIP_COMMANDS: ReadonlySet<string> = new Set(['ship'])
|
|
27
|
+
const JOIN_FLAG = /(?:^|\s)--join(?:[=\s]|$)/u
|
|
28
|
+
// The `run:review` modes that read a running check rather than write a brief.
|
|
29
|
+
const READING_MODE_FLAG = /(?:^|\s)--(?:pinned|push)(?:[=\s]|$)/u
|
|
30
|
+
const DETACH_FLAG = /(?:^|\s)--detach(?:[=\s]|$)/u
|
|
31
|
+
|
|
32
|
+
type RoundEvent = 'brief' | 'close' | 'edit' | 'none'
|
|
33
|
+
|
|
34
|
+
function review_event(segment: string): RoundEvent {
|
|
35
|
+
if (JOIN_FLAG.test(segment)) return 'close'
|
|
36
|
+
|
|
37
|
+
return READING_MODE_FLAG.test(segment) ? 'none' : 'brief'
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function segment_event(segment: string): RoundEvent {
|
|
41
|
+
if (shell_segments.is_josh_command(segment, REVIEW_COMMANDS)) return review_event(segment)
|
|
42
|
+
|
|
43
|
+
const is_detach =
|
|
44
|
+
shell_segments.is_josh_command(segment, SHIP_COMMANDS) && DETACH_FLAG.test(segment)
|
|
45
|
+
|
|
46
|
+
return is_detach ? 'close' : 'none'
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function block_events(block: Block): ReadonlyArray<RoundEvent> {
|
|
50
|
+
if (tail_commands.is_bash_use(block)) {
|
|
51
|
+
const segments = shell_segments.segments_of(time_shell.bash_command(block.input))
|
|
52
|
+
|
|
53
|
+
return segments.map((segment) => segment_event(segment))
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const is_edit = time_markers.tool_marker(block.name, block.input) === time_markers.EDIT_MARKER
|
|
57
|
+
|
|
58
|
+
return is_edit ? ['edit'] : []
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Whether the tail's last brief was followed by a fix and by neither a join nor a detach.
|
|
62
|
+
function fixes_an_open_round(tail: string): boolean {
|
|
63
|
+
const blocks = time_transcript_line.parse_text(tail).flatMap((line) => line.blocks)
|
|
64
|
+
const events = blocks.flatMap((block) => block_events(block))
|
|
65
|
+
const brief_at = events.lastIndexOf('brief')
|
|
66
|
+
|
|
67
|
+
if (brief_at === -1) return false
|
|
68
|
+
|
|
69
|
+
const since_brief = new Set(events.slice(brief_at))
|
|
70
|
+
|
|
71
|
+
return since_brief.has('edit') && !since_brief.has('close')
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function runs_check_related(command: string): boolean {
|
|
75
|
+
return shell_segments
|
|
76
|
+
.segments_of(command)
|
|
77
|
+
.some((segment) => shell_segments.is_josh_command(segment, CHECK_COMMANDS))
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// **The command test comes first and the world is consulted second**: a person working in a lane
|
|
81
|
+
// carries no mark and sees no refusal.
|
|
82
|
+
function is_candidate(command: string): boolean {
|
|
83
|
+
if (!runs_check_related(command)) return false
|
|
84
|
+
|
|
85
|
+
return lane_child_marker.is_child_of(process.cwd())
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Refused on every occurrence while the round stays open: the way on is the join, never a reissue.
|
|
89
|
+
function decide(_call: unknown, run: GuardRun): boolean {
|
|
90
|
+
return fixes_an_open_round(time_density_hook.read_tail(run.transcript))
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const ROUND_ONE_CHECK_RELATED_REASON =
|
|
94
|
+
"⛔ round-one check:related: round 1's fixes need no `check:related` — ship's pre-detach reruns the " +
|
|
95
|
+
'scoped pair on the fixed tree; refused on every occurrence. Go on to `pnpm josh run:review --join`; ' +
|
|
96
|
+
'`--join --fixing` while round 1 has fixes to make (`.claude/skills/workflow-commands/chain-rule.md` → "A lane child").'
|
|
97
|
+
|
|
98
|
+
// It declares no `keeps`: skipping the check is the absence of a call, so the row is reported
|
|
99
|
+
// unmeasured rather than scored on an act that does not exist (`lane-split-park.ts`).
|
|
100
|
+
const ROW = {
|
|
101
|
+
id: 'round-one-check-related',
|
|
102
|
+
is_trigger: bash_triggers.on_bash_command(is_candidate),
|
|
103
|
+
reason: ROUND_ONE_CHECK_RELATED_REASON,
|
|
104
|
+
decide,
|
|
105
|
+
about: {
|
|
106
|
+
title: "No check:related on round 1's fixes",
|
|
107
|
+
topic: '`.claude/skills/workflow-commands/chain-rule.md` → "A lane child"',
|
|
108
|
+
fires:
|
|
109
|
+
"`pnpm josh check:related` (`josh cr`) in a lane child after an `Edit` / `Write` that follows `run:review`'s brief, before `run:review --join` or `ship --detach`. Every occurrence",
|
|
110
|
+
quiet: 'no fix since the brief, already joined or detached, or not a lane child',
|
|
111
|
+
},
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const round_one_check_related = {
|
|
115
|
+
ROUND_ONE_CHECK_RELATED_REASON,
|
|
116
|
+
ROW,
|
|
117
|
+
fixes_an_open_round,
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export { round_one_check_related }
|
|
@@ -2,6 +2,7 @@ import { json_value } from '#scripts/lib/json-value'
|
|
|
2
2
|
import { file_reader } from '#scripts/lib/read-file'
|
|
3
3
|
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
4
4
|
import { bash_triggers } from './bash-triggers'
|
|
5
|
+
import { edit_tool } from './edit-tool'
|
|
5
6
|
import { shell_segments } from './shell-segments'
|
|
6
7
|
import { tail_commands } from './tail-commands'
|
|
7
8
|
|
|
@@ -29,10 +30,9 @@ import { tail_commands } from './tail-commands'
|
|
|
29
30
|
// refuses until it is met. It passes on answering the questions, not on reading the
|
|
30
31
|
// reminder. Keeping the rule is therefore running those two commands, which `keeps` names.
|
|
31
32
|
|
|
32
|
-
// The two edit tools the `PreToolUse` matcher routes here. A `Write` carries the whole
|
|
33
|
-
// `Edit` carries the region as `old_string` / `new_string`.
|
|
34
|
-
const
|
|
35
|
-
const WRITE_TOOL = 'Write'
|
|
33
|
+
// The two edit tools the `PreToolUse` matcher routes here (`edit-tool.ts`). A `Write` carries the whole
|
|
34
|
+
// new file; an `Edit` carries the region as `old_string` / `new_string`.
|
|
35
|
+
const { WRITE, is_edit_tool, string_field } = edit_tool
|
|
36
36
|
|
|
37
37
|
// The three rule-document families question 0 must be pushed at: the resident source, the
|
|
38
38
|
// collaboration-workflow prompts, and the skill bodies. Anchored at a path separator or the string
|
|
@@ -69,12 +69,6 @@ function adds_rule_prose(old_text: string, new_text: string): boolean {
|
|
|
69
69
|
return prose_of(new_text).length - prose_of(old_text).length >= MIN_APPENDED_PROSE
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
function string_field(input: Record<string, unknown>, key: string): string {
|
|
73
|
-
const value = input[key]
|
|
74
|
-
|
|
75
|
-
return typeof value === 'string' ? value : ''
|
|
76
|
-
}
|
|
77
|
-
|
|
78
72
|
// The file's current text, read synchronously before the write lands so a `Write` has an `old` to
|
|
79
73
|
// measure against. Injected so the suite controls it without touching the real filesystem, the way
|
|
80
74
|
// `file-body.ts` injects its existence check. A new file reads as empty, so its whole body is added.
|
|
@@ -87,7 +81,7 @@ function texts_of(
|
|
|
87
81
|
input: Record<string, unknown>,
|
|
88
82
|
read: (file_path: string) => string,
|
|
89
83
|
): { old_text: string; new_text: string } {
|
|
90
|
-
if (name ===
|
|
84
|
+
if (name === WRITE) {
|
|
91
85
|
return {
|
|
92
86
|
old_text: read(string_field(input, 'file_path')),
|
|
93
87
|
new_text: string_field(input, 'content'),
|
|
@@ -100,10 +94,6 @@ function texts_of(
|
|
|
100
94
|
}
|
|
101
95
|
}
|
|
102
96
|
|
|
103
|
-
function is_edit_tool(name: string): boolean {
|
|
104
|
-
return name === EDIT_TOOL || name === WRITE_TOOL
|
|
105
|
-
}
|
|
106
|
-
|
|
107
97
|
// The call's input when it is an edit of a rule document, and `undefined` otherwise. The tool-name and
|
|
108
98
|
// path tests run before the text read, so an ordinary edit pays nothing and a `Write`'s file read
|
|
109
99
|
// happens only for a rule document.
|
|
@@ -178,6 +168,14 @@ const ROW = {
|
|
|
178
168
|
reason: RULE_BODY_REASON,
|
|
179
169
|
already_satisfied: answered_placement,
|
|
180
170
|
keeps: bash_triggers.on_bash_command(runs_placement_oracle),
|
|
171
|
+
about: {
|
|
172
|
+
title: 'Question 0 and the ordering question before writing a rule into prose',
|
|
173
|
+
topic: '`residency.md`',
|
|
174
|
+
fires:
|
|
175
|
+
'an `Edit` / `Write` to `CLAUDE.md` / `prompts/**/*.md` / `.claude/skills/**/*.md` appending at least the threshold. Refused until both `pnpm josh oracle:list` and `pnpm josh run:step` ran',
|
|
176
|
+
quiet:
|
|
177
|
+
'not a rule document, an append under the threshold (typo, link swap, deletion), or both commands ran',
|
|
178
|
+
},
|
|
181
179
|
}
|
|
182
180
|
|
|
183
181
|
const rule_body_guard = {
|
|
@@ -2,53 +2,34 @@
|
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { delivered_rules } from './delivered-rules'
|
|
4
4
|
import { guard_remedy } from './guard-remedy'
|
|
5
|
-
import {
|
|
5
|
+
import { stop_rule_rows, type StopRule } from './stop-rule-rows'
|
|
6
6
|
|
|
7
7
|
// `josh rule:list` — the list of trigger-delivered rules, rendered from the guard rows themselves.
|
|
8
8
|
// One item per `MEASURED_RULES` row in delivery order, then the `Stop`
|
|
9
9
|
// hook's rows; each carries its single source, the call it fires on and the turn it stays silent on.
|
|
10
|
-
// The prose is `
|
|
11
|
-
// there is listed without a document edit — and a row with no registry entry is listed as missing.
|
|
10
|
+
// The prose is each row's own `about`, so a row added there is listed without a document edit.
|
|
12
11
|
|
|
13
12
|
const HEADER =
|
|
14
13
|
'# Trigger-delivered rules — rendered by `pnpm josh rule:list` from `scripts/rules/delivered-rules.ts`'
|
|
15
|
-
const MISSING = '(no entry in `scripts/rules/rule-registry.ts`)'
|
|
16
14
|
const MISSING_WHY = '(no `why` in `scripts/rules/guard-remedy.ts`)'
|
|
17
15
|
|
|
18
|
-
function item(id
|
|
19
|
-
if (rule === undefined) return `- \`${id}\` ${MISSING}`
|
|
20
|
-
|
|
16
|
+
function item({ id, about }: StopRule): string {
|
|
21
17
|
return [
|
|
22
|
-
`- **${
|
|
23
|
-
` - fires: \`${
|
|
24
|
-
` - silent: ${
|
|
18
|
+
`- **${about.title}** (\`${id}\`, ${about.topic})`,
|
|
19
|
+
` - fires: \`${about.entry ?? delivered_rules.PRETOOL_GUARD}\` — ${about.fires}`,
|
|
20
|
+
` - silent: ${about.quiet}`,
|
|
25
21
|
` - not automated: ${guard_remedy.why_of(id) ?? MISSING_WHY}`,
|
|
26
22
|
].join('\n')
|
|
27
23
|
}
|
|
28
24
|
|
|
29
|
-
function row_ids(): ReadonlyArray<string> {
|
|
30
|
-
return delivered_rules.MEASURED_RULES.map((rule) => rule.id)
|
|
31
|
-
}
|
|
32
|
-
|
|
33
25
|
function render(): string {
|
|
34
|
-
const rows =
|
|
35
|
-
const stops = rule_registry.STOP_ROWS.map((rule) => item(rule.id, rule))
|
|
36
|
-
|
|
37
|
-
return [HEADER, '', ...rows, ...stops].join('\n')
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// Registry entries no guard row reaches — a renamed or removed row left its prose behind.
|
|
41
|
-
function orphans(): ReadonlyArray<string> {
|
|
42
|
-
const reached = new Set(row_ids().map((id) => rule_registry.registry_id(id)))
|
|
43
|
-
const stop_ids = new Set(rule_registry.STOP_ROWS.map((rule) => rule.id))
|
|
26
|
+
const rows = [...delivered_rules.MEASURED_RULES, ...stop_rule_rows.ROWS].map((rule) => item(rule))
|
|
44
27
|
|
|
45
|
-
return
|
|
46
|
-
(id) => !reached.has(id) && !stop_ids.has(id),
|
|
47
|
-
)
|
|
28
|
+
return [HEADER, '', ...rows].join('\n')
|
|
48
29
|
}
|
|
49
30
|
|
|
50
31
|
if (process.argv[1] === fileURLToPath(import.meta.url)) process.stdout.write(`${render()}\n`)
|
|
51
32
|
|
|
52
|
-
const rule_list = {
|
|
33
|
+
const rule_list = { MISSING_WHY, render }
|
|
53
34
|
|
|
54
35
|
export { rule_list }
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process'
|
|
2
|
-
import {
|
|
2
|
+
import { statSync } from 'node:fs'
|
|
3
3
|
import path from 'node:path'
|
|
4
|
+
import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
5
|
+
import { atomic_write } from '#scripts/lib/atomic-write'
|
|
4
6
|
import { file_reader } from '#scripts/lib/read-file'
|
|
7
|
+
import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
|
|
5
8
|
|
|
6
9
|
// The `rule:value` reading at the `backlogrun` loop head, without the loop waiting on it.
|
|
7
10
|
// Measuring re-reads every transcript and takes minutes, and `backlog:offer`
|
|
@@ -12,30 +15,67 @@ import { file_reader } from '#scripts/lib/read-file'
|
|
|
12
15
|
// **It reports and never fails**, as `rule:value` itself does: a missing cache, an unwritable directory
|
|
13
16
|
// or a refresh that could not start prints at most nothing, and never changes the offer's answer.
|
|
14
17
|
|
|
15
|
-
|
|
18
|
+
// Outside a repository only: inside one the cache lives in the common git directory, so a lane's work
|
|
19
|
+
// tree reads the reading its parent's loop head stored rather than measuring again
|
|
20
|
+
// (joshuafolkken/kit#5186). The reading is the main checkout's — its transcripts and every lane's —
|
|
21
|
+
// because only the main checkout writes it (`is_linked_work_tree`); a lane's own measurement reaches
|
|
22
|
+
// only its own transcripts (`cost_transcript.transcript_directories`).
|
|
23
|
+
const FALLBACK_DIRECTORY = ['node_modules', '.cache', 'josh']
|
|
16
24
|
const CACHE_FILE = 'rule-value.txt'
|
|
17
25
|
// Touched when a refresh starts, so the loop head starts at most one per interval however often it runs.
|
|
18
26
|
const STAMP_FILE = 'rule-value.stamp'
|
|
19
|
-
const MS_PER_MINUTE = 60_000
|
|
20
27
|
const REFRESH_MINUTES = 15
|
|
21
28
|
const REFRESH_MS = REFRESH_MINUTES * MS_PER_MINUTE
|
|
22
29
|
const REFRESH_ARGV = ['josh', 'rule:value', '--refresh']
|
|
23
30
|
const PNPM = 'pnpm'
|
|
24
|
-
const TEMPORARY_SUFFIX = '.tmp'
|
|
25
31
|
|
|
26
32
|
interface CachePorts {
|
|
27
33
|
now: () => number
|
|
28
34
|
start_refresh: (cwd: string) => void
|
|
29
35
|
}
|
|
30
36
|
|
|
37
|
+
interface FreshReading {
|
|
38
|
+
text: string
|
|
39
|
+
taken_at: Date
|
|
40
|
+
}
|
|
41
|
+
|
|
31
42
|
function cache_path(cwd: string, file: string): string {
|
|
32
|
-
|
|
43
|
+
const common = git_common_directory.repository(cwd)
|
|
44
|
+
|
|
45
|
+
if (common === undefined) return path.join(cwd, ...FALLBACK_DIRECTORY, file)
|
|
46
|
+
|
|
47
|
+
return path.join(common, git_common_directory.STATE_DIRECTORY, file)
|
|
33
48
|
}
|
|
34
49
|
|
|
35
50
|
function read_cached(cwd: string): string | undefined {
|
|
36
51
|
return file_reader.read_if_readable(cache_path(cwd, CACHE_FILE))
|
|
37
52
|
}
|
|
38
53
|
|
|
54
|
+
function taken_at_if_fresh(cwd: string, now_ms: number): Date | undefined {
|
|
55
|
+
try {
|
|
56
|
+
const { mtime } = statSync(cache_path(cwd, CACHE_FILE))
|
|
57
|
+
|
|
58
|
+
return now_ms - mtime.getTime() < REFRESH_MS ? mtime : undefined
|
|
59
|
+
} catch {
|
|
60
|
+
return undefined
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// The stored reading when it was taken inside the refresh interval — what `josh rule:value` prints
|
|
65
|
+
// instead of measuring. `undefined` is a miss: no reading, or one older than the interval.
|
|
66
|
+
function read_fresh(
|
|
67
|
+
cwd: string = process.cwd(),
|
|
68
|
+
now_ms: number = Date.now(),
|
|
69
|
+
): FreshReading | undefined {
|
|
70
|
+
const taken_at = taken_at_if_fresh(cwd, now_ms)
|
|
71
|
+
|
|
72
|
+
if (taken_at === undefined) return undefined
|
|
73
|
+
|
|
74
|
+
const text = read_cached(cwd)
|
|
75
|
+
|
|
76
|
+
return text === undefined ? undefined : { text, taken_at }
|
|
77
|
+
}
|
|
78
|
+
|
|
39
79
|
function is_refresh_due(cwd: string, now_ms: number): boolean {
|
|
40
80
|
try {
|
|
41
81
|
return now_ms - statSync(cache_path(cwd, STAMP_FILE)).mtimeMs >= REFRESH_MS
|
|
@@ -45,12 +85,7 @@ function is_refresh_due(cwd: string, now_ms: number): boolean {
|
|
|
45
85
|
}
|
|
46
86
|
|
|
47
87
|
function write_cache_file(cwd: string, file: string, text: string): void {
|
|
48
|
-
|
|
49
|
-
const temporary = `${target}${TEMPORARY_SUFFIX}`
|
|
50
|
-
|
|
51
|
-
mkdirSync(path.dirname(target), { recursive: true })
|
|
52
|
-
writeFileSync(temporary, text)
|
|
53
|
-
renameSync(temporary, target)
|
|
88
|
+
atomic_write.replace_file(cache_path(cwd, file), text)
|
|
54
89
|
}
|
|
55
90
|
|
|
56
91
|
function ignore_spawn_error(): void {
|
|
@@ -68,8 +103,14 @@ function start_refresh_default(cwd: string): void {
|
|
|
68
103
|
|
|
69
104
|
const DEFAULT_PORTS: CachePorts = { now: Date.now, start_refresh: start_refresh_default }
|
|
70
105
|
|
|
106
|
+
// A linked work tree — a lane — measures its own transcripts alone, so it never writes the main
|
|
107
|
+
// checkout's reading or its stamp: either would stand in for the whole repository's for an interval.
|
|
108
|
+
function is_linked_work_tree(cwd: string): boolean {
|
|
109
|
+
return git_common_directory.resolve(cwd) !== undefined
|
|
110
|
+
}
|
|
111
|
+
|
|
71
112
|
function refresh_if_due(cwd: string, ports: CachePorts): void {
|
|
72
|
-
if (!is_refresh_due(cwd, ports.now())) return
|
|
113
|
+
if (is_linked_work_tree(cwd) || !is_refresh_due(cwd, ports.now())) return
|
|
73
114
|
|
|
74
115
|
write_cache_file(cwd, STAMP_FILE, new Date(ports.now()).toISOString())
|
|
75
116
|
ports.start_refresh(cwd)
|
|
@@ -90,10 +131,12 @@ function emit(cwd: string = process.cwd(), ports: CachePorts = DEFAULT_PORTS): v
|
|
|
90
131
|
|
|
91
132
|
// The detached refresh's body: the reading written whole, so a reader never sees half of one.
|
|
92
133
|
function store(text: string, cwd: string = process.cwd()): void {
|
|
134
|
+
if (is_linked_work_tree(cwd)) return
|
|
135
|
+
|
|
93
136
|
write_cache_file(cwd, CACHE_FILE, `${text}\n`)
|
|
94
137
|
}
|
|
95
138
|
|
|
96
|
-
const rule_value_cache = { CACHE_FILE, REFRESH_MS, STAMP_FILE, cache_path, emit, store }
|
|
139
|
+
const rule_value_cache = { CACHE_FILE, REFRESH_MS, STAMP_FILE, cache_path, emit, read_fresh, store }
|
|
97
140
|
|
|
98
|
-
export type { CachePorts }
|
|
141
|
+
export type { CachePorts, FreshReading }
|
|
99
142
|
export { rule_value_cache }
|