@joshuafolkken/kit 1.1514.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { lane_capacity } from '#scripts/lane/lane-capacity'
|
|
2
|
+
import { lane_snapshot_trace } from '#scripts/lane/lane-snapshot-trace'
|
|
2
3
|
import { epic_busy, type BusyRead } from './epic-busy'
|
|
3
4
|
import {
|
|
4
5
|
epic_candidate_confirm,
|
|
@@ -39,11 +40,13 @@ interface RepoPool {
|
|
|
39
40
|
|
|
40
41
|
// What is being asked of one repository. `is_all_lanes` is the caller's appetite rather than the
|
|
41
42
|
// repository's capacity: `epic:next --repo` prints a single token unless `--lanes` was passed, so a
|
|
42
|
-
// caller written against the one-child contract keeps getting exactly one child.
|
|
43
|
+
// caller written against the one-child contract keeps getting exactly one child. `is_this_checkout`
|
|
44
|
+
// says whether `repo` is the repository this command runs in, whose ship records are the ones read.
|
|
43
45
|
interface LaneRequest {
|
|
44
46
|
repo: string
|
|
45
47
|
limit: number
|
|
46
48
|
is_all_lanes: boolean
|
|
49
|
+
is_this_checkout: boolean
|
|
47
50
|
}
|
|
48
51
|
|
|
49
52
|
// The answer for one repository: the children to start, the verdict standing in their place when
|
|
@@ -62,8 +65,27 @@ function is_held(read: BusyRead): boolean {
|
|
|
62
65
|
return read.kind === 'unreadable' || read.kind === 'truncated'
|
|
63
66
|
}
|
|
64
67
|
|
|
65
|
-
function free_lanes(read: BusyRead, limit: number): number {
|
|
66
|
-
|
|
68
|
+
function free_lanes(read: BusyRead, limit: number, merge_waiting: number): number {
|
|
69
|
+
if (is_held(read)) return NO_LANES
|
|
70
|
+
|
|
71
|
+
const holders = epic_busy.occupied_lanes(read)
|
|
72
|
+
|
|
73
|
+
// A merge-waiting holder frees its place under the limit but keeps its port seat
|
|
74
|
+
// (`lane_capacity.free_lanes`).
|
|
75
|
+
return lane_capacity.free_lanes(limit, holders - merge_waiting, holders)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// **A holder whose detached ship waits on its merge holds no lane** — the count `backlog:drive` makes
|
|
79
|
+
// for the pool (`backlog-occupied.ts`), so a named epic's lanes are offered the place too
|
|
80
|
+
// (joshuafolkken/kit#4466). It keeps `in-progress` until the merge. The ship records read are this
|
|
81
|
+
// checkout's, so a `--repo` naming another repository is discounted nothing: its holder numbers
|
|
82
|
+
// would be matched against this repository's unrelated ships.
|
|
83
|
+
async function merge_waiting_holders(read: BusyRead, request: LaneRequest): Promise<number> {
|
|
84
|
+
if (read.kind !== 'busy' || !request.is_this_checkout) return NO_LANES
|
|
85
|
+
|
|
86
|
+
return await lane_snapshot_trace.count_merge_waiting(
|
|
87
|
+
read.issues.map((issue) => String(issue.number)),
|
|
88
|
+
)
|
|
67
89
|
}
|
|
68
90
|
|
|
69
91
|
function wanted_of(request: LaneRequest, free: number): number {
|
|
@@ -247,7 +269,7 @@ async function offer_for_repo(
|
|
|
247
269
|
|
|
248
270
|
if (notice !== undefined) console.error(notice)
|
|
249
271
|
|
|
250
|
-
const free = free_lanes(read, request.limit)
|
|
272
|
+
const free = free_lanes(read, request.limit, await merge_waiting_holders(read, request))
|
|
251
273
|
const ages = await holder_ages(read, request.repo)
|
|
252
274
|
|
|
253
275
|
if (free === NO_LANES) {
|
|
@@ -263,9 +285,22 @@ async function offer_for_repo(
|
|
|
263
285
|
return solo_offer(await collect(for_repo, wanted_of(request, free)), read, request, ages)
|
|
264
286
|
}
|
|
265
287
|
|
|
288
|
+
// A `--repo` compared against the repository this command runs in, case-insensitively as GitHub
|
|
289
|
+
// names it.
|
|
290
|
+
function lane_request(
|
|
291
|
+
asked: Pick<LaneRequest, 'repo' | 'is_all_lanes'>,
|
|
292
|
+
limit: number,
|
|
293
|
+
current_repo: string,
|
|
294
|
+
): LaneRequest {
|
|
295
|
+
const is_this_checkout = asked.repo.toLowerCase() === current_repo.toLowerCase()
|
|
296
|
+
|
|
297
|
+
return { ...asked, limit, is_this_checkout }
|
|
298
|
+
}
|
|
299
|
+
|
|
266
300
|
const epic_lane_offer = {
|
|
267
301
|
combine_verdicts,
|
|
268
302
|
dedupe_pools,
|
|
303
|
+
lane_request,
|
|
269
304
|
offer_for_repo,
|
|
270
305
|
}
|
|
271
306
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { josh_environment_file } from '#scripts/josh/josh-environment-file'
|
|
4
|
+
import { epic_next } from './epic-next'
|
|
5
|
+
|
|
6
|
+
// The `josh epic:next` entry, kept apart from `epic-next.ts` because other modules import that one: a
|
|
7
|
+
// bundle is one file, so a main guard there would fire for every command that carries it
|
|
8
|
+
// (joshuafolkken/kit#4186).
|
|
9
|
+
//
|
|
10
|
+
// `.env` is read here rather than through the dispatcher's `tsx_arguments`: declaring any would
|
|
11
|
+
// disqualify this command from in-process dispatch, and an unattended `epicrun` asks it every sixty
|
|
12
|
+
// seconds for the whole life of a run (`josh-environment-file.ts` records the measurement). Inside the
|
|
13
|
+
// guard, so a developer's own `.env` cannot decide what the unit tests see.
|
|
14
|
+
//
|
|
15
|
+
// `process.exitCode` rather than `process.exit()`, for the reason `scripts/cost-runtime/cost-main.ts`
|
|
16
|
+
// records: the answer goes to standard output and a write to a pipe is asynchronous on macOS, so
|
|
17
|
+
// exiting can tear the process down before it drains. This command's contract is
|
|
18
|
+
// `answer=$(pnpm josh epic:next <E>)`, which is exactly that pipe.
|
|
19
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
20
|
+
const ARGV_OFFSET = 2
|
|
21
|
+
|
|
22
|
+
josh_environment_file.load_environment_file()
|
|
23
|
+
process.exitCode = await epic_next.run(process.argv.slice(ARGV_OFFSET))
|
|
24
|
+
}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { repo_discovery } from '#scripts/discovery/repo-discovery'
|
|
4
2
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
5
3
|
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
6
|
-
import { josh_environment_file } from '#scripts/josh/josh-environment-file'
|
|
7
4
|
import { lane_capacity } from '#scripts/lane/lane-capacity'
|
|
8
5
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
9
6
|
import { issue_citation } from '#scripts/rules/issue-citation'
|
|
@@ -31,7 +28,6 @@ import { epic_report, type EpicNextResult } from './epic-report'
|
|
|
31
28
|
|
|
32
29
|
const SUCCESS_EXIT_CODE = 0
|
|
33
30
|
const FAILURE_EXIT_CODE = 1
|
|
34
|
-
const ARGV_OFFSET = 2
|
|
35
31
|
// Asking for every free lane (`--lanes`) is opt-in, so the answer stays one token for a caller that
|
|
36
32
|
// has not been changed. `--repo` alone prints exactly one number.
|
|
37
33
|
const OPTIONS = { repo: { type: 'string' }, lanes: { type: 'boolean' } } as const
|
|
@@ -351,11 +347,13 @@ async function report_epics(
|
|
|
351
347
|
const choice = await lane_capacity.lane_limit()
|
|
352
348
|
if (choice.kind === 'problem') return refuse(choice.problem)
|
|
353
349
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
350
|
+
const request = epic_lane_offer.lane_request(
|
|
351
|
+
{ repo: options.repo, is_all_lanes: options.is_all_lanes ?? false },
|
|
352
|
+
choice.limit,
|
|
357
353
|
current_repo,
|
|
358
354
|
)
|
|
355
|
+
|
|
356
|
+
return await report(views, request, current_repo)
|
|
359
357
|
}
|
|
360
358
|
|
|
361
359
|
// One view per named epic, classified against one shared registry read. `running` is every named
|
|
@@ -416,14 +414,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
416
414
|
return await run_epics(options)
|
|
417
415
|
}
|
|
418
416
|
|
|
419
|
-
// `process.exitCode` rather than `process.exit()`, for the reason `scripts/cost-runtime/cost-cli.ts` records:
|
|
420
|
-
// the answer goes to standard output and a write to a pipe is asynchronous on macOS, so exiting can
|
|
421
|
-
// tear the process down before it drains. This command's contract is `answer=$(pnpm josh epic:next
|
|
422
|
-
// <E>)`, which is exactly that pipe.
|
|
423
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
424
|
-
process.exitCode = await run(argv)
|
|
425
|
-
}
|
|
426
|
-
|
|
427
417
|
const epic_next = {
|
|
428
418
|
EXTERNAL_NOTICE,
|
|
429
419
|
FOREIGN_EPIC,
|
|
@@ -433,19 +423,11 @@ const epic_next = {
|
|
|
433
423
|
parse_options,
|
|
434
424
|
refuse_reads,
|
|
435
425
|
views_of,
|
|
426
|
+
run,
|
|
436
427
|
run_epics,
|
|
437
428
|
decide,
|
|
438
429
|
report,
|
|
439
430
|
}
|
|
440
431
|
|
|
441
|
-
// `.env` is read here rather than through the dispatcher's `tsx_arguments`: declaring any would
|
|
442
|
-
// disqualify this command from in-process dispatch, and an unattended `epicrun` asks it every sixty
|
|
443
|
-
// seconds for the whole life of a run (`josh-environment-file.ts` records the measurement). Inside the guard
|
|
444
|
-
// rather than in `main`, so a developer's own `.env` cannot decide what the unit tests see.
|
|
445
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
446
|
-
josh_environment_file.load_environment_file()
|
|
447
|
-
await main(process.argv.slice(ARGV_OFFSET))
|
|
448
|
-
}
|
|
449
|
-
|
|
450
432
|
export type { NextOptions }
|
|
451
433
|
export { epic_next }
|
|
@@ -24,6 +24,10 @@ type DependencyVerdict = 'resolved' | 'time' | 'human' | 'inherit'
|
|
|
24
24
|
// a closed blocker is a finished one.
|
|
25
25
|
type ResolveDependency = (blocker: EpicChild, blocked: EpicChild) => DependencyVerdict
|
|
26
26
|
|
|
27
|
+
// A notice's mark on `run:board`: ❗ rather than ⚠, a text symbol drawn two columns wide over the
|
|
28
|
+
// blank after it.
|
|
29
|
+
const NOTICE_ICON = '❗'
|
|
30
|
+
|
|
27
31
|
type OutsideCategory = 'time' | 'human'
|
|
28
32
|
|
|
29
33
|
// A line to announce once per invocation, keyed so the classifier's de-duplication can drop repeats.
|
|
@@ -62,7 +66,7 @@ function unread_answer(child: EpicChild, reference: IssueReference): OutsideAnsw
|
|
|
62
66
|
category: 'time',
|
|
63
67
|
notice: {
|
|
64
68
|
key: `unread:${epic_graph.key_of(child)}:${blocker}`,
|
|
65
|
-
message:
|
|
69
|
+
message: `${NOTICE_ICON} ${name_of(child)} is blocked by ${blocker}, whose state could not be read — it waits rather than runs`,
|
|
66
70
|
},
|
|
67
71
|
}
|
|
68
72
|
}
|
|
@@ -80,7 +84,7 @@ function open_answer(
|
|
|
80
84
|
category: 'human',
|
|
81
85
|
notice: {
|
|
82
86
|
key: `outside:${epic_graph.key_of(child)}:${blocker}`,
|
|
83
|
-
message:
|
|
87
|
+
message: `${NOTICE_ICON} ${name_of(child)} waits on ${blocker}, which this run will not finish — withheld for a person`,
|
|
84
88
|
},
|
|
85
89
|
}
|
|
86
90
|
}
|
|
@@ -16,7 +16,10 @@ const TASK_LIST_LINE_PATTERN = new RegExp(TASK_LIST_ISSUE_SOURCE, 'u')
|
|
|
16
16
|
// `owner/repo#101` on its own. The row patterns below are built from this source, so what counts as
|
|
17
17
|
// a cross-repository reference has one definition — a second copy would let a form the task list
|
|
18
18
|
// accepts be refused where a person types it, or the reverse.
|
|
19
|
-
|
|
19
|
+
// A segment starts with a word character, so `.`, `..` and a leading `-` never become an owner or a
|
|
20
|
+
// repository — `../..#1` would otherwise be read as one and walk the API path out of `repos/`.
|
|
21
|
+
const REPOSITORY_SEGMENT_SOURCE = String.raw`\w[\w.-]*`
|
|
22
|
+
const EXTERNAL_REFERENCE_SOURCE = String.raw`(${REPOSITORY_SEGMENT_SOURCE})\/(${REPOSITORY_SEGMENT_SOURCE})#(\d+)`
|
|
20
23
|
const EXTERNAL_REFERENCE_PATTERN = new RegExp(`^${EXTERNAL_REFERENCE_SOURCE}$`, 'u')
|
|
21
24
|
const TASK_LIST_ROW_SOURCE = String.raw`^[ \t]*[-*+][ \t]+\[[ xX]\][ \t]+`
|
|
22
25
|
const EXTERNAL_TASK_LIST_PATTERN = new RegExp(
|
|
@@ -29,8 +32,10 @@ const EXTERNAL_SHORTHAND_PATTERN = new RegExp(
|
|
|
29
32
|
'gmu',
|
|
30
33
|
)
|
|
31
34
|
// `- [ ] https://github.com/owner/repo/issues/101`
|
|
32
|
-
const EXTERNAL_URL_PATTERN =
|
|
33
|
-
|
|
35
|
+
const EXTERNAL_URL_PATTERN = new RegExp(
|
|
36
|
+
String.raw`${TASK_LIST_ROW_SOURCE}https?:\/\/github\.com\/(${REPOSITORY_SEGMENT_SOURCE})\/(${REPOSITORY_SEGMENT_SOURCE})\/issues\/(\d+)\b`,
|
|
37
|
+
'gmu',
|
|
38
|
+
)
|
|
34
39
|
|
|
35
40
|
// Fenced blocks are stripped before matching. An epic body may quote the body template itself, and
|
|
36
41
|
// its sample rows (`- [ ] #101 <title>`) are illustrations, not tracked children — counting them
|
|
@@ -345,4 +350,5 @@ export {
|
|
|
345
350
|
is_state_closed,
|
|
346
351
|
UNORDERED_DEPENDENCIES,
|
|
347
352
|
DECLARED_CHAIN_LINE,
|
|
353
|
+
REPOSITORY_SEGMENT_SOURCE,
|
|
348
354
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { expected_effect_lint } from '#scripts/issue/expected-effect-lint'
|
|
2
|
+
import { issue_priority } from '#scripts/issue/issue-priority'
|
|
1
3
|
import { issue_rank } from '#scripts/issue/issue-rank'
|
|
2
4
|
import { epic_graph, type EpicChild } from './epic-graph'
|
|
3
5
|
|
|
@@ -27,7 +29,10 @@ function rank(
|
|
|
27
29
|
const dependents = dependents_of(pool)
|
|
28
30
|
|
|
29
31
|
return issue_rank.rank(children, (child) => ({
|
|
32
|
+
is_last: issue_priority.is_last(child.body),
|
|
30
33
|
labels: child.labels,
|
|
34
|
+
lost_minutes: issue_priority.lost_minutes(child.body),
|
|
35
|
+
gain_minutes: expected_effect_lint.weekly_minutes(child.body),
|
|
31
36
|
dependents: dependents.get(epic_graph.key_of(child)) ?? 0,
|
|
32
37
|
}))
|
|
33
38
|
}
|
|
@@ -235,11 +235,50 @@ async function reconcile_epic(epic_number: number): Promise<number> {
|
|
|
235
235
|
return await apply_plan(epic_number, plan)
|
|
236
236
|
}
|
|
237
237
|
|
|
238
|
+
function with_recorded(
|
|
239
|
+
recorded: ReadonlyArray<EpicChild>,
|
|
240
|
+
link: DependencyLink,
|
|
241
|
+
repo: string,
|
|
242
|
+
): Array<EpicChild> {
|
|
243
|
+
return recorded.map((child) =>
|
|
244
|
+
child.number === link.blocked && child.repo === repo
|
|
245
|
+
? { ...child, blocked_by: [...child.blocked_by, to_blocker(link, repo)] }
|
|
246
|
+
: child,
|
|
247
|
+
)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// The plan the epic would reconcile to once `link` is recorded, so a caller about to record it can
|
|
251
|
+
// refuse first — a relation recorded and then refused leaves an order the declaration never carries.
|
|
252
|
+
function build_plan_after(input: ReconcilePlanInput, link: DependencyLink): ReconcilePlan {
|
|
253
|
+
return build_reconcile_plan({
|
|
254
|
+
...input,
|
|
255
|
+
recorded: with_recorded(input.recorded, link, input.repo),
|
|
256
|
+
})
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Why reconciling after recording `link` would refuse, read before anything is written. An epic that
|
|
260
|
+
// cannot be read throws: a failed read is no answer about whether the reconcile would refuse.
|
|
261
|
+
async function refusal_after(
|
|
262
|
+
epic_number: number,
|
|
263
|
+
link: DependencyLink,
|
|
264
|
+
): Promise<string | undefined> {
|
|
265
|
+
const epic = await epic_read.read_epic(epic_number)
|
|
266
|
+
if ('error' in epic) throw new Error(epic.error)
|
|
267
|
+
|
|
268
|
+
const input = { body: epic.subject.body, recorded: epic.recorded, repo: epic.repo }
|
|
269
|
+
const plan = build_plan_after(input, link)
|
|
270
|
+
if (plan.kind === 'cycle') return plan.message
|
|
271
|
+
|
|
272
|
+
return plan.kind === 'error' ? plan.error : undefined
|
|
273
|
+
}
|
|
274
|
+
|
|
238
275
|
const epic_reconcile = {
|
|
239
276
|
NOTHING_TO_RECONCILE,
|
|
240
277
|
RECONCILED,
|
|
278
|
+
build_plan_after,
|
|
241
279
|
build_reconcile_plan,
|
|
242
280
|
reconcile_epic,
|
|
281
|
+
refusal_after,
|
|
243
282
|
}
|
|
244
283
|
|
|
245
284
|
export { epic_reconcile }
|
package/scripts/epic/epic-run.ts
CHANGED
|
@@ -84,7 +84,9 @@ async function fill_run_command(
|
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
// The created epic's number, or `undefined` when its URL could not be read — for a caller that writes
|
|
88
|
+
// to the epic next (`epic:bundle --apply` reconciling a recorded order).
|
|
89
|
+
async function create_epic_number(input: CreateEpicInput): Promise<number | undefined> {
|
|
88
90
|
await git_gh_command.label_ensure({
|
|
89
91
|
name: EPIC_LABEL,
|
|
90
92
|
color: EPIC_LABEL_COLOR,
|
|
@@ -110,6 +112,12 @@ async function create_epic(input: CreateEpicInput): Promise<number> {
|
|
|
110
112
|
await fill_run_command(epic_number, input)
|
|
111
113
|
console.info(`▶ Run the children with: ${epic_body.format_run_command(epic_number)}`)
|
|
112
114
|
|
|
115
|
+
return epic_number
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async function create_epic(input: CreateEpicInput): Promise<number> {
|
|
119
|
+
await create_epic_number(input)
|
|
120
|
+
|
|
113
121
|
return SUCCESS_EXIT_CODE
|
|
114
122
|
}
|
|
115
123
|
|
|
@@ -215,6 +223,7 @@ async function check_epic(epic_number: number): Promise<number> {
|
|
|
215
223
|
|
|
216
224
|
const epic_run = {
|
|
217
225
|
create_epic,
|
|
226
|
+
create_epic_number,
|
|
218
227
|
promote_epic,
|
|
219
228
|
check_epic,
|
|
220
229
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
2
|
-
import {
|
|
2
|
+
import { has_label_name, RUN_SOLO_LABEL } from '#scripts/issue/issue-labels'
|
|
3
3
|
import { issue_citation } from '#scripts/rules/issue-citation'
|
|
4
4
|
import { epic_busy, type BusyRead } from './epic-busy'
|
|
5
5
|
import type { EpicChild } from './epic-graph'
|
|
@@ -28,8 +28,6 @@ import { epic_report, type EpicNextResult } from './epic-report'
|
|
|
28
28
|
// them goes first is the ranking's question — `issue-rank.ts` puts a verification-path defect at the head — so an idle
|
|
29
29
|
// repository takes the candidates in rank order like any other.
|
|
30
30
|
|
|
31
|
-
const SOLO_LABELS: ReadonlySet<string> = new Set([RUN_SOLO_LABEL])
|
|
32
|
-
|
|
33
31
|
// Which of the ordered candidates may start, which are held back, and why when a reason is worth
|
|
34
32
|
// saying. `offered` keeps the candidates' own order.
|
|
35
33
|
interface SoloSelection {
|
|
@@ -38,35 +36,65 @@ interface SoloSelection {
|
|
|
38
36
|
notice?: string
|
|
39
37
|
}
|
|
40
38
|
|
|
39
|
+
interface SoloQueue {
|
|
40
|
+
solo: EpicChild
|
|
41
|
+
index: number
|
|
42
|
+
behind: ReadonlyArray<EpicChild>
|
|
43
|
+
}
|
|
44
|
+
|
|
41
45
|
interface SoloGate {
|
|
42
46
|
result: EpicNextResult
|
|
43
47
|
notice?: string
|
|
44
48
|
}
|
|
45
49
|
|
|
46
|
-
|
|
50
|
+
// An issue as its number and its label names — a candidate, or a running issue `run:board` reads.
|
|
51
|
+
type Labelled = Pick<EpicChild, 'number' | 'labels'>
|
|
52
|
+
|
|
53
|
+
function is_solo(child: Labelled): boolean {
|
|
47
54
|
return has_label_name(child.labels, RUN_SOLO_LABEL)
|
|
48
55
|
}
|
|
49
56
|
|
|
57
|
+
// The running `run:solo` issue that lets nothing new start, if any — the one reading `select` and
|
|
58
|
+
// `run:board`'s 🔒 rows share (joshuafolkken/kit#4391).
|
|
59
|
+
function holder_of(running: ReadonlyArray<Labelled>): number | undefined {
|
|
60
|
+
return running.find((issue) => is_solo(issue))?.number
|
|
61
|
+
}
|
|
62
|
+
|
|
50
63
|
function solo_holder(read: BusyRead): number | undefined {
|
|
51
64
|
if (read.kind !== 'busy') return undefined
|
|
65
|
+
const running = read.issues.map((issue) => ({
|
|
66
|
+
number: issue.number,
|
|
67
|
+
labels: (issue.labels ?? []).map((label) => label.name),
|
|
68
|
+
}))
|
|
52
69
|
|
|
53
|
-
return
|
|
70
|
+
return holder_of(running)
|
|
54
71
|
}
|
|
55
72
|
|
|
73
|
+
// The words each of the gate's wait notices carries, so `backlog:offer` tells a `run:solo` wait from any
|
|
74
|
+
// other `wait` off the notice `backlog:next` printed (joshuafolkken/kit#4396). Each names its verb:
|
|
75
|
+
// `epic_solo_stale`'s release notice also opens "carries `run:solo` and", and is no wait.
|
|
76
|
+
const HELD_MARK = `carries \`${RUN_SOLO_LABEL}\` and is running in`
|
|
77
|
+
const WAITING_MARK = `carries \`${RUN_SOLO_LABEL}\` and waits for`
|
|
78
|
+
|
|
56
79
|
function held_message(holder: number, repo: string): string {
|
|
57
80
|
return issue_citation.linkify(
|
|
58
|
-
`${issue_cite.plain(holder)}
|
|
81
|
+
`${issue_cite.plain(holder)} ${HELD_MARK} ${repo}; nothing else starts until it merges or is parked.`,
|
|
59
82
|
repo,
|
|
60
83
|
)
|
|
61
84
|
}
|
|
62
85
|
|
|
63
86
|
function waiting_message(solo: number, repo: string): string {
|
|
64
87
|
return issue_citation.linkify(
|
|
65
|
-
`${issue_cite.plain(solo)}
|
|
88
|
+
`${issue_cite.plain(solo)} ${WAITING_MARK} ${repo}'s running lanes to finish; nothing ranked below it is offered past it.`,
|
|
66
89
|
repo,
|
|
67
90
|
)
|
|
68
91
|
}
|
|
69
92
|
|
|
93
|
+
// Whether `text` — what an offer printed on stderr — says the `run:solo` gate held the candidates.
|
|
94
|
+
function is_solo_wait(text: string): boolean {
|
|
95
|
+
return text.includes(HELD_MARK) || text.includes(WAITING_MARK)
|
|
96
|
+
}
|
|
97
|
+
|
|
70
98
|
function first_of(children: ReadonlyArray<EpicChild>, keep: number): SoloSelection {
|
|
71
99
|
return { offered: children.slice(0, keep), withheld: children.slice(keep) }
|
|
72
100
|
}
|
|
@@ -75,6 +103,15 @@ function none_of(children: ReadonlyArray<EpicChild>, notice: string): SoloSelect
|
|
|
75
103
|
return { offered: [], withheld: [...children], notice }
|
|
76
104
|
}
|
|
77
105
|
|
|
106
|
+
// The first `run:solo` candidate, where it sits, and the candidates ranked behind it, which nothing
|
|
107
|
+
// offers past it. `run:board` draws the same reading on its queued rows (joshuafolkken/kit#4294).
|
|
108
|
+
function queue_of(children: ReadonlyArray<EpicChild>): SoloQueue | undefined {
|
|
109
|
+
const index = children.findIndex((child) => is_solo(child))
|
|
110
|
+
const solo = children[index]
|
|
111
|
+
|
|
112
|
+
return solo === undefined ? undefined : { solo, index, behind: children.slice(index + 1) }
|
|
113
|
+
}
|
|
114
|
+
|
|
78
115
|
// Where the first `run:solo` candidate sits decides what starts: everything when there is none, the
|
|
79
116
|
// candidates ahead of it when it is not first, and it alone once it heads an idle repository's ranking.
|
|
80
117
|
function select_candidates(
|
|
@@ -82,14 +119,13 @@ function select_candidates(
|
|
|
82
119
|
read: BusyRead,
|
|
83
120
|
repo: string,
|
|
84
121
|
): SoloSelection {
|
|
85
|
-
const
|
|
86
|
-
const solo = children[index]
|
|
122
|
+
const queue = queue_of(children)
|
|
87
123
|
|
|
88
|
-
if (
|
|
89
|
-
if (index > 0) return first_of(children, index)
|
|
124
|
+
if (queue === undefined) return first_of(children, children.length)
|
|
125
|
+
if (queue.index > 0) return first_of(children, queue.index)
|
|
90
126
|
if (read.kind === 'idle') return first_of(children, 1)
|
|
91
127
|
|
|
92
|
-
return none_of(children, waiting_message(solo.number, repo))
|
|
128
|
+
return none_of(children, waiting_message(queue.solo.number, repo))
|
|
93
129
|
}
|
|
94
130
|
|
|
95
131
|
// An unreadable or truncated listing keeps nothing: without it a running `run:solo` issue cannot be
|
|
@@ -143,7 +179,7 @@ function gate(
|
|
|
143
179
|
: { result: gated, notice: selection.notice }
|
|
144
180
|
}
|
|
145
181
|
|
|
146
|
-
const epic_solo = { gate, is_solo, select }
|
|
182
|
+
const epic_solo = { gate, holder_of, is_solo, is_solo_wait, queue_of, select }
|
|
147
183
|
|
|
148
|
-
export type { SoloGate, SoloSelection, SoloSelector }
|
|
184
|
+
export type { Labelled, SoloGate, SoloQueue, SoloSelection, SoloSelector }
|
|
149
185
|
export { epic_solo }
|
package/scripts/epic/epic.ts
CHANGED
|
@@ -8,11 +8,13 @@
|
|
|
8
8
|
* tsx scripts/epic/epic.ts --add <E> <N1> <N2> ... [--before <M> | --after <M>]
|
|
9
9
|
* [--decision-file <path|->]
|
|
10
10
|
* tsx scripts/epic/epic.ts --remove <E> <M> <N> ... [--decision-file <path|->]
|
|
11
|
+
* tsx scripts/epic/epic.ts --decide <E> <N1> <N2> ... --decision-file <path|->
|
|
11
12
|
*/
|
|
12
13
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
13
14
|
import { error_text } from '#scripts/lib/error-message'
|
|
14
15
|
import { epic_add, type AddChildrenInput } from './epic-add'
|
|
15
16
|
import { epic_cli, type AddArguments, type CrossRepoAddTarget } from './epic-cli'
|
|
17
|
+
import { epic_decide } from './epic-decide'
|
|
16
18
|
import { epic_reconcile } from './epic-reconcile'
|
|
17
19
|
import { epic_remove } from './epic-remove'
|
|
18
20
|
import { epic_run } from './epic-run'
|
|
@@ -26,6 +28,7 @@ const USAGE = [
|
|
|
26
28
|
' josh epic --add <E> <N1> <N2> ... [--order-before <M> | --order-after <M>] [--decision-file <path|->]',
|
|
27
29
|
' josh epic --remove <E> <M> <N> ... [--decision-file <path|->]',
|
|
28
30
|
' josh epic --reconcile <E>',
|
|
31
|
+
' josh epic --decide <E> <N1> <N2> ... --decision-file <path|->',
|
|
29
32
|
].join('\n')
|
|
30
33
|
const FAILURE_EXIT_CODE = 1
|
|
31
34
|
|
|
@@ -134,6 +137,26 @@ async function run_removal(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
134
137
|
})
|
|
135
138
|
}
|
|
136
139
|
|
|
140
|
+
// A decision about children the epic already tracks — the half `--add --decision-file` cannot write,
|
|
141
|
+
// since an insertion with nothing to add is refused.
|
|
142
|
+
async function run_decision(argv: ReadonlyArray<string>): Promise<number> {
|
|
143
|
+
const parsed = epic_cli.parse_decide_arguments(argv)
|
|
144
|
+
|
|
145
|
+
if (parsed === undefined) {
|
|
146
|
+
console.error(
|
|
147
|
+
`✖ An epic number, at least one child issue number, and exactly one readable \`--decision-file\` path (\`-\` reads stdin) are required.\n${USAGE}`,
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
return FAILURE_EXIT_CODE
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return await epic_decide.decide({
|
|
154
|
+
epic_number: parsed.epic_number,
|
|
155
|
+
children: parsed.children,
|
|
156
|
+
decision: epic_cli.read_decision(parsed.decision_path) ?? '',
|
|
157
|
+
})
|
|
158
|
+
}
|
|
159
|
+
|
|
137
160
|
// Reconcile an epic's declaration with its recorded relations. No decision file and no children: the
|
|
138
161
|
// repair reads what the epic already records rather than being told an order.
|
|
139
162
|
async function run_reconciliation(argv: ReadonlyArray<string>): Promise<number> {
|
|
@@ -166,15 +189,26 @@ async function run_creation(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
166
189
|
})
|
|
167
190
|
}
|
|
168
191
|
|
|
169
|
-
|
|
170
|
-
|
|
192
|
+
type EpicForm = readonly [
|
|
193
|
+
(argv: ReadonlyArray<string>) => boolean,
|
|
194
|
+
(argv: ReadonlyArray<string>) => Promise<number>,
|
|
195
|
+
]
|
|
196
|
+
|
|
197
|
+
// Checked in this order. `--add` comes before `--promote`: both name an existing issue first, and only
|
|
198
|
+
// the flag distinguishes "insert into this epic" from "turn this issue into one".
|
|
199
|
+
const FLAGGED_FORMS: ReadonlyArray<EpicForm> = [
|
|
200
|
+
[epic_cli.is_reconciliation, run_reconciliation],
|
|
201
|
+
[epic_cli.is_removal, run_removal],
|
|
202
|
+
[epic_cli.is_decision_entry, run_decision],
|
|
203
|
+
[epic_cli.is_addition, run_addition],
|
|
204
|
+
[epic_cli.is_promotion, run_promotion],
|
|
205
|
+
]
|
|
206
|
+
|
|
171
207
|
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
if (epic_cli.is_addition(argv)) return await run_addition(argv)
|
|
175
|
-
if (epic_cli.is_promotion(argv)) return await run_promotion(argv)
|
|
208
|
+
const form = FLAGGED_FORMS.find(([is_form]) => is_form(argv))
|
|
209
|
+
const run_form = form === undefined ? run_creation : form[1]
|
|
176
210
|
|
|
177
|
-
return await
|
|
211
|
+
return await run_form(argv)
|
|
178
212
|
}
|
|
179
213
|
|
|
180
214
|
async function main(): Promise<void> {
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { doctor_consumer } from '#scripts/doctor/doctor-consumer'
|
|
3
|
+
import { NOTHING_TO_CHECK_MARKER } from '#scripts/test/skip-marker'
|
|
4
|
+
import type { NamespaceMember } from '#tools/exports/namespace-members'
|
|
5
|
+
|
|
6
|
+
const CHECK = 'exports'
|
|
7
|
+
const FAIL_EXIT_CODE = 1
|
|
8
|
+
// A consumer's namespaces are read from `.svelte` files and routes a TypeScript program over its
|
|
9
|
+
// `tsconfig.json` does not see, so every member they use would read as unused. The check is kit's own.
|
|
10
|
+
//
|
|
11
|
+
// **Not a skip notice**. `SKIP_MARKER` means "a check passed without running",
|
|
12
|
+
// and the gate withholds its green record on it — so a consumer, where this notice prints on every
|
|
13
|
+
// run, never got a green record. Out of scope by design is not unverified, so the marker stays out.
|
|
14
|
+
const CONSUMER_NOTICE = `josh ${CHECK}: checks only the kit repository itself — ${NOTHING_TO_CHECK_MARKER} in a consumer project.`
|
|
15
|
+
|
|
16
|
+
function format_member(root: string, member: NamespaceMember): string {
|
|
17
|
+
return `${path.relative(root, member.file)}:${String(member.line)} ${member.namespace}.${member.member}`
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function report(root: string, members: ReadonlyArray<NamespaceMember>): string {
|
|
21
|
+
if (members.length === 0) return `josh ${CHECK}: no unused namespace member`
|
|
22
|
+
|
|
23
|
+
return [
|
|
24
|
+
`josh ${CHECK}: ${String(members.length)} namespace member(s) nothing reads — remove each from its namespace object (and the declaration, if nothing in its file uses it either):`,
|
|
25
|
+
...members.map((member) => ` ${format_member(root, member)}`),
|
|
26
|
+
].join('\n')
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Loaded only past the consumer skip: the scanner pulls in `typescript`, an optional peer a
|
|
30
|
+
// basic-profile consumer may not have, and this check runs in every consumer's gate. For the same
|
|
31
|
+
// reason the scanner is left out of the published package (`package.json` `files`); only this check
|
|
32
|
+
// ships. `files` narrows the scan to the namespaces they declare or import directly; undefined scans
|
|
33
|
+
// the whole program.
|
|
34
|
+
async function find_members(
|
|
35
|
+
root: string,
|
|
36
|
+
files: ReadonlyArray<string> | undefined,
|
|
37
|
+
): Promise<ReadonlyArray<NamespaceMember>> {
|
|
38
|
+
const { unused_members } = await import('#tools/exports/unused-members')
|
|
39
|
+
if (files === undefined) return unused_members.find_unused_members(root)
|
|
40
|
+
|
|
41
|
+
return await unused_members.find_unused_members_in(root, files)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async function run_unused_members(root: string, files?: ReadonlyArray<string>): Promise<number> {
|
|
45
|
+
if (doctor_consumer.is_kit_consumer(root)) {
|
|
46
|
+
console.info(CONSUMER_NOTICE)
|
|
47
|
+
|
|
48
|
+
return 0
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const members = await find_members(root, files)
|
|
52
|
+
const output = report(root, members)
|
|
53
|
+
|
|
54
|
+
if (members.length === 0) console.info(output)
|
|
55
|
+
else console.error(output)
|
|
56
|
+
|
|
57
|
+
return members.length === 0 ? 0 : FAIL_EXIT_CODE
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const unused_members_check = { run_unused_members, CONSUMER_NOTICE }
|
|
61
|
+
|
|
62
|
+
export { unused_members_check }
|