@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
package/scripts/epic/epic-cli.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { session_cite } from '#scripts/issue/session-cite'
|
|
|
3
3
|
import { cli_body } from '#scripts/josh/cli-body'
|
|
4
4
|
import type { InsertKind, InsertPosition } from './epic-chains'
|
|
5
5
|
import { epic_cli_argv, type EpicArgv, type FormFlags } from './epic-cli-argv'
|
|
6
|
+
import { epic_cli_decide } from './epic-cli-decide'
|
|
6
7
|
import { epic_cli_remove } from './epic-cli-remove'
|
|
7
8
|
import { epic_parse, type ExternalChild } from './epic-parse'
|
|
8
9
|
|
|
@@ -64,17 +65,6 @@ interface PromoteArguments {
|
|
|
64
65
|
origin?: string | undefined
|
|
65
66
|
}
|
|
66
67
|
|
|
67
|
-
// Deduplicated because a repeated number would render a duplicate task-list row, and with
|
|
68
|
-
// `--ordered` would ask GitHub to make an issue block itself.
|
|
69
|
-
function to_child_numbers(raw_children: ReadonlyArray<string>): Array<number> {
|
|
70
|
-
const numbers = raw_children
|
|
71
|
-
.filter((raw) => issue_number_shape.is_issue_number(raw))
|
|
72
|
-
.map(Number)
|
|
73
|
-
.filter((value) => Number.isSafeInteger(value))
|
|
74
|
-
|
|
75
|
-
return [...new Set(numbers)]
|
|
76
|
-
}
|
|
77
|
-
|
|
78
68
|
// The flags a creation and a promotion share, read the same way for both.
|
|
79
69
|
function read_batch_flags(
|
|
80
70
|
parsed: EpicArgv,
|
|
@@ -90,7 +80,7 @@ function to_create_arguments(parsed: EpicArgv): CreateArguments | undefined {
|
|
|
90
80
|
const [title, ...raw_children] = parsed.positionals
|
|
91
81
|
if (title === undefined || title.length === 0) return undefined
|
|
92
82
|
|
|
93
|
-
const children = to_child_numbers(raw_children)
|
|
83
|
+
const children = epic_cli_argv.to_child_numbers(raw_children)
|
|
94
84
|
if (children.length === 0) return undefined
|
|
95
85
|
|
|
96
86
|
return { title, children, ...read_batch_flags(parsed) }
|
|
@@ -134,17 +124,9 @@ function parse_reconcile_arguments(argv: ReadonlyArray<string>): ReconcileArgume
|
|
|
134
124
|
// positional is a child. Refused when the epic would also be listed as its own child, which would
|
|
135
125
|
// have it block itself under `--ordered`.
|
|
136
126
|
function to_promote_arguments(parsed: EpicArgv): PromoteArguments | undefined {
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
if (raw_epic === undefined || !issue_number_shape.ISSUE_NUMBER_PATTERN.test(raw_epic)) {
|
|
140
|
-
return undefined
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const epic_number = Number(raw_epic)
|
|
144
|
-
const children = to_child_numbers(raw_children).filter((child) => child !== epic_number)
|
|
145
|
-
if (children.length === 0) return undefined
|
|
127
|
+
const subject = epic_cli_argv.read_epic_children(parsed)
|
|
146
128
|
|
|
147
|
-
return {
|
|
129
|
+
return subject === undefined ? undefined : { ...subject, ...read_batch_flags(parsed) }
|
|
148
130
|
}
|
|
149
131
|
|
|
150
132
|
function parse_promote_arguments(argv: ReadonlyArray<string>): PromoteArguments | undefined {
|
|
@@ -250,23 +232,8 @@ function is_decision_path_unusable(argv: ReadonlyArray<string>): boolean {
|
|
|
250
232
|
return is_value_unusable(argv, DECISION_FLAG)
|
|
251
233
|
}
|
|
252
234
|
|
|
253
|
-
function read_add_subject(
|
|
254
|
-
parsed: EpicArgv,
|
|
255
|
-
): { epic_number: number; children: Array<number> } | undefined {
|
|
256
|
-
const [raw_epic, ...raw_children] = parsed.positionals
|
|
257
|
-
|
|
258
|
-
if (raw_epic === undefined || !issue_number_shape.ISSUE_NUMBER_PATTERN.test(raw_epic)) {
|
|
259
|
-
return undefined
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
const epic_number = Number(raw_epic)
|
|
263
|
-
const children = to_child_numbers(raw_children).filter((child) => child !== epic_number)
|
|
264
|
-
|
|
265
|
-
return children.length === 0 ? undefined : { epic_number, children }
|
|
266
|
-
}
|
|
267
|
-
|
|
268
235
|
function to_add_arguments(parsed: EpicArgv): AddArguments | undefined {
|
|
269
|
-
const subject =
|
|
236
|
+
const subject = epic_cli_argv.read_epic_children(parsed)
|
|
270
237
|
if (subject === undefined) return undefined
|
|
271
238
|
const outcome = parse_position(parsed)
|
|
272
239
|
if (outcome.is_refused) return undefined
|
|
@@ -394,6 +361,7 @@ const epic_cli = {
|
|
|
394
361
|
is_addition,
|
|
395
362
|
is_reconciliation,
|
|
396
363
|
...epic_cli_remove,
|
|
364
|
+
...epic_cli_decide,
|
|
397
365
|
find_cross_repo_add_target,
|
|
398
366
|
is_decision_path_unusable,
|
|
399
367
|
resolve_local_add,
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
epic_child_schema,
|
|
4
|
+
epic_issue_schema,
|
|
5
|
+
type EpicChildData,
|
|
6
|
+
type EpicIssueData,
|
|
7
|
+
} from '#scripts/git/git-schemas'
|
|
3
8
|
import { cutoff_cause, cutoff_of, type ScanCutoff } from '#scripts/git/listing-cutoff'
|
|
4
9
|
import {
|
|
5
10
|
parse_json_array_or_undefined,
|
|
@@ -37,6 +42,7 @@ interface EpicIssue {
|
|
|
37
42
|
children: Array<number>
|
|
38
43
|
external_children: Array<ExternalChild>
|
|
39
44
|
has_declared_order: boolean
|
|
45
|
+
is_reopened: boolean
|
|
40
46
|
}
|
|
41
47
|
|
|
42
48
|
interface SiblingState {
|
|
@@ -44,8 +50,12 @@ interface SiblingState {
|
|
|
44
50
|
has_blocked_by: boolean
|
|
45
51
|
}
|
|
46
52
|
|
|
47
|
-
|
|
53
|
+
// GitHub's `state_reason` for an open issue that was closed once and reopened.
|
|
54
|
+
const REOPENED = 'reopened'
|
|
55
|
+
|
|
56
|
+
function to_epic_issue(raw: EpicIssueData): EpicIssue {
|
|
48
57
|
return {
|
|
58
|
+
is_reopened: raw.stateReason === REOPENED,
|
|
49
59
|
number: raw.number,
|
|
50
60
|
children: epic_parse.parse_task_list_issue_numbers(raw.body),
|
|
51
61
|
external_children: epic_parse.parse_external_task_list_children(raw.body),
|
|
@@ -98,30 +108,32 @@ function to_sibling_state(raw_json: string | undefined): SiblingState {
|
|
|
98
108
|
}
|
|
99
109
|
}
|
|
100
110
|
|
|
101
|
-
|
|
102
|
-
return to_sibling_state(await git_gh_command.issue_get_state_and_relations(String(sibling), repo))
|
|
103
|
-
}
|
|
111
|
+
type ChildRead = SiblingState & { is_readable: boolean }
|
|
104
112
|
|
|
105
|
-
// A
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
113
|
+
// A same-repository child carries no `repo`; a cross-repository one names it.
|
|
114
|
+
type ChildReference = Omit<ExternalChild, 'repo'> & { repo?: string | undefined }
|
|
115
|
+
|
|
116
|
+
// A child read by number, naming its repository in the REST path when it lives in another one.
|
|
117
|
+
// `is_readable` is what decides whether the epic may close at all: closing while a child's state is
|
|
118
|
+
// unknown is exactly what the refusal prevents. A failed read is told apart from an open child
|
|
119
|
+
// rather than read as one, which left a finished epic open with nothing in the output (#4560). A
|
|
120
|
+
// read whose answer carries no state is a failed read too.
|
|
121
|
+
async function inspect_child(child: ChildReference): Promise<ChildRead> {
|
|
111
122
|
const raw = await git_gh_command.issue_get_state_and_relations(String(child.number), child.repo)
|
|
112
123
|
|
|
113
|
-
return { ...to_sibling_state(raw), is_readable: raw !== undefined }
|
|
124
|
+
return { ...to_sibling_state(raw), is_readable: parse_child(raw)?.state !== undefined }
|
|
114
125
|
}
|
|
115
126
|
|
|
116
127
|
// The merged Issue is excluded rather than queried: GitHub applies `closes #N` asynchronously, so
|
|
117
128
|
// reading its state immediately after the merge races with that propagation.
|
|
118
|
-
async function
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
)
|
|
122
|
-
const siblings = epic.children.filter((child) => child !== merged_number)
|
|
129
|
+
async function inspect_children(epic: EpicIssue, merged_number: number): Promise<Array<ChildRead>> {
|
|
130
|
+
const siblings: Array<ChildReference> = epic.children
|
|
131
|
+
.filter((child) => child !== merged_number)
|
|
132
|
+
.map((number) => ({ number }))
|
|
123
133
|
|
|
124
|
-
return await Promise.all(
|
|
134
|
+
return await Promise.all(
|
|
135
|
+
[...siblings, ...epic.external_children].map(async (child) => await inspect_child(child)),
|
|
136
|
+
)
|
|
125
137
|
}
|
|
126
138
|
|
|
127
139
|
// `pnpm josh epic --ordered` and `--add` record the declared chain themselves, through the REST
|
|
@@ -165,9 +177,8 @@ const CASCADE_DEPTH_NOTE = `⚠️ Epic auto-close cascade reached its ${String
|
|
|
165
177
|
|
|
166
178
|
// **An unreadable comment listing does not stop the close.** It is announced and closed exactly as
|
|
167
179
|
// it was before the duplicate check existed, because refusing here would strand the epic: nothing
|
|
168
|
-
// re-triggers the auto-close
|
|
169
|
-
//
|
|
170
|
-
// would leave a finished epic open until somebody noticed.
|
|
180
|
+
// re-triggers the auto-close until some later child close sweeps the open epics, and that close may
|
|
181
|
+
// never come. One rate-limited read would leave a finished epic open until somebody noticed.
|
|
171
182
|
//
|
|
172
183
|
// The direction is chosen on what each mistake costs, and they are not symmetric. Announcing twice
|
|
173
184
|
// costs one redundant comment and nothing else, because the epic *closes* — which is what ends a loop
|
|
@@ -209,38 +220,26 @@ async function close_epic(epic: EpicIssue): Promise<boolean> {
|
|
|
209
220
|
return await close_epic_with(epic_number, comment)
|
|
210
221
|
}
|
|
211
222
|
|
|
212
|
-
// The
|
|
213
|
-
//
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
): Promise<{ states: Array<SiblingState>; is_complete: boolean }> {
|
|
217
|
-
if (epic.external_children.length === 0) return { states: [], is_complete: true }
|
|
218
|
-
const results = await Promise.all(
|
|
219
|
-
epic.external_children.map(async (child) => await inspect_external(child)),
|
|
220
|
-
)
|
|
223
|
+
// The manual-close request is made only when every child that was read is closed: while one is still
|
|
224
|
+
// open the batch is unfinished anyway, and asking for a manual close would invite closing it early.
|
|
225
|
+
function warn_when_unread_blocks_close(epic: EpicIssue, states: ReadonlyArray<ChildRead>): void {
|
|
226
|
+
if (states.some((state) => state.is_readable && !state.is_closed)) return
|
|
221
227
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
has_blocked_by: result.has_blocked_by,
|
|
226
|
-
})),
|
|
227
|
-
is_complete: results.every((result) => result.is_readable),
|
|
228
|
-
}
|
|
228
|
+
console.info(
|
|
229
|
+
`⚠️ Epic ${session_cite.issue(epic.number)} has a child whose state could not be read; ${CLOSE_MANUALLY}`,
|
|
230
|
+
)
|
|
229
231
|
}
|
|
230
232
|
|
|
233
|
+
// An epic with a child whose state is unknown is left open for manual closing, and says so.
|
|
231
234
|
async function close_epic_when_complete(epic: EpicIssue, merged_number: number): Promise<boolean> {
|
|
232
|
-
const
|
|
235
|
+
const states = await inspect_children(epic, merged_number)
|
|
233
236
|
|
|
234
|
-
if (!
|
|
235
|
-
|
|
236
|
-
`ℹ️ Epic ${session_cite.issue(epic.number)} has a child in another repository whose state could not be read; ${CLOSE_MANUALLY}`,
|
|
237
|
-
)
|
|
237
|
+
if (states.some((state) => !state.is_readable)) {
|
|
238
|
+
warn_when_unread_blocks_close(epic, states)
|
|
238
239
|
|
|
239
240
|
return false
|
|
240
241
|
}
|
|
241
242
|
|
|
242
|
-
const states = [...(await inspect_siblings(epic, merged_number)), ...external.states]
|
|
243
|
-
|
|
244
243
|
warn_when_order_unrecorded(epic, states)
|
|
245
244
|
|
|
246
245
|
if (states.some((state) => !state.is_closed)) return false
|
|
@@ -315,22 +314,74 @@ async function close_next_level(
|
|
|
315
314
|
return next
|
|
316
315
|
}
|
|
317
316
|
|
|
318
|
-
// Breadth-first up the nesting:
|
|
319
|
-
//
|
|
320
|
-
async function
|
|
317
|
+
// Breadth-first up the nesting: each closed epic becomes the next level's completed child, so a
|
|
318
|
+
// fully-finished parent closes in the same pass. `false` when the depth cap stopped the walk.
|
|
319
|
+
async function cascade_from(
|
|
321
320
|
open_epics: ReadonlyArray<EpicIssue>,
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
let frontier
|
|
321
|
+
start: ReadonlyArray<number>,
|
|
322
|
+
evaluated: Set<number>,
|
|
323
|
+
): Promise<boolean> {
|
|
324
|
+
let frontier = start
|
|
326
325
|
|
|
327
326
|
for (let depth = 0; depth < MAX_CASCADE_DEPTH; depth++) {
|
|
328
|
-
if (frontier.length === 0) return
|
|
327
|
+
if (frontier.length === 0) return true
|
|
329
328
|
// eslint-disable-next-line no-await-in-loop -- the cascade closes one level before reading the next
|
|
330
329
|
frontier = await close_next_level(open_epics, frontier, evaluated)
|
|
331
330
|
}
|
|
332
331
|
|
|
333
332
|
if (frontier.length > 0) console.info(CASCADE_DEPTH_NOTE)
|
|
333
|
+
|
|
334
|
+
return frontier.length === 0
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// An epic listing no child has nothing to be complete: with no state to read, the completion check
|
|
338
|
+
// would close it — a prose epic, or one whose task list is not written yet.
|
|
339
|
+
function tracks_children(epic: EpicIssue): boolean {
|
|
340
|
+
return epic.children.length + epic.external_children.length > 0
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Every open epic the cascade did not reach, closed when each child is: an epic whose last child
|
|
344
|
+
// closed outside every josh path — an `already-done` child `run:merge` parked and a person closed by
|
|
345
|
+
// hand (#4564) — is found by the next close of any child. An epic is marked evaluated only once it
|
|
346
|
+
// closes, so a parent read before its child epic closed here is evaluated again by that cascade.
|
|
347
|
+
//
|
|
348
|
+
// A reopened epic is left out: a person reopening a finished epic has said it is not done, and only
|
|
349
|
+
// a close of one of its own children — the cascade above — may close it again.
|
|
350
|
+
function is_sweep_target(epic: EpicIssue, evaluated: ReadonlySet<number>): boolean {
|
|
351
|
+
return !evaluated.has(epic.number) && !epic.is_reopened && tracks_children(epic)
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
async function sweep_unreached(
|
|
355
|
+
open_epics: ReadonlyArray<EpicIssue>,
|
|
356
|
+
merged_number: number,
|
|
357
|
+
evaluated: Set<number>,
|
|
358
|
+
): Promise<Array<number>> {
|
|
359
|
+
const closed: Array<number> = []
|
|
360
|
+
const unreached = open_epics.filter((epic) => is_sweep_target(epic, evaluated))
|
|
361
|
+
|
|
362
|
+
for (const epic of unreached) {
|
|
363
|
+
// eslint-disable-next-line no-await-in-loop -- a closed epic joins the evaluated set the cascade reads
|
|
364
|
+
if (await close_epic_isolated(epic, merged_number)) closed.push(epic.number)
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
for (const number of closed) evaluated.add(number)
|
|
368
|
+
|
|
369
|
+
return closed
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// Level 0 closes the epics holding the merged issue; the sweep then closes any other finished epic.
|
|
373
|
+
// A cascade stopped at the depth cap asks for a manual close, so the sweep does not run past it.
|
|
374
|
+
async function cascade_close(
|
|
375
|
+
open_epics: ReadonlyArray<EpicIssue>,
|
|
376
|
+
merged_number: number,
|
|
377
|
+
): Promise<void> {
|
|
378
|
+
const evaluated = new Set<number>()
|
|
379
|
+
|
|
380
|
+
if (!(await cascade_from(open_epics, [merged_number], evaluated))) return
|
|
381
|
+
|
|
382
|
+
const swept = await sweep_unreached(open_epics, merged_number, evaluated)
|
|
383
|
+
|
|
384
|
+
await cascade_from(open_epics, swept, evaluated)
|
|
334
385
|
}
|
|
335
386
|
|
|
336
387
|
const UNREADABLE_EPIC_LIST_MESSAGE =
|
|
@@ -363,9 +414,15 @@ async function resolve_and_close_safely(merged_number: number): Promise<void> {
|
|
|
363
414
|
/**
|
|
364
415
|
* Close every open epic whose task list is fully complete once `issue_number` closed.
|
|
365
416
|
*
|
|
366
|
-
*
|
|
367
|
-
*
|
|
368
|
-
*
|
|
417
|
+
* **The one entry every child close goes through** (#4560): `followup` after its merge,
|
|
418
|
+
* `josh issue:measured` after its own close, and `run:merge` for every child it counts as merged —
|
|
419
|
+
* which also catches a merge GitHub left OPEN. Running it
|
|
420
|
+
* twice for one child is harmless: a closed epic is no longer in the open listing. Every other open
|
|
421
|
+
* epic is swept too, so one whose last child closed outside these paths closes here (#4564).
|
|
422
|
+
*
|
|
423
|
+
* Requires `is_merged` — the child is known closed: the linked Issue is treated as closed without
|
|
424
|
+
* being queried. On a `--no-merge` run that Issue is still open, so skipping this guard would close
|
|
425
|
+
* an epic whose batch is not finished.
|
|
369
426
|
*/
|
|
370
427
|
async function close_completed_epics(input: {
|
|
371
428
|
issue_number: string | undefined
|
|
@@ -2,6 +2,7 @@ import { repo_map_logic } from '#scripts/discovery/repo-map-logic'
|
|
|
2
2
|
import { repo_origin } from '#scripts/discovery/repo-origin'
|
|
3
3
|
import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
|
|
4
4
|
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
5
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
5
6
|
import { GH_API_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
6
7
|
import { propagate_publish } from '#scripts/propagate/propagate-publish'
|
|
7
8
|
import { derive_versions_endpoint } from '#scripts/version/version-command-config'
|
|
@@ -209,14 +210,10 @@ function to_answer(repo: string, fields: ManifestFields): ManifestAnswer {
|
|
|
209
210
|
}
|
|
210
211
|
|
|
211
212
|
function to_manifest(repo: string, stdout: string): ManifestAnswer {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
if (typeof parsed !== 'object' || parsed === null) return { kind: 'unreadable' }
|
|
213
|
+
const parsed = json_value.parse_or_undefined(stdout.trim())
|
|
214
|
+
if (typeof parsed !== 'object' || parsed === null) return { kind: 'unreadable' }
|
|
215
215
|
|
|
216
|
-
|
|
217
|
-
} catch {
|
|
218
|
-
return { kind: 'unreadable' }
|
|
219
|
-
}
|
|
216
|
+
return to_answer(repo, parsed)
|
|
220
217
|
}
|
|
221
218
|
|
|
222
219
|
// Why the read failed, asked only when it did. The status line is the protocol rather than prose, so
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
import { NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
|
|
3
|
+
import { issue_read } from '#scripts/issue/issue-read'
|
|
4
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
5
|
+
import { epic_decision } from './epic-decision'
|
|
6
|
+
import { epic_parse } from './epic-parse'
|
|
7
|
+
import { epic_read } from './epic-read'
|
|
8
|
+
import type { EpicSubject } from './epic-validate'
|
|
9
|
+
|
|
10
|
+
// `josh epic --decide <E> <N...> --decision-file <path|->` — record a decision about children the epic
|
|
11
|
+
// already tracks: the epic's `## Decisions` entry, a comment on each child, and each child's
|
|
12
|
+
// `needs-decision` label removed. The text is the caller's; placing it is this command's.
|
|
13
|
+
//
|
|
14
|
+
// **A rerun writes nothing twice.** The entry and each comment are looked for before they are
|
|
15
|
+
// written, so a run that stopped half way is finished by running it again.
|
|
16
|
+
|
|
17
|
+
const SUCCESS_EXIT_CODE = 0
|
|
18
|
+
const FAILURE_EXIT_CODE = 1
|
|
19
|
+
|
|
20
|
+
interface DecideInput {
|
|
21
|
+
epic_number: number
|
|
22
|
+
children: ReadonlyArray<number>
|
|
23
|
+
decision: string
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function format_list(numbers: ReadonlyArray<number>): string {
|
|
27
|
+
return numbers.map((issue_number) => session_cite.issue(issue_number)).join(', ')
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// A child the epic does not track is refused before anything is written: placing it is `--add`'s,
|
|
31
|
+
// which records the same decision in the same call.
|
|
32
|
+
function untracked_error(epic_number: number, untracked: ReadonlyArray<number>): string {
|
|
33
|
+
return `${format_list(untracked)} not tracked by ${session_cite.issue(epic_number)}; place it with \`pnpm josh epic --add ${String(epic_number)} <N> --decision-file <path>\`. Nothing was written.`
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// The epic the decision goes to, or why nothing is written: a record `append_decision` would refuse
|
|
37
|
+
// (checked before any read), an unreadable epic, or a child it does not track.
|
|
38
|
+
async function read_decision_target(input: DecideInput): Promise<EpicSubject | { error: string }> {
|
|
39
|
+
const record_error = epic_decision.find_decision_error(input.decision)
|
|
40
|
+
if (record_error !== undefined) return { error: record_error }
|
|
41
|
+
const subject = await epic_read.read_subject(input.epic_number)
|
|
42
|
+
|
|
43
|
+
if (subject === undefined) {
|
|
44
|
+
return { error: `Could not read issue ${session_cite.issue(input.epic_number)}.` }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const tracked = epic_parse.parse_task_list_issue_numbers(subject.body)
|
|
48
|
+
const untracked = input.children.filter((child) => !tracked.includes(child))
|
|
49
|
+
|
|
50
|
+
return untracked.length === 0 ? subject : { error: untracked_error(input.epic_number, untracked) }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function record_on_epic(subject: EpicSubject, decision: string): Promise<string> {
|
|
54
|
+
const epic = session_cite.issue(subject.number)
|
|
55
|
+
|
|
56
|
+
if (epic_decision.has_decision(subject.body, decision)) {
|
|
57
|
+
return `📝 ${epic} already records this decision.`
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const body = epic_decision.append_decision(subject.body ?? '', decision)
|
|
61
|
+
|
|
62
|
+
await git_gh_command.issue_edit_body(String(subject.number), body)
|
|
63
|
+
|
|
64
|
+
return `📝 Decision recorded in ${epic}'s \`## Decisions\`.`
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// `undefined` when the comments could not be read: posting then risks the duplicate this exists to
|
|
68
|
+
// prevent, so the child is reported as not recorded and a rerun finishes it.
|
|
69
|
+
async function has_comment(child: number, decision: string): Promise<boolean | undefined> {
|
|
70
|
+
const comments = await issue_read.parse_comments(
|
|
71
|
+
await git_gh_command.issue_list_comments(String(child)),
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
return comments?.some((comment) => comment.body.trim() === decision.trim())
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The label goes only once the child carries the record, so a failed comment leaves it parked.
|
|
78
|
+
async function record_on_child(child: number, decision: string): Promise<boolean> {
|
|
79
|
+
const has_record = await has_comment(child, decision)
|
|
80
|
+
if (has_record === undefined) return false
|
|
81
|
+
const is_commented =
|
|
82
|
+
has_record || (await git_gh_command.issue_try_comment(String(child), decision))
|
|
83
|
+
if (!is_commented) return false
|
|
84
|
+
|
|
85
|
+
return await git_gh_command.issue_clear_label(String(child), NEEDS_DECISION_LABEL)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function format_child_report(total: number, failures: number): string {
|
|
89
|
+
if (failures === 0) return epic_decision.format_decision_report({ total, failures })
|
|
90
|
+
|
|
91
|
+
return `⚠️ ${String(failures)} of ${String(total)} child issue(s) could not be given the comment or lose \`${NEEDS_DECISION_LABEL}\`; rerun the same command — nothing is written twice.`
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async function decide(input: DecideInput): Promise<number> {
|
|
95
|
+
const epic = await read_decision_target(input)
|
|
96
|
+
|
|
97
|
+
if ('error' in epic) {
|
|
98
|
+
console.error(`✖ ${epic.error}`)
|
|
99
|
+
|
|
100
|
+
return FAILURE_EXIT_CODE
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
console.info(await record_on_epic(epic, input.decision))
|
|
104
|
+
const recorded = await Promise.all(
|
|
105
|
+
input.children.map(async (child) => await record_on_child(child, input.decision)),
|
|
106
|
+
)
|
|
107
|
+
const failures = recorded.filter((is_recorded) => !is_recorded).length
|
|
108
|
+
|
|
109
|
+
console.info(format_child_report(input.children.length, failures))
|
|
110
|
+
|
|
111
|
+
return failures === 0 ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const epic_decide = {
|
|
115
|
+
decide,
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export { epic_decide }
|
|
119
|
+
export type { DecideInput }
|
|
@@ -153,8 +153,17 @@ function read_recorded_reasons(body: string | undefined): string {
|
|
|
153
153
|
].join('\n')
|
|
154
154
|
}
|
|
155
155
|
|
|
156
|
+
// Whether `## Decisions` already carries this record, compared as `append_decision` writes it — so a
|
|
157
|
+
// rerun of `epic --decide` after a partial failure appends nothing a second time.
|
|
158
|
+
function has_decision(body: string | undefined, record: string): boolean {
|
|
159
|
+
if (body === undefined) return false
|
|
160
|
+
|
|
161
|
+
return read_section(body, DECISIONS_HEADING_PATTERN).includes(record.trimEnd())
|
|
162
|
+
}
|
|
163
|
+
|
|
156
164
|
const epic_decision = {
|
|
157
165
|
append_decision,
|
|
166
|
+
has_decision,
|
|
158
167
|
append_replacements,
|
|
159
168
|
read_recorded_reasons,
|
|
160
169
|
find_decision_error,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
2
|
import type { IssueReadFailure } from '#scripts/gh/git-gh-issue-read'
|
|
3
|
+
import { issue_sample_prime } from '#scripts/issue/issue-sample-prime'
|
|
3
4
|
import { epic_cross_repo } from './epic-cross-repo'
|
|
4
5
|
import type { EpicChild, IssueReference } from './epic-graph'
|
|
5
6
|
import { epic_issue, type EpicIssue } from './epic-issue'
|
|
@@ -21,6 +22,9 @@ function to_child(parsed: EpicIssue, repo: string): EpicChild {
|
|
|
21
22
|
state: epic_issue.normalize_state(parsed.state),
|
|
22
23
|
labels: epic_issue.label_names(parsed),
|
|
23
24
|
blocked_by: epic_issue.blocker_references_of(parsed, repo),
|
|
25
|
+
body: parsed.body,
|
|
26
|
+
author_association: parsed.author_association,
|
|
27
|
+
user: parsed.user,
|
|
24
28
|
}
|
|
25
29
|
}
|
|
26
30
|
|
|
@@ -132,6 +136,8 @@ async function fetch_child_read(
|
|
|
132
136
|
|
|
133
137
|
const parsed = epic_issue.parse_epic_issue(read.json)
|
|
134
138
|
|
|
139
|
+
await issue_sample_prime.prime([parsed?.body])
|
|
140
|
+
|
|
135
141
|
return { child: parsed === undefined ? undefined : to_child(parsed, repo), is_unreachable: false }
|
|
136
142
|
}
|
|
137
143
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { AuthorFields } from '#scripts/gh/gh-author-association'
|
|
1
2
|
import type { DependencyLink } from './epic-parse'
|
|
2
3
|
import {
|
|
3
4
|
format_dependency_link,
|
|
@@ -23,12 +24,18 @@ import {
|
|
|
23
24
|
// exist, `blocker_categories` dropped it, and the child ran as though nothing blocked it. It also
|
|
24
25
|
// made `epic_cross_repo.resolve_cross_repo`'s cross-repository branch unreachable: every blocker
|
|
25
26
|
// arrived carrying the blocked child's repository, so `blocker.repo === blocked.repo` always held.
|
|
26
|
-
|
|
27
|
+
//
|
|
28
|
+
// The author fields (`AuthorFields`) are read only by `backlog:next`, which offers a child only when
|
|
29
|
+
// its author has write access (joshuafolkken/kit#4633); absent on rows built without a read.
|
|
30
|
+
interface EpicChild extends AuthorFields {
|
|
27
31
|
number: number
|
|
28
32
|
repo: string
|
|
29
33
|
state: 'OPEN' | 'CLOSED'
|
|
30
34
|
labels: ReadonlyArray<string>
|
|
31
35
|
blocked_by: ReadonlyArray<IssueReference>
|
|
36
|
+
// Read to hold a child until its declared start time and to rank it by its causing-lane minutes;
|
|
37
|
+
// absent on rows built without a read.
|
|
38
|
+
body?: string | undefined
|
|
32
39
|
}
|
|
33
40
|
|
|
34
41
|
// What is wrong with the graph. Both stop the run — neither is something to pick a winner for.
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { git_gh_issue_rest } from '#scripts/gh/git-gh-issue-rest'
|
|
2
|
-
import { blocked_by_schema } from '#scripts/git/git-schemas'
|
|
2
|
+
import { author_fields_schema, blocked_by_schema } from '#scripts/git/git-schemas'
|
|
3
3
|
import { parse_json_object_or_undefined } from '#scripts/git/parse-json-array'
|
|
4
4
|
import { z } from 'zod'
|
|
5
|
+
import { REPOSITORY_SEGMENT_SOURCE } from './epic-parse'
|
|
5
6
|
import type { IssueReference } from './epic-reference'
|
|
6
7
|
|
|
7
8
|
// The shapes one issue is read as, and the argument every epic command takes.
|
|
@@ -35,6 +36,8 @@ const epic_issue_schema = z.object({
|
|
|
35
36
|
url: z.string().default(''),
|
|
36
37
|
labels: z.array(label_schema).default([]),
|
|
37
38
|
blockedBy: blocked_by_schema,
|
|
39
|
+
// Who filed the issue, for `backlog:next`'s author-trust check (joshuafolkken/kit#4633).
|
|
40
|
+
...author_fields_schema,
|
|
38
41
|
})
|
|
39
42
|
|
|
40
43
|
type EpicIssue = z.infer<typeof epic_issue_schema>
|
|
@@ -116,7 +119,10 @@ interface EpicReference {
|
|
|
116
119
|
number: number
|
|
117
120
|
}
|
|
118
121
|
|
|
119
|
-
const QUALIFIED_REFERENCE =
|
|
122
|
+
const QUALIFIED_REFERENCE = new RegExp(
|
|
123
|
+
String.raw`^(${REPOSITORY_SEGMENT_SOURCE}\/${REPOSITORY_SEGMENT_SOURCE})#(\d+)$`,
|
|
124
|
+
'u',
|
|
125
|
+
)
|
|
120
126
|
const QUALIFIED_REPO_GROUP = 1
|
|
121
127
|
const QUALIFIED_NUMBER_GROUP = 2
|
|
122
128
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
|
|
2
2
|
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
3
3
|
import { IN_PROGRESS_LABEL } from '#scripts/issue/issue-labels'
|
|
4
|
+
import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
|
|
4
5
|
|
|
5
6
|
// How long each lane holder has carried `in-progress`. The stale-label rule
|
|
6
7
|
// in `backlogrun-progress.md` is applied by age, and until this read the age was a hand-written
|
|
@@ -12,7 +13,6 @@ import { IN_PROGRESS_LABEL } from '#scripts/issue/issue-labels'
|
|
|
12
13
|
|
|
13
14
|
// Matches the `Stale \`in-progress\`` row of the table in `backlogrun-progress.md`.
|
|
14
15
|
const STALE_MINUTES = 90
|
|
15
|
-
const MS_PER_MINUTE = 60_000
|
|
16
16
|
const TIMELINE_PAGE = 100
|
|
17
17
|
|
|
18
18
|
const LABELED_FILTER = `.[] | select(.event == "labeled" and (.label.name | ascii_downcase) == "${IN_PROGRESS_LABEL}") | .created_at`
|