@joshuafolkken/kit 1.1514.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_lint_cli } from './issue-lint-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh issue:lint` entry, kept apart from `issue-lint-cli.ts` because other modules import that
|
|
6
|
+
// one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const PATH_ARGUMENT_INDEX = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = await issue_lint_cli.run(process.argv[PATH_ARGUMENT_INDEX])
|
|
12
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_evidence_exit } from '#scripts/issue/issue-evidence-exit'
|
|
4
|
+
import { issue_measured_close } from '#scripts/issue/issue-measured-close'
|
|
5
|
+
|
|
6
|
+
// `josh issue:measured <N> --evidence-file <path>` — the completion of a measurement-only Issue
|
|
7
|
+
// (`issue-comments.md` → "A measurement-only Issue"): the result comment, the
|
|
8
|
+
// `measured` label, the close and the `run:release`, in that order (`issue-evidence-exit.ts`,
|
|
9
|
+
// `issue-measured-close.ts`). `--unmet` records that the measurement fell short of the expected
|
|
10
|
+
// effect, with the `measured:unmet` label `josh effect:audit` reads.
|
|
11
|
+
|
|
12
|
+
const ARGV_OFFSET = 2
|
|
13
|
+
const UNMET_FLAG = '--unmet'
|
|
14
|
+
|
|
15
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
16
|
+
const exit = argv.includes(UNMET_FLAG)
|
|
17
|
+
? issue_measured_close.MEASURED_UNMET_EXIT
|
|
18
|
+
: issue_measured_close.MEASURED_EXIT
|
|
19
|
+
|
|
20
|
+
return await issue_evidence_exit.run(
|
|
21
|
+
argv.filter((argument) => argument !== UNMET_FLAG),
|
|
22
|
+
exit,
|
|
23
|
+
)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
27
|
+
process.exitCode = await run(argv)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const issue_measured_cli = { run }
|
|
31
|
+
|
|
32
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
33
|
+
|
|
34
|
+
export { issue_measured_cli }
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { epic_close } from '#scripts/epic/epic-close'
|
|
2
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
3
|
+
import { issue_evidence_exit, type EvidenceExit } from '#scripts/issue/issue-evidence-exit'
|
|
4
|
+
import { MEASURED_LABEL, MEASURED_UNMET_LABEL } from '#scripts/issue/issue-labels'
|
|
5
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
6
|
+
|
|
7
|
+
// The writes that complete a measurement-only Issue — the result comment, the `measured` label and
|
|
8
|
+
// the close — shared by `josh issue:measured` and `backlog:drive`'s declared measurement
|
|
9
|
+
// (`backlog-measure-close.ts`), out of the CLI so the drive imports no main guard.
|
|
10
|
+
//
|
|
11
|
+
// **The close is the run's own**: such an Issue changes no code, so no pull request's `closes #N`
|
|
12
|
+
// can close it, and an OPEN child `run:merge` reads as `failed` and parks with `run:stalled`. A
|
|
13
|
+
// CLOSED one it reads as `merged` (`run-merge.ts` → `classify_child`). The label goes on before the
|
|
14
|
+
// close because it is what every sweep — `run:carry --end`, `run:tidy` — tells this close from a
|
|
15
|
+
// person's by (`issue-merged.ts`); a close without it would be one they never count as merged.
|
|
16
|
+
|
|
17
|
+
async function apply_label(issue_number: string, label: string = MEASURED_LABEL): Promise<boolean> {
|
|
18
|
+
const write = await git_gh_command.issue_apply_label(issue_number, label)
|
|
19
|
+
|
|
20
|
+
if (!write.is_applied) console.error(`${label} not applied: ${write.reason}`)
|
|
21
|
+
|
|
22
|
+
return write.is_applied
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// A closed measurement may be its epic's last child, and no `followup` runs for it — so the epic
|
|
26
|
+
// auto-close is run here, through the one entry every child close takes (`epic-close.ts`).
|
|
27
|
+
async function close_issue(issue_number: string): Promise<boolean> {
|
|
28
|
+
const is_closed = await git_gh_command.issue_close(issue_number, undefined)
|
|
29
|
+
|
|
30
|
+
if (is_closed) await epic_close.close_completed_epics({ issue_number, is_merged: true })
|
|
31
|
+
else console.error(`Issue ${session_cite.issue(issue_number)} not closed`)
|
|
32
|
+
|
|
33
|
+
return is_closed
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function label_and_close(issue_number: string): Promise<boolean> {
|
|
37
|
+
return (await apply_label(issue_number)) && (await close_issue(issue_number))
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// A measurement that fell short carries `measured:unmet` too, put on first: the close is the last write.
|
|
41
|
+
async function mark_unmet_and_close(issue_number: string): Promise<boolean> {
|
|
42
|
+
return (
|
|
43
|
+
(await apply_label(issue_number, MEASURED_UNMET_LABEL)) && (await label_and_close(issue_number))
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const COMMAND = 'issue:measured'
|
|
48
|
+
const MEASURED_EXIT: EvidenceExit = { command: COMMAND, finish: label_and_close }
|
|
49
|
+
const MEASURED_UNMET_EXIT: EvidenceExit = { command: COMMAND, finish: mark_unmet_and_close }
|
|
50
|
+
|
|
51
|
+
// The same writes for evidence composed in process, with no hold of its own to release.
|
|
52
|
+
async function close(issue_number: string, evidence: string): Promise<boolean> {
|
|
53
|
+
return await issue_evidence_exit.write({ issue_number, evidence }, MEASURED_EXIT)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const issue_measured_close = { MEASURED_EXIT, MEASURED_UNMET_EXIT, close }
|
|
57
|
+
|
|
58
|
+
export { issue_measured_close }
|
|
@@ -1,5 +1,6 @@
|
|
|
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
|
+
import { MEASURED_LABEL } from '#scripts/issue/issue-labels'
|
|
3
4
|
|
|
4
5
|
// Whether an issue was closed by a merge, read from its REST timeline. The
|
|
5
6
|
// issue's own `state_reason` cannot tell: a pull request's `closes #N` and a person's "Close as
|
|
@@ -8,9 +9,15 @@ import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
|
8
9
|
// pull request. A manual "completed" close still reads as merged when a merged pull request also
|
|
9
10
|
// references the issue — the one case the timeline cannot separate — and every other doubt falls to
|
|
10
11
|
// `false`, because a sweep deletes work on this answer.
|
|
12
|
+
//
|
|
13
|
+
// **A measurement-only issue stands in for the merge with its `measured` label**: it changes no code,
|
|
14
|
+
// so no pull request closes it, and `josh issue:measured` labels it before closing it. A completed
|
|
15
|
+
// close while the label is on is the run's own, so every sweep reading this answer agrees on it.
|
|
11
16
|
|
|
12
17
|
const CLOSED_EVENT = 'closed'
|
|
13
18
|
const REOPENED_EVENT = 'reopened'
|
|
19
|
+
const LABELED_EVENT = 'labeled'
|
|
20
|
+
const UNLABELED_EVENT = 'unlabeled'
|
|
14
21
|
const MERGED_REFERENCE = 'merged-reference'
|
|
15
22
|
// A close by a pull request's `closes #N` carries no reason in the timeline; a person's "Close as
|
|
16
23
|
// completed" carries `completed`. Any other reason — `not_planned`, `duplicate` — is not a merge, and
|
|
@@ -19,13 +26,16 @@ const COMPLETED_REASONS: ReadonlySet<string> = new Set(['', 'completed'])
|
|
|
19
26
|
const FIELD_SEPARATOR = '\t'
|
|
20
27
|
const LINE_SEPARATOR = '\n'
|
|
21
28
|
// One `<event>\t<state_reason>` line per closed/reopened event, and a `merged-reference` line per
|
|
22
|
-
// merged pull request that cross-references the issue
|
|
29
|
+
// merged pull request that cross-references the issue, and a `labeled` / `unlabeled` line per change of
|
|
30
|
+
// the `measured` label — the kinds the answer reads.
|
|
23
31
|
const TIMELINE_FILTER = [
|
|
24
32
|
'.[]',
|
|
25
33
|
'| if .event == "cross-referenced" and .source.issue.pull_request.merged_at != null',
|
|
26
34
|
String.raw`then "${MERGED_REFERENCE}\t"`,
|
|
27
35
|
`elif .event == "${CLOSED_EVENT}" or .event == "${REOPENED_EVENT}"`,
|
|
28
36
|
String.raw`then "\(.event)\t\(.state_reason // "")"`,
|
|
37
|
+
`elif (.event == "${LABELED_EVENT}" or .event == "${UNLABELED_EVENT}") and .label.name == "${MEASURED_LABEL}"`,
|
|
38
|
+
String.raw`then "\(.event)\t"`,
|
|
29
39
|
'else empty end',
|
|
30
40
|
].join(' ')
|
|
31
41
|
|
|
@@ -45,6 +55,13 @@ function parse_rows(raw: string): Array<TimelineRow> {
|
|
|
45
55
|
})
|
|
46
56
|
}
|
|
47
57
|
|
|
58
|
+
// The last `labeled` / `unlabeled` event of the `measured` label is whether it is on now.
|
|
59
|
+
function is_measured(rows: ReadonlyArray<TimelineRow>): boolean {
|
|
60
|
+
const last = rows.findLast((row) => row.event === LABELED_EVENT || row.event === UNLABELED_EVENT)
|
|
61
|
+
|
|
62
|
+
return last?.event === LABELED_EVENT
|
|
63
|
+
}
|
|
64
|
+
|
|
48
65
|
// The last closed/reopened event is the issue's current state, so a reopened issue is not merged
|
|
49
66
|
// even with a merged reference from an earlier attempt.
|
|
50
67
|
function is_merged_close(rows: ReadonlyArray<TimelineRow>): boolean {
|
|
@@ -52,7 +69,7 @@ function is_merged_close(rows: ReadonlyArray<TimelineRow>): boolean {
|
|
|
52
69
|
|
|
53
70
|
if (last?.event !== CLOSED_EVENT || !COMPLETED_REASONS.has(last.reason)) return false
|
|
54
71
|
|
|
55
|
-
return rows.some((row) => row.event === MERGED_REFERENCE)
|
|
72
|
+
return is_measured(rows) || rows.some((row) => row.event === MERGED_REFERENCE)
|
|
56
73
|
}
|
|
57
74
|
|
|
58
75
|
// `undefined` when the timeline could not be read, so a caller that keeps the answer can tell "not
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
2
|
+
import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
|
|
3
|
+
import { epic_issue_schema } from '#scripts/git/git-schemas'
|
|
4
|
+
import { parse_json_array_or_undefined } from '#scripts/git/parse-json-array'
|
|
5
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
6
|
+
import { has_label_name, NOT_BEFORE_LABEL, REPOSITORY_LABELS } from './issue-labels'
|
|
7
|
+
import { issue_not_before } from './issue-not-before'
|
|
8
|
+
import { issue_sample_prime } from './issue-sample-prime'
|
|
9
|
+
import { session_cite } from './session-cite'
|
|
10
|
+
|
|
11
|
+
// joshuafolkken/kit#4079: the body's start-time declaration held an issue back from `backlog:next`,
|
|
12
|
+
// but neither the issue listing nor `run:board` showed it waited on the clock. `not-before` is a copy
|
|
13
|
+
// of that declaration, kept here alone: the body stays the source, and this module is the one place
|
|
14
|
+
// that decides whether the copy is owed.
|
|
15
|
+
|
|
16
|
+
type LabelChange = 'add' | 'remove'
|
|
17
|
+
|
|
18
|
+
// One issue as the listings return it; `labels` may be absent.
|
|
19
|
+
interface LabelledIssue {
|
|
20
|
+
number: number
|
|
21
|
+
body?: string | undefined
|
|
22
|
+
labels?: ReadonlyArray<{ name: string }> | undefined
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const DEFINITION = REPOSITORY_LABELS.find((label) => label.name === NOT_BEFORE_LABEL)
|
|
26
|
+
const NOT_APPLIED = 'the label was not applied'
|
|
27
|
+
const LABELLED_LIMIT = 200
|
|
28
|
+
|
|
29
|
+
function is_waiting(body: string | undefined, now: number): boolean {
|
|
30
|
+
return !issue_not_before.is_due(body, now)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// What the label owes one issue: `add` while the declared time is ahead and the label is absent,
|
|
34
|
+
// `remove` once the time has passed or the declaration is gone, else nothing.
|
|
35
|
+
function change_of(
|
|
36
|
+
body: string | undefined,
|
|
37
|
+
labels: ReadonlyArray<string>,
|
|
38
|
+
now: number = Date.now(),
|
|
39
|
+
): LabelChange | undefined {
|
|
40
|
+
const is_labelled = has_label_name(labels, NOT_BEFORE_LABEL)
|
|
41
|
+
|
|
42
|
+
if (is_waiting(body, now) === is_labelled) return undefined
|
|
43
|
+
|
|
44
|
+
return is_labelled ? 'remove' : 'add'
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// The labels a new issue is filed with — the label added when its body declares a time still ahead.
|
|
48
|
+
function with_label(
|
|
49
|
+
labels: ReadonlyArray<string>,
|
|
50
|
+
body: string,
|
|
51
|
+
now: number = Date.now(),
|
|
52
|
+
): ReadonlyArray<string> {
|
|
53
|
+
return change_of(body, labels, now) === 'add' ? [...labels, NOT_BEFORE_LABEL] : labels
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function changes_of(
|
|
57
|
+
issues: ReadonlyArray<LabelledIssue>,
|
|
58
|
+
now: number,
|
|
59
|
+
): ReadonlyArray<readonly [LabelledIssue, LabelChange]> {
|
|
60
|
+
return issues.flatMap(function change(issue): Array<readonly [LabelledIssue, LabelChange]> {
|
|
61
|
+
const names = (issue.labels ?? []).map((label) => label.name)
|
|
62
|
+
const owed = change_of(issue.body, names, now)
|
|
63
|
+
|
|
64
|
+
return owed === undefined ? [] : [[issue, owed]]
|
|
65
|
+
})
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// The addition answers `false` where the removal throws; both fail here the same way.
|
|
69
|
+
async function write(number: string, owed: LabelChange): Promise<void> {
|
|
70
|
+
if (owed === 'remove') {
|
|
71
|
+
await git_gh_issue_write.issue_remove_label(number, NOT_BEFORE_LABEL)
|
|
72
|
+
|
|
73
|
+
return
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (!(await git_gh_issue_write.issue_add_label(number, NOT_BEFORE_LABEL))) {
|
|
77
|
+
throw new Error(NOT_APPLIED)
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// A failed write is named and left: the next scan owes the same change and makes it then.
|
|
82
|
+
async function apply(issue: LabelledIssue, owed: LabelChange): Promise<void> {
|
|
83
|
+
try {
|
|
84
|
+
await write(String(issue.number), owed)
|
|
85
|
+
} catch (error) {
|
|
86
|
+
const cited = session_cite.issue(issue.number)
|
|
87
|
+
|
|
88
|
+
console.warn(
|
|
89
|
+
`${cited}: could not ${owed} \`${NOT_BEFORE_LABEL}\`: ${error_text.message_of(error)}`,
|
|
90
|
+
)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Brings every issue's label in line with its body. The label is created before the first addition,
|
|
95
|
+
// so it carries its color and description rather than the ones GitHub generates for a missing label.
|
|
96
|
+
async function sync(issues: ReadonlyArray<LabelledIssue>, now: number = Date.now()): Promise<void> {
|
|
97
|
+
const changes = changes_of(issues, now)
|
|
98
|
+
|
|
99
|
+
if (DEFINITION !== undefined && changes.some(([, owed]) => owed === 'add')) {
|
|
100
|
+
await git_gh_issue_write.label_ensure(DEFINITION)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
await Promise.all(
|
|
104
|
+
changes.map(async ([issue, owed]) => {
|
|
105
|
+
await apply(issue, owed)
|
|
106
|
+
}),
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Every open issue already carrying the label. A failed read is an empty list: the next scan reads it
|
|
111
|
+
// again.
|
|
112
|
+
async function read_labelled(): Promise<ReadonlyArray<LabelledIssue>> {
|
|
113
|
+
const { json } = await git_gh_command.issue_list_by_label(NOT_BEFORE_LABEL, LABELLED_LIMIT)
|
|
114
|
+
const rows =
|
|
115
|
+
json === undefined ? undefined : parse_json_array_or_undefined(json, epic_issue_schema)
|
|
116
|
+
|
|
117
|
+
return (rows ?? []).map((row) => ({ ...row, labels: [{ name: NOT_BEFORE_LABEL }] }))
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// `sync` over the scanned issues plus every issue the label is on. `issue:file` labels a filing that
|
|
121
|
+
// may never be scanned — one never opted in — so only the label's own listing reaches it to remove it.
|
|
122
|
+
async function sweep(
|
|
123
|
+
scanned: ReadonlyArray<LabelledIssue>,
|
|
124
|
+
now: number = Date.now(),
|
|
125
|
+
): Promise<void> {
|
|
126
|
+
const seen = new Set(scanned.map((issue) => issue.number))
|
|
127
|
+
const labelled = await read_labelled()
|
|
128
|
+
|
|
129
|
+
await issue_sample_prime.prime(labelled.map((issue) => issue.body))
|
|
130
|
+
await sync([...scanned, ...labelled.filter((issue) => !seen.has(issue.number))], now)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const issue_not_before_label = { change_of, sweep, sync, with_label }
|
|
134
|
+
|
|
135
|
+
export { issue_not_before_label }
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { issue_sample_gate } from './issue-sample-gate'
|
|
2
|
+
import { markdown_section } from './markdown-section'
|
|
3
|
+
|
|
4
|
+
// joshuafolkken/kit#4007: a follow-up measurement filed with `auto-ok` ("measure three days after #N
|
|
5
|
+
// merges") was offered by `backlog:next` the day it was filed, and its lane could only hand the hold
|
|
6
|
+
// back. The body now names the earliest time the work can start, and the pickup holds the issue until
|
|
7
|
+
// then. One UTC spelling only — a date a reader has to guess the zone of is not a deadline.
|
|
8
|
+
// A body may instead wait on samples recorded after a pull request merged (`issue-sample-gate.ts`);
|
|
9
|
+
// this module answers for both, so every reader holds an issue back the same way.
|
|
10
|
+
|
|
11
|
+
const BACKGROUND_HEADING = '## 背景'
|
|
12
|
+
const PREFIX = '- 実施可能日:'
|
|
13
|
+
const DATE_PATTERN = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}Z$/u
|
|
14
|
+
// What `toISOString` writes after the minutes the declaration spells.
|
|
15
|
+
const ISO_TAIL = ':00.000Z'
|
|
16
|
+
// The refusal ends in a line ready to paste (joshuafolkken/kit#5225); a far-future date, so the
|
|
17
|
+
// example never reads as already due.
|
|
18
|
+
const EXAMPLE = `${PREFIX} 2099-01-01T09:00Z`
|
|
19
|
+
const MALFORMED = `\`${PREFIX}\` must be a UTC time written YYYY-MM-DDTHH:MMZ\n${EXAMPLE}`
|
|
20
|
+
const HEADING_MARKS = /^#{1,6}\s+/u
|
|
21
|
+
// joshuafolkken/kit#4438: a start condition written as its own heading is never read — every reader
|
|
22
|
+
// sees only the declaration line under the background heading — so the issue is offered at once.
|
|
23
|
+
const STRAY_HEADINGS = [
|
|
24
|
+
{ name: '実施可能日', declaration: `${PREFIX} YYYY-MM-DDTHH:MMZ` },
|
|
25
|
+
{ name: '実施可能条件', declaration: issue_sample_gate.DECLARATION },
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
// The value after the declaration under the background heading, or `undefined` when the body declares none.
|
|
29
|
+
function declared_value(body: string): string | undefined {
|
|
30
|
+
const background = markdown_section.section_lines(body, BACKGROUND_HEADING).join('\n')
|
|
31
|
+
const line = markdown_section
|
|
32
|
+
.unfenced_lines(background)
|
|
33
|
+
.map((text) => text.trim())
|
|
34
|
+
.find((text) => text.startsWith(PREFIX))
|
|
35
|
+
|
|
36
|
+
return line?.slice(PREFIX.length).trim()
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// The round trip refuses a calendar-impossible value (`2026-02-30T09:30Z`, `T24:00Z`) that
|
|
40
|
+
// `Date.parse` silently rolls over into a different time.
|
|
41
|
+
function is_valid(value: string): boolean {
|
|
42
|
+
if (!DATE_PATTERN.test(value)) return false
|
|
43
|
+
|
|
44
|
+
const time = Date.parse(value)
|
|
45
|
+
|
|
46
|
+
return !Number.isNaN(time) && new Date(time).toISOString() === `${value.slice(0, -1)}${ISO_TAIL}`
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// The declared time, or `undefined` when there is none or it does not parse. A malformed date reads as
|
|
50
|
+
// absent: `issue:file` refuses it, and holding a hand-edited one forever would lose the issue silently.
|
|
51
|
+
function date_of(body = ''): string | undefined {
|
|
52
|
+
const value = declared_value(body)
|
|
53
|
+
|
|
54
|
+
return value !== undefined && is_valid(value) ? value : undefined
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function is_date_due(body: string | undefined, now: number): boolean {
|
|
58
|
+
const date = date_of(body)
|
|
59
|
+
|
|
60
|
+
return date === undefined || Date.parse(date) <= now
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Whether the issue may start: its declared time has arrived and its declared samples are recorded.
|
|
64
|
+
function is_due(body: string | undefined, now: number = Date.now()): boolean {
|
|
65
|
+
return is_date_due(body, now) && issue_sample_gate.wait_of(body) === undefined
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// The declared time as epoch milliseconds while it is still ahead, or `undefined` when it has arrived —
|
|
69
|
+
// for a reader that spells the time its own way (`run:board` in the local zone).
|
|
70
|
+
function waiting_ms(body: string | undefined, now: number = Date.now()): number | undefined {
|
|
71
|
+
if (is_date_due(body, now)) return undefined
|
|
72
|
+
|
|
73
|
+
return Date.parse(String(date_of(body)))
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// The declared time as written while it is still ahead, or `undefined` when it has arrived.
|
|
77
|
+
function waiting_date(body: string | undefined, now: number = Date.now()): string | undefined {
|
|
78
|
+
return is_date_due(body, now) ? undefined : date_of(body)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Why `backlog:next` holds an issue back, or `undefined` when it is due. The caller cites the issue.
|
|
82
|
+
function waiting_reason(body: string | undefined, now: number = Date.now()): string | undefined {
|
|
83
|
+
const date = waiting_date(body, now)
|
|
84
|
+
|
|
85
|
+
if (date !== undefined) return `not before ${date}`
|
|
86
|
+
|
|
87
|
+
const wait = issue_sample_gate.wait_of(body)
|
|
88
|
+
|
|
89
|
+
return wait === undefined ? undefined : issue_sample_gate.reason_of(wait)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function stray_heading_problems(body: string): ReadonlyArray<string> {
|
|
93
|
+
const headings = markdown_section
|
|
94
|
+
.unfenced_lines(body)
|
|
95
|
+
.map((line) => line.trim())
|
|
96
|
+
.filter((line) => HEADING_MARKS.test(line))
|
|
97
|
+
.map((line) => line.replace(HEADING_MARKS, ''))
|
|
98
|
+
|
|
99
|
+
return STRAY_HEADINGS.filter(({ name }) => headings.some((text) => text.startsWith(name))).map(
|
|
100
|
+
({ name, declaration }) =>
|
|
101
|
+
`heading \`${name}\` is not read — declare it under \`${BACKGROUND_HEADING}\` as \`${declaration}\``,
|
|
102
|
+
)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function problems(body: string): ReadonlyArray<string> {
|
|
106
|
+
const value = declared_value(body)
|
|
107
|
+
const date_problems = value === undefined || is_valid(value) ? [] : [MALFORMED]
|
|
108
|
+
|
|
109
|
+
return [...stray_heading_problems(body), ...date_problems, ...issue_sample_gate.problems(body)]
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const issue_not_before = { is_due, problems, waiting_date, waiting_ms, waiting_reason }
|
|
113
|
+
|
|
114
|
+
export { issue_not_before }
|
|
@@ -22,6 +22,20 @@ function require_issue_number(issue: string): void {
|
|
|
22
22
|
if (!is_issue_number(issue)) throw new Error(`${BAD_ISSUE_MESSAGE}${issue}`)
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
// A command whose one positional is the issue it writes to: a missing, malformed or second number
|
|
26
|
+
// answers `undefined`, so the caller refuses the whole call rather than writing to some other issue.
|
|
27
|
+
function single_of(positionals: ReadonlyArray<string>): string | undefined {
|
|
28
|
+
const [issue_number, ...rest] = positionals
|
|
29
|
+
const is_single = rest.length === 0 && issue_number !== undefined
|
|
30
|
+
|
|
31
|
+
return is_single && ISSUE_NUMBER_PATTERN.test(issue_number) ? issue_number : undefined
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const issue_number_shape = {
|
|
35
|
+
ISSUE_NUMBER_PATTERN,
|
|
36
|
+
is_issue_number,
|
|
37
|
+
require_issue_number,
|
|
38
|
+
single_of,
|
|
39
|
+
}
|
|
26
40
|
|
|
27
41
|
export { issue_number_shape }
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
|
|
2
|
+
|
|
3
|
+
// A park on GitHub: the label that keeps an issue from being offered again, and the comment that says
|
|
4
|
+
// why. `run:park` (a lane child's `needs-decision`), `run:merge` and the ship relaunch cap (both
|
|
5
|
+
// `run:stalled`) park the same way, so the pair is written once here (joshuafolkken/kit#4132).
|
|
6
|
+
//
|
|
7
|
+
// **The label goes first and the comment only on it.** The label is what every offer reads; a comment
|
|
8
|
+
// on an issue whose label failed would explain a park that did not happen.
|
|
9
|
+
|
|
10
|
+
interface ParkWrite {
|
|
11
|
+
is_labelled: boolean
|
|
12
|
+
is_commented: boolean
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async function apply(issue: string, label: string, body: string): Promise<ParkWrite> {
|
|
16
|
+
const is_labelled = await git_gh_issue_write.issue_add_label(issue, label)
|
|
17
|
+
|
|
18
|
+
if (!is_labelled) return { is_labelled, is_commented: false }
|
|
19
|
+
|
|
20
|
+
const is_commented = await git_gh_issue_write.issue_try_comment(issue, body)
|
|
21
|
+
|
|
22
|
+
return { is_labelled, is_commented }
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const issue_park = { apply }
|
|
26
|
+
|
|
27
|
+
export type { ParkWrite }
|
|
28
|
+
export { issue_park }
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
|
+
import { issue_body_or_comment } from '#scripts/issue/issue-body-or-comment'
|
|
5
|
+
import { PLANNED_LABEL } from '#scripts/issue/issue-labels'
|
|
6
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
7
|
+
import { plan_consumers_section } from '#scripts/issue/plan-consumers-section'
|
|
8
|
+
import { cli_body } from '#scripts/josh/cli-body'
|
|
9
|
+
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
10
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
11
|
+
|
|
12
|
+
// `josh issue:plan <N> --body-file <path> [--title <title>] [--planned]` — record a plan on an issue
|
|
13
|
+
// in one call: the title normalized, the plan written into a blank body or posted as a comment, and
|
|
14
|
+
// `run:planned` applied.
|
|
15
|
+
//
|
|
16
|
+
// **`kickoff` and `fullrun` spelled those three writes out by hand** — a `gh api -X PATCH` for the
|
|
17
|
+
// title, a second one for a blank body or `issue:comment` otherwise, and a third `gh api` for the
|
|
18
|
+
// label — so the blank-body decision lived in three documents. It now lives in
|
|
19
|
+
// `issue-body-or-comment.ts`, which `followup`'s completion notice shares.
|
|
20
|
+
|
|
21
|
+
const SUCCESS_EXIT_CODE = 0
|
|
22
|
+
const FAILURE_EXIT_CODE = 1
|
|
23
|
+
const ARGV_OFFSET = 2
|
|
24
|
+
const USAGE =
|
|
25
|
+
'Usage: josh issue:plan <issue-number> --body-file <path> [--title <title>] [--planned] [--repo <owner/name>]'
|
|
26
|
+
|
|
27
|
+
interface PlanRequest {
|
|
28
|
+
issue_number: string
|
|
29
|
+
plan: string
|
|
30
|
+
title: string | undefined
|
|
31
|
+
is_planned: boolean
|
|
32
|
+
repo: string | undefined
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const OPTIONS = {
|
|
36
|
+
'body-file': { type: 'string' },
|
|
37
|
+
title: { type: 'string' },
|
|
38
|
+
planned: { type: 'boolean' },
|
|
39
|
+
repo: { type: 'string' },
|
|
40
|
+
} as const
|
|
41
|
+
|
|
42
|
+
// The plan is read last, from the path the flags named; an empty plan refuses like a missing one. A
|
|
43
|
+
// plan without its existing-consumers section throws its refusal, printed as-is like a read failure,
|
|
44
|
+
// before any write (`plan-consumers-section.ts`).
|
|
45
|
+
function with_plan(
|
|
46
|
+
flags: Omit<PlanRequest, 'plan'>,
|
|
47
|
+
file_path: string | undefined,
|
|
48
|
+
): PlanRequest | undefined {
|
|
49
|
+
if (file_path === undefined) return undefined
|
|
50
|
+
const plan = cli_body.read_file_or_stdin(file_path)
|
|
51
|
+
|
|
52
|
+
if (plan.trim().length === 0) return undefined
|
|
53
|
+
const refusal = plan_consumers_section.refusal_of(plan)
|
|
54
|
+
|
|
55
|
+
if (refusal !== undefined) throw new Error(refusal)
|
|
56
|
+
|
|
57
|
+
return { ...flags, plan }
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// An optional string flag, trimmed; given blank it is `''`, which the caller refuses.
|
|
61
|
+
function trimmed(value: string | undefined): string | undefined {
|
|
62
|
+
return value?.trim()
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// A `--title` or `--repo` given blank refuses rather than being dropped: the caller meant to rename
|
|
66
|
+
// the issue, or to address another repository's — a dropped `--repo` would write to this one's.
|
|
67
|
+
function parse_request(argv: ReadonlyArray<string>): PlanRequest | undefined {
|
|
68
|
+
const parsed = cli_flags.arguments_of(argv, OPTIONS)
|
|
69
|
+
|
|
70
|
+
if (parsed === undefined) return undefined
|
|
71
|
+
const issue_number = issue_number_shape.single_of(parsed.positionals)
|
|
72
|
+
const [title, repo] = [trimmed(parsed.values.title), trimmed(parsed.values.repo)]
|
|
73
|
+
|
|
74
|
+
if (issue_number === undefined || [title, repo].includes('')) return undefined
|
|
75
|
+
const is_planned = parsed.values.planned === true
|
|
76
|
+
|
|
77
|
+
return with_plan({ issue_number, title, is_planned, repo }, parsed.values['body-file'])
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// A file-read failure surfaces as an `Error` naming the resolved path, printed as-is; `undefined` is
|
|
81
|
+
// a malformed call, which `USAGE` explains.
|
|
82
|
+
function resolve_request(argv: ReadonlyArray<string>): PlanRequest | undefined {
|
|
83
|
+
try {
|
|
84
|
+
const request = parse_request(argv)
|
|
85
|
+
|
|
86
|
+
if (request === undefined) console.error(USAGE)
|
|
87
|
+
|
|
88
|
+
return request
|
|
89
|
+
} catch (error) {
|
|
90
|
+
console.error(error_text.message_of(error))
|
|
91
|
+
|
|
92
|
+
return undefined
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// The title goes first, so the plan and the label land on an issue already carrying the name the
|
|
97
|
+
// plan was written under; the label goes last, so `run:planned` never marks an issue whose plan
|
|
98
|
+
// failed to post.
|
|
99
|
+
async function apply_planned_label(issue_number: string, repo?: string): Promise<boolean> {
|
|
100
|
+
const is_applied = await git_gh_command.issue_add_label(issue_number, PLANNED_LABEL, repo)
|
|
101
|
+
|
|
102
|
+
if (is_applied) console.info(`label: ${PLANNED_LABEL}`)
|
|
103
|
+
else console.error(`Could not apply ${PLANNED_LABEL} to issue ${issue_number}.`)
|
|
104
|
+
|
|
105
|
+
return is_applied
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// `--repo` addresses every write — the title, the plan and the label — so `kickoff kit#<N>` run from
|
|
109
|
+
// another checkout records the plan on the named repository's issue, never on this one's.
|
|
110
|
+
async function record_plan(request: PlanRequest): Promise<boolean> {
|
|
111
|
+
const { issue_number, title, repo } = request
|
|
112
|
+
|
|
113
|
+
if (title !== undefined) {
|
|
114
|
+
console.info(`title: ${await git_gh_command.issue_edit_title(issue_number, title, repo)}`)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const posted = await issue_body_or_comment.post(issue_number, request.plan, repo)
|
|
118
|
+
|
|
119
|
+
console.info(`${posted.destination}: ${posted.url}`)
|
|
120
|
+
|
|
121
|
+
return request.is_planned ? await apply_planned_label(issue_number, repo) : true
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// A refused write prints as one line, like a file-read failure, rather than escaping as a stack trace.
|
|
125
|
+
async function try_record_plan(request: PlanRequest): Promise<boolean> {
|
|
126
|
+
try {
|
|
127
|
+
return await record_plan(request)
|
|
128
|
+
} catch (error) {
|
|
129
|
+
console.error(error_text.message_of(error))
|
|
130
|
+
|
|
131
|
+
return false
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
136
|
+
const request = resolve_request(argv)
|
|
137
|
+
|
|
138
|
+
if (request === undefined) return FAILURE_EXIT_CODE
|
|
139
|
+
|
|
140
|
+
return (await try_record_plan(request)) ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
144
|
+
process.exitCode = await run(argv)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const issue_plan_cli = { USAGE, run }
|
|
148
|
+
|
|
149
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
150
|
+
|
|
151
|
+
export { issue_plan_cli }
|