@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
|
@@ -2,16 +2,19 @@ import path from 'node:path'
|
|
|
2
2
|
import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
|
|
3
3
|
import { cost_transcript } from '#scripts/cost-runtime/cost-transcript'
|
|
4
4
|
import { capped_print_part } from '#scripts/document/capped-print-part'
|
|
5
|
+
import { changed_paths_sync } from '#scripts/git/changed-paths-sync'
|
|
5
6
|
import { hook_decision, type GuardRun } from '#scripts/josh/hook-decision'
|
|
6
7
|
import { time_batch_guard, type GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
7
8
|
import { time_bundle_call } from '#scripts/time-runtime/time-bundle-call'
|
|
9
|
+
import { time_search_call } from '#scripts/time-runtime/time-search-call'
|
|
8
10
|
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
9
11
|
import { time_spans, type Span } from '#scripts/time-runtime/time-spans'
|
|
10
12
|
import { delegation_policy } from './delegation-policy'
|
|
11
13
|
|
|
12
14
|
// How many files a run has read and not edited since its last delegated unit, counted off the
|
|
13
15
|
// transcript rather than left to the agent's memory, so the threshold fires again on a second
|
|
14
|
-
// accumulation. A delegation clears the set; a read adds to it; an edit exempts its file
|
|
16
|
+
// accumulation. A delegation clears the set; a read adds to it; an edit exempts its file, as does
|
|
17
|
+
// the branch's own change since its merge base, which an earlier session of the run wrote.
|
|
15
18
|
|
|
16
19
|
const READ_TOOLS: ReadonlySet<string> = new Set(['Read'])
|
|
17
20
|
// Both spellings of the subagent tool are in use: `Task` (published) and `Agent` (this harness).
|
|
@@ -32,17 +35,10 @@ const CONTENT_READ_LABELS: ReadonlySet<string> = new Set(
|
|
|
32
35
|
CONTENT_READ_COMMANDS.map((command) => time_shell.bash_label(command)),
|
|
33
36
|
)
|
|
34
37
|
|
|
35
|
-
|
|
36
|
-
const SEARCH_COMMANDS: ReadonlyArray<string> = ['fd', 'find', 'grep', 'rg']
|
|
37
|
-
const SEARCH_LABELS: ReadonlySet<string> = new Set(
|
|
38
|
-
SEARCH_COMMANDS.map((command) => time_shell.bash_label(command)),
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
// `.claude/agents/investigator.md`; a consumer receives it through the plugin as `kit:investigator`.
|
|
42
|
-
const INVESTIGATOR_AGENT = 'investigator'
|
|
38
|
+
const { INVESTIGATOR_AGENT } = delegation_policy
|
|
43
39
|
|
|
44
40
|
// The deny reason is the only text that reaches the model, so it names the count, command and return shape.
|
|
45
|
-
const REASON = `⛔ investigation: ${
|
|
41
|
+
const REASON = `⛔ investigation: ${delegation_policy.INVESTIGATION_LIMIT}. ${delegation_policy.INVESTIGATION_STEP} Keep main-line reads to files you will edit; every read-only search turn counts. \`.claude/skills/workflow-commands/delegation.md\``
|
|
46
42
|
|
|
47
43
|
interface ReadTally {
|
|
48
44
|
// The files read and not since edited, resolved.
|
|
@@ -56,12 +52,13 @@ interface ReadTally {
|
|
|
56
52
|
// The search-side `pending` / `pending_since`, reset by a delegation or a successful write.
|
|
57
53
|
searches: number
|
|
58
54
|
searches_since: number
|
|
59
|
-
// Files successfully edited in the window; a read of one stays in the main
|
|
55
|
+
// Files successfully edited in the window or changed on the branch; a read of one stays in the main
|
|
56
|
+
// line, so it never counts.
|
|
60
57
|
edited: ReadonlySet<string>
|
|
61
58
|
}
|
|
62
59
|
|
|
63
60
|
// The run's own instructions are not the Issue's subject and cannot be delegated, so they never count.
|
|
64
|
-
// Matched relative to the repository root, so `
|
|
61
|
+
// Matched relative to the repository root, so `tools/eval/prompts/x.ts` stays subject code.
|
|
65
62
|
const INSTRUCTION_PATHS: ReadonlyArray<string> = ['prompts', '.claude/skills']
|
|
66
63
|
const INSTRUCTION_FILES: ReadonlySet<string> = new Set(['CLAUDE.md', 'AGENTS.md', 'GEMINI.md'])
|
|
67
64
|
const REPOSITORY_ROOT = process.cwd()
|
|
@@ -188,10 +185,6 @@ interface Accumulation {
|
|
|
188
185
|
searches: Map<string, number>
|
|
189
186
|
}
|
|
190
187
|
|
|
191
|
-
function is_read_only_search(span: Span): boolean {
|
|
192
|
-
return SEARCH_LABELS.has(span.label) && span.is_bundleable && !span.may_write
|
|
193
|
-
}
|
|
194
|
-
|
|
195
188
|
// A span with no message id is a turn of its own, as in every other turn counter.
|
|
196
189
|
function search_turn_key(searches: ReadonlyMap<string, number>, span: Span): string {
|
|
197
190
|
if (span.message_id !== time_spans.NO_MESSAGE_ID) return span.message_id
|
|
@@ -210,19 +203,27 @@ function apply_search(searches: Map<string, number>, span: Span): void {
|
|
|
210
203
|
|
|
211
204
|
const turn = search_turn_key(searches, span)
|
|
212
205
|
|
|
213
|
-
|
|
206
|
+
// A search carries no file text but costs a turn, so searches count in turns: parallel ones count once.
|
|
207
|
+
if (time_search_call.is_read_only_search(span) && !searches.has(turn)) {
|
|
208
|
+
searches.set(turn, span.ended_ms)
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// A refused dispatch (`investigator-foreground`, `agent-model`) ran no unit, so it resets nothing.
|
|
213
|
+
function is_delegation(span: Span): boolean {
|
|
214
|
+
return DELEGATION_TOOLS.has(span.label) && !is_failed_outcome(span)
|
|
214
215
|
}
|
|
215
216
|
|
|
216
217
|
function apply_span(accumulation: Accumulation, span: Span, edited: ReadonlySet<string>): void {
|
|
217
|
-
if (
|
|
218
|
+
if (is_failed_outcome(span)) return
|
|
219
|
+
|
|
220
|
+
if (is_delegation(span)) {
|
|
218
221
|
accumulation.pending.clear()
|
|
219
222
|
accumulation.searches.clear()
|
|
220
223
|
|
|
221
224
|
return
|
|
222
225
|
}
|
|
223
226
|
|
|
224
|
-
if (is_failed_outcome(span)) return
|
|
225
|
-
|
|
226
227
|
apply_search(accumulation.searches, span)
|
|
227
228
|
|
|
228
229
|
if (!is_content_read(span.label)) return
|
|
@@ -233,7 +234,7 @@ function apply_span(accumulation: Accumulation, span: Span, edited: ReadonlySet<
|
|
|
233
234
|
}
|
|
234
235
|
|
|
235
236
|
function last_delegation_ms(spans: ReadonlyArray<Span>): number {
|
|
236
|
-
return delegation_instant(spans.findLast((span) =>
|
|
237
|
+
return delegation_instant(spans.findLast((span) => is_delegation(span)))
|
|
237
238
|
}
|
|
238
239
|
|
|
239
240
|
// The window is the tail the hook read; the set clears at every delegation, so the tail suffices.
|
|
@@ -241,9 +242,15 @@ function pending_after(pending: ReadonlyMap<string, number>, since_ms: number):
|
|
|
241
242
|
return [...pending.values()].filter((at_ms) => at_ms > since_ms).length
|
|
242
243
|
}
|
|
243
244
|
|
|
244
|
-
|
|
245
|
+
// `branch_files` (repository-relative) are the branch's own change since its merge base: an earlier
|
|
246
|
+
// session of this run wrote them, and a resumed session's transcript holds none of those writes.
|
|
247
|
+
function tally_of(
|
|
248
|
+
text: string,
|
|
249
|
+
since_ms: number = hook_decision.NEVER_MS,
|
|
250
|
+
branch_files: ReadonlyArray<string> = [],
|
|
251
|
+
): ReadTally {
|
|
245
252
|
const { spans, started_ms } = time_spans.parse_timeline(text)
|
|
246
|
-
const edited = edited_files(spans)
|
|
253
|
+
const edited = new Set([...edited_files(spans), ...subject_targets(branch_files)])
|
|
247
254
|
const accumulation: Accumulation = { pending: new Map(), searches: new Map() }
|
|
248
255
|
|
|
249
256
|
for (const span of spans) apply_span(accumulation, span, edited)
|
|
@@ -314,7 +321,9 @@ function is_read_only_command(call: GuardedCall, labels: ReadonlySet<string>): b
|
|
|
314
321
|
|
|
315
322
|
// A search is refusable without a subject target: a bare-directory sweep is what this count is for.
|
|
316
323
|
function is_search_call(call: GuardedCall): boolean {
|
|
317
|
-
return
|
|
324
|
+
return time_search_call.is_read_only_search(
|
|
325
|
+
time_spans.to_tool_call(call.name, call.input, time_spans.NO_MESSAGE_ID),
|
|
326
|
+
)
|
|
318
327
|
}
|
|
319
328
|
|
|
320
329
|
// This guard counts reading, so a `Bash` line that also writes is never refused, and neither is a call
|
|
@@ -336,6 +345,20 @@ function is_growing_past_threshold(tally: ReadTally, call: GuardedCall): boolean
|
|
|
336
345
|
return projected_count(tally.pending, call, tally.edited) > tally.pending.length
|
|
337
346
|
}
|
|
338
347
|
|
|
348
|
+
function is_blocking(tally: ReadTally, call: GuardedCall, refused_at_ms: number): boolean {
|
|
349
|
+
return is_growing_past_threshold(tally, call) && is_rearmed(tally, refused_at_ms)
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// The branch diff is a git read, so it is asked only of a call the transcript alone would refuse; more
|
|
353
|
+
// edited files can only lower the counts, so a call that passes without it passes with it.
|
|
354
|
+
function is_blocking_past_branch(text: string, call: GuardedCall, refused_at_ms: number): boolean {
|
|
355
|
+
if (!is_blocking(tally_of(text, refused_at_ms), call, refused_at_ms)) return false
|
|
356
|
+
|
|
357
|
+
const branch_files = changed_paths_sync.read_changed_paths()
|
|
358
|
+
|
|
359
|
+
return is_blocking(tally_of(text, refused_at_ms, branch_files), call, refused_at_ms)
|
|
360
|
+
}
|
|
361
|
+
|
|
339
362
|
function should_block(
|
|
340
363
|
text: string,
|
|
341
364
|
call: GuardedCall,
|
|
@@ -345,9 +368,7 @@ function should_block(
|
|
|
345
368
|
// A delegated unit is never refused: the remedy — send the reading to a unit — does not exist inside one.
|
|
346
369
|
if (!is_refusable_call(call) || is_unit_run(run)) return false
|
|
347
370
|
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
return is_growing_past_threshold(tally, call) && is_rearmed(tally, refused_at_ms)
|
|
371
|
+
return is_blocking_past_branch(text, call, refused_at_ms)
|
|
351
372
|
}
|
|
352
373
|
|
|
353
374
|
const investigation_reads = {
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { file_content } from '#scripts/sync/file-content'
|
|
4
|
+
import {
|
|
5
|
+
DEFAULT_RELEASE_AGE_MINUTES,
|
|
6
|
+
release_window,
|
|
7
|
+
type ReleaseWindow,
|
|
8
|
+
} from '#scripts/version/release-window'
|
|
9
|
+
|
|
10
|
+
// Dependabot's `cooldown` is the workspace's `minimumReleaseAge` restated in days, so a freshly
|
|
11
|
+
// published action or package waits out the same window pnpm and Safe Chain enforce (kit #4023).
|
|
12
|
+
// The edit is line-based and touches only each entry's `cooldown` block: a consumer's own keys and
|
|
13
|
+
// the file's comments survive, which a YAML round trip would discard.
|
|
14
|
+
const DEPENDABOT_FILE = path.join('.github', 'dependabot.yml')
|
|
15
|
+
const MINUTES_PER_DAY = 1440
|
|
16
|
+
// Dependabot accepts `default-days` from 1 to 90.
|
|
17
|
+
const MIN_DAYS = 1
|
|
18
|
+
const MAX_DAYS = 90
|
|
19
|
+
// pnpm's exclusions name npm packages, so only the npm entry receives them.
|
|
20
|
+
const NPM_ECOSYSTEM = 'npm'
|
|
21
|
+
const UPDATES_PATTERN = /^updates:\s*(?:#.*)?$/u
|
|
22
|
+
const ECOSYSTEM_PATTERN = /^\s*(?:-\s+)?package-ecosystem:\s*['"]?([\w-]+)/u
|
|
23
|
+
const TOP_LEVEL_KEY_PATTERN = /^[^\s#-]/u
|
|
24
|
+
const COOLDOWN_KEY = 'cooldown:'
|
|
25
|
+
|
|
26
|
+
interface UpdateEntry {
|
|
27
|
+
start: number
|
|
28
|
+
end: number
|
|
29
|
+
key_indent: string
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function cooldown_days(minutes: number | undefined): number {
|
|
33
|
+
const days = Math.ceil((minutes ?? DEFAULT_RELEASE_AGE_MINUTES) / MINUTES_PER_DAY)
|
|
34
|
+
|
|
35
|
+
return Math.min(MAX_DAYS, Math.max(MIN_DAYS, days))
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function quote(value: string): string {
|
|
39
|
+
return `'${value.replaceAll("'", "''")}'`
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function cooldown_lines(ecosystem: string, window: ReleaseWindow, indent: string): Array<string> {
|
|
43
|
+
const lines = ['cooldown:', ` default-days: ${String(cooldown_days(window.minutes))}`]
|
|
44
|
+
|
|
45
|
+
if (ecosystem === NPM_ECOSYSTEM && window.exclusions.length > 0) {
|
|
46
|
+
lines.push(' exclude:', ...window.exclusions.map((name) => ` - ${quote(name)}`))
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return lines.map((line) => `${indent}${line}`)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function indent_width(line: string): number {
|
|
53
|
+
return line.length - line.trimStart().length
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function is_blank(line: string | undefined): boolean {
|
|
57
|
+
return line?.trim() === ''
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function trim_trailing_blanks(lines: ReadonlyArray<string>): Array<string> {
|
|
61
|
+
const trimmed = [...lines]
|
|
62
|
+
while (trimmed.length > 1 && is_blank(trimmed.at(-1))) trimmed.pop()
|
|
63
|
+
|
|
64
|
+
return trimmed
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function is_comment(line: string | undefined): boolean {
|
|
68
|
+
return line?.trimStart().startsWith('#') === true
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// A blank line, or a comment left of `width`: it may sit inside a block or head the next one.
|
|
72
|
+
function is_detached(line: string | undefined, width: number): boolean {
|
|
73
|
+
return is_blank(line) || (is_comment(line) && indent_width(line ?? '') < width)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// The first key line at or after `from` that sits left of `width`, or `limit`.
|
|
77
|
+
function block_stop(
|
|
78
|
+
lines: ReadonlyArray<string>,
|
|
79
|
+
from: number,
|
|
80
|
+
width: number,
|
|
81
|
+
limit: number,
|
|
82
|
+
): number {
|
|
83
|
+
const relative = lines
|
|
84
|
+
.slice(from, limit)
|
|
85
|
+
.findIndex((line) => !is_blank(line) && !is_comment(line) && indent_width(line) < width)
|
|
86
|
+
|
|
87
|
+
return relative === -1 ? limit : from + relative
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// The block runs to the next key line left of `width`. A comment left of `width` in the middle stays
|
|
91
|
+
// inside, while the run of such comments right before that key belongs to what follows.
|
|
92
|
+
function block_end(
|
|
93
|
+
lines: ReadonlyArray<string>,
|
|
94
|
+
from: number,
|
|
95
|
+
width: number,
|
|
96
|
+
limit: number,
|
|
97
|
+
): number {
|
|
98
|
+
const stop = block_stop(lines, from, width, limit)
|
|
99
|
+
let end = stop
|
|
100
|
+
|
|
101
|
+
for (let index = stop - 1; index >= from && is_detached(lines[index], width); index -= 1) {
|
|
102
|
+
if (!is_blank(lines[index])) end = index
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return end
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// The next top-level key. A list written flush with `updates:` and a comment at column 0 both still
|
|
109
|
+
// belong to it, so neither ends the list.
|
|
110
|
+
function updates_end(lines: ReadonlyArray<string>, updates: number): number {
|
|
111
|
+
const relative = lines.slice(updates + 1).findIndex((line) => TOP_LEVEL_KEY_PATTERN.test(line))
|
|
112
|
+
|
|
113
|
+
return relative === -1 ? lines.length : updates + 1 + relative
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function find_entries(lines: ReadonlyArray<string>, updates: number): Array<UpdateEntry> {
|
|
117
|
+
const limit = updates_end(lines, updates)
|
|
118
|
+
const starts = lines
|
|
119
|
+
.map((line, index) => ({ index, item: /^(\s*-\s+)\S/u.exec(line)?.[1] }))
|
|
120
|
+
.filter(({ index, item }) => index > updates && index < limit && item !== undefined)
|
|
121
|
+
const item_width = Math.min(...starts.map(({ item }) => item?.indexOf('-') ?? 0))
|
|
122
|
+
|
|
123
|
+
return starts
|
|
124
|
+
.filter(({ item }) => item?.indexOf('-') === item_width)
|
|
125
|
+
.map(({ index, item = '' }) => ({
|
|
126
|
+
start: index,
|
|
127
|
+
end: block_end(lines, index + 1, item.length, limit),
|
|
128
|
+
key_indent: ' '.repeat(item.length),
|
|
129
|
+
}))
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// The entry's own `cooldown:` key, either on a key line or on the item line itself (`- cooldown:`).
|
|
133
|
+
function is_cooldown_key(line: string, index: number, key_indent: string): boolean {
|
|
134
|
+
const is_key_line = index === 0 || line.startsWith(key_indent)
|
|
135
|
+
|
|
136
|
+
return is_key_line && line.slice(key_indent.length).startsWith(COOLDOWN_KEY)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// An entry that opened with `- cooldown:` hands its item marker to the next key once the block goes.
|
|
140
|
+
function promote_first_key(rest: ReadonlyArray<string>, marker: string): Array<string> {
|
|
141
|
+
const first = rest.findIndex((line) => !is_blank(line) && !line.trimStart().startsWith('#'))
|
|
142
|
+
|
|
143
|
+
return rest.map((line, index) =>
|
|
144
|
+
index === first ? `${marker}${line.slice(marker.length)}` : line,
|
|
145
|
+
)
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function without_cooldown(entry: ReadonlyArray<string>, key_indent: string): Array<string> {
|
|
149
|
+
const start = entry.findIndex((line, index) => is_cooldown_key(line, index, key_indent))
|
|
150
|
+
if (start === -1) return [...entry]
|
|
151
|
+
const rest = entry.slice(block_end(entry, start + 1, key_indent.length + 1, entry.length))
|
|
152
|
+
if (start > 0) return [...entry.slice(0, start), ...rest]
|
|
153
|
+
|
|
154
|
+
return promote_first_key(rest, (entry.at(0) ?? '').slice(0, key_indent.length))
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function rewrite_entry(
|
|
158
|
+
entry: ReadonlyArray<string>,
|
|
159
|
+
key_indent: string,
|
|
160
|
+
window: ReleaseWindow,
|
|
161
|
+
): Array<string> {
|
|
162
|
+
const ecosystem = entry.map((line) => ECOSYSTEM_PATTERN.exec(line)?.[1]).find(Boolean)
|
|
163
|
+
if (ecosystem === undefined) return [...entry]
|
|
164
|
+
const body = trim_trailing_blanks(without_cooldown(entry, key_indent))
|
|
165
|
+
const trailing = entry.slice(trim_trailing_blanks(entry).length)
|
|
166
|
+
|
|
167
|
+
return [...body, ...cooldown_lines(ecosystem, window, key_indent), ...trailing]
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function merge_cooldown(existing: string, window: ReleaseWindow): string {
|
|
171
|
+
const lines = existing.split('\n')
|
|
172
|
+
const updates = lines.findIndex((line) => UPDATES_PATTERN.test(line))
|
|
173
|
+
if (updates === -1) return existing
|
|
174
|
+
|
|
175
|
+
for (const { start, end, key_indent } of find_entries(lines, updates).toReversed()) {
|
|
176
|
+
lines.splice(start, end - start, ...rewrite_entry(lines.slice(start, end), key_indent, window))
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return lines.join('\n')
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function sync_dependabot_cooldown(root: string): boolean {
|
|
183
|
+
const config_path = path.join(root, DEPENDABOT_FILE)
|
|
184
|
+
if (!existsSync(config_path)) return false
|
|
185
|
+
const existing = readFileSync(config_path, 'utf8')
|
|
186
|
+
const merged = merge_cooldown(existing, release_window.read_release_window(root))
|
|
187
|
+
if (merged === existing) return false
|
|
188
|
+
file_content.write_contained(config_path, merged)
|
|
189
|
+
|
|
190
|
+
return true
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const dependabot_cooldown = { cooldown_days, merge_cooldown, sync_dependabot_cooldown }
|
|
194
|
+
|
|
195
|
+
export { dependabot_cooldown }
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
|
+
import { stamped_memo } from '#scripts/lib/stamped-memo'
|
|
3
4
|
import { repo_map_logic, type DiscoveredRepo, type RepoMap } from './repo-map-logic'
|
|
4
5
|
import { repo_origin } from './repo-origin'
|
|
5
6
|
|
|
@@ -59,18 +60,35 @@ function resolve_git_directory(repository_path: string): string | undefined {
|
|
|
59
60
|
}
|
|
60
61
|
}
|
|
61
62
|
|
|
62
|
-
|
|
63
|
-
function read_config(repository_path: string): string | undefined {
|
|
64
|
-
const git_directory = resolve_git_directory(repository_path)
|
|
65
|
-
if (git_directory === undefined) return undefined
|
|
66
|
-
|
|
63
|
+
function read_text(file: string): string | undefined {
|
|
67
64
|
try {
|
|
68
|
-
return readFileSync(
|
|
65
|
+
return readFileSync(file, 'utf8')
|
|
69
66
|
} catch {
|
|
70
67
|
return undefined
|
|
71
68
|
}
|
|
72
69
|
}
|
|
73
70
|
|
|
71
|
+
// Each work tree's git directory and each config's text, read again only once the `.git` entry or the
|
|
72
|
+
// config itself has changed: `run:board` cites issues through the origin on every redraw
|
|
73
|
+
// (joshuafolkken/kit#4263).
|
|
74
|
+
const git_directories = stamped_memo.create<string | undefined>()
|
|
75
|
+
const configs = stamped_memo.create<string | undefined>()
|
|
76
|
+
|
|
77
|
+
// The work tree's git config text, or nothing when it is unreadable or not a work tree.
|
|
78
|
+
function read_config(repository_path: string): string | undefined {
|
|
79
|
+
const git_entry = path.join(repository_path, GIT_DIRECTORY)
|
|
80
|
+
const git_directory = git_directories.of(
|
|
81
|
+
repository_path,
|
|
82
|
+
stamped_memo.file_stamp(git_entry),
|
|
83
|
+
() => resolve_git_directory(repository_path),
|
|
84
|
+
)
|
|
85
|
+
if (git_directory === undefined) return undefined
|
|
86
|
+
|
|
87
|
+
const config = path.join(git_directory, GIT_CONFIG)
|
|
88
|
+
|
|
89
|
+
return configs.of(config, stamped_memo.file_stamp(config), () => read_text(config))
|
|
90
|
+
}
|
|
91
|
+
|
|
74
92
|
// The `origin` URL a work tree declares, or nothing when it has no `origin`, no readable config, or
|
|
75
93
|
// is not a work tree at all. Every failure reads as "no remote" so one unreadable sibling cannot
|
|
76
94
|
// fail a command whose contract is to report what it could find.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { repo_discovery } from './repo-discovery'
|
|
2
|
-
import { repo_origin } from './repo-origin'
|
|
2
|
+
import { repo_origin, type RepoIdentity } from './repo-origin'
|
|
3
|
+
import { session_owner_pin } from './session-owner-pin'
|
|
3
4
|
|
|
4
5
|
// **First-party vs third-party, computed rather than judged**. `CLAUDE.md`
|
|
5
6
|
// and `upstream-interrupt.md` both declared the test mechanical — owner equality between the target
|
|
@@ -32,45 +33,100 @@ function classify(session_owner: string | undefined, target: string | undefined)
|
|
|
32
33
|
// The owner half of a `owner/repo` argument, parsed through the remote-URL reader so a `.git` suffix
|
|
33
34
|
// and a malformed form (one segment, three segments) are handled by the one place that already knows
|
|
34
35
|
// them rather than by a second split here.
|
|
36
|
+
function parse_owner_repo(owner_repo: string): RepoIdentity | undefined {
|
|
37
|
+
return repo_origin.parse_origin_url(`https://${repo_origin.GITHUB_HOST}/${owner_repo}`)
|
|
38
|
+
}
|
|
39
|
+
|
|
35
40
|
function target_owner(owner_repo: string): string | undefined {
|
|
36
|
-
return
|
|
41
|
+
return parse_owner_repo(owner_repo)?.owner
|
|
37
42
|
}
|
|
38
43
|
|
|
39
|
-
// The owner of the repository the session runs in
|
|
40
|
-
// and no authenticated CLI, so the guard that consults it
|
|
44
|
+
// The owner of the repository the session runs in: the one pinned at session start, else read
|
|
45
|
+
// locally from its `origin` — no network call and no authenticated CLI, so the guard that consults it
|
|
46
|
+
// stays synchronous. The pin is what keeps a mid-session remote rewrite from changing the answer
|
|
47
|
+
// (`session-owner-pin.ts`).
|
|
41
48
|
function current_owner(repository_path: string = process.cwd()): string | undefined {
|
|
42
|
-
return
|
|
49
|
+
return (
|
|
50
|
+
session_owner_pin.pinned(repository_path) ??
|
|
51
|
+
repo_discovery.resolve_current_owner(repository_path)
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// The repository a `[HOST/]OWNER/REPO` selector names — `GH_REPO`, or `gh`'s `-R` / `--repo` value —
|
|
56
|
+
// read from its last two segments so an optional host prefix is skipped.
|
|
57
|
+
function selector_repository(selector: string): RepoIdentity | undefined {
|
|
58
|
+
return parse_owner_repo(selector.split('/').slice(-GH_REPO_PATH_SEGMENTS).join('/'))
|
|
43
59
|
}
|
|
44
60
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
return [target_owner(gh_repo.split('/').slice(-GH_REPO_PATH_SEGMENTS).join('/'))]
|
|
61
|
+
function selector_owner(selector: string): string | undefined {
|
|
62
|
+
return selector_repository(selector)?.owner
|
|
48
63
|
}
|
|
49
64
|
|
|
50
|
-
//
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
function
|
|
65
|
+
// Every remote the work tree declares. A remote that cannot be read stays in the set as `undefined`
|
|
66
|
+
// rather than being dropped: an SSH host alias (`git@github-work:o/r.git`) is one `gh` translates to
|
|
67
|
+
// github.com and may pick, so dropping it would hide the repository `gh` writes to.
|
|
68
|
+
function remote_repositories(repository_path: string): Array<RepoIdentity | undefined> {
|
|
54
69
|
return repo_discovery
|
|
55
70
|
.read_remote_urls(repository_path)
|
|
56
|
-
.map((url) => repo_origin.parse_origin_url(url)
|
|
71
|
+
.map((url) => repo_origin.parse_origin_url(url))
|
|
57
72
|
}
|
|
58
73
|
|
|
59
|
-
// Every
|
|
74
|
+
// Every repository `gh` could expand the `{owner}/{repo}` placeholders to. `GH_REPO`
|
|
60
75
|
// (`[HOST/]OWNER/REPO`) overrides the remotes outright; otherwise `gh` picks its base repository among
|
|
61
76
|
// the GitHub remotes — `upstream` ahead of `origin`, or a `gh repo set-default` choice — so in a fork
|
|
62
|
-
// checkout it can expand to the upstream
|
|
77
|
+
// checkout it can expand to the upstream repository. Answering the whole candidate set rather than
|
|
63
78
|
// re-implementing that pick keeps the caller safe whichever remote `gh` chooses. An `undefined` entry
|
|
64
|
-
// is a candidate
|
|
79
|
+
// is a candidate that could not be read, which the caller must not assume is first-party.
|
|
80
|
+
function placeholder_repositories(
|
|
81
|
+
repository_path: string,
|
|
82
|
+
environment: NodeJS.ProcessEnv,
|
|
83
|
+
): Array<RepoIdentity | undefined> {
|
|
84
|
+
const gh_repo = environment[GH_REPO_ENV_KEY]
|
|
85
|
+
|
|
86
|
+
return gh_repo === undefined || gh_repo === ''
|
|
87
|
+
? remote_repositories(repository_path)
|
|
88
|
+
: [selector_repository(gh_repo)]
|
|
89
|
+
}
|
|
90
|
+
|
|
65
91
|
function placeholder_owners(
|
|
66
92
|
repository_path: string = process.cwd(),
|
|
67
93
|
environment: NodeJS.ProcessEnv = process.env,
|
|
68
94
|
): Array<string | undefined> {
|
|
69
|
-
|
|
95
|
+
return placeholder_repositories(repository_path, environment).map((identity) => identity?.owner)
|
|
96
|
+
}
|
|
70
97
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
98
|
+
// Two spellings of one repository, compared case-insensitively as GitHub resolves them.
|
|
99
|
+
function is_same_repository(left: RepoIdentity | undefined, right: RepoIdentity): boolean {
|
|
100
|
+
if (left === undefined || classify(left.owner, right.owner) !== FIRST_PARTY) return false
|
|
101
|
+
|
|
102
|
+
return left.repo.toLowerCase() === right.repo.toLowerCase()
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// The one repository every candidate names, or nothing when there is none, one is unreadable, or two
|
|
106
|
+
// differ — a fork checkout whose `upstream` `gh` may pick ahead of `origin`.
|
|
107
|
+
function sole_repository(
|
|
108
|
+
candidates: ReadonlyArray<RepoIdentity | undefined>,
|
|
109
|
+
): RepoIdentity | undefined {
|
|
110
|
+
const [first, ...rest] = candidates
|
|
111
|
+
if (first === undefined) return undefined
|
|
112
|
+
|
|
113
|
+
return rest.every((candidate) => is_same_repository(candidate, first)) ? first : undefined
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// The checkout's own repository: the one `{owner}/{repo}` expands to — where `josh issue:comment`
|
|
117
|
+
// posts. Nothing unless that is one repository whichever candidate `gh` picks, so a spelled-out
|
|
118
|
+
// repository is never read as the one `issue:comment` reaches when it might not be
|
|
119
|
+
// (joshuafolkken/kit#4737).
|
|
120
|
+
function current_repository(
|
|
121
|
+
repository_path: string = process.cwd(),
|
|
122
|
+
environment: NodeJS.ProcessEnv = process.env,
|
|
123
|
+
): RepoIdentity | undefined {
|
|
124
|
+
return sole_repository(placeholder_repositories(repository_path, environment))
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Whether `target` is the checkout's own repository `current_repository` answered.
|
|
128
|
+
function is_own_repository(target: RepoIdentity, own: RepoIdentity | undefined): boolean {
|
|
129
|
+
return is_same_repository(own, target)
|
|
74
130
|
}
|
|
75
131
|
|
|
76
132
|
const repo_party = {
|
|
@@ -79,7 +135,11 @@ const repo_party = {
|
|
|
79
135
|
UNKNOWN,
|
|
80
136
|
classify,
|
|
81
137
|
current_owner,
|
|
138
|
+
current_repository,
|
|
139
|
+
is_own_repository,
|
|
82
140
|
placeholder_owners,
|
|
141
|
+
selector_owner,
|
|
142
|
+
sole_repository,
|
|
83
143
|
target_owner,
|
|
84
144
|
}
|
|
85
145
|
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
2
|
+
import { repo_discovery } from './repo-discovery'
|
|
3
|
+
|
|
4
|
+
// **The session's owner, fixed when the session starts** (joshuafolkken/kit#4659). The first-party
|
|
5
|
+
// test compares a target's owner with the session's, and the session's was read from `origin` on
|
|
6
|
+
// every call — so `git remote set-url origin https://github.com/<other>/x` mid-session made another
|
|
7
|
+
// owner first-party. The session-start hook records the owner once; `repo_party.current_owner`
|
|
8
|
+
// answers the record ahead of the live remote. Only the session's owner is pinned: the `{owner}`
|
|
9
|
+
// placeholder candidates and a selector-less `gh` write still resolve against the live remotes.
|
|
10
|
+
//
|
|
11
|
+
// **Written by the process the session start already runs** (`audit-provision --session-start`), so
|
|
12
|
+
// pinning adds no spawn to the launch, and read as one local file by the hooks that already run — no
|
|
13
|
+
// network call. A checkout with no record (a session the hook did not start) falls back to `origin`.
|
|
14
|
+
//
|
|
15
|
+
// **Per checkout, replaced at every session start.** The record is the stamp `stamp-file.ts` keeps in
|
|
16
|
+
// the temp directory, keyed on the account and the checkout path; a checkout whose origin owner
|
|
17
|
+
// cannot be read at start leaves no record rather than a stale one. A command run outside a session
|
|
18
|
+
// reads the last session's record for that path, which the next session start replaces.
|
|
19
|
+
|
|
20
|
+
const PIN_PREFIX = 'josh-session-owner-'
|
|
21
|
+
const PIN_SUFFIX = '.txt'
|
|
22
|
+
|
|
23
|
+
function pin_path(repository_path: string): string {
|
|
24
|
+
return stamp_file.stamp_path(PIN_PREFIX, repository_path, PIN_SUFFIX)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Records the checkout's `origin` owner for the session about to run. Never throws: this runs at
|
|
28
|
+
// session start beside the scanner provisioning, and an unwritable temp directory only costs the pin.
|
|
29
|
+
function pin(repository_path: string = process.cwd()): string | undefined {
|
|
30
|
+
const owner = repo_discovery.resolve_current_owner(repository_path)
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
if (owner === undefined) stamp_file.remove_stamp(pin_path(repository_path))
|
|
34
|
+
else stamp_file.write_text_stamp(pin_path(repository_path), owner)
|
|
35
|
+
} catch {
|
|
36
|
+
return undefined
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return owner
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// The owner recorded at session start, or `undefined` when the checkout holds no readable record.
|
|
43
|
+
function pinned(repository_path: string = process.cwd()): string | undefined {
|
|
44
|
+
const text = stamp_file.read_stamp_text(pin_path(repository_path))?.trim()
|
|
45
|
+
|
|
46
|
+
return text === '' ? undefined : text
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const session_owner_pin = { pin, pin_path, pinned }
|
|
50
|
+
|
|
51
|
+
export { session_owner_pin }
|
|
@@ -2,6 +2,7 @@ import { existsSync } from 'node:fs'
|
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { git_spawn_sync } from '#scripts/git/git-spawn-sync'
|
|
4
4
|
import { json_value } from '#scripts/lib/json-value'
|
|
5
|
+
import { package_manifest } from '#scripts/lib/package-manifest'
|
|
5
6
|
import { file_reader } from '#scripts/lib/read-file'
|
|
6
7
|
import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
7
8
|
import { KIT_PACKAGE_NAME } from '#scripts/version/kit-descriptor'
|
|
@@ -37,11 +38,7 @@ const STATE_MISSING = 'missing'
|
|
|
37
38
|
type ClaudeMdState = typeof STATE_OK | typeof STATE_TARGET_MISSING | typeof STATE_MISSING
|
|
38
39
|
|
|
39
40
|
function parse_manifest(root: string): ManifestShape | undefined {
|
|
40
|
-
|
|
41
|
-
if (content === undefined) return undefined
|
|
42
|
-
const parsed = manifest_schema.safeParse(json_value.parse_or_undefined(content))
|
|
43
|
-
|
|
44
|
-
return parsed.success ? parsed.data : undefined
|
|
41
|
+
return package_manifest.read_manifest_if_valid(root, manifest_schema)
|
|
45
42
|
}
|
|
46
43
|
|
|
47
44
|
function lists_kit_dependency(manifest: ManifestShape | undefined): boolean {
|
|
@@ -68,6 +68,6 @@ function capped_print(text: string, label: string, root: string = process.cwd())
|
|
|
68
68
|
console.info(listing(text, budget, write_parts(label, text, budget)))
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
const capped_output = { HEADROOM_CHARS, capped_print }
|
|
71
|
+
const capped_output = { HEADROOM_CHARS, capped_print, output_budget }
|
|
72
72
|
|
|
73
73
|
export { capped_output }
|