@joshuafolkken/kit 1.1471.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -42,14 +42,14 @@
|
|
|
42
42
|
import { readFileSync, writeFileSync } from 'node:fs'
|
|
43
43
|
import { fileURLToPath } from 'node:url'
|
|
44
44
|
import { json_value } from '#scripts/lib/json-value'
|
|
45
|
-
import {
|
|
45
|
+
import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
|
|
46
46
|
import { execaSync } from 'execa'
|
|
47
47
|
import semver from 'semver'
|
|
48
48
|
import { z } from 'zod'
|
|
49
|
+
import { npm_registry } from './npm-registry'
|
|
49
50
|
import { package_manager_version } from './package-manager-version'
|
|
50
51
|
import { release_age } from './release-age'
|
|
51
52
|
|
|
52
|
-
const PACKAGE_JSON_PATH = 'package.json'
|
|
53
53
|
const PACKAGE_MANAGER_RE = /"packageManager"\s*:\s*"pnpm@(\d+)(?:[^\d]|$)/u
|
|
54
54
|
const PINNED_VERSION_RE = /"packageManager"\s*:\s*"pnpm@([^"+]+)/u
|
|
55
55
|
const TARGET_PREFIX = 'pnpm@'
|
|
@@ -133,13 +133,10 @@ function extract_times_json(stdout: string): Record<string, string> | undefined
|
|
|
133
133
|
// The registry's publish timestamps for every pnpm release (version → ISO date, plus the
|
|
134
134
|
// created/modified bookkeeping keys the selector ignores).
|
|
135
135
|
function query_release_times(): Record<string, string> | undefined {
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
timeout: COMMAND_TIMEOUT_MS,
|
|
139
|
-
})
|
|
140
|
-
if ((result.exitCode ?? FAILURE_EXIT_CODE) !== 0) return undefined
|
|
136
|
+
const answer = npm_registry.view('pnpm', 'time', 'json')
|
|
137
|
+
if (answer.exit_code !== 0) return undefined
|
|
141
138
|
|
|
142
|
-
return extract_times_json(
|
|
139
|
+
return extract_times_json(answer.stdout)
|
|
143
140
|
}
|
|
144
141
|
|
|
145
142
|
function to_resolution(
|
|
@@ -179,13 +176,10 @@ function parse_latest_version(stdout: string): string | undefined {
|
|
|
179
176
|
}
|
|
180
177
|
|
|
181
178
|
function query_latest_version(): string | undefined {
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
timeout: COMMAND_TIMEOUT_MS,
|
|
185
|
-
})
|
|
186
|
-
if ((result.exitCode ?? FAILURE_EXIT_CODE) !== 0) return undefined
|
|
179
|
+
const answer = npm_registry.view('pnpm', 'version', 'json')
|
|
180
|
+
if (answer.exit_code !== 0) return undefined
|
|
187
181
|
|
|
188
|
-
return parse_latest_version(
|
|
182
|
+
return parse_latest_version(answer.stdout)
|
|
189
183
|
}
|
|
190
184
|
|
|
191
185
|
// The target handed to pnpm self-update: an exact registry-resolved version on the pinned major, or
|
|
@@ -239,7 +233,7 @@ function run_pnpm_update(target: string): number {
|
|
|
239
233
|
// match). Runs on every path, not just after a successful bump: a repository that arrives
|
|
240
234
|
// with the two fields already out of step sits in the no-bump steady state forever, so an
|
|
241
235
|
// alignment gated on a bump would never repair it.
|
|
242
|
-
function sync_development_engines(package_json_path: string =
|
|
236
|
+
function sync_development_engines(package_json_path: string = PACKAGE_JSON): void {
|
|
243
237
|
const content = readFileSync(package_json_path, 'utf8')
|
|
244
238
|
const aligned = package_manager_version.align_development_engines_version(content)
|
|
245
239
|
if (aligned === content) return
|
|
@@ -249,10 +243,7 @@ function sync_development_engines(package_json_path: string = PACKAGE_JSON_PATH)
|
|
|
249
243
|
}
|
|
250
244
|
|
|
251
245
|
// Restore the pre-run manifest if self-update fails after changing it.
|
|
252
|
-
function restore_package_json(
|
|
253
|
-
content: string,
|
|
254
|
-
package_json_path: string = PACKAGE_JSON_PATH,
|
|
255
|
-
): void {
|
|
246
|
+
function restore_package_json(content: string, package_json_path: string = PACKAGE_JSON): void {
|
|
256
247
|
writeFileSync(package_json_path, content)
|
|
257
248
|
console.info('✔ Restored package.json pin (pnpm bump failed)')
|
|
258
249
|
}
|
|
@@ -274,20 +265,17 @@ function extract_encoded_integrity(stdout: string): string | undefined {
|
|
|
274
265
|
}
|
|
275
266
|
|
|
276
267
|
function query_integrity(target: string): string | undefined {
|
|
277
|
-
const
|
|
278
|
-
|
|
279
|
-
timeout: COMMAND_TIMEOUT_MS,
|
|
280
|
-
})
|
|
281
|
-
if ((result.exitCode ?? FAILURE_EXIT_CODE) !== 0) return undefined
|
|
268
|
+
const answer = npm_registry.view(target, 'dist.integrity', 'json')
|
|
269
|
+
if (answer.exit_code !== 0) return undefined
|
|
282
270
|
|
|
283
|
-
const encoded = extract_encoded_integrity(
|
|
271
|
+
const encoded = extract_encoded_integrity(answer.stdout)
|
|
284
272
|
if (encoded === undefined) return undefined
|
|
285
273
|
|
|
286
274
|
return decode_integrity(encoded)
|
|
287
275
|
}
|
|
288
276
|
|
|
289
277
|
function restore_integrity(target: string, integrity: string): void {
|
|
290
|
-
const content = readFileSync(
|
|
278
|
+
const content = readFileSync(PACKAGE_JSON, 'utf8')
|
|
291
279
|
const version = target.slice(TARGET_PREFIX.length)
|
|
292
280
|
const expected = `pnpm@${version}`
|
|
293
281
|
const current = PACKAGE_MANAGER_VALUE_RE.exec(content)?.[0]
|
|
@@ -303,10 +291,7 @@ function restore_integrity(target: string, integrity: string): void {
|
|
|
303
291
|
},
|
|
304
292
|
)
|
|
305
293
|
|
|
306
|
-
writeFileSync(
|
|
307
|
-
PACKAGE_JSON_PATH,
|
|
308
|
-
package_manager_version.align_development_engines_version(pinned),
|
|
309
|
-
)
|
|
294
|
+
writeFileSync(PACKAGE_JSON, package_manager_version.align_development_engines_version(pinned))
|
|
310
295
|
}
|
|
311
296
|
|
|
312
297
|
// The equal case is the steady state of every up-to-date run, so it logs as success; only
|
|
@@ -342,7 +327,7 @@ function pin_unpinned_manifest(original: string, target: string, integrity: stri
|
|
|
342
327
|
)
|
|
343
328
|
|
|
344
329
|
writeFileSync(
|
|
345
|
-
|
|
330
|
+
PACKAGE_JSON,
|
|
346
331
|
package_manager_version.align_development_engines_version(`${pinned}\n`),
|
|
347
332
|
)
|
|
348
333
|
|
|
@@ -403,7 +388,7 @@ function bump_to_registry_target(original: string, major: string | undefined): n
|
|
|
403
388
|
}
|
|
404
389
|
|
|
405
390
|
function main(): number {
|
|
406
|
-
const original = readFileSync(
|
|
391
|
+
const original = readFileSync(PACKAGE_JSON, 'utf8')
|
|
407
392
|
const status = bump_to_registry_target(original, extract_pnpm_major(original))
|
|
408
393
|
|
|
409
394
|
sync_development_engines()
|
|
@@ -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
|