@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
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { pr_raw_schema, type RollupItemData } from '#scripts/git/git-schemas'
|
|
2
2
|
import { json_value } from '#scripts/lib/json-value'
|
|
3
|
+
import type { z } from 'zod'
|
|
3
4
|
|
|
4
5
|
const CHECK_STATUS_PASS = 'pass'
|
|
5
6
|
const CHECK_STATUS_PENDING = 'pending'
|
|
@@ -9,8 +10,8 @@ const CHECK_STATUS_MISSING = 'missing'
|
|
|
9
10
|
// GitHub reports a job whose `if:` condition was false as COMPLETED with conclusion `skipped`, and
|
|
10
11
|
// counts it as satisfied for branch protection — a pull request reaches CLEAN with such jobs in its
|
|
11
12
|
// rollup. Recording them as `fail` would disagree with GitHub itself, and it would disable the
|
|
12
|
-
// CodeRabbit non-blocking exemption: `
|
|
13
|
-
// every non-passing check is CodeRabbit's, so kit's own conditional jobs (`auto-merge`, `E2E`,
|
|
13
|
+
// CodeRabbit non-blocking exemption: `is_unstable_only_from_optional` opens the gate only when
|
|
14
|
+
// every non-passing check is CodeRabbit's or an optional one still running, so kit's own conditional jobs (`auto-merge`, `E2E`,
|
|
14
15
|
// `Notify Auto Tag`) would keep a slow review blocking the merge until the wait loop timed out. That
|
|
15
16
|
// is invisible on fast reviews, where CLEAN short-circuits the predicate — it surfaces only on the
|
|
16
17
|
// exact path the exemption exists to protect.
|
|
@@ -45,6 +46,12 @@ interface PrStateSnapshot {
|
|
|
45
46
|
rollup: Array<RollupCheck>
|
|
46
47
|
merge_state_status: string | undefined
|
|
47
48
|
review_decision: string | undefined
|
|
49
|
+
// The commit `rollup` was read from — the head a merge has to name so that it lands what passed and
|
|
50
|
+
// nothing pushed since (#4036). Absent where the snapshot carried none.
|
|
51
|
+
head_sha?: string
|
|
52
|
+
// The base branch's required status check contexts (joshuafolkken/kit#4351). Absent where the
|
|
53
|
+
// branch requires none or they could not be read, which keeps the merge gate waiting for `CLEAN`.
|
|
54
|
+
required_contexts?: Array<string>
|
|
48
55
|
}
|
|
49
56
|
|
|
50
57
|
function read_string(value: unknown): string | undefined {
|
|
@@ -118,16 +125,39 @@ function parse_rollup_checks(raw_json: string): Array<RollupCheck> {
|
|
|
118
125
|
return checks
|
|
119
126
|
}
|
|
120
127
|
|
|
121
|
-
function
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
128
|
+
function with_head_sha(snapshot: PrStateSnapshot, head_sha: string | undefined): PrStateSnapshot {
|
|
129
|
+
return head_sha === undefined ? snapshot : { ...snapshot, head_sha }
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function with_required_contexts(
|
|
133
|
+
snapshot: PrStateSnapshot,
|
|
134
|
+
required_contexts: Array<string> | undefined,
|
|
135
|
+
): PrStateSnapshot {
|
|
136
|
+
if (required_contexts === undefined || required_contexts.length === 0) return snapshot
|
|
137
|
+
|
|
138
|
+
return { ...snapshot, required_contexts }
|
|
139
|
+
}
|
|
125
140
|
|
|
126
|
-
|
|
141
|
+
type PrRawData = Partial<z.infer<typeof pr_raw_schema>>
|
|
142
|
+
|
|
143
|
+
function read_pr_raw_data(raw_json: string): PrRawData {
|
|
144
|
+
const result = pr_raw_schema.safeParse(json_value.parse_or_undefined(raw_json))
|
|
145
|
+
|
|
146
|
+
return result.success ? result.data : {}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function parse_pr_state_snapshot(raw_json: string): PrStateSnapshot {
|
|
150
|
+
const data = read_pr_raw_data(raw_json)
|
|
151
|
+
const snapshot = {
|
|
127
152
|
rollup: parse_rollup_checks(raw_json),
|
|
128
|
-
merge_state_status: read_string(data
|
|
129
|
-
review_decision: read_string(data
|
|
153
|
+
merge_state_status: read_string(data.mergeStateStatus),
|
|
154
|
+
review_decision: read_string(data.reviewDecision),
|
|
130
155
|
}
|
|
156
|
+
|
|
157
|
+
return with_required_contexts(
|
|
158
|
+
with_head_sha(snapshot, read_string(data.headRefOid)),
|
|
159
|
+
data.requiredContexts,
|
|
160
|
+
)
|
|
131
161
|
}
|
|
132
162
|
|
|
133
163
|
export {
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { git_gh_command } from './git-gh-command'
|
|
2
|
+
import { git_pr_checks, type PrStateSnapshot } from './git-pr-checks'
|
|
3
|
+
|
|
4
|
+
// **A merge lands the head the merge gate passed, and nothing pushed after it** (#4036).
|
|
5
|
+
//
|
|
6
|
+
// The gate reads the checks of one commit, and the merge request names that commit as its `sha`. A
|
|
7
|
+
// push between the two moves the head, GitHub answers 409, and the wait starts over on the new head
|
|
8
|
+
// — so the push is merged once its own checks pass, with nobody having to re-run anything. The
|
|
9
|
+
// retries are bounded: a branch that keeps moving under every wait is not one to merge unattended.
|
|
10
|
+
|
|
11
|
+
const MAX_HEAD_MOVES = 3
|
|
12
|
+
const NO_CHECKED_HEAD_MESSAGE =
|
|
13
|
+
'The merge gate answered without the head commit it checked, so there is no commit to bind the merge to'
|
|
14
|
+
const HEAD_MOVED_NOTE =
|
|
15
|
+
'The pull request head moved after its checks passed — waiting on the new head'
|
|
16
|
+
const HEAD_KEPT_MOVING_MESSAGE = `The pull request head moved after its checks passed ${String(MAX_HEAD_MOVES)} times, so it was not merged`
|
|
17
|
+
|
|
18
|
+
type WaitForGreen = () => Promise<PrStateSnapshot>
|
|
19
|
+
|
|
20
|
+
interface CheckedMerge {
|
|
21
|
+
branch_name: string
|
|
22
|
+
// The wait to go back to when the head moved — the caller's own, so a re-wait watches what the
|
|
23
|
+
// first wait watched.
|
|
24
|
+
wait_for_green: WaitForGreen
|
|
25
|
+
// The snapshot the gate already passed. Absent, the merge waits for one first.
|
|
26
|
+
checked?: PrStateSnapshot | undefined
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function checked_head(snapshot: PrStateSnapshot): string {
|
|
30
|
+
if (snapshot.head_sha === undefined) throw new Error(NO_CHECKED_HEAD_MESSAGE)
|
|
31
|
+
|
|
32
|
+
return snapshot.head_sha
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// `false` is "the head moved"; every other failure is the caller's to see.
|
|
36
|
+
async function try_merge(branch_name: string, snapshot: PrStateSnapshot): Promise<boolean> {
|
|
37
|
+
const head_sha = checked_head(snapshot)
|
|
38
|
+
|
|
39
|
+
try {
|
|
40
|
+
await git_gh_command.pr_merge(branch_name, head_sha)
|
|
41
|
+
|
|
42
|
+
return true
|
|
43
|
+
} catch (error) {
|
|
44
|
+
if (!git_gh_command.is_head_moved(error)) throw error
|
|
45
|
+
|
|
46
|
+
return false
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function merge_checked(input: CheckedMerge): Promise<void> {
|
|
51
|
+
let snapshot = input.checked ?? (await input.wait_for_green())
|
|
52
|
+
|
|
53
|
+
for (let move = 0; move < MAX_HEAD_MOVES; move += 1) {
|
|
54
|
+
// eslint-disable-next-line no-await-in-loop -- each merge names the head the wait before it passed
|
|
55
|
+
if (await try_merge(input.branch_name, snapshot)) return
|
|
56
|
+
|
|
57
|
+
console.info(HEAD_MOVED_NOTE)
|
|
58
|
+
// eslint-disable-next-line no-await-in-loop -- the new head has to pass before it is merged
|
|
59
|
+
snapshot = await input.wait_for_green()
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
throw new Error(HEAD_KEPT_MOVING_MESSAGE)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// The merge gate's default wait, then the bound merge.
|
|
66
|
+
async function merge_when_green(branch_name: string): Promise<void> {
|
|
67
|
+
async function wait_for_green(): Promise<PrStateSnapshot> {
|
|
68
|
+
return await git_pr_checks.wait_for_pr_success(branch_name)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
await merge_checked({ branch_name, wait_for_green })
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const git_pr_merge_checked = {
|
|
75
|
+
merge_checked,
|
|
76
|
+
merge_when_green,
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export type { CheckedMerge, WaitForGreen }
|
|
80
|
+
export { git_pr_merge_checked, HEAD_KEPT_MOVING_MESSAGE, MAX_HEAD_MOVES, NO_CHECKED_HEAD_MESSAGE }
|
package/scripts/git/base-tree.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mkdtemp, rm, symlink } from 'node:fs/promises'
|
|
1
|
+
import { copyFile, mkdir, mkdtemp, rm, symlink } from 'node:fs/promises'
|
|
2
2
|
import { tmpdir } from 'node:os'
|
|
3
3
|
import path from 'node:path'
|
|
4
4
|
import { git_worktree } from './git-worktree'
|
|
@@ -60,7 +60,24 @@ async function with_tree<T>(
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
async function copy_one(tree: string, file: string): Promise<void> {
|
|
64
|
+
const target = path.join(tree, file)
|
|
65
|
+
|
|
66
|
+
await mkdir(path.dirname(target), { recursive: true })
|
|
67
|
+
await copyFile(file, target)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// The caller's working-tree files into the tree at the same relative paths. Each file has its own
|
|
71
|
+
// target, and a recursive `mkdir` tolerates a sibling creating the same parent.
|
|
72
|
+
async function copy_in(tree: string, files: ReadonlyArray<string>): Promise<void> {
|
|
73
|
+
await Promise.all(
|
|
74
|
+
files.map(async (file) => {
|
|
75
|
+
await copy_one(tree, file)
|
|
76
|
+
}),
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const base_tree = { NODE_MODULES, copy_in, with_tree }
|
|
64
81
|
|
|
65
82
|
export type { BaseTree }
|
|
66
83
|
export { base_tree }
|
|
@@ -11,9 +11,10 @@ import { git_command } from './git-command'
|
|
|
11
11
|
// nothing, and listing what was narrowed by — is identical, so it lives here once rather than in
|
|
12
12
|
// each command.
|
|
13
13
|
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
14
|
+
// The narrowed unit run replaces the whole suite in the gate (joshuafolkken/kit#4065), and the
|
|
15
|
+
// narrowed lint the whole-tree lint (joshuafolkken/kit#4085), each with CI's whole run behind it.
|
|
16
|
+
// Either way both fallbacks end at the whole check, and each says which of the two it was: the
|
|
17
|
+
// one thing this must never do is answer "nothing to run" quietly.
|
|
17
18
|
|
|
18
19
|
type ScopeMode = 'all' | 'related'
|
|
19
20
|
|
|
@@ -176,7 +177,7 @@ async function resolve_command_scope(request: ScopeRequest): Promise<ChangedFile
|
|
|
176
177
|
// describing a set the caller never handed over.
|
|
177
178
|
function report_unusable_arguments(
|
|
178
179
|
command_arguments: ReadonlyArray<string>,
|
|
179
|
-
scope: ChangedFileScope,
|
|
180
|
+
scope: Pick<ChangedFileScope, 'files'>,
|
|
180
181
|
label: string,
|
|
181
182
|
): void {
|
|
182
183
|
const narrowed = new Set(scope.files)
|
|
@@ -195,6 +196,7 @@ const changed_file_scope = {
|
|
|
195
196
|
UNREADABLE_REASON,
|
|
196
197
|
describe_scope,
|
|
197
198
|
flags_of,
|
|
199
|
+
format_file_list,
|
|
198
200
|
is_flag,
|
|
199
201
|
read_changed_files,
|
|
200
202
|
report_unusable_arguments,
|
|
@@ -24,6 +24,23 @@ async function read_changed_paths(is_staged: boolean): Promise<Array<string>> {
|
|
|
24
24
|
return [...tracked, ...untracked]
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
// The same reading against any commit rather than the change base — the change since the tree a
|
|
28
|
+
// test-read map was recorded on.
|
|
29
|
+
async function read_changed_since(commit: string): Promise<Array<string>> {
|
|
30
|
+
const tracked = to_paths(await git_command.diff_names_since(commit))
|
|
31
|
+
const untracked = to_paths(await git_command.untracked_names())
|
|
32
|
+
|
|
33
|
+
return [...new Set([...tracked, ...untracked])]
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// The paths among `paths` the tree of `commit` held. An empty list asks git nothing, since
|
|
37
|
+
// `ls-tree` with no path lists the whole tree.
|
|
38
|
+
async function read_held_at(commit: string, paths: ReadonlyArray<string>): Promise<Array<string>> {
|
|
39
|
+
if (paths.length === 0) return []
|
|
40
|
+
|
|
41
|
+
return to_paths(await git_command.tree_names_at(commit, paths))
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const changed_paths = { read_changed_paths, read_changed_since, read_held_at, to_paths }
|
|
28
45
|
|
|
29
46
|
export { changed_paths }
|
|
@@ -151,18 +151,41 @@ async function change_base_commit(): Promise<string> {
|
|
|
151
151
|
return await git_spawn.read(['rev-parse', await change_base()])
|
|
152
152
|
}
|
|
153
153
|
|
|
154
|
-
|
|
154
|
+
// The working tree against any commit, with the same flags as the branch diff. `josh test:related`
|
|
155
|
+
// reads the change since the commit its test-read map was recorded on, which is not the merge base.
|
|
156
|
+
async function diff_names_since(commit: string): Promise<string> {
|
|
155
157
|
return await git_spawn.read([
|
|
156
158
|
...NO_PATH_QUOTING,
|
|
157
159
|
'diff',
|
|
158
160
|
NAME_ONLY_FLAG,
|
|
159
161
|
NO_RELATIVE_PATHS,
|
|
160
162
|
NO_RENAME_DETECTION,
|
|
161
|
-
|
|
163
|
+
commit,
|
|
164
|
+
'--',
|
|
165
|
+
])
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Which of `paths` a commit's tree holds. `josh test:related` asks it of the tree its test-read map
|
|
169
|
+
// was recorded on: a file that tree held and no test read is one no test reads, while a file added
|
|
170
|
+
// since is one the map knows nothing about. **Callers pass at least one path** — with none, `ls-tree`
|
|
171
|
+
// lists the whole tree.
|
|
172
|
+
async function tree_names_at(commit: string, paths: ReadonlyArray<string>): Promise<string> {
|
|
173
|
+
return await git_spawn.read([
|
|
174
|
+
...NO_PATH_QUOTING,
|
|
175
|
+
'ls-tree',
|
|
176
|
+
'-r',
|
|
177
|
+
NAME_ONLY_FLAG,
|
|
178
|
+
'--full-tree',
|
|
179
|
+
commit,
|
|
162
180
|
'--',
|
|
181
|
+
...paths,
|
|
163
182
|
])
|
|
164
183
|
}
|
|
165
184
|
|
|
185
|
+
async function diff_main_names(): Promise<string> {
|
|
186
|
+
return await diff_names_since(await change_base())
|
|
187
|
+
}
|
|
188
|
+
|
|
166
189
|
async function diff_cached_names(): Promise<string> {
|
|
167
190
|
return await git_spawn.read([
|
|
168
191
|
...NO_PATH_QUOTING,
|
|
@@ -224,7 +247,9 @@ const git_diff_reads = {
|
|
|
224
247
|
diff_main,
|
|
225
248
|
diff_main_names,
|
|
226
249
|
diff_main_numstat,
|
|
250
|
+
diff_names_since,
|
|
227
251
|
get_default_branch,
|
|
252
|
+
tree_names_at,
|
|
228
253
|
untracked_names,
|
|
229
254
|
}
|
|
230
255
|
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { get_exit_code } from '#scripts/git/git-execa-error'
|
|
2
|
+
import { git_spawn } from '#scripts/git/git-spawn'
|
|
3
|
+
|
|
4
|
+
// One fixed-string `git grep -n` over a pathspec, read back as `file:line` hits with a short excerpt.
|
|
5
|
+
// `run:prep`'s code locations and `plan:consumers` both search a name this way, so the parse and the
|
|
6
|
+
// no-match-versus-failure reading live here rather than in each.
|
|
7
|
+
|
|
8
|
+
const GREP_LINE = /^(?<path>[^:]+):(?<line>\d+):(?<text>.*)$/u
|
|
9
|
+
const MAX_EXCERPT_LENGTH = 80
|
|
10
|
+
const ELLIPSIS = '…'
|
|
11
|
+
// `git grep` exits 1 for no match; any other exit is a search that never ran.
|
|
12
|
+
const GREP_NO_MATCH_EXIT = 1
|
|
13
|
+
|
|
14
|
+
interface Hit {
|
|
15
|
+
path: string
|
|
16
|
+
line: string
|
|
17
|
+
excerpt: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
interface GrepResult {
|
|
21
|
+
hits: ReadonlyArray<Hit>
|
|
22
|
+
has_failed: boolean
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function shorten(text: string): string {
|
|
26
|
+
const trimmed = text.trim()
|
|
27
|
+
|
|
28
|
+
if (trimmed.length <= MAX_EXCERPT_LENGTH) return trimmed
|
|
29
|
+
|
|
30
|
+
return `${trimmed.slice(0, MAX_EXCERPT_LENGTH)}${ELLIPSIS}`
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// `git grep -n` prints `path:line:text`; the text may itself hold colons, so only the first two split.
|
|
34
|
+
function to_hit(output_line: string): Hit | undefined {
|
|
35
|
+
const groups = GREP_LINE.exec(output_line)?.groups
|
|
36
|
+
|
|
37
|
+
if (groups === undefined) return undefined
|
|
38
|
+
|
|
39
|
+
// All three groups are non-optional in `GREP_LINE`, so a match always carries each of them.
|
|
40
|
+
const { path, line, text } = groups as Record<'line' | 'path' | 'text', string>
|
|
41
|
+
|
|
42
|
+
return { path, line, excerpt: shorten(text) }
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function parse(stdout: string): Array<Hit> {
|
|
46
|
+
const hits = stdout.split('\n').map((line) => to_hit(line))
|
|
47
|
+
|
|
48
|
+
return hits.filter((hit): hit is Hit => hit !== undefined)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// `git grep` exits 1 when nothing matches, which `git_spawn.read` raises. Only that is "no match": a
|
|
52
|
+
// git without `grep -m` (older than 2.38) exits 129, and naming every target absent then would send
|
|
53
|
+
// the reader away from code that is there. `root` searches that checkout rather than the working
|
|
54
|
+
// directory's.
|
|
55
|
+
async function search(
|
|
56
|
+
target: string,
|
|
57
|
+
flags: ReadonlyArray<string>,
|
|
58
|
+
pathspecs: ReadonlyArray<string>,
|
|
59
|
+
root?: string,
|
|
60
|
+
): Promise<GrepResult> {
|
|
61
|
+
const location = root === undefined ? [] : ['-C', root]
|
|
62
|
+
const grep_arguments = [
|
|
63
|
+
...location,
|
|
64
|
+
'grep',
|
|
65
|
+
'-n',
|
|
66
|
+
'-I',
|
|
67
|
+
'-F',
|
|
68
|
+
...flags,
|
|
69
|
+
'-e',
|
|
70
|
+
target,
|
|
71
|
+
'--',
|
|
72
|
+
...pathspecs,
|
|
73
|
+
]
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
return { hits: parse(await git_spawn.read(grep_arguments)), has_failed: false }
|
|
77
|
+
} catch (error) {
|
|
78
|
+
return { hits: [], has_failed: get_exit_code(error) !== GREP_NO_MATCH_EXIT }
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const git_grep_hits = { parse, search }
|
|
83
|
+
|
|
84
|
+
export type { GrepResult, Hit }
|
|
85
|
+
export { git_grep_hits }
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
//
|
|
10
10
|
// The list is single-sourced here because it has three consumers that must not drift apart: the
|
|
11
11
|
// probes that clear it, the fixture that clears it, and the unit-suite guard that refuses a write
|
|
12
|
-
// while any of it is set (`
|
|
12
|
+
// while any of it is set (`tools/test/test-repository-guard.ts`).
|
|
13
13
|
//
|
|
14
14
|
// **Only the variables that redirect where git writes are listed.** `GIT_PREFIX`, `GIT_EDITOR` and
|
|
15
15
|
// the `GIT_CONFIG_*` family are exported to hooks too and are deliberately absent: clearing them
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { git_spawn_sync } from './git-spawn-sync'
|
|
4
|
+
|
|
5
|
+
// The paths merging another branch into this working tree would stop on, read without touching any
|
|
6
|
+
// index or ref (joshuafolkken/kit#4348). **The working tree, not `HEAD`, is ours**: `josh ship` asks
|
|
7
|
+
// before its commit, so the change it is about to ship is still uncommitted. Each path is merged on
|
|
8
|
+
// its own, as `merge-tree` would merge its content: a side left as the merge base had it, or both
|
|
9
|
+
// sides alike, merges cleanly; a side that deleted or added what the other changed differently
|
|
10
|
+
// conflicts; otherwise `git merge-file` decides. Only blob ids are compared, so no content is read.
|
|
11
|
+
|
|
12
|
+
const CLEAN_EXIT_CODE = 0
|
|
13
|
+
const HEAD = 'HEAD'
|
|
14
|
+
|
|
15
|
+
interface Sides {
|
|
16
|
+
base: string | undefined
|
|
17
|
+
ours: string | undefined
|
|
18
|
+
theirs: string | undefined
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface Commits {
|
|
22
|
+
base: string
|
|
23
|
+
theirs: string
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function blob_id(revision: string, file_path: string, cwd: string): string | undefined {
|
|
27
|
+
return git_spawn_sync.read(['rev-parse', '--verify', '--quiet', `${revision}:${file_path}`], {
|
|
28
|
+
cwd,
|
|
29
|
+
})
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Written to the object store so `merge-file --object-id` can read it; no index or ref moves.
|
|
33
|
+
function working_blob_id(file_path: string, cwd: string): string | undefined {
|
|
34
|
+
if (!existsSync(path.join(cwd, file_path))) return undefined
|
|
35
|
+
|
|
36
|
+
return git_spawn_sync.read(['hash-object', '-w', '--', file_path], { cwd })
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function is_one_sided(sides: Sides): boolean {
|
|
40
|
+
return sides.ours === sides.theirs || sides.ours === sides.base || sides.theirs === sides.base
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function is_complete(sides: Sides): sides is Record<keyof Sides, string> {
|
|
44
|
+
return sides.base !== undefined && sides.ours !== undefined && sides.theirs !== undefined
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function is_merged(sides: Sides, cwd: string): boolean {
|
|
48
|
+
if (is_one_sided(sides)) return true
|
|
49
|
+
if (!is_complete(sides)) return false
|
|
50
|
+
|
|
51
|
+
const { base, ours, theirs } = sides
|
|
52
|
+
const result = git_spawn_sync.run(['merge-file', '-p', '--object-id', ours, base, theirs], {
|
|
53
|
+
cwd,
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
return result.exit_code === CLEAN_EXIT_CODE
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function sides_of(file_path: string, commits: Commits, cwd: string): Sides {
|
|
60
|
+
return {
|
|
61
|
+
base: blob_id(commits.base, file_path, cwd),
|
|
62
|
+
ours: working_blob_id(file_path, cwd),
|
|
63
|
+
theirs: blob_id(commits.theirs, file_path, cwd),
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Of `paths` (relative to `cwd`, the working tree's root), the ones merging `theirs` would stop on;
|
|
68
|
+
// `undefined` where the merge base with `theirs` could not be read.
|
|
69
|
+
function working_tree_conflicts(
|
|
70
|
+
theirs: string,
|
|
71
|
+
paths: ReadonlyArray<string>,
|
|
72
|
+
cwd: string,
|
|
73
|
+
): ReadonlyArray<string> | undefined {
|
|
74
|
+
const base = git_spawn_sync.read(['merge-base', HEAD, theirs], { cwd })
|
|
75
|
+
|
|
76
|
+
if (base === undefined) return undefined
|
|
77
|
+
|
|
78
|
+
return paths.filter((file_path) => !is_merged(sides_of(file_path, { base, theirs }, cwd), cwd))
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const git_merge_conflicts = { working_tree_conflicts }
|
|
82
|
+
|
|
83
|
+
export { git_merge_conflicts }
|
|
@@ -13,6 +13,19 @@ import { git_issue, type IssueInfo } from './git-issue'
|
|
|
13
13
|
// anything changes, and all of them are reported at once.** No rule is new: each
|
|
14
14
|
// answer comes from the function the later stage refuses with, so the two cannot drift apart.
|
|
15
15
|
|
|
16
|
+
// Which precondition a problem leaves unmet, so a stopped `josh ship` records the kind beside the text
|
|
17
|
+
// (joshuafolkken/kit#4166).
|
|
18
|
+
const PRECONDITION = {
|
|
19
|
+
ISSUE: 'issue',
|
|
20
|
+
BRANCH: 'branch',
|
|
21
|
+
CLASSIFICATION: 'classification',
|
|
22
|
+
} as const
|
|
23
|
+
|
|
24
|
+
interface Unmet {
|
|
25
|
+
kind: string
|
|
26
|
+
problem: string
|
|
27
|
+
}
|
|
28
|
+
|
|
16
29
|
interface PreflightInput {
|
|
17
30
|
cli_input: string | undefined
|
|
18
31
|
will_open_pr: boolean
|
|
@@ -26,14 +39,20 @@ interface Target {
|
|
|
26
39
|
|
|
27
40
|
interface Resolution {
|
|
28
41
|
target: Target | undefined
|
|
29
|
-
problems: Array<
|
|
42
|
+
problems: Array<Unmet>
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function unmet(kind: string, problem: string): Unmet {
|
|
46
|
+
return { kind, problem }
|
|
30
47
|
}
|
|
31
48
|
|
|
32
49
|
function resolve_from_branch(current_branch: string): Resolution {
|
|
33
50
|
const number = git_issue.branch_number(current_branch)
|
|
34
51
|
|
|
35
52
|
if (number === undefined) {
|
|
36
|
-
|
|
53
|
+
const problem = unmet(PRECONDITION.ISSUE, git_issue.branch_derivation_error(current_branch))
|
|
54
|
+
|
|
55
|
+
return { target: undefined, problems: [problem] }
|
|
37
56
|
}
|
|
38
57
|
|
|
39
58
|
return { target: { number, branch_name: current_branch }, problems: [] }
|
|
@@ -55,7 +74,10 @@ function resolve_parsed(
|
|
|
55
74
|
return {
|
|
56
75
|
target,
|
|
57
76
|
problems: [
|
|
58
|
-
|
|
77
|
+
unmet(
|
|
78
|
+
PRECONDITION.BRANCH,
|
|
79
|
+
`Branch mismatch: on "${current_branch}", but the title resolves to "${parsed.branch_name}".`,
|
|
80
|
+
),
|
|
59
81
|
],
|
|
60
82
|
}
|
|
61
83
|
}
|
|
@@ -68,7 +90,10 @@ function resolve_from_title(
|
|
|
68
90
|
try {
|
|
69
91
|
return resolve_parsed(git_issue.parse(cli_input), current_branch, default_branch)
|
|
70
92
|
} catch (error) {
|
|
71
|
-
return {
|
|
93
|
+
return {
|
|
94
|
+
target: undefined,
|
|
95
|
+
problems: [unmet(PRECONDITION.ISSUE, error_text.message_of(error))],
|
|
96
|
+
}
|
|
72
97
|
}
|
|
73
98
|
}
|
|
74
99
|
|
|
@@ -80,13 +105,13 @@ async function resolve_target(cli_input: string | undefined): Promise<Resolution
|
|
|
80
105
|
return resolve_from_title(cli_input, current_branch, await git_command.get_default_branch())
|
|
81
106
|
}
|
|
82
107
|
|
|
83
|
-
async function classification_problems(target: Target): Promise<Array<
|
|
108
|
+
async function classification_problems(target: Target): Promise<Array<Unmet>> {
|
|
84
109
|
try {
|
|
85
110
|
await git_pr.release_classification(target.number, target.branch_name)
|
|
86
111
|
|
|
87
112
|
return []
|
|
88
113
|
} catch (error) {
|
|
89
|
-
return [error_text.message_of(error)]
|
|
114
|
+
return [unmet(PRECONDITION.CLASSIFICATION, error_text.message_of(error))]
|
|
90
115
|
}
|
|
91
116
|
}
|
|
92
117
|
|
|
@@ -106,8 +131,8 @@ async function announce_evidence(branch_name: string): Promise<void> {
|
|
|
106
131
|
)
|
|
107
132
|
}
|
|
108
133
|
|
|
109
|
-
function refusal(problems: ReadonlyArray<
|
|
110
|
-
const lines = problems.map((problem) => ` - ${problem}`)
|
|
134
|
+
function refusal(problems: ReadonlyArray<Unmet>): Error {
|
|
135
|
+
const lines = problems.map(({ problem }) => ` - ${problem}`)
|
|
111
136
|
|
|
112
137
|
return new Error(
|
|
113
138
|
[
|
|
@@ -119,7 +144,7 @@ function refusal(problems: ReadonlyArray<string>): Error {
|
|
|
119
144
|
|
|
120
145
|
interface PreflightAnswer {
|
|
121
146
|
pr_target: Target | undefined
|
|
122
|
-
problems: Array<
|
|
147
|
+
problems: Array<Unmet>
|
|
123
148
|
}
|
|
124
149
|
|
|
125
150
|
async function answer(input: PreflightInput): Promise<PreflightAnswer> {
|
|
@@ -131,9 +156,9 @@ async function answer(input: PreflightInput): Promise<PreflightAnswer> {
|
|
|
131
156
|
return { pr_target, problems: [...problems, ...pr_problems] }
|
|
132
157
|
}
|
|
133
158
|
|
|
134
|
-
// The unmet preconditions as a list, so `josh ship` can ask them before its
|
|
159
|
+
// The unmet preconditions as a list, each with its kind, so `josh ship` can ask them before its
|
|
135
160
|
// review and gate start instead of meeting the refusal at the commit stage.
|
|
136
|
-
async function problems_of(input: PreflightInput): Promise<Array<
|
|
161
|
+
async function problems_of(input: PreflightInput): Promise<Array<Unmet>> {
|
|
137
162
|
const { problems } = await answer(input)
|
|
138
163
|
|
|
139
164
|
return problems
|
|
@@ -149,5 +174,5 @@ async function check(input: PreflightInput): Promise<void> {
|
|
|
149
174
|
|
|
150
175
|
const git_preflight = { check, problems_of }
|
|
151
176
|
|
|
152
|
-
export type { PreflightInput }
|
|
177
|
+
export type { PreflightInput, Unmet }
|
|
153
178
|
export { git_preflight }
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
1
2
|
import { execa } from 'execa'
|
|
2
3
|
import { git_utilities } from './constants'
|
|
3
4
|
import {
|
|
@@ -8,8 +9,6 @@ import {
|
|
|
8
9
|
} from './git-execa-error'
|
|
9
10
|
import { git_ssh_keepalive } from './git-ssh-keepalive'
|
|
10
11
|
|
|
11
|
-
const MS_PER_SECOND = 1000
|
|
12
|
-
|
|
13
12
|
// The budget for one `git push`, and the reason a push can no longer wait without end.
|
|
14
13
|
// Measured on PR #1244: the commit itself took 0.6 seconds and the push
|
|
15
14
|
// then sat silent for 8 minutes 13 seconds before it was found by hand and killed — about 9 minutes
|
|
@@ -2,21 +2,28 @@ import { z } from 'zod'
|
|
|
2
2
|
|
|
3
3
|
const package_name_schema = z.object({ name: z.string().min(1) })
|
|
4
4
|
|
|
5
|
+
// REST answers `null` for a field it has no value for yet — a running check run's `conclusion` above
|
|
6
|
+
// all — and one rejected element fails the whole snapshot, which then reads as an empty rollup until
|
|
7
|
+
// the last check completes (joshuafolkken/kit#4351). Every string field is `nullish` for that reason.
|
|
5
8
|
const rollup_item_schema = z.looseObject({
|
|
6
9
|
// eslint-disable-next-line @typescript-eslint/naming-convention -- GraphQL field name from GitHub API
|
|
7
|
-
__typename: z.string().
|
|
8
|
-
state: z.string().
|
|
9
|
-
status: z.string().
|
|
10
|
-
conclusion: z.string().
|
|
11
|
-
name: z.string().
|
|
12
|
-
context: z.string().
|
|
10
|
+
__typename: z.string().nullish(),
|
|
11
|
+
state: z.string().nullish(),
|
|
12
|
+
status: z.string().nullish(),
|
|
13
|
+
conclusion: z.string().nullish(),
|
|
14
|
+
name: z.string().nullish(),
|
|
15
|
+
context: z.string().nullish(),
|
|
13
16
|
description: z.string().nullish(),
|
|
14
17
|
})
|
|
15
18
|
|
|
16
19
|
const pr_raw_schema = z.object({
|
|
17
20
|
statusCheckRollup: z.array(rollup_item_schema).optional(),
|
|
21
|
+
// The base branch's required status check contexts, read from its rules — empty where none are
|
|
22
|
+
// set or they could not be read (`git-gh-branch-rules.ts`).
|
|
23
|
+
requiredContexts: z.array(z.string()).optional(),
|
|
18
24
|
mergeStateStatus: z.string().optional(),
|
|
19
25
|
reviewDecision: z.string().optional(),
|
|
26
|
+
headRefOid: z.string().optional(),
|
|
20
27
|
})
|
|
21
28
|
|
|
22
29
|
const pull_comment_schema = z.object({
|
|
@@ -40,6 +47,8 @@ const pr_info_schema = z.object({
|
|
|
40
47
|
const epic_issue_schema = z.object({
|
|
41
48
|
number: z.number(),
|
|
42
49
|
body: z.string().optional(),
|
|
50
|
+
// REST answers null for an issue never closed and `reopened` for one a person reopened.
|
|
51
|
+
stateReason: z.string().nullish(),
|
|
43
52
|
})
|
|
44
53
|
|
|
45
54
|
// One blocker as `gh` reports it inside the `blockedBy` connection. `state` comes back with the
|
|
@@ -140,6 +149,7 @@ const open_issue_schema = z.object({
|
|
|
140
149
|
|
|
141
150
|
type RollupItemData = z.infer<typeof rollup_item_schema>
|
|
142
151
|
type EpicChildData = z.infer<typeof epic_child_schema>
|
|
152
|
+
type EpicIssueData = z.infer<typeof epic_issue_schema>
|
|
143
153
|
type OpenIssueData = z.infer<typeof open_issue_schema>
|
|
144
154
|
type RestCommentData = z.infer<typeof rest_comment_schema>
|
|
145
155
|
|
|
@@ -159,4 +169,4 @@ export {
|
|
|
159
169
|
blocking_issue_schema,
|
|
160
170
|
blocked_by_schema,
|
|
161
171
|
}
|
|
162
|
-
export type { RollupItemData, EpicChildData, OpenIssueData, RestCommentData }
|
|
172
|
+
export type { RollupItemData, EpicChildData, EpicIssueData, OpenIssueData, RestCommentData }
|