@joshuafolkken/kit 1.1471.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,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 }
|
package/scripts/git/git-spawn.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GIT_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
1
|
+
import { GIT_TIMEOUT_MS, MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
2
2
|
import { execa } from 'execa'
|
|
3
3
|
import { git_utilities } from './constants'
|
|
4
4
|
import {
|
|
@@ -47,7 +47,6 @@ async function read(
|
|
|
47
47
|
// still takes this one. The push's budget is reused rather than a second number chosen: both transfer
|
|
48
48
|
// objects over the same transport, and that one is already read off what a healthy transfer costs here.
|
|
49
49
|
const REMOTE_TIMEOUT_MS = PUSH_TIMEOUT_MS
|
|
50
|
-
const MS_PER_SECOND = 1000
|
|
51
50
|
|
|
52
51
|
// A budget kill is reported as a timeout, never as whatever the killed process printed first, and
|
|
53
52
|
// `cause` carries the same `TIMEOUT_EXIT_CODE` a timed-out push does. Unlike the push it is not
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { animation_helpers, type AnimationOptions } from '#scripts/lib/animation-helpers'
|
|
2
|
+
import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
|
|
2
3
|
import { REQUIRED_STATUS_LENGTH, STAGED_STATUS_INDEX, UNTRACKED_FILE_PREFIX } from './constants'
|
|
3
4
|
import { git_command } from './git-command'
|
|
4
5
|
|
|
5
6
|
const WARNING_ICON = '🔔'
|
|
6
|
-
const PACKAGE_JSON_FILE = 'package.json'
|
|
7
7
|
const STATUS_PREFIX_LENGTH = 2
|
|
8
8
|
const VERSION_NOT_UPDATED = 'Not updated'
|
|
9
9
|
|
|
@@ -62,7 +62,7 @@ function is_package_json_staged(status_output: string): boolean {
|
|
|
62
62
|
|
|
63
63
|
const filename = extract_filename(line)
|
|
64
64
|
|
|
65
|
-
return filename ===
|
|
65
|
+
return filename === PACKAGE_JSON
|
|
66
66
|
})
|
|
67
67
|
}
|
|
68
68
|
|
|
@@ -148,7 +148,7 @@ async function check_package_json_version(): Promise<boolean> {
|
|
|
148
148
|
return await animation_helpers.execute_with_animation(
|
|
149
149
|
'Checking if package.json version is updated...',
|
|
150
150
|
async () => {
|
|
151
|
-
const diff_output: string = await git_command.diff_cached(
|
|
151
|
+
const diff_output: string = await git_command.diff_cached(PACKAGE_JSON)
|
|
152
152
|
|
|
153
153
|
return is_version_updated_in_diff(diff_output)
|
|
154
154
|
},
|
|
@@ -166,7 +166,7 @@ async function check_branch_version(): Promise<boolean> {
|
|
|
166
166
|
return await animation_helpers.execute_with_animation(
|
|
167
167
|
'Checking if version is already updated on this branch...',
|
|
168
168
|
async () => {
|
|
169
|
-
const diff_output: string = await git_command.diff_main(
|
|
169
|
+
const diff_output: string = await git_command.diff_main(PACKAGE_JSON)
|
|
170
170
|
|
|
171
171
|
return is_version_updated_in_diff(diff_output)
|
|
172
172
|
},
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { main_merge } from './main-merge'
|
|
4
|
+
|
|
5
|
+
// The `josh main:merge` entry, kept apart from `main-merge.ts` because `run-ship-sync.ts` imports
|
|
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 main_merge.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { SUITE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
2
|
+
import { execa } from 'execa'
|
|
3
|
+
import { git_command } from './git-command'
|
|
4
|
+
import { git_spawn } from './git-spawn'
|
|
5
|
+
|
|
6
|
+
// A merge of the default branch that stops only on generated files is finished here rather than by a
|
|
7
|
+
// resumed session: each such file is the output of a command, so running that command on the merged
|
|
8
|
+
// tree writes the one correct resolution, with no conflict marker for anyone to read.
|
|
9
|
+
//
|
|
10
|
+
// **This table is the single list of what is resolved that way** — a file a person writes never
|
|
11
|
+
// belongs in it, because regenerating would discard that person's side of the merge. A conflict on any
|
|
12
|
+
// path not listed here still stops as `conflict`. A file belongs here only once its committed content
|
|
13
|
+
// is exactly what its command writes: `tools/test/pure-files.ts` is not, so regenerating it would
|
|
14
|
+
// rewrite far more than the conflict.
|
|
15
|
+
|
|
16
|
+
interface RegeneratedFile {
|
|
17
|
+
path: string
|
|
18
|
+
command: ReadonlyArray<string>
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const REGENERATED_FILES: ReadonlyArray<RegeneratedFile> = [
|
|
22
|
+
{
|
|
23
|
+
path: 'docs/josh-command-catalog.md',
|
|
24
|
+
command: ['pnpm', 'exec', 'tsx', 'tools/document/generate-catalog.ts'],
|
|
25
|
+
},
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
function regenerated_for(
|
|
29
|
+
files: ReadonlyArray<string>,
|
|
30
|
+
table: ReadonlyArray<RegeneratedFile>,
|
|
31
|
+
): ReadonlyArray<RegeneratedFile> {
|
|
32
|
+
const entries = files.map((file) => table.find((entry) => entry.path === file))
|
|
33
|
+
|
|
34
|
+
return entries.every((entry) => entry !== undefined) ? entries : []
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Each generator writes only its own file, so they run side by side.
|
|
38
|
+
async function regenerate(entries: ReadonlyArray<RegeneratedFile>, cwd: string): Promise<void> {
|
|
39
|
+
await Promise.all(
|
|
40
|
+
entries.map(async (entry) => {
|
|
41
|
+
const [binary = '', ...command_arguments] = entry.command
|
|
42
|
+
|
|
43
|
+
await execa(binary, command_arguments, { cwd })
|
|
44
|
+
}),
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// `--no-edit` keeps the message the merge was started with — the one carrying the issue number the
|
|
49
|
+
// `commit-msg` hook asks for.
|
|
50
|
+
async function conclude_merge(entries: ReadonlyArray<RegeneratedFile>): Promise<void> {
|
|
51
|
+
await git_spawn.with_output('add', ['--', ...entries.map((entry) => entry.path)])
|
|
52
|
+
await git_spawn.with_output('commit', ['--no-edit'], { timeout_ms: SUITE_TIMEOUT_MS })
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Whether the merge that stopped on `files` was finished. A command that fails leaves the merge in
|
|
56
|
+
// progress and answers `false`, so the stop is the `conflict` it would have been without this table.
|
|
57
|
+
async function resolve(
|
|
58
|
+
files: ReadonlyArray<string>,
|
|
59
|
+
table: ReadonlyArray<RegeneratedFile> = REGENERATED_FILES,
|
|
60
|
+
): Promise<boolean> {
|
|
61
|
+
const entries = regenerated_for(files, table)
|
|
62
|
+
|
|
63
|
+
if (entries.length === 0) return false
|
|
64
|
+
|
|
65
|
+
try {
|
|
66
|
+
await regenerate(entries, await git_command.repository_root())
|
|
67
|
+
await conclude_merge(entries)
|
|
68
|
+
} catch {
|
|
69
|
+
return false
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return true
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const main_merge_regenerate = { REGENERATED_FILES, resolve }
|
|
76
|
+
|
|
77
|
+
export type { RegeneratedFile }
|
|
78
|
+
export { main_merge_regenerate }
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { extract_issue_number } from '#scripts/hooks/check-commit-message'
|
|
4
2
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
5
3
|
import { composite_arguments, USAGE_ERROR_EXIT_CODE } from '#scripts/josh/josh-composite-arguments'
|
|
6
4
|
import { error_text } from '#scripts/lib/error-message'
|
|
5
|
+
import { split_assess } from '#scripts/split/split-assess'
|
|
6
|
+
import { split_measure } from '#scripts/split/split-measure'
|
|
7
7
|
import { git_command } from './git-command'
|
|
8
8
|
import { main_merge_guard } from './main-merge-guard'
|
|
9
|
+
import { main_merge_regenerate } from './main-merge-regenerate'
|
|
9
10
|
|
|
10
11
|
// `josh main:merge` (`josh mm`) — bring the default branch into the branch this checkout is on.
|
|
11
12
|
//
|
|
@@ -29,8 +30,9 @@ import { main_merge_guard } from './main-merge-guard'
|
|
|
29
30
|
|
|
30
31
|
const SUCCESS_EXIT_CODE = 0
|
|
31
32
|
const FAILURE_EXIT_CODE = 1
|
|
32
|
-
const ARGV_OFFSET = 2
|
|
33
33
|
const COMMAND_NAME = 'main:merge'
|
|
34
|
+
const SPLIT_UNMEASURED =
|
|
35
|
+
'split notice: the diff could not be measured — run `pnpm josh split:assess`'
|
|
34
36
|
|
|
35
37
|
// git's default merge message carries no `#N`, so on an issue branch the `commit-msg` hook refuses
|
|
36
38
|
// it and leaves the index mid-merge. The number is read with the hook's
|
|
@@ -62,18 +64,26 @@ interface MergeTarget {
|
|
|
62
64
|
}
|
|
63
65
|
|
|
64
66
|
// A failure that left no unmerged path — a remote that cannot be reached, a hook that refused — is not
|
|
65
|
-
// a conflict, so it is rethrown rather than reported as one with nothing to resolve.
|
|
67
|
+
// a conflict, so it is rethrown rather than reported as one with nothing to resolve. A conflict only on
|
|
68
|
+
// generated files is regenerated and committed (`main-merge-regenerate.ts`), so it answers `undefined`
|
|
69
|
+
// and the merge reads as finished.
|
|
70
|
+
async function unresolved_conflict(error: unknown): Promise<MergeOutcome | undefined> {
|
|
71
|
+
const files = main_merge_guard.unmerged_paths(await git_command.status())
|
|
72
|
+
|
|
73
|
+
if (files.length === 0) throw error
|
|
74
|
+
|
|
75
|
+
return (await main_merge_regenerate.resolve(files)) ? undefined : { kind: 'conflict', files }
|
|
76
|
+
}
|
|
77
|
+
|
|
66
78
|
async function merge_into(target: MergeTarget): Promise<MergeOutcome> {
|
|
67
79
|
const { default_branch, current_branch } = target
|
|
68
80
|
|
|
69
81
|
try {
|
|
70
82
|
await git_command.merge_branch(default_branch, merge_message(default_branch, current_branch))
|
|
71
83
|
} catch (error) {
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
if (files.length === 0) throw error
|
|
84
|
+
const conflict = await unresolved_conflict(error)
|
|
75
85
|
|
|
76
|
-
|
|
86
|
+
if (conflict !== undefined) return conflict
|
|
77
87
|
}
|
|
78
88
|
|
|
79
89
|
return { kind: target.is_current ? 'current' : 'merged', branch: default_branch }
|
|
@@ -106,6 +116,25 @@ function failure_text(outcome: MergeOutcome): string | undefined {
|
|
|
106
116
|
return undefined
|
|
107
117
|
}
|
|
108
118
|
|
|
119
|
+
// joshuafolkken/kit#4302: every implementing run merges the default branch immediately before the
|
|
120
|
+
// gate, so this is where a diff that outgrew the entry's split estimate is told so. The notice is
|
|
121
|
+
// advisory: a finished merge never fails on it, and an unreadable diff says so rather than reading as
|
|
122
|
+
// under the guide. It sits on the command, not on `merge()`, because `josh ship` merges again past the
|
|
123
|
+
// point a run can act on it.
|
|
124
|
+
async function split_notice(): Promise<string | undefined> {
|
|
125
|
+
try {
|
|
126
|
+
return split_assess.notice(await split_measure.read_branch())
|
|
127
|
+
} catch (error) {
|
|
128
|
+
return `${SPLIT_UNMEASURED}: ${error_text.message_of(error)}`
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
async function warn_over_split_guide(): Promise<void> {
|
|
133
|
+
const notice = await split_notice()
|
|
134
|
+
|
|
135
|
+
if (notice !== undefined) console.warn(notice)
|
|
136
|
+
}
|
|
137
|
+
|
|
109
138
|
async function merge_default_branch(): Promise<number> {
|
|
110
139
|
const outcome = await merge()
|
|
111
140
|
const failure = failure_text(outcome)
|
|
@@ -118,6 +147,8 @@ async function merge_default_branch(): Promise<number> {
|
|
|
118
147
|
|
|
119
148
|
if ('branch' in outcome) console.info(outcome.branch)
|
|
120
149
|
|
|
150
|
+
await warn_over_split_guide()
|
|
151
|
+
|
|
121
152
|
return SUCCESS_EXIT_CODE
|
|
122
153
|
}
|
|
123
154
|
|
|
@@ -145,13 +176,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
145
176
|
}
|
|
146
177
|
}
|
|
147
178
|
|
|
148
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
149
|
-
process.exitCode = await run(argv)
|
|
150
|
-
}
|
|
151
|
-
|
|
152
179
|
const main_merge = { merge, run }
|
|
153
180
|
|
|
154
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
155
|
-
|
|
156
181
|
export { main_merge }
|
|
157
182
|
export type { MergeOutcome }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { main_sync } from './main-sync'
|
|
4
|
+
|
|
5
|
+
// The `josh main:sync` entry, kept apart from `main-sync.ts` because `observations-flush.ts` imports
|
|
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 main_sync.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
package/scripts/git/main-sync.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { composite_arguments, USAGE_ERROR_EXIT_CODE } from '#scripts/josh/josh-composite-arguments'
|
|
4
2
|
import { error_text } from '#scripts/lib/error-message'
|
|
5
3
|
import { git_command } from './git-command'
|
|
@@ -27,7 +25,6 @@ import { lockfile_sync } from './lockfile-sync'
|
|
|
27
25
|
|
|
28
26
|
const SUCCESS_EXIT_CODE = 0
|
|
29
27
|
const FAILURE_EXIT_CODE = 1
|
|
30
|
-
const ARGV_OFFSET = 2
|
|
31
28
|
const COMMAND_NAME = 'main:sync'
|
|
32
29
|
const INSTALL_FAILURE =
|
|
33
30
|
'node_modules is behind pnpm-lock.yaml and `pnpm install --frozen-lockfile` failed; run `pnpm josh ms` again, or the install here by hand.'
|
|
@@ -144,12 +141,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
144
141
|
}
|
|
145
142
|
}
|
|
146
143
|
|
|
147
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
148
|
-
process.exitCode = await run(argv)
|
|
149
|
-
}
|
|
150
|
-
|
|
151
144
|
const main_sync = { run }
|
|
152
145
|
|
|
153
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
154
|
-
|
|
155
146
|
export { main_sync }
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { git_spawn } from '#scripts/git/git-spawn'
|
|
2
|
+
import { LEDGER_EXCLUSION_PATHSPEC } from '#scripts/observations/observation-ledger'
|
|
2
3
|
|
|
3
4
|
// The one place a sanctioned `git stash pop` is targeted by its message rather than its stack
|
|
4
5
|
// position. The stash is a single repository-wide stack shared by every
|
|
@@ -97,14 +98,34 @@ async function has_conflict(directory?: string): Promise<boolean> {
|
|
|
97
98
|
|
|
98
99
|
// Uncommitted work is anything `git status --porcelain` lists — untracked files included, which is what
|
|
99
100
|
// `push` below carries with `-u`, so the two agree on what "work" means.
|
|
100
|
-
|
|
101
|
-
|
|
101
|
+
// A `pathspec` narrows both to the same paths, so a push never finds nothing where this found work.
|
|
102
|
+
async function has_changes(
|
|
103
|
+
directory?: string,
|
|
104
|
+
pathspec: ReadonlyArray<string> = [],
|
|
105
|
+
): Promise<boolean> {
|
|
106
|
+
const status = await git_spawn.read(git_args(directory, ['status', '--porcelain', ...pathspec]))
|
|
107
|
+
|
|
108
|
+
return status !== ''
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// What `josh stash:push` sets aside: everything but the observation ledger, whose lines ride on the
|
|
112
|
+
// run's own commit (`stash-push-cli.ts`).
|
|
113
|
+
const STASHABLE_PATHSPEC: ReadonlyArray<string> = ['--', ...LEDGER_EXCLUSION_PATHSPEC]
|
|
114
|
+
|
|
115
|
+
// Whether `josh stash:push` would push anything — the question to ask before telling someone to run it,
|
|
116
|
+
// so a ledger-only tree is never sent to a push that answers `clean`.
|
|
117
|
+
async function has_stashable_changes(directory?: string): Promise<boolean> {
|
|
118
|
+
return await has_changes(directory, STASHABLE_PATHSPEC)
|
|
102
119
|
}
|
|
103
120
|
|
|
104
121
|
// Push with a message `josh stash:pop` can later target — the stack is shared by every work tree, so an
|
|
105
122
|
// entry pushed from a lane outlives the lane's own tree.
|
|
106
|
-
async function push(
|
|
107
|
-
|
|
123
|
+
async function push(
|
|
124
|
+
message: string,
|
|
125
|
+
directory?: string,
|
|
126
|
+
pathspec: ReadonlyArray<string> = [],
|
|
127
|
+
): Promise<void> {
|
|
128
|
+
await git_spawn.read(git_args(directory, ['stash', 'push', '-u', '-m', message, ...pathspec]))
|
|
108
129
|
}
|
|
109
130
|
|
|
110
131
|
// The stack keyed by commit rather than position: a sweep that reads the
|
|
@@ -181,6 +202,7 @@ const git_stash = {
|
|
|
181
202
|
drop_by_hash,
|
|
182
203
|
has_changes,
|
|
183
204
|
has_conflict,
|
|
205
|
+
has_stashable_changes,
|
|
184
206
|
list,
|
|
185
207
|
list_by_hash,
|
|
186
208
|
matches,
|
|
@@ -188,6 +210,7 @@ const git_stash = {
|
|
|
188
210
|
pop,
|
|
189
211
|
push,
|
|
190
212
|
select,
|
|
213
|
+
STASHABLE_PATHSPEC,
|
|
191
214
|
work_message,
|
|
192
215
|
}
|
|
193
216
|
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
2
2
|
|
|
3
|
-
// `josh stash:pop`
|
|
4
|
-
// lives here, acting on the stack lives in
|
|
5
|
-
// `undefined` rather than a guessed intent — a pop run on a misread argument
|
|
6
|
-
// entry off a stack shared by every lane
|
|
3
|
+
// `josh stash:push` and `josh stash:pop` turn their `argv` into a single request: the message of the
|
|
4
|
+
// stash to push or pop. Parsing lives here, acting on the stack lives in each command's cli, and a
|
|
5
|
+
// malformed command line is `undefined` rather than a guessed intent — a pop run on a misread argument
|
|
6
|
+
// would take the wrong entry off a stack shared by every lane, and a push without its message would
|
|
7
|
+
// leave an entry nothing can target.
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
// `--dir` points the pop at a lane's work tree; without it the pop lands in the current checkout.
|
|
9
|
+
// `--dir` points the command at a lane's work tree; without it, it acts on the current checkout.
|
|
11
10
|
const OPTIONS = { dir: { type: 'string' } } as const
|
|
12
11
|
|
|
13
12
|
interface ParsedValues {
|
|
@@ -20,12 +19,16 @@ interface Request {
|
|
|
20
19
|
dir: string | undefined
|
|
21
20
|
}
|
|
22
21
|
|
|
22
|
+
function usage(command: string): string {
|
|
23
|
+
return `Usage: josh ${command} "<message>" [--dir <path>]`
|
|
24
|
+
}
|
|
25
|
+
|
|
23
26
|
function read_arguments(argv: ReadonlyArray<string>): ParsedValues | undefined {
|
|
24
27
|
return cli_flags.arguments_of(argv, OPTIONS)
|
|
25
28
|
}
|
|
26
29
|
|
|
27
30
|
// The message is the sole positional and must be a non-empty string: an empty message matches every
|
|
28
|
-
// stash pushed without a message, which is exactly the ambiguity
|
|
31
|
+
// stash pushed without a message, which is exactly the ambiguity `stash:pop` exists to refuse.
|
|
29
32
|
function message_of(positionals: ReadonlyArray<string>): string | undefined {
|
|
30
33
|
if (positionals.length !== 1) return undefined
|
|
31
34
|
|
|
@@ -42,7 +45,7 @@ function to_request(parsed: ParsedValues): Request | undefined {
|
|
|
42
45
|
return { message, dir: parsed.values.dir }
|
|
43
46
|
}
|
|
44
47
|
|
|
45
|
-
const
|
|
48
|
+
const stash_args = { read_arguments, to_request, usage }
|
|
46
49
|
|
|
47
50
|
export type { Request }
|
|
48
|
-
export {
|
|
51
|
+
export { stash_args }
|