@joshuafolkken/kit 1.1514.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +5 -5
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +53 -6
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +30 -7
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +8 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +27 -24
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-write.ts +67 -29
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +2 -2
- package/scripts/git/main-merge.ts +25 -9
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +0 -8
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +1 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +2 -10
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +157 -158
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +103 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +2 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +81 -15
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +8 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +80 -2
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +9 -1
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +82 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +116 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +207 -265
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +6 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +34 -8
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +42 -24
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +61 -149
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +97 -10
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +4 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { git_stash } from '#scripts/git/stash/git-stash'
|
|
4
|
+
import { stash_pop_cli } from '#scripts/git/stash/stash-pop-cli'
|
|
5
|
+
import { stash_push_cli } from '#scripts/git/stash/stash-push-cli'
|
|
6
|
+
import { resolve_spawn_exit } from '#scripts/lib/spawn-exit'
|
|
7
|
+
import { execaSync } from 'execa'
|
|
8
|
+
import { latest_scope_cli } from './latest-scope-cli'
|
|
9
|
+
|
|
10
|
+
// `josh latest:if-required` — the dependency update a run owes, in one call.
|
|
11
|
+
//
|
|
12
|
+
// `latest:scope` decides; on `required` the tree is set aside, `josh latest` runs, and the stash is
|
|
13
|
+
// popped by its message. Four procedures used to spell that sequence out, and each copy was one more
|
|
14
|
+
// place to drift from the others. `josh latest` itself stays a fixed `sh -c` chain that takes no
|
|
15
|
+
// arguments, so the conditional form is its own command rather than a flag on it.
|
|
16
|
+
//
|
|
17
|
+
// **Every failure leaves the stash where it is.** A failed update can leave `package.json` half
|
|
18
|
+
// rewritten, and a conflicted pop is a stash git keeps — popping onto either would bury the work
|
|
19
|
+
// under conflicts, so the command stops with the message to pop it by.
|
|
20
|
+
|
|
21
|
+
const ARGV_OFFSET = 2
|
|
22
|
+
const USAGE = 'Usage: josh latest:if-required'
|
|
23
|
+
const STASH_MESSAGE = 'josh latest'
|
|
24
|
+
const LATEST_COMMAND: ReadonlyArray<string> = ['josh', 'latest']
|
|
25
|
+
const PNPM = 'pnpm'
|
|
26
|
+
const SUCCESS_EXIT_CODE = 0
|
|
27
|
+
const FAILURE_EXIT_CODE = 1
|
|
28
|
+
const KEPT_STASH_HINT = `the stash is kept — pop it with \`pnpm josh stash:pop "${STASH_MESSAGE}"\``
|
|
29
|
+
// A conflicted pop has already applied the stash, so popping it again would apply it twice.
|
|
30
|
+
const CONFLICTED_STASH_HINT = `the stash "${STASH_MESSAGE}" is applied and still kept — resolve the conflicts, then drop it`
|
|
31
|
+
|
|
32
|
+
function run_latest(): number {
|
|
33
|
+
const result = execaSync(PNPM, LATEST_COMMAND, { stdio: 'inherit', reject: false })
|
|
34
|
+
|
|
35
|
+
return resolve_spawn_exit(PNPM, result)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function stop(reason: string): number {
|
|
39
|
+
console.error(`latest:if-required stopped: ${reason}`)
|
|
40
|
+
|
|
41
|
+
return FAILURE_EXIT_CODE
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function refuse(): number {
|
|
45
|
+
console.error(USAGE)
|
|
46
|
+
|
|
47
|
+
return FAILURE_EXIT_CODE
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function restore(): Promise<number> {
|
|
51
|
+
const code = await stash_pop_cli.run([STASH_MESSAGE])
|
|
52
|
+
|
|
53
|
+
if (code !== SUCCESS_EXIT_CODE) return stop(`the pop failed — ${KEPT_STASH_HINT}`)
|
|
54
|
+
if (await git_stash.has_conflict()) return stop(`the pop conflicted — ${CONFLICTED_STASH_HINT}`)
|
|
55
|
+
|
|
56
|
+
return SUCCESS_EXIT_CODE
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function update(): Promise<number> {
|
|
60
|
+
const verdict = await stash_push_cli.set_aside({ message: STASH_MESSAGE, dir: undefined })
|
|
61
|
+
const is_stashed = verdict === stash_push_cli.STASHED_VERDICT
|
|
62
|
+
const code = run_latest()
|
|
63
|
+
|
|
64
|
+
if (code !== SUCCESS_EXIT_CODE) {
|
|
65
|
+
return stop(is_stashed ? `josh latest failed — ${KEPT_STASH_HINT}` : 'josh latest failed')
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return is_stashed ? await restore() : SUCCESS_EXIT_CODE
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// The scope on stdout and its reason on stderr, the split `latest:scope` prints in, so the log
|
|
72
|
+
// says why the update ran or did not.
|
|
73
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
74
|
+
if (argv.length > 0) return refuse()
|
|
75
|
+
|
|
76
|
+
const decision = latest_scope_cli.scope_decision()
|
|
77
|
+
|
|
78
|
+
console.info(decision.scope)
|
|
79
|
+
console.error(decision.reason)
|
|
80
|
+
if (decision.scope === latest_scope_cli.SKIPPED_SCOPE) return SUCCESS_EXIT_CODE
|
|
81
|
+
|
|
82
|
+
return await update()
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
86
|
+
process.exitCode = await run(argv)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const latest_if_required_cli = { run, STASH_MESSAGE }
|
|
90
|
+
|
|
91
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
92
|
+
|
|
93
|
+
export { latest_if_required_cli }
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { latest_lane_guard } from './latest-lane-guard'
|
|
4
|
+
|
|
5
|
+
// The `josh latest:guard` entry, kept apart from `latest-lane-guard.ts` because `latest:scope` 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). The guard takes no arguments and sets its own exit code.
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) latest_lane_guard.main()
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { lane_paths, type LaneEnvironment } from '#scripts/lane/lane-paths'
|
|
4
2
|
|
|
5
3
|
// Refuse a dependency update inside a lane.
|
|
@@ -44,6 +42,4 @@ const latest_lane_guard = {
|
|
|
44
42
|
main,
|
|
45
43
|
}
|
|
46
44
|
|
|
47
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) main()
|
|
48
|
-
|
|
49
45
|
export { latest_lane_guard }
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { latest_lane_guard } from './latest-lane-guard'
|
|
4
2
|
import { latest_stamp, type LatestStamp } from './latest-stamp'
|
|
5
3
|
|
|
@@ -14,7 +12,6 @@ import { latest_stamp, type LatestStamp } from './latest-stamp'
|
|
|
14
12
|
// paths*, and this decides from *when the last run happened*. The flag parsing and the printing are the small half;
|
|
15
13
|
// the read of the diff is what that module exists for, and this command never makes one.
|
|
16
14
|
|
|
17
|
-
const ARGV_OFFSET = 2
|
|
18
15
|
const USAGE = 'Usage: josh latest:scope [--record] [--json]'
|
|
19
16
|
const JSON_KEY = 'scope'
|
|
20
17
|
const JSON_FLAG = '--json'
|
|
@@ -124,10 +121,6 @@ function run(argv: ReadonlyArray<string>): number {
|
|
|
124
121
|
return 0
|
|
125
122
|
}
|
|
126
123
|
|
|
127
|
-
function main(argv: ReadonlyArray<string>): void {
|
|
128
|
-
process.exitCode = run(argv)
|
|
129
|
-
}
|
|
130
|
-
|
|
131
124
|
const latest_scope_cli = {
|
|
132
125
|
decide,
|
|
133
126
|
JSON_KEY,
|
|
@@ -140,6 +133,4 @@ const latest_scope_cli = {
|
|
|
140
133
|
USAGE,
|
|
141
134
|
}
|
|
142
135
|
|
|
143
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
|
|
144
|
-
|
|
145
136
|
export { latest_scope_cli }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { latest_scope_cli } from './latest-scope-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh latest:scope` entry, kept apart from `latest-scope-cli.ts` because other modules import
|
|
6
|
+
// that one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = latest_scope_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { readFileSync, writeFileSync } from 'node:fs'
|
|
8
8
|
import { fileURLToPath } from 'node:url'
|
|
9
|
+
import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
|
|
9
10
|
import { file_reader } from '#scripts/lib/read-file'
|
|
10
11
|
import { lockfile_overrides } from '#scripts/overrides/lockfile-overrides'
|
|
11
12
|
import { overrides_files } from '#scripts/overrides/overrides-files'
|
|
@@ -16,7 +17,6 @@ import { latest_regression, type VersionRegression } from './latest-regression'
|
|
|
16
17
|
import { playwright_browsers } from './playwright-browsers'
|
|
17
18
|
import { safe_chain_version_update } from './safe-chain-version-update'
|
|
18
19
|
|
|
19
|
-
const PACKAGE_JSON_PATH = 'package.json'
|
|
20
20
|
const LOCKFILE_PATH = 'pnpm-lock.yaml'
|
|
21
21
|
|
|
22
22
|
interface TreeSnapshot {
|
|
@@ -44,7 +44,7 @@ function run_update_stages(stages: Array<Array<string>>): number {
|
|
|
44
44
|
|
|
45
45
|
function take_snapshot(): TreeSnapshot {
|
|
46
46
|
return {
|
|
47
|
-
package_json: readFileSync(
|
|
47
|
+
package_json: readFileSync(PACKAGE_JSON, 'utf8'),
|
|
48
48
|
lockfile: file_reader.read_file_or_empty(LOCKFILE_PATH),
|
|
49
49
|
}
|
|
50
50
|
}
|
|
@@ -54,7 +54,7 @@ function take_snapshot(): TreeSnapshot {
|
|
|
54
54
|
// "the latest release is <older>". The captured lockfile still carries the resolved URL and
|
|
55
55
|
// integrity, which installs fine.
|
|
56
56
|
function restore_snapshot(snapshot: TreeSnapshot): void {
|
|
57
|
-
writeFileSync(
|
|
57
|
+
writeFileSync(PACKAGE_JSON, snapshot.package_json)
|
|
58
58
|
if (snapshot.lockfile.length > 0) writeFileSync(LOCKFILE_PATH, snapshot.lockfile)
|
|
59
59
|
}
|
|
60
60
|
|
|
@@ -71,7 +71,7 @@ function report_kept_back(regressions: ReadonlyArray<VersionRegression>): void {
|
|
|
71
71
|
const PNPM_UPDATE_ALL_TIERS = ['pnpm', 'update']
|
|
72
72
|
|
|
73
73
|
function build_update_commands(): Array<Array<string>> {
|
|
74
|
-
const content = readFileSync(
|
|
74
|
+
const content = readFileSync(PACKAGE_JSON, 'utf8')
|
|
75
75
|
const latest = overrides_check.build_update_command(
|
|
76
76
|
overrides_files.read_current_overrides(),
|
|
77
77
|
content,
|
|
@@ -87,7 +87,7 @@ interface UpdateOutcome {
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
function find_regressions_after_update(snapshot: TreeSnapshot): Array<VersionRegression> {
|
|
90
|
-
const after = readFileSync(
|
|
90
|
+
const after = readFileSync(PACKAGE_JSON, 'utf8')
|
|
91
91
|
|
|
92
92
|
return latest_regression.find_regressions(snapshot.package_json, after)
|
|
93
93
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { json_value } from '#scripts/lib/json-value'
|
|
2
|
-
import { FETCH_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
3
|
-
import { migrate_logic } from '#scripts/registry-migration/migrate-logic'
|
|
2
|
+
import { COMMAND_TIMEOUT_MS, FETCH_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
4
3
|
import { execaSync } from 'execa'
|
|
5
4
|
import semver from 'semver'
|
|
6
5
|
import { z } from 'zod'
|
|
@@ -18,8 +17,19 @@ const SCOPE_SEPARATOR = '/'
|
|
|
18
17
|
const ENCODED_SCOPE_SEPARATOR = '%2f'
|
|
19
18
|
const SCOPE_PATTERN = /^@[^/]+(?=\/)/u
|
|
20
19
|
const SCOPE_REGISTRY_SUFFIX = ':registry'
|
|
20
|
+
const GITHUB_REGISTRY_HOST = 'npm.pkg.github.com'
|
|
21
|
+
const PNPM = 'pnpm'
|
|
22
|
+
const JSON_FLAG = '--json'
|
|
23
|
+
const FAILURE_EXIT_CODE = 1
|
|
21
24
|
const github_scopes = new Map<string, boolean>()
|
|
22
25
|
|
|
26
|
+
type ViewFormat = 'json' | 'text'
|
|
27
|
+
|
|
28
|
+
interface ViewAnswer {
|
|
29
|
+
exit_code: number
|
|
30
|
+
stdout: string
|
|
31
|
+
}
|
|
32
|
+
|
|
23
33
|
// The version commands are synchronous end to end and exported that way to consumers, so the
|
|
24
34
|
// request runs in a child Node process rather than turning the whole chain async. Node's own
|
|
25
35
|
// `fetch` needs no external binary, and a non-2xx answer exits non-zero so it reads as "no answer".
|
|
@@ -53,19 +63,30 @@ function read_packument(package_name: string, accept: string): unknown {
|
|
|
53
63
|
return json_value.parse_or_undefined(result.stdout)
|
|
54
64
|
}
|
|
55
65
|
|
|
56
|
-
//
|
|
57
|
-
|
|
66
|
+
// The host is compared, not searched for, so a registry carrying it only in its path is not GitHub.
|
|
67
|
+
function is_github_registry(value: string): boolean {
|
|
68
|
+
try {
|
|
69
|
+
const url = new URL(value)
|
|
70
|
+
|
|
71
|
+
return url.protocol === 'https:' && url.hostname === GITHUB_REGISTRY_HOST
|
|
72
|
+
} catch {
|
|
73
|
+
return false
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Whether this checkout installs the package's scope from GitHub Packages, read with
|
|
78
|
+
// `pnpm config get` (project `.npmrc` over user `~/.npmrc`). The two
|
|
58
79
|
// registries are published by parallel jobs and can drift, so a consumer routed to GitHub Packages
|
|
59
80
|
// keeps reading it: public npm could otherwise offer a release its registry does not carry yet.
|
|
60
81
|
// Memoized per scope — kit and app-kit share one, and one report asks for both packages.
|
|
61
82
|
function is_github_scope(scope: string): boolean {
|
|
62
83
|
const is_cached_github = github_scopes.get(scope)
|
|
63
84
|
if (is_cached_github !== undefined) return is_cached_github
|
|
64
|
-
const result = execaSync(
|
|
85
|
+
const result = execaSync(PNPM, ['config', 'get', `${scope}${SCOPE_REGISTRY_SUFFIX}`], {
|
|
65
86
|
reject: false,
|
|
66
87
|
timeout: FETCH_TIMEOUT_MS,
|
|
67
88
|
})
|
|
68
|
-
const is_github = result.exitCode === 0 &&
|
|
89
|
+
const is_github = result.exitCode === 0 && is_github_registry(result.stdout.trim())
|
|
69
90
|
|
|
70
91
|
github_scopes.set(scope, is_github)
|
|
71
92
|
|
|
@@ -106,6 +127,21 @@ function has_public_version(package_name: string, version: string): boolean {
|
|
|
106
127
|
return parsed.success && parsed.data.time[version] !== undefined
|
|
107
128
|
}
|
|
108
129
|
|
|
130
|
+
// A `pnpm view` answer, for a question that has to see what the package manager sees: the
|
|
131
|
+
// checkout's own registry routing, and safe-chain's minimum-age filter when it is shimmed on PATH.
|
|
132
|
+
// `pnpm` rather than `npm`, because npm refuses to run at all inside a project whose
|
|
133
|
+
// `devEngines.packageManager` names pnpm with an `onFail` other than `"warn"` / `"ignore"` (kit
|
|
134
|
+
// ships `"download"`), failing with EBADDEVENGINES instead of answering.
|
|
135
|
+
function view(spec: string, field: string, format: ViewFormat = 'text'): ViewAnswer {
|
|
136
|
+
const format_arguments = format === 'json' ? [JSON_FLAG] : []
|
|
137
|
+
const result = execaSync(PNPM, ['view', spec, field, ...format_arguments], {
|
|
138
|
+
reject: false,
|
|
139
|
+
timeout: COMMAND_TIMEOUT_MS,
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
return { exit_code: result.exitCode ?? FAILURE_EXIT_CODE, stdout: result.stdout }
|
|
143
|
+
}
|
|
144
|
+
|
|
109
145
|
// The version itself, or nothing when it is not exactly a semver version.
|
|
110
146
|
function valid_version(value: string): string | undefined {
|
|
111
147
|
return version_schema.safeParse(value).success ? value : undefined
|
|
@@ -117,6 +153,8 @@ const npm_registry = {
|
|
|
117
153
|
read_latest,
|
|
118
154
|
read_release_times,
|
|
119
155
|
valid_version,
|
|
156
|
+
view,
|
|
120
157
|
}
|
|
121
158
|
|
|
122
159
|
export { npm_registry }
|
|
160
|
+
export type { ViewAnswer }
|
|
@@ -9,8 +9,8 @@ import { existsSync, readFileSync } from 'node:fs'
|
|
|
9
9
|
import path from 'node:path'
|
|
10
10
|
import { fileURLToPath } from 'node:url'
|
|
11
11
|
import { adopt_toolkits } from '#scripts/adopt/adopt-toolkits'
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
12
|
+
import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
|
|
13
|
+
import { npm_registry } from './npm-registry'
|
|
14
14
|
import { peer_floor } from './peer-floor'
|
|
15
15
|
import {
|
|
16
16
|
publishable_range,
|
|
@@ -19,7 +19,6 @@ import {
|
|
|
19
19
|
type RangeProbe,
|
|
20
20
|
} from './publishable-range'
|
|
21
21
|
|
|
22
|
-
const PACKAGE_JSON_PATH = 'package.json'
|
|
23
22
|
const FAILURE_EXIT_CODE = 1
|
|
24
23
|
const NODE_MODULES = 'node_modules'
|
|
25
24
|
|
|
@@ -27,18 +26,8 @@ const NODE_MODULES = 'node_modules'
|
|
|
27
26
|
// managers on PATH, so the answer comes back already filtered by the same minimum-age policy a
|
|
28
27
|
// consumer installs under. A plain fetch would read the unfiltered registry and pass a range no
|
|
29
28
|
// consumer can resolve — the exact blind spot this guard exists to close.
|
|
30
|
-
//
|
|
31
|
-
// `pnpm view` rather than `npm view` because npm refuses to run at all inside a project whose
|
|
32
|
-
// `devEngines.packageManager` names pnpm with an `onFail` other than `"warn"` / `"ignore"` (kit
|
|
33
|
-
// ships `"download"`, which npm refuses on just the same), failing every probe with
|
|
34
|
-
// EBADDEVENGINES instead of answering. Both are shimmed, so the filtered view is preserved.
|
|
35
29
|
function probe_range(name: string, range: string): ProbeResult {
|
|
36
|
-
|
|
37
|
-
reject: false,
|
|
38
|
-
timeout: COMMAND_TIMEOUT_MS,
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
return { exit_code: result.exitCode ?? FAILURE_EXIT_CODE, stdout: result.stdout }
|
|
30
|
+
return npm_registry.view(`${name}@${range}`, 'version')
|
|
42
31
|
}
|
|
43
32
|
|
|
44
33
|
function report(violations: ReadonlyArray<PublishedRange>, total: number): number {
|
|
@@ -90,14 +79,14 @@ function check_peer_floors(
|
|
|
90
79
|
function read_installed_toolkit_manifests(project_root: string): Array<string> {
|
|
91
80
|
return adopt_toolkits
|
|
92
81
|
.all_declared_toolkits(project_root)
|
|
93
|
-
.map((package_name) => path.join(project_root, NODE_MODULES, package_name,
|
|
82
|
+
.map((package_name) => path.join(project_root, NODE_MODULES, package_name, PACKAGE_JSON))
|
|
94
83
|
.filter((manifest_path) => existsSync(manifest_path))
|
|
95
84
|
.map((manifest_path) => readFileSync(manifest_path, 'utf8'))
|
|
96
85
|
}
|
|
97
86
|
|
|
98
87
|
// Both checks always run, so one invocation reports everything there is to fix.
|
|
99
88
|
function main(): void {
|
|
100
|
-
const package_json_content = readFileSync(
|
|
89
|
+
const package_json_content = readFileSync(PACKAGE_JSON, 'utf8')
|
|
101
90
|
const range_exit_code = check(package_json_content, probe_range)
|
|
102
91
|
const toolkit_json_contents = read_installed_toolkit_manifests(process.cwd())
|
|
103
92
|
const peer_exit_code = check_peer_floors(package_json_content, toolkit_json_contents)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
|
+
import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
|
|
3
4
|
import { yaml_document } from '#scripts/lib/yaml-document'
|
|
4
5
|
import semver from 'semver'
|
|
5
6
|
import { z } from 'zod'
|
|
@@ -20,7 +21,6 @@ const workspace_age_schema = z.object({ minimumReleaseAge: z.number().int().nonn
|
|
|
20
21
|
// A version → ISO publish date map, the shape both the registry and the GitHub Packages API are
|
|
21
22
|
// reduced to before the aged-version selection runs.
|
|
22
23
|
const release_times_schema = z.record(z.string(), z.string())
|
|
23
|
-
const MS_PER_MINUTE = 60_000
|
|
24
24
|
|
|
25
25
|
function parse_workspace(workspace_content: string): unknown {
|
|
26
26
|
try {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
|
|
1
2
|
import semver from 'semver'
|
|
2
3
|
import { release_age } from './release-age'
|
|
3
4
|
|
|
@@ -18,7 +19,6 @@ import { release_age } from './release-age'
|
|
|
18
19
|
// which is why this explanation is attached there and nowhere else.
|
|
19
20
|
|
|
20
21
|
const MINUTES_PER_HOUR = 60
|
|
21
|
-
const MS_PER_MINUTE = 60_000
|
|
22
22
|
const HOLD_LABEL = 'Held:'
|
|
23
23
|
|
|
24
24
|
// Whether `latest` is itself inside the window — the precondition for a hold existing at all. Without
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { file_reader } from '#scripts/lib/read-file'
|
|
3
|
+
import { yaml_document } from '#scripts/lib/yaml-document'
|
|
4
|
+
import { z } from 'zod'
|
|
5
|
+
import { release_age } from './release-age'
|
|
6
|
+
|
|
7
|
+
// The release-age window a workspace declares — its minutes and the packages exempt from it. This is
|
|
8
|
+
// the one reading every mirror of the window derives from: Safe Chain's `.aikido` and Dependabot's
|
|
9
|
+
// `cooldown` both take it from here rather than parsing `pnpm-workspace.yaml` themselves.
|
|
10
|
+
const WORKSPACE_FILE = 'pnpm-workspace.yaml'
|
|
11
|
+
const exclusions_schema = z.object({ minimumReleaseAgeExclude: z.array(z.string()).optional() })
|
|
12
|
+
|
|
13
|
+
// The window a project without a declared one is held to, in minutes (three days). kit's own
|
|
14
|
+
// `pnpm-workspace.yaml` declares the same value.
|
|
15
|
+
const DEFAULT_RELEASE_AGE_MINUTES = 4320
|
|
16
|
+
|
|
17
|
+
interface ReleaseWindow {
|
|
18
|
+
minutes: number | undefined
|
|
19
|
+
exclusions: ReadonlyArray<string>
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function parse_release_window(workspace: string): ReleaseWindow {
|
|
23
|
+
const exclusions = exclusions_schema.parse(yaml_document.parse_yaml(workspace))
|
|
24
|
+
|
|
25
|
+
return {
|
|
26
|
+
minutes: release_age.parse_declared_minimum_release_age(workspace),
|
|
27
|
+
exclusions: exclusions.minimumReleaseAgeExclude ?? [],
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// An absent workspace file reads as an empty one: no declared window and no exclusions.
|
|
32
|
+
function read_release_window(root: string): ReleaseWindow {
|
|
33
|
+
return parse_release_window(file_reader.read_file_or_empty(path.join(root, WORKSPACE_FILE)))
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const release_window = { parse_release_window, read_release_window }
|
|
37
|
+
|
|
38
|
+
export { DEFAULT_RELEASE_AGE_MINUTES, release_window, type ReleaseWindow }
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { json_value } from '#scripts/lib/json-value'
|
|
4
|
+
import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
|
|
4
5
|
import { package_version_schema } from '#scripts/lib/schemas'
|
|
5
6
|
|
|
6
|
-
const PACKAGE_JSON = 'package.json'
|
|
7
7
|
// Scripts live two levels under the package root (scripts/<group>/<file>.ts), so the running
|
|
8
8
|
// binary's own package.json is reached by walking up twice from the script directory.
|
|
9
9
|
const SCRIPT_DEPTH_FROM_ROOT = ['..', '..'] as const
|
|
@@ -1,20 +1,15 @@
|
|
|
1
|
-
import { COMMAND_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
2
1
|
import { ci_installer_pin } from '#scripts/safe-chain/ci-installer-pin'
|
|
3
2
|
import { npm_registry } from '#scripts/version/npm-registry'
|
|
4
|
-
import { execaSync } from 'execa'
|
|
5
3
|
|
|
6
4
|
const SAFE_CHAIN_PKG = '@aikidosec/safe-chain'
|
|
7
5
|
|
|
8
6
|
// The registry's answer is trusted only as an exact semver version: it ends up in workflow files and
|
|
9
7
|
// in the installer URL.
|
|
10
8
|
function fetch_latest_version(): string | undefined {
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
timeout: COMMAND_TIMEOUT_MS,
|
|
14
|
-
})
|
|
15
|
-
if (result.exitCode !== 0 || !result.stdout) return undefined
|
|
9
|
+
const answer = npm_registry.view(SAFE_CHAIN_PKG, 'version')
|
|
10
|
+
if (answer.exit_code !== 0 || !answer.stdout) return undefined
|
|
16
11
|
|
|
17
|
-
return npm_registry.valid_version(
|
|
12
|
+
return npm_registry.valid_version(answer.stdout.trim())
|
|
18
13
|
}
|
|
19
14
|
|
|
20
15
|
// The hash-verified installer pinned in the workflows is the one place a safe-chain release is
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import path from 'node:path'
|
|
2
2
|
import { json_value } from '#scripts/lib/json-value'
|
|
3
|
-
import {
|
|
3
|
+
import { package_manifest } from '#scripts/lib/package-manifest'
|
|
4
4
|
import { package_version_schema, pnpm_ls_global_schema } from '#scripts/lib/schemas'
|
|
5
5
|
import { execaSync } from 'execa'
|
|
6
6
|
|
|
7
7
|
const NODE_MODULES = 'node_modules'
|
|
8
|
-
const PACKAGE_JSON = 'package.json'
|
|
9
8
|
|
|
10
9
|
// Build the `pnpm ls -g --json <package>` arguments for the package being checked.
|
|
11
10
|
function build_pnpm_ls_arguments(package_name: string): Array<string> {
|
|
@@ -21,40 +20,25 @@ function parse_global_version(stdout: string, package_name: string): string | un
|
|
|
21
20
|
return parsed.data[0]?.dependencies?.[package_name]?.version
|
|
22
21
|
}
|
|
23
22
|
|
|
24
|
-
// Read the project-local version from a node_modules package.json string. Undefined when the
|
|
25
|
-
// file is missing (raw is undefined) or malformed.
|
|
26
|
-
function parse_project_version(raw: string | undefined): string | undefined {
|
|
27
|
-
if (raw === undefined) return undefined
|
|
28
|
-
const parsed = package_version_schema.safeParse(json_value.parse_or_undefined(raw))
|
|
29
|
-
|
|
30
|
-
return parsed.success ? parsed.data.version : undefined
|
|
31
|
-
}
|
|
32
|
-
|
|
33
23
|
function read_global_version(package_name: string): string | undefined {
|
|
34
24
|
const result = execaSync('pnpm', build_pnpm_ls_arguments(package_name), { reject: false })
|
|
35
25
|
|
|
36
26
|
return parse_global_version(result.stdout, package_name)
|
|
37
27
|
}
|
|
38
28
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
|
|
29
|
+
// Read the project-local version from <cwd>/node_modules/<package>/package.json. Undefined when the
|
|
30
|
+
// file is missing or malformed.
|
|
43
31
|
function read_project_version(cwd: string, package_name: string): string | undefined {
|
|
44
|
-
const
|
|
45
|
-
const raw = file_reader.read_optional(package_path)
|
|
32
|
+
const package_directory = path.join(cwd, NODE_MODULES, package_name)
|
|
46
33
|
|
|
47
|
-
return
|
|
34
|
+
return package_manifest.read_manifest_if_valid(package_directory, package_version_schema)?.version
|
|
48
35
|
}
|
|
49
36
|
|
|
50
37
|
// Read the current project's own declared version from <cwd>/package.json. This is the version
|
|
51
38
|
// that `josh bump` increments — distinct from read_project_version, which reads the installed kit
|
|
52
39
|
// package version under node_modules.
|
|
53
40
|
function read_workspace_version(cwd: string): string | undefined {
|
|
54
|
-
|
|
55
|
-
const raw = file_reader.read_optional(package_path)
|
|
56
|
-
|
|
57
|
-
return parse_project_version(raw)
|
|
41
|
+
return package_manifest.read_manifest_if_valid(cwd, package_version_schema)?.version
|
|
58
42
|
}
|
|
59
43
|
|
|
60
44
|
// `format_project_version_line` / `project_version_line` lived here and formatted
|
|
@@ -67,15 +51,9 @@ function read_workspace_version(cwd: string): string | undefined {
|
|
|
67
51
|
const version_targets = {
|
|
68
52
|
build_pnpm_ls_arguments,
|
|
69
53
|
parse_global_version,
|
|
70
|
-
parse_project_version,
|
|
71
54
|
read_global_version,
|
|
72
55
|
read_project_version,
|
|
73
|
-
project_package_path,
|
|
74
56
|
read_workspace_version,
|
|
75
|
-
// The manifest's filename. Exported rather than re-declared in each of `josh release`'s two
|
|
76
|
-
// halves: the module that already owns "where the project's manifest is"
|
|
77
|
-
// is where the name belongs.
|
|
78
|
-
PACKAGE_JSON,
|
|
79
57
|
}
|
|
80
58
|
|
|
81
59
|
export { version_targets }
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
# The local composite actions pin actions of their own, and Dependabot reads only the directories
|
|
4
|
+
# it is given — `/` covers `.github/workflows` and no `.github/actions/*/action.yml`.
|
|
5
|
+
- package-ecosystem: 'github-actions'
|
|
6
|
+
directories:
|
|
7
|
+
- '/'
|
|
8
|
+
- '/.github/actions/*'
|
|
9
|
+
schedule:
|
|
10
|
+
interval: 'weekly'
|
|
11
|
+
cooldown:
|
|
12
|
+
default-days: 3
|
|
13
|
+
# Version updates are disabled: `josh latest` runs at the start of every fullrun / halfrun /
|
|
14
|
+
# queue and already bumps npm dependencies to latest, so Dependabot's weekly PRs only duplicate
|
|
15
|
+
# it and were being closed unmerged after consuming a full CI run. `open-pull-requests-limit: 0`
|
|
16
|
+
# disables version updates only — security update PRs "are not subject to this limit and do not
|
|
17
|
+
# count toward it" (GitHub's Dependabot options reference), so an advisory still opens a PR,
|
|
18
|
+
# which is the one case `josh latest` does not cover on its own. That fallback needs Dependabot
|
|
19
|
+
# security updates enabled on the repository (Settings > Advanced Security); without it this file
|
|
20
|
+
# leaves no npm Dependabot PRs at all. See joshuafolkken/kit#803.
|
|
21
|
+
- package-ecosystem: 'npm'
|
|
22
|
+
directory: '/'
|
|
23
|
+
schedule:
|
|
24
|
+
interval: 'weekly'
|
|
25
|
+
open-pull-requests-limit: 0
|
|
26
|
+
cooldown:
|
|
27
|
+
default-days: 3
|
|
28
|
+
exclude:
|
|
29
|
+
- 'vite'
|
package/templates/gitignore
CHANGED
|
@@ -78,7 +78,10 @@ e2e/.auth/chrome-profile/
|
|
|
78
78
|
.claude/scheduled_tasks.lock
|
|
79
79
|
.claude/tmp/
|
|
80
80
|
|
|
81
|
-
#
|
|
81
|
+
# Scratch files any agent writes (Issue / PR bodies, plans, handoffs, logs); the rest of .josh/ is tracked
|
|
82
|
+
.josh/tmp/
|
|
83
|
+
|
|
84
|
+
# Run handoff notes (written for josh run:cut --handoff); they belong in .josh/tmp/, and the
|
|
82
85
|
# names below are the ones that were once written beside the code and committed with it
|
|
83
86
|
/.git-handoff-*.json
|
|
84
87
|
/.josh-handoff-*.json
|
|
@@ -71,8 +71,9 @@ sonar.issue.ignore.multicriteria.e14.resourceKey=**/*
|
|
|
71
71
|
|
|
72
72
|
# Files to exclude from the duplicate check.
|
|
73
73
|
# Snapshot files (.snap) contain machine-generated repetitive patterns and are not authored code.
|
|
74
|
-
# Command-registry files (josh-commands-*.ts) are data
|
|
75
|
-
# structural similarity between entries is inherent and
|
|
74
|
+
# Command-registry files (josh-commands-*.ts) are data
|
|
75
|
+
# definitions that follow a fixed schema; structural similarity between entries is inherent and
|
|
76
|
+
# expected, not logic duplication.
|
|
76
77
|
sonar.cpd.exclusions=**/*.test.ts,**/*.spec.ts,**/*.e2e.ts,**/*.snap,**/josh-commands-*.ts
|
|
77
78
|
|
|
78
79
|
# Use SonarCloud-compatible tsconfig
|
|
@@ -125,6 +125,7 @@ jobs:
|
|
|
125
125
|
persist-credentials: false
|
|
126
126
|
|
|
127
127
|
- name: Setup Node.js
|
|
128
|
+
id: setup-node
|
|
128
129
|
uses: ./.github/actions/setup-node
|
|
129
130
|
|
|
130
131
|
- name: Configure GitHub Packages authentication for existing projects
|
|
@@ -144,11 +145,18 @@ jobs:
|
|
|
144
145
|
# save nothing back under the key it already hit — a cold lint on every later run.
|
|
145
146
|
# joshuafolkken/kit#2054: the commit sha makes each run save its warmed cache under a fresh
|
|
146
147
|
# key, while the sha-less prefix restores the newest entry from an earlier run.
|
|
147
|
-
|
|
148
|
+
# joshuafolkken/kit#4346: ESLint hashes `process.version` into every entry, and runner
|
|
149
|
+
# images carry different Node.js patch releases for `'24'`, so a restore across two of them
|
|
150
|
+
# lints cold. The resolved version leads every key: each release keeps its own lineage.
|
|
151
|
+
# joshuafolkken/kit#4496: the key is not built from kit's toolchain input list — the cache
|
|
152
|
+
# is restored before the install, and this workflow has no kit source to run. The lockfile
|
|
153
|
+
# and eslint config hashes move it with the two inputs ESLint's own per-entry check does
|
|
154
|
+
# not cover.
|
|
155
|
+
key: ${{ runner.os }}-eslint-cache-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('eslint.config.js', 'eslint/**/*.js') }}-${{ github.sha }}
|
|
148
156
|
restore-keys: |
|
|
149
|
-
${{ runner.os }}-eslint-cache-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('eslint.config.js', 'eslint/**/*.js') }}-
|
|
150
|
-
${{ runner.os }}-eslint-cache-${{ hashFiles('pnpm-lock.yaml') }}-
|
|
151
|
-
${{ runner.os }}-eslint-cache-
|
|
157
|
+
${{ runner.os }}-eslint-cache-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('eslint.config.js', 'eslint/**/*.js') }}-
|
|
158
|
+
${{ runner.os }}-eslint-cache-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('pnpm-lock.yaml') }}-
|
|
159
|
+
${{ runner.os }}-eslint-cache-${{ steps.setup-node.outputs.node-version }}-
|
|
152
160
|
|
|
153
161
|
- name: Setup cspell cache
|
|
154
162
|
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
@@ -41,6 +41,10 @@ jobs:
|
|
|
41
41
|
env:
|
|
42
42
|
DISPATCH_TAG: ${{ github.event.client_payload.tag }}
|
|
43
43
|
run: |
|
|
44
|
+
if ! [[ "$DISPATCH_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+([.-][0-9A-Za-z.-]+)?$ ]]; then
|
|
45
|
+
echo "::error::Invalid tag format: $DISPATCH_TAG" >&2
|
|
46
|
+
exit 1
|
|
47
|
+
fi
|
|
44
48
|
echo "tag=$DISPATCH_TAG" >> "$GITHUB_OUTPUT"
|
|
45
49
|
if [ -f .github/workflows/publish.yml ]; then
|
|
46
50
|
echo "workflow=publish.yml" >> "$GITHUB_OUTPUT"
|