@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
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
|
+
}
|
|
@@ -10,7 +10,7 @@ import { git_spawn } from './git-spawn'
|
|
|
10
10
|
// **This table is the single list of what is resolved that way** — a file a person writes never
|
|
11
11
|
// belongs in it, because regenerating would discard that person's side of the merge. A conflict on any
|
|
12
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: `
|
|
13
|
+
// is exactly what its command writes: `tools/test/pure-files.ts` is not, so regenerating it would
|
|
14
14
|
// rewrite far more than the conflict.
|
|
15
15
|
|
|
16
16
|
interface RegeneratedFile {
|
|
@@ -21,7 +21,7 @@ interface RegeneratedFile {
|
|
|
21
21
|
const REGENERATED_FILES: ReadonlyArray<RegeneratedFile> = [
|
|
22
22
|
{
|
|
23
23
|
path: 'docs/josh-command-catalog.md',
|
|
24
|
-
command: ['pnpm', 'exec', 'tsx', '
|
|
24
|
+
command: ['pnpm', 'exec', 'tsx', 'tools/document/generate-catalog.ts'],
|
|
25
25
|
},
|
|
26
26
|
]
|
|
27
27
|
|
|
@@ -1,9 +1,9 @@
|
|
|
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
9
|
import { main_merge_regenerate } from './main-merge-regenerate'
|
|
@@ -30,8 +30,9 @@ import { main_merge_regenerate } from './main-merge-regenerate'
|
|
|
30
30
|
|
|
31
31
|
const SUCCESS_EXIT_CODE = 0
|
|
32
32
|
const FAILURE_EXIT_CODE = 1
|
|
33
|
-
const ARGV_OFFSET = 2
|
|
34
33
|
const COMMAND_NAME = 'main:merge'
|
|
34
|
+
const SPLIT_UNMEASURED =
|
|
35
|
+
'split notice: the diff could not be measured — run `pnpm josh split:assess`'
|
|
35
36
|
|
|
36
37
|
// git's default merge message carries no `#N`, so on an issue branch the `commit-msg` hook refuses
|
|
37
38
|
// it and leaves the index mid-merge. The number is read with the hook's
|
|
@@ -115,6 +116,25 @@ function failure_text(outcome: MergeOutcome): string | undefined {
|
|
|
115
116
|
return undefined
|
|
116
117
|
}
|
|
117
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
|
+
|
|
118
138
|
async function merge_default_branch(): Promise<number> {
|
|
119
139
|
const outcome = await merge()
|
|
120
140
|
const failure = failure_text(outcome)
|
|
@@ -127,6 +147,8 @@ async function merge_default_branch(): Promise<number> {
|
|
|
127
147
|
|
|
128
148
|
if ('branch' in outcome) console.info(outcome.branch)
|
|
129
149
|
|
|
150
|
+
await warn_over_split_guide()
|
|
151
|
+
|
|
130
152
|
return SUCCESS_EXIT_CODE
|
|
131
153
|
}
|
|
132
154
|
|
|
@@ -154,13 +176,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
154
176
|
}
|
|
155
177
|
}
|
|
156
178
|
|
|
157
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
158
|
-
process.exitCode = await run(argv)
|
|
159
|
-
}
|
|
160
|
-
|
|
161
179
|
const main_merge = { merge, run }
|
|
162
180
|
|
|
163
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
164
|
-
|
|
165
181
|
export { main_merge }
|
|
166
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 }
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { fileURLToPath } from 'node:url'
|
|
2
1
|
import { error_text } from '#scripts/lib/error-message'
|
|
3
2
|
import { git_stash } from './git-stash'
|
|
4
|
-
import {
|
|
3
|
+
import { stash_args, type Request } from './stash-args'
|
|
5
4
|
|
|
6
5
|
// `josh stash:pop "<message>"` — pop the stash whose message matches, and no other.
|
|
7
6
|
// The stash stack is shared by every working tree of the repository, so a
|
|
@@ -9,6 +8,8 @@ import { stash_pop_args, type Request } from './stash-pop-args'
|
|
|
9
8
|
// selector from the message and pops that entry alone; no match and more than one match are both
|
|
10
9
|
// refusals rather than a guess at which was meant.
|
|
11
10
|
|
|
11
|
+
const COMMAND = 'stash:pop'
|
|
12
|
+
|
|
12
13
|
const POPPED_VERDICT = 'popped'
|
|
13
14
|
const CONFLICTED_VERDICT = 'conflicted'
|
|
14
15
|
const NO_MATCH_VERDICT = 'no-match'
|
|
@@ -16,7 +17,6 @@ const AMBIGUOUS_VERDICT = 'ambiguous'
|
|
|
16
17
|
|
|
17
18
|
const SUCCESS_EXIT_CODE = 0
|
|
18
19
|
const FAILURE_EXIT_CODE = 1
|
|
19
|
-
const ARGV_OFFSET = 2
|
|
20
20
|
|
|
21
21
|
function report(verdict: string, detail: string, code: number): number {
|
|
22
22
|
console.info(verdict)
|
|
@@ -26,7 +26,7 @@ function report(verdict: string, detail: string, code: number): number {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
function refuse(): number {
|
|
29
|
-
console.error(
|
|
29
|
+
console.error(stash_args.usage(COMMAND))
|
|
30
30
|
|
|
31
31
|
return FAILURE_EXIT_CODE
|
|
32
32
|
}
|
|
@@ -73,11 +73,11 @@ function report_unknown(error: unknown): number {
|
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
76
|
-
const parsed =
|
|
76
|
+
const parsed = stash_args.read_arguments(argv)
|
|
77
77
|
|
|
78
78
|
if (parsed === undefined) return refuse()
|
|
79
79
|
|
|
80
|
-
const request =
|
|
80
|
+
const request = stash_args.to_request(parsed)
|
|
81
81
|
|
|
82
82
|
if (request === undefined) return refuse()
|
|
83
83
|
|
|
@@ -88,10 +88,6 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
92
|
-
process.exitCode = await run(argv)
|
|
93
|
-
}
|
|
94
|
-
|
|
95
91
|
const stash_pop_cli = {
|
|
96
92
|
AMBIGUOUS_VERDICT,
|
|
97
93
|
CONFLICTED_VERDICT,
|
|
@@ -100,6 +96,4 @@ const stash_pop_cli = {
|
|
|
100
96
|
run,
|
|
101
97
|
}
|
|
102
98
|
|
|
103
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
104
|
-
|
|
105
99
|
export { stash_pop_cli }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { stash_pop_cli } from './stash-pop-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh stash:pop` entry, kept apart from `stash-pop-cli.ts` because `latest-if-required-cli.ts`
|
|
6
|
+
// imports that one: a bundle is one file, so a main guard there would fire for every command that
|
|
7
|
+
// carries it (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = await stash_pop_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
2
|
+
import { git_stash } from './git-stash'
|
|
3
|
+
import { stash_args, type Request } from './stash-args'
|
|
4
|
+
|
|
5
|
+
// `josh stash:push "<message>"` — the one way a workflow sets its working tree aside, paired with
|
|
6
|
+
// `josh stash:pop "<message>"` that brings it back. Two rules fix what it takes:
|
|
7
|
+
//
|
|
8
|
+
// - **Untracked files go with it (`-u`).** Work in progress almost always includes a new, untracked
|
|
9
|
+
// `*.test.ts`; a stash that leaves it behind leaves it for the next `pnpm josh ms` to refuse.
|
|
10
|
+
// - **The observation ledger stays** — every path `observation_ledger.is_ledger_path` names, legacy
|
|
11
|
+
// ones included (`git_stash.STASHABLE_PATHSPEC`). A run appends its own lines to `.josh/observations/` and they
|
|
12
|
+
// ride on that run's commit; a stash would take them off the tree before the commit or the
|
|
13
|
+
// batch-end flush could see them.
|
|
14
|
+
//
|
|
15
|
+
// A tree with nothing outside the ledger to set aside pushes nothing and says `clean`, so a procedure
|
|
16
|
+
// can call it unconditionally and pop only after `stashed`.
|
|
17
|
+
|
|
18
|
+
const COMMAND = 'stash:push'
|
|
19
|
+
|
|
20
|
+
const STASHED_VERDICT = 'stashed'
|
|
21
|
+
const CLEAN_VERDICT = 'clean'
|
|
22
|
+
|
|
23
|
+
const SUCCESS_EXIT_CODE = 0
|
|
24
|
+
const FAILURE_EXIT_CODE = 1
|
|
25
|
+
|
|
26
|
+
function report(verdict: string, detail: string): number {
|
|
27
|
+
console.info(verdict)
|
|
28
|
+
console.error(detail)
|
|
29
|
+
|
|
30
|
+
return SUCCESS_EXIT_CODE
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function refuse(): number {
|
|
34
|
+
console.error(stash_args.usage(COMMAND))
|
|
35
|
+
|
|
36
|
+
return FAILURE_EXIT_CODE
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
type PushVerdict = typeof STASHED_VERDICT | typeof CLEAN_VERDICT
|
|
40
|
+
|
|
41
|
+
// The decision and the push without the printing, so a caller that chains a pop on `stashed`
|
|
42
|
+
// (`josh latest:if-required`) reads the verdict instead of parsing stdout.
|
|
43
|
+
async function set_aside(request: Request): Promise<PushVerdict> {
|
|
44
|
+
if (!(await git_stash.has_stashable_changes(request.dir))) return CLEAN_VERDICT
|
|
45
|
+
|
|
46
|
+
await git_stash.push(request.message, request.dir, git_stash.STASHABLE_PATHSPEC)
|
|
47
|
+
|
|
48
|
+
return STASHED_VERDICT
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function answer(request: Request): Promise<number> {
|
|
52
|
+
if ((await set_aside(request)) === CLEAN_VERDICT) {
|
|
53
|
+
return report(CLEAN_VERDICT, 'Nothing to stash.')
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return report(STASHED_VERDICT, `Stashed as "${request.message}".`)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
60
|
+
const parsed = stash_args.read_arguments(argv)
|
|
61
|
+
const request = parsed === undefined ? undefined : stash_args.to_request(parsed)
|
|
62
|
+
|
|
63
|
+
if (request === undefined) return refuse()
|
|
64
|
+
|
|
65
|
+
try {
|
|
66
|
+
return await answer(request)
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.error(error_text.message_of(error))
|
|
69
|
+
|
|
70
|
+
return FAILURE_EXIT_CODE
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const stash_push_cli = { CLEAN_VERDICT, STASHED_VERDICT, run, set_aside }
|
|
75
|
+
|
|
76
|
+
export { stash_push_cli }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { stash_push_cli } from './stash-push-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh stash:push` entry, kept apart from `stash-push-cli.ts` because `run-pause.ts` and
|
|
6
|
+
// `latest-if-required-cli.ts` import that one: a bundle is one file, so a main guard there would fire
|
|
7
|
+
// for every command that carries it (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = await stash_push_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { text } from 'node:stream/consumers'
|
|
3
|
-
import { fileURLToPath } from 'node:url'
|
|
4
1
|
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
5
2
|
import { lane_guard_policy, type LaneGuardMode } from '#scripts/lane/lane-guard-policy'
|
|
6
3
|
import { time_batch_guard, type GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
@@ -121,11 +118,6 @@ const notice_refusal_path = hook_decision.create_refusal_stamp(
|
|
|
121
118
|
).path
|
|
122
119
|
const { deny_envelope, load_environment_file, DISABLED_VALUES } = hook_decision
|
|
123
120
|
|
|
124
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
125
|
-
if (process.stdin.isTTY) hook_decision.report_no_payload('batch:guard')
|
|
126
|
-
else hook_decision.write_outcome(await text(process.stdin), batch_outcome)
|
|
127
|
-
}
|
|
128
|
-
|
|
129
121
|
export {
|
|
130
122
|
batch_outcome,
|
|
131
123
|
batch_refusal,
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { run_check } from './check-commit-message'
|
|
4
|
+
|
|
5
|
+
// The `josh check-commit-message` entry, kept apart from `check-commit-message.ts` because
|
|
6
|
+
// `main-merge.ts` imports that one: a bundle is one file, so a main guard there would fire for every
|
|
7
|
+
// command that carries it (joshuafolkken/kit#4186). The message file is read from `process.argv`.
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) process.exitCode = await run_check()
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
1
|
import { readFileSync } from 'node:fs'
|
|
3
2
|
import os from 'node:os'
|
|
4
3
|
import path from 'node:path'
|
|
5
|
-
import { fileURLToPath } from 'node:url'
|
|
6
4
|
import { git_command } from '#scripts/git/git-command'
|
|
7
5
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
8
6
|
|
|
@@ -122,16 +120,15 @@ async function check_commit_message(): Promise<CheckResult> {
|
|
|
122
120
|
}
|
|
123
121
|
}
|
|
124
122
|
|
|
125
|
-
|
|
123
|
+
// The `commit-msg` hook's run: the check's message, and a failure exit when it refused.
|
|
124
|
+
async function run_check(): Promise<number> {
|
|
126
125
|
const result = await check_commit_message()
|
|
127
126
|
|
|
128
127
|
console.info(result.message)
|
|
129
128
|
|
|
130
|
-
|
|
129
|
+
return result.success ? 0 : 1
|
|
131
130
|
}
|
|
132
131
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
export { check_commit_message, extract_issue_number, is_safe_commit_message_path }
|
|
132
|
+
export { check_commit_message, extract_issue_number, is_safe_commit_message_path, run_check }
|
|
136
133
|
|
|
137
134
|
export type { CheckResult }
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { existsSync } from 'node:fs'
|
|
3
3
|
import path from 'node:path'
|
|
4
|
-
import {
|
|
5
|
-
import { resolve_local_bin, resolve_package_bin } from '#scripts/build/local-bin'
|
|
4
|
+
import { resolve_local_bin } from '#scripts/build/local-bin'
|
|
6
5
|
import { ESLINT_EDIT_CACHE_FLAGS } from '#scripts/josh/josh-command-types'
|
|
7
6
|
import { json_value } from '#scripts/lib/json-value'
|
|
8
7
|
import { HOOK_PROCESS_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
8
|
+
import { eslint_daemon } from '#scripts/lint/eslint-daemon'
|
|
9
9
|
import { time_density_hook } from '#scripts/time-runtime/time-density-hook'
|
|
10
10
|
import { execa } from 'execa'
|
|
11
11
|
import { z } from 'zod'
|
|
@@ -83,12 +83,8 @@ const ESLINT_ARGUMENTS: ReadonlyArray<string> = [
|
|
|
83
83
|
// identical rather than merely similar. The config entry file is re-read per request; the modules it
|
|
84
84
|
// imports are not, which `plan_daemon_restart` below is the answer to. The daemon exits after 15
|
|
85
85
|
// minutes of inactivity.
|
|
86
|
-
const ESLINT_DAEMON =
|
|
86
|
+
const { ESLINT_DAEMON } = eslint_daemon
|
|
87
87
|
const DAEMON_RESTART = 'restart'
|
|
88
|
-
// The two shapes a flat config is built from here and in every consumer of this kit: the root
|
|
89
|
-
// `eslint.config.*` entry, and the rule modules under `eslint/` that it imports.
|
|
90
|
-
const ESLINT_CONFIG_DIR = 'eslint'
|
|
91
|
-
const ESLINT_CONFIG_ENTRY = /^eslint\.config\.[cm]?[jt]s$/u
|
|
92
88
|
|
|
93
89
|
// The problems eslint could not auto-fix are handed to the model verbatim from eslint's own stdout —
|
|
94
90
|
// its default formatter already prints the file, the `line:col`, and the rule name. A header names what the block is, since additionalContext arrives
|
|
@@ -104,11 +100,6 @@ const DIAGNOSTIC_TRUNCATION_NOTICE = '\n…(diagnostics truncated)'
|
|
|
104
100
|
// present.
|
|
105
101
|
const SECTION_SEPARATOR = '\n\n'
|
|
106
102
|
|
|
107
|
-
// Where this file sits inside the kit package. `eslint_d` is kit's dependency rather than the
|
|
108
|
-
// consumer's, and pnpm writes a `node_modules/.bin` shim only for a project's *direct* dependencies,
|
|
109
|
-
// so a consumer's project root cannot see it and this directory can.
|
|
110
|
-
const MODULE_DIRECTORY = path.dirname(fileURLToPath(import.meta.url))
|
|
111
|
-
|
|
112
103
|
interface FormatCommand {
|
|
113
104
|
bin: string
|
|
114
105
|
command_arguments: ReadonlyArray<string>
|
|
@@ -226,10 +217,7 @@ const DAEMON_BINS: ReadonlySet<string> = new Set([ESLINT_BIN, ESLINT_DAEMON])
|
|
|
226
217
|
function resolve_daemon_cli(bin: string, project_root: string): string | undefined {
|
|
227
218
|
if (!DAEMON_BINS.has(bin)) return undefined
|
|
228
219
|
|
|
229
|
-
return (
|
|
230
|
-
resolve_package_bin(MODULE_DIRECTORY, ESLINT_DAEMON, ESLINT_DAEMON) ??
|
|
231
|
-
resolve_package_bin(project_root, ESLINT_DAEMON, ESLINT_DAEMON)
|
|
232
|
-
)
|
|
220
|
+
return eslint_daemon.resolve_daemon_cli(project_root)
|
|
233
221
|
}
|
|
234
222
|
|
|
235
223
|
// Only the config *entry file* is re-read per request: ESLint cache-busts `eslint.config.js` by
|
|
@@ -238,13 +226,6 @@ function resolve_daemon_cli(bin: string, project_root: string): string | undefin
|
|
|
238
226
|
// and then any source file, and it would be auto-fixed against the pre-edit rules for as long as the
|
|
239
227
|
// daemon lives — an author testing a rule change would read that as the rule being broken. Restarting
|
|
240
228
|
// after an edit to a config input is what makes the whole config current, not just its first file.
|
|
241
|
-
function is_eslint_config_input(relative_path: string): boolean {
|
|
242
|
-
return (
|
|
243
|
-
relative_path.split(path.sep)[0] === ESLINT_CONFIG_DIR ||
|
|
244
|
-
ESLINT_CONFIG_ENTRY.test(relative_path)
|
|
245
|
-
)
|
|
246
|
-
}
|
|
247
|
-
|
|
248
229
|
function plan_daemon_restart(
|
|
249
230
|
file_path: string,
|
|
250
231
|
project_root: string,
|
|
@@ -253,7 +234,7 @@ function plan_daemon_restart(
|
|
|
253
234
|
|
|
254
235
|
if (
|
|
255
236
|
relative === undefined ||
|
|
256
|
-
!
|
|
237
|
+
!eslint_daemon.is_config_input(relative) ||
|
|
257
238
|
resolve_daemon_cli(ESLINT_DAEMON, project_root) === undefined
|
|
258
239
|
) {
|
|
259
240
|
return []
|
|
@@ -392,8 +373,11 @@ async function format_edited_file(
|
|
|
392
373
|
...plan_commands(file_path, project_root),
|
|
393
374
|
...plan_daemon_restart(file_path, project_root),
|
|
394
375
|
]
|
|
376
|
+
const daemon_before = eslint_daemon.read_record(project_root)
|
|
395
377
|
const unfixed = await collect_unfixed(plan, runner, project_root)
|
|
396
378
|
|
|
379
|
+
eslint_daemon.remember_started(project_root, daemon_before)
|
|
380
|
+
|
|
397
381
|
return format_diagnostics(unfixed === '' ? undefined : unfixed)
|
|
398
382
|
}
|
|
399
383
|
|