@joshuafolkken/kit 1.1471.0 → 1.1784.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/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -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 +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- 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 +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -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 +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- 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 +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- 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/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- 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 +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- 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-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-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -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 +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- 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 +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- 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/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -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 +34 -78
- 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/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- 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 +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -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 +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -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 +111 -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.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- 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 +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- 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 +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- 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 +111 -71
- 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 +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -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 +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- 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 +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- 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 +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- 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/read-file.ts +3 -1
- 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/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.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -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 +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- 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 +18 -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 +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -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 +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -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 +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -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 +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- 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 +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- 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 +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- 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 +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -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 +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- 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 +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -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 +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- 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.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- 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-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- 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 +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- 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.ts +2 -1
- 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 +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- 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 +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- 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 +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -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-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- 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 +3 -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 +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- 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 +15 -0
- package/scripts/split/split-measure.ts +65 -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/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -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 +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- 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 +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- 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/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -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 +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -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-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- 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/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/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,111 @@
|
|
|
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
|
+
const MALFORMED = `\`${PREFIX}\` must be a UTC time written YYYY-MM-DDTHH:MMZ`
|
|
17
|
+
const HEADING_MARKS = /^#{1,6}\s+/u
|
|
18
|
+
// joshuafolkken/kit#4438: a start condition written as its own heading is never read — every reader
|
|
19
|
+
// sees only the declaration line under the background heading — so the issue is offered at once.
|
|
20
|
+
const STRAY_HEADINGS = [
|
|
21
|
+
{ name: '実施可能日', declaration: `${PREFIX} YYYY-MM-DDTHH:MMZ` },
|
|
22
|
+
{ name: '実施可能条件', declaration: issue_sample_gate.DECLARATION },
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
// The value after the declaration under the background heading, or `undefined` when the body declares none.
|
|
26
|
+
function declared_value(body: string): string | undefined {
|
|
27
|
+
const background = markdown_section.section_lines(body, BACKGROUND_HEADING).join('\n')
|
|
28
|
+
const line = markdown_section
|
|
29
|
+
.unfenced_lines(background)
|
|
30
|
+
.map((text) => text.trim())
|
|
31
|
+
.find((text) => text.startsWith(PREFIX))
|
|
32
|
+
|
|
33
|
+
return line?.slice(PREFIX.length).trim()
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// The round trip refuses a calendar-impossible value (`2026-02-30T09:30Z`, `T24:00Z`) that
|
|
37
|
+
// `Date.parse` silently rolls over into a different time.
|
|
38
|
+
function is_valid(value: string): boolean {
|
|
39
|
+
if (!DATE_PATTERN.test(value)) return false
|
|
40
|
+
|
|
41
|
+
const time = Date.parse(value)
|
|
42
|
+
|
|
43
|
+
return !Number.isNaN(time) && new Date(time).toISOString() === `${value.slice(0, -1)}${ISO_TAIL}`
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// The declared time, or `undefined` when there is none or it does not parse. A malformed date reads as
|
|
47
|
+
// absent: `issue:file` refuses it, and holding a hand-edited one forever would lose the issue silently.
|
|
48
|
+
function date_of(body = ''): string | undefined {
|
|
49
|
+
const value = declared_value(body)
|
|
50
|
+
|
|
51
|
+
return value !== undefined && is_valid(value) ? value : undefined
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function is_date_due(body: string | undefined, now: number): boolean {
|
|
55
|
+
const date = date_of(body)
|
|
56
|
+
|
|
57
|
+
return date === undefined || Date.parse(date) <= now
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Whether the issue may start: its declared time has arrived and its declared samples are recorded.
|
|
61
|
+
function is_due(body: string | undefined, now: number = Date.now()): boolean {
|
|
62
|
+
return is_date_due(body, now) && issue_sample_gate.wait_of(body) === undefined
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// The declared time as epoch milliseconds while it is still ahead, or `undefined` when it has arrived —
|
|
66
|
+
// for a reader that spells the time its own way (`run:board` in the local zone).
|
|
67
|
+
function waiting_ms(body: string | undefined, now: number = Date.now()): number | undefined {
|
|
68
|
+
if (is_date_due(body, now)) return undefined
|
|
69
|
+
|
|
70
|
+
return Date.parse(String(date_of(body)))
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// The declared time as written while it is still ahead, or `undefined` when it has arrived.
|
|
74
|
+
function waiting_date(body: string | undefined, now: number = Date.now()): string | undefined {
|
|
75
|
+
return is_date_due(body, now) ? undefined : date_of(body)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Why `backlog:next` holds an issue back, or `undefined` when it is due. The caller cites the issue.
|
|
79
|
+
function waiting_reason(body: string | undefined, now: number = Date.now()): string | undefined {
|
|
80
|
+
const date = waiting_date(body, now)
|
|
81
|
+
|
|
82
|
+
if (date !== undefined) return `not before ${date}`
|
|
83
|
+
|
|
84
|
+
const wait = issue_sample_gate.wait_of(body)
|
|
85
|
+
|
|
86
|
+
return wait === undefined ? undefined : issue_sample_gate.reason_of(wait)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function stray_heading_problems(body: string): ReadonlyArray<string> {
|
|
90
|
+
const headings = markdown_section
|
|
91
|
+
.unfenced_lines(body)
|
|
92
|
+
.map((line) => line.trim())
|
|
93
|
+
.filter((line) => HEADING_MARKS.test(line))
|
|
94
|
+
.map((line) => line.replace(HEADING_MARKS, ''))
|
|
95
|
+
|
|
96
|
+
return STRAY_HEADINGS.filter(({ name }) => headings.some((text) => text.startsWith(name))).map(
|
|
97
|
+
({ name, declaration }) =>
|
|
98
|
+
`heading \`${name}\` is not read — declare it under \`${BACKGROUND_HEADING}\` as \`${declaration}\``,
|
|
99
|
+
)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function problems(body: string): ReadonlyArray<string> {
|
|
103
|
+
const value = declared_value(body)
|
|
104
|
+
const date_problems = value === undefined || is_valid(value) ? [] : [MALFORMED]
|
|
105
|
+
|
|
106
|
+
return [...stray_heading_problems(body), ...date_problems, ...issue_sample_gate.problems(body)]
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const issue_not_before = { is_due, problems, waiting_date, waiting_ms, waiting_reason }
|
|
110
|
+
|
|
111
|
+
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 }
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { expected_effect_lint } from './expected-effect-lint'
|
|
2
|
+
import { has_label_name, PRIORITY_CRITICAL_LABEL, PRIORITY_HIGH_LABEL } from './issue-labels'
|
|
3
|
+
import { markdown_section } from './markdown-section'
|
|
4
|
+
|
|
5
|
+
// joshuafolkken/kit#4383: the priority `josh issue:file` applies, read from the body's one priority
|
|
6
|
+
// declaration under its background heading (`issue-template.md` holds the criteria). An urgent or high
|
|
7
|
+
// declaration must name its basis, so neither label is applied on a bare word. A run-time-shortening
|
|
8
|
+
// Issue's reduction-per-merge line sets a floor — its share of the median lane time per merge — and
|
|
9
|
+
// a declaration below that floor is refused. A priority label the filer typed (`kickoff new critical`)
|
|
10
|
+
// wins: the body is then not judged at all.
|
|
11
|
+
|
|
12
|
+
type PriorityLevel = 'critical' | 'high' | 'normal'
|
|
13
|
+
|
|
14
|
+
interface LevelParser {
|
|
15
|
+
pattern: RegExp
|
|
16
|
+
level: PriorityLevel
|
|
17
|
+
accepts: (basis: string) => boolean
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const BACKGROUND_HEADING = '## 背景'
|
|
21
|
+
const DECLARATION_PREFIX = '- 優先度:'
|
|
22
|
+
const NORMAL_LINE = '- 優先度: 通常'
|
|
23
|
+
const CRITICAL_PATTERN = /^- 優先度: 緊急((?<basis>.*))$/u
|
|
24
|
+
const HIGH_PATTERN = /^- 優先度: 高((?<basis>.*))$/u
|
|
25
|
+
// An interrupt-filing condition number (`wip-cap.md`) or a stated reduction.
|
|
26
|
+
const CRITICAL_BASIS = /条件 ?[1-3]|短縮 ?\d/u
|
|
27
|
+
const PLACEHOLDER = /^<.*>$/u
|
|
28
|
+
const REDUCTION_PREFIX = '- 1 マージあたりの短縮:'
|
|
29
|
+
// A number with its percent sign, half- or full-width, glued to the word before it or not, one space
|
|
30
|
+
// before the sign or none.
|
|
31
|
+
const PERCENT = /(?<![\d.])(?<value>[\d.]+) ?[%%]/gu
|
|
32
|
+
const CRITICAL_PERCENT = 10
|
|
33
|
+
const HIGH_PERCENT = 3
|
|
34
|
+
const LEVELS: ReadonlyArray<PriorityLevel> = ['normal', 'high', 'critical']
|
|
35
|
+
const LABELS: Readonly<Record<PriorityLevel, string | undefined>> = {
|
|
36
|
+
critical: PRIORITY_CRITICAL_LABEL,
|
|
37
|
+
high: PRIORITY_HIGH_LABEL,
|
|
38
|
+
normal: undefined,
|
|
39
|
+
}
|
|
40
|
+
const DECLARATION_PROBLEM = `declare at most one priority under \`${BACKGROUND_HEADING}\`: \`- 優先度: 緊急(条件 <1-3> / 短縮 <値>)\`, \`- 優先度: 高(<根拠>)\` or \`${NORMAL_LINE}\` — an urgent or high one names its basis (\`issue-template.md\`)`
|
|
41
|
+
|
|
42
|
+
const REDUCTION_PROBLEM = `a \`${expected_effect_lint.DECLARATION_LINE}\` Issue states \`${REDUCTION_PREFIX} <分>(レーン中央値 <分> の <%>)\` under \`${expected_effect_lint.HEADING}\` with its percentage filled in (\`issue-template.md\`)`
|
|
43
|
+
|
|
44
|
+
function unfenced_lines(body: string, heading: string): ReadonlyArray<string> {
|
|
45
|
+
const section = markdown_section.section_lines(body, heading).join('\n')
|
|
46
|
+
|
|
47
|
+
return markdown_section.unfenced_lines(section).map((line) => line.trim())
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function has_basis(basis: string): boolean {
|
|
51
|
+
const trimmed = basis.trim()
|
|
52
|
+
|
|
53
|
+
return trimmed.length > 0 && !PLACEHOLDER.test(trimmed)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function has_critical_basis(basis: string): boolean {
|
|
57
|
+
return CRITICAL_BASIS.test(basis)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const PARSERS: ReadonlyArray<LevelParser> = [
|
|
61
|
+
{ pattern: CRITICAL_PATTERN, level: 'critical', accepts: has_critical_basis },
|
|
62
|
+
{ pattern: HIGH_PATTERN, level: 'high', accepts: has_basis },
|
|
63
|
+
]
|
|
64
|
+
|
|
65
|
+
function parsed_level(parser: LevelParser, line: string): PriorityLevel | undefined {
|
|
66
|
+
const basis = parser.pattern.exec(line)?.groups?.['basis'] ?? ''
|
|
67
|
+
|
|
68
|
+
return parser.accepts(basis) ? parser.level : undefined
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// The level one declaration line states, or `undefined` when it is malformed or names no basis.
|
|
72
|
+
function level_of(line: string): PriorityLevel | undefined {
|
|
73
|
+
if (line === NORMAL_LINE) return 'normal'
|
|
74
|
+
const parser = PARSERS.find((entry) => entry.pattern.test(line))
|
|
75
|
+
|
|
76
|
+
return parser === undefined ? undefined : parsed_level(parser, line)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// `normal` when the body declares nothing, `undefined` when it declares more than one line or a bad one.
|
|
80
|
+
function declared_level(body: string): PriorityLevel | undefined {
|
|
81
|
+
const lines = unfenced_lines(body, BACKGROUND_HEADING).filter((line) =>
|
|
82
|
+
line.startsWith(DECLARATION_PREFIX),
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
if (lines.length === 0) return 'normal'
|
|
86
|
+
|
|
87
|
+
return lines.length === 1 ? level_of(lines[0] ?? '') : undefined
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// The share of the median lane time per merge the reduction line states, the last percentage on it.
|
|
91
|
+
function reduction_percent(body: string): number | undefined {
|
|
92
|
+
const line = unfenced_lines(body, expected_effect_lint.HEADING).find((text) =>
|
|
93
|
+
text.startsWith(REDUCTION_PREFIX),
|
|
94
|
+
)
|
|
95
|
+
const values = [...(line ?? '').matchAll(PERCENT)].map((match) => Number(match.groups?.['value']))
|
|
96
|
+
|
|
97
|
+
return values.findLast((value) => Number.isFinite(value))
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// The lowest level a run-time-shortening Issue may declare, from its stated reduction.
|
|
101
|
+
function floor_of(body: string): PriorityLevel {
|
|
102
|
+
const percent = expected_effect_lint.is_target(body) ? reduction_percent(body) : undefined
|
|
103
|
+
|
|
104
|
+
if (percent === undefined || percent < HIGH_PERCENT) return 'normal'
|
|
105
|
+
|
|
106
|
+
return percent >= CRITICAL_PERCENT ? 'critical' : 'high'
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function is_typed(labels: ReadonlyArray<string>): boolean {
|
|
110
|
+
return (
|
|
111
|
+
has_label_name(labels, PRIORITY_CRITICAL_LABEL) || has_label_name(labels, PRIORITY_HIGH_LABEL)
|
|
112
|
+
)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// A run-time-shortening Issue must state its reduction as a percentage, or its floor could not be judged.
|
|
116
|
+
function has_missing_reduction(body: string): boolean {
|
|
117
|
+
return expected_effect_lint.is_target(body) && reduction_percent(body) === undefined
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function floor_problem(body: string, level: PriorityLevel): string | undefined {
|
|
121
|
+
const floor = floor_of(body)
|
|
122
|
+
|
|
123
|
+
if (LEVELS.indexOf(level) >= LEVELS.indexOf(floor)) return undefined
|
|
124
|
+
|
|
125
|
+
return `the stated reduction per merge ranks this Issue \`${floor}\`, above its declared \`${level}\` — declare \`- 優先度: ${floor === 'critical' ? '緊急' : '高'}(短縮 …)\` (\`issue-template.md\`)`
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Why the filing is refused for its priority, or `undefined`. `typed` is the `--label` list.
|
|
129
|
+
function problem(body: string, typed: ReadonlyArray<string>): string | undefined {
|
|
130
|
+
if (is_typed(typed)) return undefined
|
|
131
|
+
const level = declared_level(body)
|
|
132
|
+
|
|
133
|
+
if (level === undefined) return DECLARATION_PROBLEM
|
|
134
|
+
if (has_missing_reduction(body)) return REDUCTION_PROBLEM
|
|
135
|
+
|
|
136
|
+
return floor_problem(body, level)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// The labels a new Issue is filed with — the declared priority's label added unless one was typed.
|
|
140
|
+
function with_label(labels: ReadonlyArray<string>, body: string): ReadonlyArray<string> {
|
|
141
|
+
const label = LABELS[declared_level(body) ?? 'normal']
|
|
142
|
+
|
|
143
|
+
if (label === undefined || is_typed(labels)) return labels
|
|
144
|
+
|
|
145
|
+
return [...labels, label]
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const issue_priority = { declared_level, floor_of, problem, with_label }
|
|
149
|
+
|
|
150
|
+
export type { PriorityLevel }
|
|
151
|
+
export { issue_priority }
|
|
@@ -2,6 +2,7 @@ import {
|
|
|
2
2
|
BUG_LABEL,
|
|
3
3
|
has_label_name,
|
|
4
4
|
INTERRUPT_ROUTE_LABEL,
|
|
5
|
+
PRIORITY_CRITICAL_LABEL,
|
|
5
6
|
PRIORITY_HIGH_LABEL,
|
|
6
7
|
RUN_SOLO_LABEL,
|
|
7
8
|
} from './issue-labels'
|
|
@@ -9,7 +10,7 @@ import {
|
|
|
9
10
|
// The keys that decide which open issue is offered first, defined once for
|
|
10
11
|
// every ranking that asks: the `🗒 Next issues` display, the `auto-ok` pickup and `backlog:next`.
|
|
11
12
|
//
|
|
12
|
-
// In order: `priority:high`, then a defect on the verification path (`bug` with `run:solo`, or
|
|
13
|
+
// In order: `priority:critical`, then `priority:high`, then a defect on the verification path (`bug` with `run:solo`, or
|
|
13
14
|
// `route:interrupt`), then how many other open issues wait on it. Below those, the caller's own order
|
|
14
15
|
// stands — the sort is stable, so recency and the defect-rate adjustment survive as the last key.
|
|
15
16
|
//
|
|
@@ -35,6 +36,10 @@ function flag(is_set: boolean): number {
|
|
|
35
36
|
return is_set ? 1 : 0
|
|
36
37
|
}
|
|
37
38
|
|
|
39
|
+
function is_critical(labels: ReadonlyArray<string>): boolean {
|
|
40
|
+
return has_label_name(labels, PRIORITY_CRITICAL_LABEL)
|
|
41
|
+
}
|
|
42
|
+
|
|
38
43
|
function is_priority(labels: ReadonlyArray<string>): boolean {
|
|
39
44
|
return has_label_name(labels, PRIORITY_HIGH_LABEL)
|
|
40
45
|
}
|
|
@@ -48,6 +53,7 @@ function is_verification_defect(labels: ReadonlyArray<string>): boolean {
|
|
|
48
53
|
// Negated so that the larger value sorts first under an ascending comparison.
|
|
49
54
|
function keys_of(row: RankRow): ReadonlyArray<number> {
|
|
50
55
|
return [
|
|
56
|
+
-flag(is_critical(row.labels)),
|
|
51
57
|
-flag(is_priority(row.labels)),
|
|
52
58
|
-flag(is_verification_defect(row.labels)),
|
|
53
59
|
-row.dependents,
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
2
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
5
3
|
import { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
@@ -27,7 +25,6 @@ import { issue_report_failures, type ReadFailureKind } from './issue-report-fail
|
|
|
27
25
|
// wins, and a comment nobody read cannot win anything.
|
|
28
26
|
|
|
29
27
|
const FAILURE_EXIT_CODE = 1
|
|
30
|
-
const ARGV_OFFSET = 2
|
|
31
28
|
const USAGE = 'Usage: josh issue:read <issue-number> [<issue-number> ...]'
|
|
32
29
|
const BLOCK_SEPARATOR = '\n\n---\n\n'
|
|
33
30
|
// The same bound `issue:state` puts on its batch read, for the same reason: every read is a `gh`
|
|
@@ -82,7 +79,9 @@ async function read_issue(issue_number: string): Promise<NumberResult> {
|
|
|
82
79
|
|
|
83
80
|
if (fields === undefined) return { kind: 'unreadable' }
|
|
84
81
|
|
|
85
|
-
|
|
82
|
+
const comments = await issue_read.parse_comments(comments_json)
|
|
83
|
+
|
|
84
|
+
return { kind: 'issue', content: { fields, comments } }
|
|
86
85
|
}
|
|
87
86
|
|
|
88
87
|
// One issue's block for a caller that wants the text rather than the printing — `run:prep` composes it
|
|
@@ -134,10 +133,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
134
133
|
return issue_report_failures.report_failures(reports, FAILURE_TERMS)
|
|
135
134
|
}
|
|
136
135
|
|
|
137
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
138
|
-
process.exitCode = await run(argv)
|
|
139
|
-
}
|
|
140
|
-
|
|
141
136
|
const issue_read_cli = {
|
|
142
137
|
USAGE,
|
|
143
138
|
parse_numbers,
|
|
@@ -145,7 +140,5 @@ const issue_read_cli = {
|
|
|
145
140
|
run,
|
|
146
141
|
}
|
|
147
142
|
|
|
148
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
149
|
-
|
|
150
143
|
export type { BlockRead }
|
|
151
144
|
export { issue_read_cli }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_read_cli } from './issue-read-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh issue:read` entry, kept apart from `issue-read-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 ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = await issue_read_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { gh_author_association } from '#scripts/gh/gh-author-association'
|
|
1
2
|
import { parse_json_object_or_undefined, read_json_listing } from '#scripts/git/parse-json-array'
|
|
2
3
|
import { z } from 'zod'
|
|
3
4
|
|
|
@@ -30,6 +31,10 @@ const COMMENT_SEPARATOR = '\n\n'
|
|
|
30
31
|
const SECTION_SEPARATOR = '\n\n'
|
|
31
32
|
const COMMENT_HEADING = 'comment by '
|
|
32
33
|
const AT = ' at '
|
|
34
|
+
// **A comment from an author without write access is shown but never read** (joshuafolkken/kit#4021):
|
|
35
|
+
// on a public repository anyone can comment, and `issue-comments.md` takes the later text as the
|
|
36
|
+
// agreement in force, so a third party's comment printed whole would be an instruction to the run.
|
|
37
|
+
const UNTRUSTED_COMMENT = `(body withheld — the author is not ${gh_author_association.TRUSTED_LIST}, so it is not an instruction)`
|
|
33
38
|
|
|
34
39
|
const issue_fields_schema = z.looseObject({
|
|
35
40
|
title: z.string(),
|
|
@@ -41,6 +46,7 @@ const comment_schema = z.looseObject({
|
|
|
41
46
|
user: z.looseObject({ login: z.string() }).optional(),
|
|
42
47
|
created_at: z.string().optional(),
|
|
43
48
|
body: z.string().optional(),
|
|
49
|
+
author_association: z.string().nullish(),
|
|
44
50
|
})
|
|
45
51
|
|
|
46
52
|
interface IssueFields {
|
|
@@ -53,6 +59,7 @@ interface IssueComment {
|
|
|
53
59
|
author: string
|
|
54
60
|
created_at: string
|
|
55
61
|
body: string
|
|
62
|
+
is_trusted: boolean
|
|
56
63
|
}
|
|
57
64
|
|
|
58
65
|
const UNKNOWN_AUTHOR = '(unknown)'
|
|
@@ -74,11 +81,17 @@ function parse_issue_fields(json: string): IssueFields | undefined {
|
|
|
74
81
|
}
|
|
75
82
|
}
|
|
76
83
|
|
|
77
|
-
function to_comment(raw: z.infer<typeof comment_schema>): IssueComment {
|
|
84
|
+
async function to_comment(raw: z.infer<typeof comment_schema>): Promise<IssueComment> {
|
|
85
|
+
const login = raw.user?.login
|
|
86
|
+
|
|
78
87
|
return {
|
|
79
|
-
author:
|
|
88
|
+
author: login ?? UNKNOWN_AUTHOR,
|
|
80
89
|
created_at: raw.created_at ?? UNKNOWN_TIME,
|
|
81
90
|
body: raw.body ?? '',
|
|
91
|
+
is_trusted: await gh_author_association.is_trusted({
|
|
92
|
+
login,
|
|
93
|
+
association: raw.author_association,
|
|
94
|
+
}),
|
|
82
95
|
}
|
|
83
96
|
}
|
|
84
97
|
|
|
@@ -91,18 +104,27 @@ function to_comment(raw: z.infer<typeof comment_schema>): IssueComment {
|
|
|
91
104
|
// outcomes it already tells apart; a `JSON.parse` plus `safeParse` pair here would be the clone
|
|
92
105
|
// `CLAUDE.md` prohibits, on the one endpoint two modules would then parse two ways. All three collapse
|
|
93
106
|
// to `undefined` here, because the block above draws only one distinction: read, or not read.
|
|
94
|
-
function parse_comments(
|
|
107
|
+
async function parse_comments(
|
|
108
|
+
json: string | undefined,
|
|
109
|
+
): Promise<ReadonlyArray<IssueComment> | undefined> {
|
|
95
110
|
if (json === undefined) return undefined
|
|
96
111
|
|
|
97
112
|
const listing = read_json_listing(json, comment_schema)
|
|
98
113
|
|
|
99
|
-
|
|
114
|
+
if (listing.kind !== 'read') return undefined
|
|
115
|
+
|
|
116
|
+
return await Promise.all(listing.rows.map(async (row) => await to_comment(row)))
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// The bodies a caller may act on — the comments of authors with write access, in order.
|
|
120
|
+
function trusted_bodies(comments: ReadonlyArray<IssueComment>): ReadonlyArray<string> {
|
|
121
|
+
return comments.filter((comment) => comment.is_trusted).map((comment) => comment.body)
|
|
100
122
|
}
|
|
101
123
|
|
|
102
124
|
function format_comment(comment: IssueComment): string {
|
|
103
125
|
const heading = `${COMMENT_HEADING}${comment.author}${AT}${comment.created_at}`
|
|
104
126
|
|
|
105
|
-
return `${heading}\n${comment.body}`
|
|
127
|
+
return `${heading}\n${comment.is_trusted ? comment.body : UNTRUSTED_COMMENT}`
|
|
106
128
|
}
|
|
107
129
|
|
|
108
130
|
function format_comments(comments: ReadonlyArray<IssueComment> | undefined): string {
|
|
@@ -133,9 +155,11 @@ const issue_read = {
|
|
|
133
155
|
NO_COMMENTS,
|
|
134
156
|
COMMENTS_UNREADABLE,
|
|
135
157
|
COMMENT_HEADING,
|
|
158
|
+
UNTRUSTED_COMMENT,
|
|
136
159
|
format_issue,
|
|
137
160
|
parse_comments,
|
|
138
161
|
parse_issue_fields,
|
|
162
|
+
trusted_bodies,
|
|
139
163
|
}
|
|
140
164
|
|
|
141
165
|
export type { IssueComment, IssueFields }
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
2
|
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
5
3
|
import { git_gh_issue_list, MAX_SCANNED } from '#scripts/gh/git-gh-issue-list'
|
|
@@ -27,7 +25,6 @@ import { session_cite } from './session-cite'
|
|
|
27
25
|
|
|
28
26
|
const SUCCESS_EXIT_CODE = 0
|
|
29
27
|
const FAILURE_EXIT_CODE = 1
|
|
30
|
-
const ARGV_OFFSET = 2
|
|
31
28
|
const USAGE = 'Usage: josh issue:release <issue-number> [--wait]'
|
|
32
29
|
const NONE = 'none'
|
|
33
30
|
const UNKNOWN_REPO_MESSAGE =
|
|
@@ -199,13 +196,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
199
196
|
return (await record(request, current)) ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
|
|
200
197
|
}
|
|
201
198
|
|
|
202
|
-
// `process.exitCode` rather than `process.exit()`, so the report on standard output drains first.
|
|
203
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
204
|
-
process.exitCode = await run(argv)
|
|
205
|
-
}
|
|
206
|
-
|
|
207
199
|
const issue_release_cli = { find_open, link, run }
|
|
208
200
|
|
|
209
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
210
|
-
|
|
211
201
|
export { issue_release_cli, NONE }
|