@joshuafolkken/kit 1.1514.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { fileURLToPath } from 'node:url'
|
|
5
|
+
import { format_edited_payload } from '#scripts/hooks/format-edited-file'
|
|
6
|
+
import { rename_identifier, type RenameRequest, type TypeScriptApi } from './rename-identifier'
|
|
7
|
+
|
|
8
|
+
// `josh rename <old> <new> [--import <old-specifier> <new-specifier>] <file...>` — one identifier, and
|
|
9
|
+
// the import specifier it moved with, renamed across files in one call (joshuafolkken/kit#5236), where
|
|
10
|
+
// a lane would otherwise spend one Read and one Edit per file.
|
|
11
|
+
//
|
|
12
|
+
// **All or nothing**: a file the rename would not touch is named and nothing is written, since a path
|
|
13
|
+
// passed by mistake means the file list is not the one the caller thinks it is. Each written file is
|
|
14
|
+
// then formatted the way the edit hook formats an edited one — a Bash write gets no hook.
|
|
15
|
+
|
|
16
|
+
const ARGV_OFFSET = 2
|
|
17
|
+
const FAILURE_EXIT_CODE = 1
|
|
18
|
+
const IMPORT_FLAG = '--import'
|
|
19
|
+
const SPECIFIER_COUNT = 2
|
|
20
|
+
// What the TypeScript parser reads whole; a `.svelte` file's markup would be parsed as script.
|
|
21
|
+
const SCRIPT_EXTENSIONS: ReadonlySet<string> = new Set([
|
|
22
|
+
'.ts',
|
|
23
|
+
'.tsx',
|
|
24
|
+
'.mts',
|
|
25
|
+
'.cts',
|
|
26
|
+
'.js',
|
|
27
|
+
'.jsx',
|
|
28
|
+
'.mjs',
|
|
29
|
+
'.cjs',
|
|
30
|
+
])
|
|
31
|
+
const IDENTIFIER = /^[$A-Z_a-z][\w$]*$/u
|
|
32
|
+
const USAGE = `Usage: josh rename <old-identifier> <new-identifier> [${IMPORT_FLAG} <old-specifier> <new-specifier>] <file...>`
|
|
33
|
+
|
|
34
|
+
interface RenameArguments {
|
|
35
|
+
request: RenameRequest
|
|
36
|
+
files: ReadonlyArray<string>
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface FileRename {
|
|
40
|
+
file: string
|
|
41
|
+
text: string
|
|
42
|
+
count: number
|
|
43
|
+
is_taken: boolean
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
type Formatter = (files: ReadonlyArray<string>) => Promise<void>
|
|
47
|
+
|
|
48
|
+
interface SplitArguments {
|
|
49
|
+
specifier: RenameRequest['specifier']
|
|
50
|
+
rest: ReadonlyArray<string>
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function split_import(argv: ReadonlyArray<string>): SplitArguments | undefined {
|
|
54
|
+
const at = argv.indexOf(IMPORT_FLAG)
|
|
55
|
+
|
|
56
|
+
if (at === -1) return { specifier: undefined, rest: argv }
|
|
57
|
+
const [from, to] = argv.slice(at + 1, at + 1 + SPECIFIER_COUNT)
|
|
58
|
+
if (from === undefined || to === undefined) return undefined
|
|
59
|
+
|
|
60
|
+
return { specifier: [from, to], rest: argv.toSpliced(at, 1 + SPECIFIER_COUNT) }
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function arguments_of(split: SplitArguments): RenameArguments | undefined {
|
|
64
|
+
const [old_name = '', new_name = '', ...files] = split.rest
|
|
65
|
+
|
|
66
|
+
if (!IDENTIFIER.test(old_name) || !IDENTIFIER.test(new_name)) return undefined
|
|
67
|
+
|
|
68
|
+
return { request: { old_name, new_name, specifier: split.specifier }, files }
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function parse(argv: ReadonlyArray<string>): RenameArguments | undefined {
|
|
72
|
+
const split = split_import(argv)
|
|
73
|
+
const parsed = split === undefined ? undefined : arguments_of(split)
|
|
74
|
+
|
|
75
|
+
return parsed?.files.length === 0 ? undefined : parsed
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function refuse(reason: string, files: ReadonlyArray<string>): number {
|
|
79
|
+
console.error(`josh rename: ${reason}: ${files.join(', ')} — nothing was written`)
|
|
80
|
+
|
|
81
|
+
return FAILURE_EXIT_CODE
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function rename_all(api: TypeScriptApi, parsed: RenameArguments): ReadonlyArray<FileRename> {
|
|
85
|
+
return parsed.files.map((file) => ({
|
|
86
|
+
file,
|
|
87
|
+
...rename_identifier.rewrite(api, file, readFileSync(file, 'utf8'), parsed.request),
|
|
88
|
+
}))
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async function write_all(
|
|
92
|
+
renames: ReadonlyArray<FileRename>,
|
|
93
|
+
formatter: Formatter,
|
|
94
|
+
): Promise<number> {
|
|
95
|
+
for (const rename of renames) {
|
|
96
|
+
writeFileSync(rename.file, rename.text)
|
|
97
|
+
console.info(`${rename.file}: ${String(rename.count)}`)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
await formatter(renames.map((rename) => rename.file))
|
|
101
|
+
|
|
102
|
+
return 0
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function file_refusal(files: ReadonlyArray<string>): number | undefined {
|
|
106
|
+
const missing = files.filter((file) => !existsSync(file))
|
|
107
|
+
if (missing.length > 0) return refuse('no such file', missing)
|
|
108
|
+
const unparsed = files.filter((file) => !SCRIPT_EXTENSIONS.has(path.extname(file)))
|
|
109
|
+
|
|
110
|
+
return unparsed.length > 0 ? refuse('not a TypeScript or JavaScript file', unparsed) : undefined
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function files_where(
|
|
114
|
+
renames: ReadonlyArray<FileRename>,
|
|
115
|
+
is_match: (rename: FileRename) => boolean,
|
|
116
|
+
): ReadonlyArray<string> {
|
|
117
|
+
return renames.filter((rename) => is_match(rename)).map((rename) => rename.file)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// The rename matches by spelling, so a file that already binds the new name could end up with one
|
|
121
|
+
// binding shadowing or merging with another; it is refused rather than guessed at.
|
|
122
|
+
function rename_refusal(renames: ReadonlyArray<FileRename>, new_name: string): number | undefined {
|
|
123
|
+
const untouched = files_where(renames, (rename) => rename.count === 0)
|
|
124
|
+
if (untouched.length > 0) return refuse('no replacement', untouched)
|
|
125
|
+
const taken = files_where(renames, (rename) => rename.is_taken)
|
|
126
|
+
|
|
127
|
+
return taken.length > 0 ? refuse(`\`${new_name}\` is already bound`, taken) : undefined
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async function apply(
|
|
131
|
+
api: TypeScriptApi,
|
|
132
|
+
parsed: RenameArguments,
|
|
133
|
+
formatter: Formatter,
|
|
134
|
+
): Promise<number> {
|
|
135
|
+
const file_stop = file_refusal(parsed.files)
|
|
136
|
+
if (file_stop !== undefined) return file_stop
|
|
137
|
+
const renames = rename_all(api, parsed)
|
|
138
|
+
|
|
139
|
+
return rename_refusal(renames, parsed.request.new_name) ?? (await write_all(renames, formatter))
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// The edit hook's own formatter, one file at a time: each run rewrites the file the next may import.
|
|
143
|
+
async function format_files(
|
|
144
|
+
files: ReadonlyArray<string>,
|
|
145
|
+
format_one: typeof format_edited_payload = format_edited_payload,
|
|
146
|
+
): Promise<void> {
|
|
147
|
+
for (const file of files) {
|
|
148
|
+
const payload = JSON.stringify({ tool_input: { file_path: path.resolve(file) } })
|
|
149
|
+
// eslint-disable-next-line no-await-in-loop -- formatters rewrite files the next run reads
|
|
150
|
+
const diagnostics = await format_one(payload, process.cwd())
|
|
151
|
+
|
|
152
|
+
if (diagnostics !== undefined) console.info(diagnostics)
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async function run(
|
|
157
|
+
argv: ReadonlyArray<string>,
|
|
158
|
+
api: TypeScriptApi,
|
|
159
|
+
formatter: Formatter = format_files,
|
|
160
|
+
): Promise<number> {
|
|
161
|
+
const parsed = parse(argv)
|
|
162
|
+
|
|
163
|
+
if (parsed !== undefined) return await apply(api, parsed, formatter)
|
|
164
|
+
console.error(USAGE)
|
|
165
|
+
|
|
166
|
+
return FAILURE_EXIT_CODE
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
170
|
+
const typescript = await import('typescript')
|
|
171
|
+
|
|
172
|
+
process.exitCode = await run(argv, typescript.default)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const rename_cli = { USAGE, format_files, main, run }
|
|
176
|
+
|
|
177
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
178
|
+
|
|
179
|
+
export { rename_cli }
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import type ts from 'typescript'
|
|
2
|
+
|
|
3
|
+
// The rewrite behind `josh rename` (joshuafolkken/kit#5236): one identifier and, optionally, one import
|
|
4
|
+
// specifier, renamed through the TypeScript parse tree rather than a pattern.
|
|
5
|
+
//
|
|
6
|
+
// **Only a binding is renamed, never a key.** `obj.old`, `{ old: 1 }` and `{ old: x } = obj` name a
|
|
7
|
+
// property of some other value, so they stay; a shorthand `{ old }` keeps its key and becomes
|
|
8
|
+
// `{ old: new }`. Strings and comments are not identifiers to the parser, so the walk never reaches
|
|
9
|
+
// them — a specifier is rewritten only where the module system reads it.
|
|
10
|
+
|
|
11
|
+
type TypeScriptApi = typeof ts
|
|
12
|
+
|
|
13
|
+
interface RenameRequest {
|
|
14
|
+
old_name: string
|
|
15
|
+
new_name: string
|
|
16
|
+
specifier?: readonly [string, string] | undefined
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
interface Replacement {
|
|
20
|
+
start: number
|
|
21
|
+
end: number
|
|
22
|
+
text: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// `is_taken`: the new name is already a binding here, so the rename could shadow or merge with it —
|
|
26
|
+
// the rename matches by spelling, not by scope.
|
|
27
|
+
interface RenameResult {
|
|
28
|
+
text: string
|
|
29
|
+
count: number
|
|
30
|
+
is_taken: boolean
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Calls whose first argument is a module specifier the test runner resolves like an import.
|
|
34
|
+
const MODULE_CALLS: ReadonlySet<string> = new Set([
|
|
35
|
+
'vi.mock',
|
|
36
|
+
'vi.doMock',
|
|
37
|
+
'vi.importActual',
|
|
38
|
+
'vi.importMock',
|
|
39
|
+
])
|
|
40
|
+
const NAME_KEY = 'name'
|
|
41
|
+
|
|
42
|
+
// The parents whose `name` is a property key rather than a binding.
|
|
43
|
+
function key_parent_kinds(api: TypeScriptApi): ReadonlySet<ts.SyntaxKind> {
|
|
44
|
+
const kind = api.SyntaxKind
|
|
45
|
+
|
|
46
|
+
return new Set([
|
|
47
|
+
kind.PropertyAccessExpression,
|
|
48
|
+
kind.PropertyAssignment,
|
|
49
|
+
kind.PropertyDeclaration,
|
|
50
|
+
kind.PropertySignature,
|
|
51
|
+
kind.MethodDeclaration,
|
|
52
|
+
kind.MethodSignature,
|
|
53
|
+
kind.GetAccessor,
|
|
54
|
+
kind.SetAccessor,
|
|
55
|
+
kind.EnumMember,
|
|
56
|
+
kind.JsxAttribute,
|
|
57
|
+
])
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function is_key_position(api: TypeScriptApi, node: ts.Identifier): boolean {
|
|
61
|
+
const { parent } = node
|
|
62
|
+
|
|
63
|
+
if (api.isQualifiedName(parent)) return parent.right === node
|
|
64
|
+
if (api.isBindingElement(parent)) return parent.propertyName === node
|
|
65
|
+
|
|
66
|
+
return key_parent_kinds(api).has(parent.kind) && Reflect.get(parent, NAME_KEY) === node
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// A shorthand key is also the property's name, so the key is spelled out to keep it.
|
|
70
|
+
function keeps_key(api: TypeScriptApi, node: ts.Identifier): boolean {
|
|
71
|
+
const { parent } = node
|
|
72
|
+
|
|
73
|
+
if (api.isShorthandPropertyAssignment(parent)) return true
|
|
74
|
+
|
|
75
|
+
return (
|
|
76
|
+
api.isBindingElement(parent) &&
|
|
77
|
+
parent.propertyName === undefined &&
|
|
78
|
+
parent.dotDotDotToken === undefined &&
|
|
79
|
+
api.isObjectBindingPattern(parent.parent)
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function identifier_replacement(
|
|
84
|
+
api: TypeScriptApi,
|
|
85
|
+
node: ts.Identifier,
|
|
86
|
+
request: RenameRequest,
|
|
87
|
+
): Replacement | undefined {
|
|
88
|
+
if (node.text !== request.old_name || is_key_position(api, node)) return undefined
|
|
89
|
+
const text = keeps_key(api, node) ? `${node.text}: ${request.new_name}` : request.new_name
|
|
90
|
+
|
|
91
|
+
return { start: node.getStart(), end: node.getEnd(), text }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function is_module_call(
|
|
95
|
+
api: TypeScriptApi,
|
|
96
|
+
call: ts.CallExpression,
|
|
97
|
+
node: ts.StringLiteral,
|
|
98
|
+
): boolean {
|
|
99
|
+
if (call.arguments.indexOf(node) !== 0) return false
|
|
100
|
+
|
|
101
|
+
return (
|
|
102
|
+
call.expression.kind === api.SyntaxKind.ImportKeyword ||
|
|
103
|
+
MODULE_CALLS.has(call.expression.getText())
|
|
104
|
+
)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function is_module_specifier(api: TypeScriptApi, node: ts.StringLiteral): boolean {
|
|
108
|
+
const { parent } = node
|
|
109
|
+
|
|
110
|
+
if (api.isImportDeclaration(parent) || api.isExportDeclaration(parent)) {
|
|
111
|
+
return parent.moduleSpecifier === node
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (api.isCallExpression(parent)) return is_module_call(api, parent, node)
|
|
115
|
+
|
|
116
|
+
return api.isLiteralTypeNode(parent) && api.isImportTypeNode(parent.parent)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function specifier_replacement(
|
|
120
|
+
api: TypeScriptApi,
|
|
121
|
+
node: ts.StringLiteral,
|
|
122
|
+
specifier: RenameRequest['specifier'],
|
|
123
|
+
): Replacement | undefined {
|
|
124
|
+
if (specifier?.[0] !== node.text || !is_module_specifier(api, node)) return undefined
|
|
125
|
+
const start = node.getStart()
|
|
126
|
+
const quote = node.getSourceFile().text.charAt(start)
|
|
127
|
+
|
|
128
|
+
return { start, end: node.getEnd(), text: `${quote}${specifier[1]}${quote}` }
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function replacement_at(
|
|
132
|
+
api: TypeScriptApi,
|
|
133
|
+
node: ts.Node,
|
|
134
|
+
request: RenameRequest,
|
|
135
|
+
): Replacement | undefined {
|
|
136
|
+
if (api.isIdentifier(node)) return identifier_replacement(api, node, request)
|
|
137
|
+
if (api.isStringLiteral(node)) return specifier_replacement(api, node, request.specifier)
|
|
138
|
+
|
|
139
|
+
return undefined
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// `forEachChild` never descends into JSDoc, so a name inside a doc comment stays as written.
|
|
143
|
+
function collect(
|
|
144
|
+
api: TypeScriptApi,
|
|
145
|
+
node: ts.Node,
|
|
146
|
+
request: RenameRequest,
|
|
147
|
+
into: Array<Replacement>,
|
|
148
|
+
): void {
|
|
149
|
+
const replacement = replacement_at(api, node, request)
|
|
150
|
+
|
|
151
|
+
if (replacement !== undefined) into.push(replacement)
|
|
152
|
+
api.forEachChild(node, (child) => {
|
|
153
|
+
collect(api, child, request, into)
|
|
154
|
+
})
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Applied from the end of the file backwards, so an earlier offset is never moved by a later edit.
|
|
158
|
+
function apply(text: string, replacements: ReadonlyArray<Replacement>): string {
|
|
159
|
+
const backwards = replacements.toSorted((first, second) => second.start - first.start)
|
|
160
|
+
let result = text
|
|
161
|
+
|
|
162
|
+
for (const edit of backwards) {
|
|
163
|
+
result = `${result.slice(0, edit.start)}${edit.text}${result.slice(edit.end)}`
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return result
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function rewrite(
|
|
170
|
+
api: TypeScriptApi,
|
|
171
|
+
file_name: string,
|
|
172
|
+
text: string,
|
|
173
|
+
request: RenameRequest,
|
|
174
|
+
): RenameResult {
|
|
175
|
+
const source = api.createSourceFile(file_name, text, api.ScriptTarget.Latest, true)
|
|
176
|
+
const replacements: Array<Replacement> = []
|
|
177
|
+
const existing: Array<Replacement> = []
|
|
178
|
+
|
|
179
|
+
collect(api, source, request, replacements)
|
|
180
|
+
collect(api, source, { old_name: request.new_name, new_name: request.new_name }, existing)
|
|
181
|
+
|
|
182
|
+
return {
|
|
183
|
+
text: apply(text, replacements),
|
|
184
|
+
count: replacements.length,
|
|
185
|
+
is_taken: existing.length > 0,
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const rename_identifier = { rewrite }
|
|
190
|
+
|
|
191
|
+
export type { RenameRequest, RenameResult, TypeScriptApi }
|
|
192
|
+
export { rename_identifier }
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type ts from 'typescript'
|
|
2
|
+
|
|
3
|
+
// The module specifiers a file names only for their types: an `import type` or an
|
|
4
|
+
// `export type … from` declaration, which the transpiler drops whole, so the test runner's module graph
|
|
5
|
+
// never holds the edge (joshuafolkken/kit#5368). An `import { type A }` is left out: under
|
|
6
|
+
// `verbatimModuleSyntax` it stays as a side-effect import. A declaration is matched to the reference
|
|
7
|
+
// `preProcessFile` reports by where its specifier sits, never by its text, so a value import of the
|
|
8
|
+
// same module keeps its edge whichever declarations `preProcessFile` lists.
|
|
9
|
+
type TypeScript = typeof ts
|
|
10
|
+
type ModuleDeclaration = ts.ImportDeclaration | ts.ExportDeclaration
|
|
11
|
+
|
|
12
|
+
function declaration_of(
|
|
13
|
+
typescript: TypeScript,
|
|
14
|
+
statement: ts.Statement,
|
|
15
|
+
): ModuleDeclaration | undefined {
|
|
16
|
+
if (typescript.isImportDeclaration(statement)) return statement
|
|
17
|
+
if (typescript.isExportDeclaration(statement)) return statement
|
|
18
|
+
|
|
19
|
+
return undefined
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function is_type_only(typescript: TypeScript, declaration: ModuleDeclaration): boolean {
|
|
23
|
+
if (typescript.isExportDeclaration(declaration)) return declaration.isTypeOnly
|
|
24
|
+
|
|
25
|
+
return declaration.importClause?.phaseModifier === typescript.SyntaxKind.TypeKeyword
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Where the specifier's literal starts, its opening quote — the `pos` `preProcessFile` reports.
|
|
29
|
+
function type_only_position(
|
|
30
|
+
typescript: TypeScript,
|
|
31
|
+
source: ts.SourceFile,
|
|
32
|
+
statement: ts.Statement,
|
|
33
|
+
): number | undefined {
|
|
34
|
+
const declaration = declaration_of(typescript, statement)
|
|
35
|
+
if (declaration === undefined || !is_type_only(typescript, declaration)) return undefined
|
|
36
|
+
const specifier = declaration.moduleSpecifier
|
|
37
|
+
if (specifier === undefined || !typescript.isStringLiteral(specifier)) return undefined
|
|
38
|
+
|
|
39
|
+
return specifier.getStart(source)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// The specifiers `preProcessFile` finds less the type-only declarations': the edges the test runner
|
|
43
|
+
// follows.
|
|
44
|
+
function runtime_specifiers(typescript: TypeScript, file: string, content: string): Array<string> {
|
|
45
|
+
const source = typescript.createSourceFile(file, content, typescript.ScriptTarget.Latest)
|
|
46
|
+
const type_only = new Set(
|
|
47
|
+
source.statements.map((statement) => type_only_position(typescript, source, statement)),
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
return typescript
|
|
51
|
+
.preProcessFile(content, true, true)
|
|
52
|
+
.importedFiles.filter((reference) => !type_only.has(reference.pos))
|
|
53
|
+
.map((reference) => reference.fileName)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const type_only_imports = { runtime_specifiers }
|
|
57
|
+
|
|
58
|
+
export { type_only_imports }
|
|
@@ -15,7 +15,6 @@ interface Headings {
|
|
|
15
15
|
none: string
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
const JAPANESE_LANG_PREFIX = 'ja'
|
|
19
18
|
const JAPANESE_HEADINGS: Headings = {
|
|
20
19
|
recommended: '推奨:',
|
|
21
20
|
alternatives: '他の選択肢:',
|
|
@@ -31,7 +30,7 @@ const ENGLISH_HEADINGS: Headings = {
|
|
|
31
30
|
function headings(): Headings {
|
|
32
31
|
const { lang } = session_language.resolve_session_lang()
|
|
33
32
|
|
|
34
|
-
return
|
|
33
|
+
return session_language.is_japanese(lang) ? JAPANESE_HEADINGS : ENGLISH_HEADINGS
|
|
35
34
|
}
|
|
36
35
|
|
|
37
36
|
// An empty list is stated as none, so a confirmation with no other option says so rather than
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { gh_spawn } from '#scripts/gh/gh-spawn'
|
|
2
2
|
import { timed_fetch } from '#scripts/lib/timed-fetch'
|
|
3
|
+
import { token_shape } from '#scripts/lib/token-shape'
|
|
3
4
|
import { z } from 'zod'
|
|
4
5
|
import { confirmation_options, type ConfirmationOptions } from './confirmation-options'
|
|
5
6
|
import { notify_opt_in } from './notify-opt-in'
|
|
@@ -20,14 +21,14 @@ const telegram_environment_schema = z.object({
|
|
|
20
21
|
// Sending `failure` (❌) there would say the merge failed, which is false and is
|
|
21
22
|
// the more expensive lie of the two; sending `completion` (✅) twice says nothing went wrong, which
|
|
22
23
|
// is the silence this type exists to end.
|
|
23
|
-
// **`
|
|
24
|
-
// merged alongside something that did not work;
|
|
25
|
-
//
|
|
26
|
-
// exactly that: not done, not broken, just
|
|
27
|
-
// **`stranded` is not `
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
//
|
|
24
|
+
// **`idle` is not `warning`**. `warning` names a run that *finished* and
|
|
25
|
+
// merged alongside something that did not work; an idle run is alive and has not finished — it has
|
|
26
|
+
// nothing left to dispatch and no child running, so what remains waits on a person. The 💤 icon says
|
|
27
|
+
// exactly that: not done, not broken, just waiting for a hand.
|
|
28
|
+
// **`stranded` is not `idle`**. An idle run still has a driver watching the
|
|
29
|
+
// backlog; a stranded one has none. The session that cut the budget handed it off and died, no
|
|
30
|
+
// successor claimed it, and no supervisor is watching, so nothing can take the next step at all. The
|
|
31
|
+
// 🚨 icon says a run needs a hand to keep running at all.
|
|
31
32
|
type TelegramTaskType =
|
|
32
33
|
| 'planning'
|
|
33
34
|
| 'completion'
|
|
@@ -35,7 +36,7 @@ type TelegramTaskType =
|
|
|
35
36
|
| 'warning'
|
|
36
37
|
| 'kickoff_retry'
|
|
37
38
|
| 'confirmation'
|
|
38
|
-
| '
|
|
39
|
+
| 'idle'
|
|
39
40
|
| 'stranded'
|
|
40
41
|
| 'progress'
|
|
41
42
|
|
|
@@ -68,7 +69,7 @@ const TASK_DEFINITIONS: Record<TelegramTaskType, TaskDefinition> = {
|
|
|
68
69
|
warning: { icon: '⚠️', label: 'Completed with a warning' },
|
|
69
70
|
kickoff_retry: { icon: '🔄', label: 'Kickoff retry' },
|
|
70
71
|
confirmation: { icon: '⏸️', label: 'Confirmation required' },
|
|
71
|
-
|
|
72
|
+
idle: { icon: '💤', label: 'Backlog run idle — nothing left to dispatch' },
|
|
72
73
|
stranded: { icon: '🚨', label: 'Run stranded — nobody is driving it' },
|
|
73
74
|
progress: { icon: '📊', label: 'Progress' },
|
|
74
75
|
}
|
|
@@ -230,6 +231,14 @@ function build_text(input: TelegramSendInput): string {
|
|
|
230
231
|
return join_blocks({ ...input, body: `${head_of(input.body, kept)}${BODY_TRUNCATION_MARK}` })
|
|
231
232
|
}
|
|
232
233
|
|
|
234
|
+
// The text to send, refused when it holds a credential: the whole text is read, before the cut could
|
|
235
|
+
// leave a head no shape matches.
|
|
236
|
+
function outbound_text(input: TelegramSendInput): string {
|
|
237
|
+
token_shape.refuse(join_blocks(input), 'The Telegram message')
|
|
238
|
+
|
|
239
|
+
return build_text(input)
|
|
240
|
+
}
|
|
241
|
+
|
|
233
242
|
async function post_message(config: TelegramConfig, text: string): Promise<void> {
|
|
234
243
|
const url = `${TELEGRAM_API_BASE}/bot${config.bot_token}/sendMessage`
|
|
235
244
|
const response = await timed_fetch(url, {
|
|
@@ -271,7 +280,7 @@ async function send(input: TelegramSendInput): Promise<void> {
|
|
|
271
280
|
}
|
|
272
281
|
|
|
273
282
|
const config = load_config()
|
|
274
|
-
const text =
|
|
283
|
+
const text = outbound_text(input)
|
|
275
284
|
|
|
276
285
|
try {
|
|
277
286
|
await post_message(config, text)
|
|
@@ -283,7 +292,7 @@ async function send(input: TelegramSendInput): Promise<void> {
|
|
|
283
292
|
}
|
|
284
293
|
|
|
285
294
|
// **The tolerant form**, for a caller whose job is something other than the notification.
|
|
286
|
-
// `followup` sends the completion message
|
|
295
|
+
// `followup` sends the completion message beside the merge, and a gateway timeout at
|
|
287
296
|
// Telegram is not a reason to leave a reviewed, green pull request unmerged. So the failure is
|
|
288
297
|
// reported and the run carries on.
|
|
289
298
|
//
|
|
@@ -298,7 +307,7 @@ async function send(input: TelegramSendInput): Promise<void> {
|
|
|
298
307
|
//
|
|
299
308
|
// **Not routed through `git_followup_cleanup`**, which is that Issue's mechanism: it guards the
|
|
300
309
|
// steps a merge has already earned and says "failed after the merge" in its own wording, while this
|
|
301
|
-
// send happens *
|
|
310
|
+
// send never happens *after* the merge. Borrowing it would print a sentence that is not true.
|
|
302
311
|
function report_send_failure(error: unknown, recovery: string | undefined): void {
|
|
303
312
|
console.error('')
|
|
304
313
|
console.error(`❗ ${describe_symptom(error)}`)
|
|
@@ -389,25 +398,25 @@ async function confirm(input: ConfirmInput): Promise<boolean> {
|
|
|
389
398
|
)
|
|
390
399
|
}
|
|
391
400
|
|
|
392
|
-
interface
|
|
401
|
+
interface IdleInput {
|
|
393
402
|
body: string
|
|
394
403
|
recovery: string
|
|
395
404
|
}
|
|
396
405
|
|
|
397
406
|
/**
|
|
398
|
-
* Push the
|
|
399
|
-
* Off-screen is the whole point:
|
|
400
|
-
*
|
|
407
|
+
* Push the 💤 idle type — a backlog run with no child running and nothing left to dispatch.
|
|
408
|
+
* Off-screen is the whole point: what is left waits on a person, and the
|
|
409
|
+
* terminal shows that only to someone already watching.
|
|
401
410
|
*
|
|
402
411
|
* **`warn`'s shape exactly** — the repository looked up under the shared bound, the tolerant
|
|
403
|
-
* `send_or_report` so a gateway timeout at Telegram never fails the
|
|
412
|
+
* `send_or_report` so a gateway timeout at Telegram never fails the loop that is only reporting, and
|
|
404
413
|
* the caller's own `recovery` line. No `issue_title`: the header label already names what this is, and
|
|
405
414
|
* the body carries what is waiting, so a title line would only repeat the header.
|
|
406
415
|
*/
|
|
407
|
-
async function
|
|
416
|
+
async function idle(input: IdleInput): Promise<boolean> {
|
|
408
417
|
return await send_or_report(
|
|
409
418
|
{
|
|
410
|
-
task_type: '
|
|
419
|
+
task_type: 'idle',
|
|
411
420
|
repo_name: gh_spawn.get_repo_name_with_owner_within(REPO_LOOKUP_TIMEOUT_MS),
|
|
412
421
|
issue_title: undefined,
|
|
413
422
|
body: input.body,
|
|
@@ -425,11 +434,11 @@ interface StrandedInput {
|
|
|
425
434
|
|
|
426
435
|
/**
|
|
427
436
|
* Push the 🚨 stranded type — a run whose driver is gone and which nothing can advance.
|
|
428
|
-
* Off-screen is the whole point, as it is for `
|
|
437
|
+
* Off-screen is the whole point, as it is for `idle`: the state is
|
|
429
438
|
* invisible on the terminal because the session that would show it has died, so the person hears about
|
|
430
439
|
* it where they are not watching, rather than by asking.
|
|
431
440
|
*
|
|
432
|
-
* **`
|
|
441
|
+
* **`idle`'s shape exactly** — the repository looked up under the shared bound, the tolerant
|
|
433
442
|
* `send_or_report` so a Telegram timeout never fails the detector that is only reporting, and the
|
|
434
443
|
* caller's own `recovery` line naming the command that hands the run to a fresh supervisor. No
|
|
435
444
|
* `issue_title`: the header label already names what this is.
|
|
@@ -471,10 +480,10 @@ async function progress(body: string): Promise<boolean> {
|
|
|
471
480
|
|
|
472
481
|
const telegram_notify = {
|
|
473
482
|
confirm,
|
|
483
|
+
idle,
|
|
474
484
|
progress,
|
|
475
485
|
send,
|
|
476
486
|
send_or_report,
|
|
477
|
-
stalled,
|
|
478
487
|
stranded,
|
|
479
488
|
warn,
|
|
480
489
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { telegram_test } from './telegram-test'
|
|
4
|
+
|
|
5
|
+
// The `josh notify` entry, kept apart from `telegram-test.ts` because the stop hook and
|
|
6
|
+
// `run-stop-notify.ts` import that one: a bundle is one file, so a main guard there would fire for
|
|
7
|
+
// every command that carries it (joshuafolkken/kit#4186). The flags are read from `process.argv`.
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await telegram_test.run_cli()
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
4
2
|
import { git_gh_repo } from '#scripts/gh/git-gh-repo'
|
|
5
3
|
import { github_issue_url, type IssueUrlTarget } from '#scripts/gh/github-issue-url'
|
|
@@ -141,8 +139,8 @@ async function main(): Promise<void> {
|
|
|
141
139
|
// and exits non-zero. Both the message and the `cause` whose text `handle` also prints reach it
|
|
142
140
|
// already free of the bot token and the chat id — `telegram_notify` redacts each before throwing.
|
|
143
141
|
//
|
|
144
|
-
//
|
|
145
|
-
//
|
|
142
|
+
// The `josh notify` entry is `telegram-test-main.ts`, kept apart because other modules import this one
|
|
143
|
+
// (joshuafolkken/kit#4186).
|
|
146
144
|
async function run_cli(): Promise<void> {
|
|
147
145
|
try {
|
|
148
146
|
await main()
|
|
@@ -151,8 +149,6 @@ async function run_cli(): Promise<void> {
|
|
|
151
149
|
}
|
|
152
150
|
}
|
|
153
151
|
|
|
154
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await run_cli()
|
|
155
|
-
|
|
156
152
|
const telegram_test = { fetch_repo_name, fetch_issue_title, resolve_context, run_cli, send_values }
|
|
157
153
|
|
|
158
154
|
export { telegram_test }
|
|
@@ -89,6 +89,18 @@ function is_ledger_path(file_path: string): boolean {
|
|
|
89
89
|
)
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
+
// The git pathspec of every path but the ledger — the same paths `is_ledger_path` answers, for a git
|
|
93
|
+
// command to leave out. `:/` and `top` anchor it at the repository root, so a command run from a
|
|
94
|
+
// subdirectory still covers the whole tree and still leaves the root's ledger alone.
|
|
95
|
+
const LEDGER_EXCLUSION_PATHSPEC: ReadonlyArray<string> = [
|
|
96
|
+
':/',
|
|
97
|
+
...LEDGER_DIRECTORIES.map((directory) => `:(top,exclude)${directory}`),
|
|
98
|
+
...LEGACY_OBSERVATION_LEDGER_PATHS.map((legacy) => `:(top,exclude)${legacy}`),
|
|
99
|
+
...LEGACY_OBSERVATION_LEDGER_PATHS.map(
|
|
100
|
+
(legacy) => `:(top,exclude,glob)${legacy}.*${MIGRATION_CLAIM_SUFFIX}`,
|
|
101
|
+
),
|
|
102
|
+
]
|
|
103
|
+
|
|
92
104
|
function is_ledger_line(line: string): boolean {
|
|
93
105
|
return is_ledger_path(status_path(line))
|
|
94
106
|
}
|
|
@@ -124,6 +136,7 @@ const observation_ledger = {
|
|
|
124
136
|
|
|
125
137
|
export {
|
|
126
138
|
LEDGER_DIRECTORIES,
|
|
139
|
+
LEDGER_EXCLUSION_PATHSPEC,
|
|
127
140
|
LEDGER_FILE_EXTENSION,
|
|
128
141
|
LEGACY_LEDGER_FILE,
|
|
129
142
|
LEGACY_OBSERVATION_LEDGER_DIRECTORY,
|