@joshuafolkken/kit 1.1514.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 +5 -5
- 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 +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- 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 +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -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 +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -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 +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- 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-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- 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 +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- 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 +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- 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 +2 -3
- 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 +53 -6
- 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 +30 -7
- 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 +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 +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 +112 -30
- 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 +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- 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 +8 -6
- 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/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 +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 +19 -66
- 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 +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- 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 +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- 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 +27 -24
- 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-write.ts +67 -29
- 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/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 +2 -2
- package/scripts/git/main-merge.ts +25 -9
- 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 +0 -8
- 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 +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -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/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 +1 -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 +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- 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 +2 -10
- 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 +0 -11
- 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/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 +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- 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 +157 -158
- 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 +25 -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 +103 -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 +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- 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 +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- 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 +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- 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 +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- 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-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 +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- 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 +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- 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 +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- 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 +11 -2
- 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 +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -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 +2 -6
- 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 +2 -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.ts +1 -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 +81 -15
- 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 +8 -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 +80 -2
- 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 +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -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 +9 -1
- 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/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- 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 +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- 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 -32
- 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 +118 -38
- package/scripts/run/board/run-board-header.ts +82 -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 +116 -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 +239 -60
- 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 +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- 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 -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 +207 -265
- 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 +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- 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-handoff.ts +2 -2
- 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 +6 -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 +34 -8
- 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 +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- 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 +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- 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 +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- 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.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 +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- 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 +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- 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 +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- 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-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- 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 +25 -1
- 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 +42 -24
- 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 +61 -149
- 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 +97 -10
- 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 +4 -1
- 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-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-CDY4NFQG.js +0 -15
- 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-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-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/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/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_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 }
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_release_cli } from './issue-release-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh issue:release` entry, kept apart from `issue-release-cli.ts` because other modules import
|
|
6
|
+
// that one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186). `process.exitCode` rather than `process.exit()`, so the report on standard
|
|
8
|
+
// output drains first.
|
|
9
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
10
|
+
const ARGV_OFFSET = 2
|
|
11
|
+
|
|
12
|
+
process.exitCode = await issue_release_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
13
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
2
|
+
import { RELEASE_LABEL } from './issue-labels'
|
|
2
3
|
|
|
3
4
|
// The decisions behind `josh issue:release`, kept apart from the command
|
|
4
5
|
// that reads the network so each is a pure answer a test can pin. An Issue whose change reaches a
|
|
@@ -20,14 +21,9 @@ function is_listing_row(value: unknown): value is ListingRow {
|
|
|
20
21
|
// release Issue at a time; were a person to open a second, the oldest is the one the next release
|
|
21
22
|
// closes, so it is the one every new blocker joins.
|
|
22
23
|
function open_release_of(json: string): number | undefined {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return rows.length === 0 ? undefined : Math.min(...rows.map((row) => row.number))
|
|
28
|
-
} catch {
|
|
29
|
-
return undefined
|
|
30
|
-
}
|
|
24
|
+
const rows = (json_value.parse_array(json) ?? []).filter((row) => is_listing_row(row))
|
|
25
|
+
|
|
26
|
+
return rows.length === 0 ? undefined : Math.min(...rows.map((row) => row.number))
|
|
31
27
|
}
|
|
32
28
|
|
|
33
29
|
function title_of(repo: string): string {
|
|
@@ -51,9 +47,8 @@ function body_of(repo: string): string {
|
|
|
51
47
|
].join('\n')
|
|
52
48
|
}
|
|
53
49
|
|
|
54
|
-
// The release label
|
|
55
|
-
|
|
56
|
-
const RELEASE_LABELS: ReadonlyArray<string> = [RELEASE_LABEL, DEPTH_0_LABEL]
|
|
50
|
+
// The release label alone — never `auto-ok`.
|
|
51
|
+
const RELEASE_LABELS: ReadonlyArray<string> = [RELEASE_LABEL]
|
|
57
52
|
|
|
58
53
|
const issue_release = { RELEASE_LABELS, open_release_of, title_of, body_of }
|
|
59
54
|
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { read_pull } from '#scripts/gh/git-gh-pr-read'
|
|
2
|
+
import { git_closes_keyword } from '#scripts/git/git-closes-keyword'
|
|
3
|
+
import { lane_ledger } from '#scripts/lane/lane-ledger'
|
|
4
|
+
import { issue_cite } from './issue-cite'
|
|
5
|
+
import { markdown_section } from './markdown-section'
|
|
6
|
+
|
|
7
|
+
// joshuafolkken/kit#4414: a follow-up measurement waits on samples, not on the calendar — a busy day
|
|
8
|
+
// collects enough merges before a dated start time, a quiet one not even after it. The body names the
|
|
9
|
+
// pull request whose effect it measures and how many merges the lane ledger must record after that
|
|
10
|
+
// pull request merged; the pickup holds the issue until then. The pull request's own merge is not a
|
|
11
|
+
// sample: `run:merge` records it, keyed by the issue it closes, after GitHub stamps `merged_at`.
|
|
12
|
+
//
|
|
13
|
+
// The readers that hold an issue back are synchronous and see only the body, so the one network fact
|
|
14
|
+
// the wait needs — when the pull request merged — is read ahead by `prime`, once per pull request per
|
|
15
|
+
// process, wherever bodies first arrive. A body nobody primed reads as waiting: offering it early is
|
|
16
|
+
// the defect this guards, and the next primed read releases it.
|
|
17
|
+
|
|
18
|
+
const BACKGROUND_HEADING = '## 背景'
|
|
19
|
+
const PREFIX = '- 実施可能条件:'
|
|
20
|
+
const CONDITION_PATTERN = /^#(?<pr>[1-9]\d*) のマージ後 (?<count>[1-9]\d*) マージ$/u
|
|
21
|
+
const VALUE_FORMAT = '#<PR> のマージ後 <K> マージ'
|
|
22
|
+
const DECLARATION = `${PREFIX} ${VALUE_FORMAT}`
|
|
23
|
+
const MALFORMED = `\`${PREFIX}\` must read \`${VALUE_FORMAT}\` with K at least 1`
|
|
24
|
+
|
|
25
|
+
interface Condition {
|
|
26
|
+
pr: number
|
|
27
|
+
count: number
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
type SampleWait =
|
|
31
|
+
| { kind: 'unread'; pr: number }
|
|
32
|
+
| { kind: 'unmerged'; pr: number }
|
|
33
|
+
| { kind: 'short'; pr: number; counted: number; needed: number }
|
|
34
|
+
|
|
35
|
+
// One pull request as read: `merged_at` absent is one found unmerged, read again as it may merge since.
|
|
36
|
+
// `closes` is the issue its body closes, whose ledger merge is the pull request's own.
|
|
37
|
+
interface PullRead {
|
|
38
|
+
merged_at: string | undefined
|
|
39
|
+
closes: number | undefined
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface PrimePorts {
|
|
43
|
+
pull: (pr: number) => Promise<PullRead>
|
|
44
|
+
ledger_path: () => Promise<string | undefined>
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
interface LedgerState {
|
|
48
|
+
path: string | undefined
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// A pull request with no entry was never read.
|
|
52
|
+
|
|
53
|
+
const pull_by_number = new Map<number, PullRead>()
|
|
54
|
+
const ledger: LedgerState = { path: undefined }
|
|
55
|
+
|
|
56
|
+
function declared_value(body: string): string | undefined {
|
|
57
|
+
const background = markdown_section.section_lines(body, BACKGROUND_HEADING).join('\n')
|
|
58
|
+
const line = markdown_section
|
|
59
|
+
.unfenced_lines(background)
|
|
60
|
+
.map((text) => text.trim())
|
|
61
|
+
.find((text) => text.startsWith(PREFIX))
|
|
62
|
+
|
|
63
|
+
return line?.slice(PREFIX.length).trim()
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// The declared condition, or `undefined` when there is none or it does not parse — a malformed one is
|
|
67
|
+
// refused by `issue:lint`, and holding a hand-edited one forever would lose the issue silently.
|
|
68
|
+
function condition_of(body = ''): Condition | undefined {
|
|
69
|
+
const groups = CONDITION_PATTERN.exec(declared_value(body) ?? '')?.groups
|
|
70
|
+
|
|
71
|
+
if (groups === undefined) return undefined
|
|
72
|
+
|
|
73
|
+
return { pr: Number(groups['pr']), count: Number(groups['count']) }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// The number the declared condition cites, or `undefined` when there is none or it does not parse.
|
|
77
|
+
function cited_number(body: string): number | undefined {
|
|
78
|
+
return condition_of(body)?.pr
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function problems(body: string): ReadonlyArray<string> {
|
|
82
|
+
const value = declared_value(body)
|
|
83
|
+
|
|
84
|
+
return value === undefined || CONDITION_PATTERN.test(value) ? [] : [MALFORMED]
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async function read_source(pr: number): Promise<PullRead> {
|
|
88
|
+
const pull = await read_pull(pr)
|
|
89
|
+
const closes = git_closes_keyword.parse_closes_issue_number(pull.body ?? undefined)
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
merged_at: pull.merged_at ?? undefined,
|
|
93
|
+
closes: closes === undefined ? undefined : Number(closes),
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const DEFAULT_PORTS: PrimePorts = { pull: read_source, ledger_path: lane_ledger.target }
|
|
98
|
+
|
|
99
|
+
// A failed read stays unread, so the next prime asks again.
|
|
100
|
+
async function remember(pr: number, ports: PrimePorts): Promise<void> {
|
|
101
|
+
try {
|
|
102
|
+
pull_by_number.set(pr, await ports.pull(pr))
|
|
103
|
+
} catch {
|
|
104
|
+
pull_by_number.delete(pr)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function is_merge_known(pr: number): boolean {
|
|
109
|
+
return pull_by_number.get(pr)?.merged_at !== undefined
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Reads ahead what the bodies' conditions need. Nothing is read for bodies that declare none.
|
|
113
|
+
async function prime(
|
|
114
|
+
bodies: ReadonlyArray<string | undefined>,
|
|
115
|
+
ports: PrimePorts = DEFAULT_PORTS,
|
|
116
|
+
): Promise<void> {
|
|
117
|
+
const unread = bodies
|
|
118
|
+
.map((body) => condition_of(body)?.pr)
|
|
119
|
+
.filter((pr): pr is number => pr !== undefined && !is_merge_known(pr))
|
|
120
|
+
|
|
121
|
+
if (unread.length === 0) return
|
|
122
|
+
|
|
123
|
+
ledger.path = await ports.ledger_path()
|
|
124
|
+
await Promise.all(
|
|
125
|
+
[...new Set(unread)].map(async (pr) => {
|
|
126
|
+
await remember(pr, ports)
|
|
127
|
+
}),
|
|
128
|
+
)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function merges_after({ merged_at, closes }: PullRead & { merged_at: string }): number {
|
|
132
|
+
if (ledger.path === undefined) return 0
|
|
133
|
+
|
|
134
|
+
const since = Date.parse(merged_at)
|
|
135
|
+
|
|
136
|
+
return lane_ledger
|
|
137
|
+
.read_entries(ledger.path)
|
|
138
|
+
.filter(
|
|
139
|
+
(entry) =>
|
|
140
|
+
entry.kind === lane_ledger.KIND.MERGE &&
|
|
141
|
+
entry.issue !== closes &&
|
|
142
|
+
Date.parse(entry.at) > since,
|
|
143
|
+
).length
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// What the body still waits on, or `undefined` when it declares nothing or has its samples.
|
|
147
|
+
function wait_of(body?: string): SampleWait | undefined {
|
|
148
|
+
const condition = condition_of(body)
|
|
149
|
+
|
|
150
|
+
if (condition === undefined) return undefined
|
|
151
|
+
|
|
152
|
+
const { pr, count } = condition
|
|
153
|
+
const pull = pull_by_number.get(pr)
|
|
154
|
+
|
|
155
|
+
if (pull === undefined) return { kind: 'unread', pr }
|
|
156
|
+
|
|
157
|
+
const { merged_at, closes } = pull
|
|
158
|
+
|
|
159
|
+
if (merged_at === undefined) return { kind: 'unmerged', pr }
|
|
160
|
+
|
|
161
|
+
const counted = merges_after({ merged_at, closes })
|
|
162
|
+
|
|
163
|
+
return counted >= count ? undefined : { kind: 'short', pr, counted, needed: count }
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Why the body waits, for a reader that cites the issue itself.
|
|
167
|
+
function reason_of(wait: SampleWait): string {
|
|
168
|
+
const pr = issue_cite.plain(wait.pr)
|
|
169
|
+
|
|
170
|
+
if (wait.kind === 'unread') return `until the merge of ${pr} is read`
|
|
171
|
+
if (wait.kind === 'unmerged') return `until ${pr} merges`
|
|
172
|
+
|
|
173
|
+
return `${String(wait.counted)}/${String(wait.needed)} merges after ${pr}`
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function reset(): void {
|
|
177
|
+
pull_by_number.clear()
|
|
178
|
+
ledger.path = undefined
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const issue_sample_gate = {
|
|
182
|
+
DECLARATION,
|
|
183
|
+
cited_number,
|
|
184
|
+
prime,
|
|
185
|
+
problems,
|
|
186
|
+
reason_of,
|
|
187
|
+
reset,
|
|
188
|
+
wait_of,
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export type { PrimePorts, SampleWait }
|
|
192
|
+
export { issue_sample_gate }
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
|
|
2
|
+
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
3
|
+
import { git_gh_issue_rest } from '#scripts/gh/git-gh-issue-rest'
|
|
4
|
+
import { issue_closing_pr } from './issue-closing-pr'
|
|
5
|
+
import { issue_sample_gate } from './issue-sample-gate'
|
|
6
|
+
import { session_cite } from './session-cite'
|
|
7
|
+
|
|
8
|
+
// joshuafolkken/kit#4460: the start condition cites the pull request whose merge it waits on. An issue
|
|
9
|
+
// number passes the format check, then reads as a pull request that is never found, so the issue waits
|
|
10
|
+
// forever. The filing reads what the number names and refuses an issue, citing the merged pull request
|
|
11
|
+
// that closed it when there is one. An unreadable number passes — an outage is no reason to stop.
|
|
12
|
+
//
|
|
13
|
+
// `repo` is the filing's target, `undefined` for this checkout. The closing pull request is looked up
|
|
14
|
+
// only here: `issue_closing_pr` reads this checkout's timeline, so a foreign target gets the plain hint.
|
|
15
|
+
|
|
16
|
+
interface SourcePorts {
|
|
17
|
+
is_pull: (number: number, repo: string | undefined) => Promise<boolean | undefined>
|
|
18
|
+
closing_pr: (issue: number) => Promise<string | undefined>
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async function read_is_pull(
|
|
22
|
+
number: number,
|
|
23
|
+
repo: string | undefined,
|
|
24
|
+
): Promise<boolean | undefined> {
|
|
25
|
+
try {
|
|
26
|
+
const json = await git_gh_exec.exec_gh_api({
|
|
27
|
+
path: git_gh_api_path.issue_api_path(String(number), repo),
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
return git_gh_issue_rest.is_pull_request(git_gh_issue_rest.parse_rest_issue(json))
|
|
31
|
+
} catch {
|
|
32
|
+
return undefined
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// The closing pull request's number, read off the URL `read_closing_pr` answers.
|
|
37
|
+
async function read_closing_pr(issue: number): Promise<string | undefined> {
|
|
38
|
+
const url = await issue_closing_pr.read_closing_pr(String(issue))
|
|
39
|
+
|
|
40
|
+
return url?.slice(url.lastIndexOf('/') + 1)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const DEFAULT_PORTS: SourcePorts = { is_pull: read_is_pull, closing_pr: read_closing_pr }
|
|
44
|
+
|
|
45
|
+
async function hint_of(
|
|
46
|
+
issue: number,
|
|
47
|
+
repo: string | undefined,
|
|
48
|
+
ports: SourcePorts,
|
|
49
|
+
): Promise<string> {
|
|
50
|
+
const closing = repo === undefined ? await ports.closing_pr(issue) : undefined
|
|
51
|
+
|
|
52
|
+
if (closing === undefined) return 'cite the pull request whose merge it waits on'
|
|
53
|
+
|
|
54
|
+
return `cite the pull request that closed it: ${session_cite.issue(closing)}`
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// The refusal for a condition citing an issue, or `undefined` when it cites a pull request, cites
|
|
58
|
+
// nothing, or cannot be read.
|
|
59
|
+
async function problem(
|
|
60
|
+
body: string,
|
|
61
|
+
repo?: string,
|
|
62
|
+
ports: SourcePorts = DEFAULT_PORTS,
|
|
63
|
+
): Promise<string | undefined> {
|
|
64
|
+
const number = issue_sample_gate.cited_number(body)
|
|
65
|
+
|
|
66
|
+
if (number === undefined || (await ports.is_pull(number, repo)) !== false) return undefined
|
|
67
|
+
const cited = session_cite.issue(number, undefined, repo)
|
|
68
|
+
const hint = await hint_of(number, repo, ports)
|
|
69
|
+
|
|
70
|
+
return `\`- 実施可能条件:\` cites ${cited}, an issue, not a pull request — ${hint}`
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const issue_sample_source = { problem }
|
|
74
|
+
|
|
75
|
+
export type { SourcePorts }
|
|
76
|
+
export { issue_sample_source }
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
1
|
import { readFile } from 'node:fs/promises'
|
|
3
|
-
import { fileURLToPath } from 'node:url'
|
|
4
2
|
import { epic_audit_logic } from '#scripts/epic/epic-audit'
|
|
5
3
|
import { epic_bundle, type BacklogIssue, type BundleDecision } from '#scripts/epic/epic-bundle'
|
|
6
4
|
import { epic_bundle_cli } from '#scripts/epic/epic-bundle-cli'
|
|
@@ -34,7 +32,6 @@ const { CLOSED_CEILING_LINE, CLOSED_UNREADABLE_LINE, read_recently_closed, warn_
|
|
|
34
32
|
|
|
35
33
|
const SUCCESS_EXIT_CODE = 0
|
|
36
34
|
const FAILURE_EXIT_CODE = 1
|
|
37
|
-
const ARGV_OFFSET = 2
|
|
38
35
|
const SCORE_DIGITS = 2
|
|
39
36
|
const USAGE = 'Usage: josh issue:scout "<title>" [--body "<draft>" | --body-file <path>]'
|
|
40
37
|
const UNKNOWN_REPO_MESSAGE =
|
|
@@ -394,12 +391,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
394
391
|
return await report(args, repo)
|
|
395
392
|
}
|
|
396
393
|
|
|
397
|
-
// `process.exitCode` rather than `process.exit()`: the answer goes to standard output and a write to
|
|
398
|
-
// a pipe is asynchronous on macOS, so exiting can tear the process down before it drains.
|
|
399
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
400
|
-
process.exitCode = await run(argv)
|
|
401
|
-
}
|
|
402
|
-
|
|
403
394
|
const issue_scout_cli = {
|
|
404
395
|
USAGE,
|
|
405
396
|
UNKNOWN_REPO_MESSAGE,
|
|
@@ -415,7 +406,5 @@ const issue_scout_cli = {
|
|
|
415
406
|
run,
|
|
416
407
|
}
|
|
417
408
|
|
|
418
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
419
|
-
|
|
420
409
|
export type { ScoutArguments, ScoutOutcome }
|
|
421
410
|
export { issue_scout_cli }
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_scout_cli } from './issue-scout-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh issue:scout` entry, kept apart from `issue-scout-cli.ts` because other modules import
|
|
6
|
+
// that one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186). `process.exitCode` rather than `process.exit()`: the answer goes to
|
|
8
|
+
// standard output and a write to a pipe is asynchronous on macOS, so exiting can tear the process
|
|
9
|
+
// down before it drains.
|
|
10
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
11
|
+
const ARGV_OFFSET = 2
|
|
12
|
+
|
|
13
|
+
process.exitCode = await issue_scout_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
14
|
+
}
|
|
@@ -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 type { IssueReadReason } from '#scripts/gh/git-gh-issue-read'
|
|
5
3
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
@@ -29,7 +27,6 @@ import { issue_state, type IssueState } from './issue-state'
|
|
|
29
27
|
// are told apart here and neither is a state.
|
|
30
28
|
|
|
31
29
|
const FAILURE_EXIT_CODE = 1
|
|
32
|
-
const ARGV_OFFSET = 2
|
|
33
30
|
const USAGE = 'Usage: josh issue:state <issue-number> [<issue-number> ...] [--repo <owner/repo>]'
|
|
34
31
|
// A blank line between the blocks of a multi-number report, so a person sees where one issue ends
|
|
35
32
|
// while a reader matching `issue: ` still finds each block by its first line.
|
|
@@ -172,21 +169,14 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
172
169
|
return issue_report_failures.report_failures(reports, FAILURE_TERMS)
|
|
173
170
|
}
|
|
174
171
|
|
|
175
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
176
|
-
process.exitCode = await run(argv)
|
|
177
|
-
}
|
|
178
|
-
|
|
179
172
|
const issue_state_cli = {
|
|
180
173
|
READ_CONCURRENCY,
|
|
181
174
|
STATE_FIELDS,
|
|
182
175
|
USAGE,
|
|
183
|
-
main,
|
|
184
176
|
parse_request,
|
|
185
177
|
read_issue,
|
|
186
178
|
run,
|
|
187
179
|
}
|
|
188
180
|
|
|
189
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
190
|
-
|
|
191
181
|
export type { StateRead }
|
|
192
182
|
export { issue_state_cli }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_state_cli } from './issue-state-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh issue:state` entry, kept apart from `issue-state-cli.ts` because other modules import
|
|
6
|
+
// that 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_state_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|