@joshuafolkken/kit 1.1050.0 → 1.1128.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/settings.json +9 -8
- package/.claude/skills/epic-commands/SKILL.md +5 -7
- package/.claude/skills/workflow-commands/SKILL.md +20 -12
- package/.claude/skills/workflow-commands/background-commands.md +36 -84
- package/.claude/skills/workflow-commands/backlogrun-child.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +8 -6
- package/.claude/skills/workflow-commands/backlogrun-progress.md +30 -33
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun.md +2 -2
- package/.claude/skills/workflow-commands/chain-rule.md +4 -2
- package/.claude/skills/workflow-commands/delegation.md +3 -3
- package/.claude/skills/workflow-commands/followup-reference.md +1 -1
- package/.claude/skills/workflow-commands/followup.md +7 -3
- package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/fullrun.md +8 -6
- package/.claude/skills/workflow-commands/halfrun.md +19 -21
- package/.claude/skills/workflow-commands/issue-comments.md +1 -1
- package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
- package/.claude/skills/workflow-commands/issue-scout.md +1 -1
- package/.claude/skills/workflow-commands/kickoff.md +9 -4
- package/.claude/skills/workflow-commands/latest-gate.md +8 -16
- package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
- package/.claude/skills/workflow-commands/observation-filing.md +3 -3
- package/.claude/skills/workflow-commands/pre-gate-cut.md +4 -8
- package/.claude/skills/workflow-commands/prerequisite.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +36 -0
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +4 -18
- package/.claude/skills/workflow-commands/working-tree-hold.md +22 -2
- package/.codex/hooks.json +16 -20
- package/.github/actions/setup-node/action.yml +33 -0
- package/.github/actions/setup-pnpm/action.yml +93 -0
- package/.github/dependabot.yml +5 -1
- package/.github/workflows/auto-tag.yml +2 -3
- package/.github/workflows/ci.yml +31 -134
- package/.github/workflows/dependabot-auto-merge.yml +1 -0
- package/.github/workflows/pr-classification.yml +6 -44
- package/.github/workflows/production.yml +1 -0
- package/.github/workflows/publish.yml +43 -47
- package/.github/workflows/sonar-qube.yml +41 -4
- package/.pnpmfile.mjs +29 -0
- package/AGENTS.md +5 -2
- package/CLAUDE.md +33 -27
- package/GEMINI.md +5 -2
- package/README.md +66 -20
- package/SECURITY.md +37 -6
- package/cspell/index.yaml +6 -1
- package/dist/CLAUDE.basic.md +6 -6
- package/dist/CLAUDE.md +33 -27
- package/dist/CLAUDE.static.md +6 -6
- package/dist/config-merge/index.js +48 -12
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-7VPDUBRN.js → chunk-4JZDP5X5.js} +152 -155
- package/dist/hooks/{chunk-HJIISEAC.js → chunk-5SD2YM7Z.js} +5 -13
- package/dist/hooks/{chunk-NAS4C7GP.js → chunk-77J7IEQM.js} +2 -2
- package/dist/hooks/{chunk-DMQN45FN.js → chunk-7HVB7SZG.js} +3 -3
- package/dist/hooks/{chunk-RLDX5SOC.js → chunk-AIOIOMPX.js} +4413 -1970
- package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M7QKEKWO.js} +873 -2049
- package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-MKVGBQPA.js} +2 -2
- package/dist/hooks/{chunk-EJDX2TOB.js → chunk-NXYMNPUQ.js} +7 -88
- package/dist/hooks/{chunk-NJQOBE6L.js → chunk-QVLT52OV.js} +2 -7
- package/dist/hooks/{chunk-GQ7KP45M.js → chunk-XYUIQOW3.js} +2 -2
- package/dist/hooks/codex-hook-adapter.js +12 -48
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +2 -2
- package/dist/hooks/inputs.json +280 -0
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +9 -9
- package/dist/hooks/session-lang.js +0 -1
- package/dist/hooks/stop-guard.js +192 -333
- package/dist/josh.js +240 -148
- package/dist/managed-marker/index.js +2 -1
- package/dist/version/index.js +70 -78
- package/eslint/rules/promise.js +5 -0
- package/eslint/rules/unicorn.js +3 -2
- package/package.json +26 -5
- package/pnpm-workspace.yaml +5 -7
- package/prompts/collaboration-workflow/glossary.md +17 -0
- package/prompts/collaboration-workflow/issue-citation.md +5 -5
- package/prompts/collaboration-workflow/issue-template.md +1 -1
- package/prompts/collaboration-workflow/operating-rules.md +5 -5
- package/prompts/collaboration-workflow/overview.md +13 -1
- package/prompts/collaboration-workflow/principles.md +9 -0
- package/prompts/collaboration-workflow/report-format.md +1 -1
- package/prompts/collaboration-workflow/residency.md +3 -3
- package/prompts/collaboration-workflow/rule-delivery.md +1 -1
- package/prompts/collaboration-workflow/turn-batching.md +3 -3
- package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
- package/prompts/collaboration-workflow/wip-cap.md +25 -22
- package/prompts/collaboration-workflow.md +6 -8
- package/prompts/review-rubric.md +1 -1
- package/prompts/review.md +3 -3
- package/prompts/sonar-hotspot-handling.md +11 -3
- package/prompts/testing-guide.md +3 -3
- package/scripts/adopt/adopt-toolkits.ts +0 -2
- package/scripts/adopt/adopt.ts +0 -2
- package/scripts/agent/agent-argv.ts +0 -2
- package/scripts/agent/agent-diagnostics.ts +1 -1
- package/scripts/agent/agent-role-profile.ts +0 -7
- package/scripts/agent/claude-agent-argv.ts +0 -2
- package/scripts/agent/codex-agent-argv.ts +1 -1
- package/scripts/agent/codex-hooks.ts +92 -0
- package/scripts/agent/interactive-ask.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +6 -16
- package/scripts/backlog/backlog-arrival.ts +30 -10
- package/scripts/backlog/backlog-budget-cli.ts +15 -16
- package/scripts/backlog/backlog-budget.ts +0 -2
- package/scripts/backlog/backlog-defect-priority.ts +2 -2
- package/scripts/backlog/backlog-drive-cli.ts +10 -8
- package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
- package/scripts/backlog/backlog-drive-named.ts +2 -1
- package/scripts/backlog/backlog-drive.ts +76 -16
- package/scripts/backlog/backlog-named.ts +0 -3
- package/scripts/backlog/backlog-next.ts +9 -15
- package/scripts/backlog/backlog-offer-cli.ts +6 -19
- package/scripts/backlog/backlog-plan-cli.ts +1 -7
- package/scripts/backlog/backlog-plan.ts +30 -19
- package/scripts/backlog/backlog-pool.ts +3 -6
- package/scripts/backlog/backlog-rank.ts +2 -2
- package/scripts/backlog/backlog-ready.ts +39 -10
- package/scripts/backlog/backlog-scope.ts +1 -3
- package/scripts/backlog/backlog-stalled-detect.ts +2 -2
- package/scripts/backlog/backlog-stalled.ts +0 -1
- package/scripts/backlog/backlog-waves.ts +5 -2
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/build/build-codex-hooks.ts +26 -0
- package/scripts/build/build-hooks.ts +85 -9
- package/scripts/build/hook-bundle-stamp.ts +111 -0
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +1 -1
- package/scripts/ci/composite-actions.ts +30 -0
- package/scripts/ci/pr-classification.ts +3 -3
- package/scripts/claude/workflow-destination.ts +10 -1
- package/scripts/clone/clone-fingerprint.ts +0 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/json-format.ts +0 -1
- package/scripts/config-merge/parse-jsonc.ts +33 -3
- package/scripts/config-merge/patch-json-key.ts +13 -6
- package/scripts/config-merge/patch-yaml-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +2 -9
- package/scripts/cost-runtime/cost-attribute.ts +0 -1
- package/scripts/cost-runtime/cost-cli.ts +3 -10
- package/scripts/cost-runtime/cost-corpus.ts +0 -2
- package/scripts/cost-runtime/cost-format.ts +0 -3
- package/scripts/cost-runtime/cost-pricing.ts +0 -1
- package/scripts/cost-runtime/cost-tokens.ts +0 -1
- package/scripts/delegation/delegation-cli.ts +1 -1
- package/scripts/delegation/delegation-policy.ts +0 -1
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +0 -2
- package/scripts/delegation/investigation-reads.ts +1 -164
- package/scripts/discovery/repo-map-logic.ts +0 -1
- package/scripts/discovery/repo-party-cli.ts +1 -1
- package/scripts/doctor/doctor-consumer.ts +6 -10
- package/scripts/doctor/doctor-io.ts +9 -13
- package/scripts/doctor/doctor-logic.ts +0 -4
- package/scripts/doctor/doctor.ts +14 -9
- package/scripts/document/backlogrun-parent-read-set.ts +12 -1
- package/scripts/document/document-byte-budget.ts +5 -5
- package/scripts/document/document-byte-check.ts +0 -1
- package/scripts/document/document-read-cli.ts +0 -2
- package/scripts/document/document-section-cli.ts +1 -1
- package/scripts/document/document-section.ts +0 -3
- package/scripts/document/edit-files-cli.ts +0 -1
- package/scripts/document/entry-read-budget.ts +21 -7
- package/scripts/document/entry-read-set.ts +32 -8
- package/scripts/document/lane-child-read-set.ts +8 -6
- package/scripts/document/read-files-cli.ts +0 -4
- package/scripts/document/read-set-cli.ts +0 -2
- package/scripts/document/read-set-point-of-use.ts +9 -3
- package/scripts/document/read-set-pricing.ts +0 -1
- package/scripts/document/read-set-trim.ts +4 -2
- package/scripts/epic/epic-add.ts +1 -1
- package/scripts/epic/epic-audit-cli.ts +1 -4
- package/scripts/epic/epic-audit-orphans.ts +1 -3
- package/scripts/epic/epic-audit-rationale.ts +0 -1
- package/scripts/epic/epic-audit-report.ts +0 -2
- package/scripts/epic/epic-audit.ts +8 -22
- package/scripts/epic/epic-bundle-cli.ts +1 -1
- package/scripts/epic/epic-bundle-evidence.ts +0 -1
- package/scripts/epic/epic-bundle-referenced.ts +1 -5
- package/scripts/epic/epic-bundle.ts +0 -4
- package/scripts/epic/epic-busy.ts +4 -5
- package/scripts/epic/epic-candidate-confirm.ts +0 -5
- package/scripts/epic/epic-classify.ts +2 -2
- package/scripts/epic/epic-cli-argv.ts +0 -1
- package/scripts/epic/epic-close-comment.ts +1 -1
- package/scripts/epic/epic-close.ts +5 -2
- package/scripts/epic/epic-cross-repo.ts +2 -4
- package/scripts/epic/epic-decision.ts +0 -1
- package/scripts/epic/epic-fetch.ts +2 -2
- package/scripts/epic/epic-index.ts +2 -3
- package/scripts/epic/epic-issue.ts +1 -15
- package/scripts/epic/epic-lane-offer.ts +9 -8
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +1 -3
- package/scripts/epic/epic-next-views.ts +0 -1
- package/scripts/epic/epic-next.ts +1 -10
- package/scripts/epic/epic-parse.ts +0 -1
- package/scripts/epic/epic-promote.ts +0 -9
- package/scripts/epic/epic-rank.ts +2 -2
- package/scripts/epic/epic-read.ts +1 -2
- package/scripts/epic/epic-reconcile.ts +1 -1
- package/scripts/epic/epic-reference.ts +1 -13
- package/scripts/epic/epic-relation-recheck.ts +1 -1
- package/scripts/epic/epic-relations.ts +1 -1
- package/scripts/epic/epic-remove.ts +1 -1
- package/scripts/epic/epic-report.ts +0 -1
- package/scripts/epic/epic-run.ts +2 -3
- package/scripts/epic/epic-shape.ts +1 -1
- package/scripts/epic/epic-solo-stale.ts +107 -0
- package/scripts/epic/epic-solo.ts +3 -2
- package/scripts/epic/epic-triage.ts +1 -1
- package/scripts/epic/epic-validate.ts +1 -1
- package/scripts/epic/epic.ts +1 -1
- package/scripts/exports/unused-members-cli.ts +53 -0
- package/scripts/{git → followup}/followup-issue-number.ts +1 -6
- package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
- package/scripts/{git → followup}/git-followup-finish.ts +1 -3
- package/scripts/{git → followup}/git-followup-flush.ts +2 -2
- package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
- package/scripts/{git → followup}/git-followup-label.ts +4 -4
- package/scripts/followup/git-followup-merged.ts +112 -0
- package/scripts/{git → followup}/git-followup-pending.ts +1 -1
- package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
- package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
- package/scripts/{git → followup}/git-pr-followup.ts +53 -16
- package/scripts/gate/core-budget.ts +3 -9
- package/scripts/gate/gate-plan.ts +7 -4
- package/scripts/gate/gate-report.ts +0 -6
- package/scripts/gate/gate-tree.ts +1 -1
- package/scripts/gate/pre-commit-type-check.ts +0 -6
- package/scripts/gate/project-checks.ts +7 -8
- package/scripts/gate/scoped-green.ts +0 -1
- package/scripts/gate/type-check-step.ts +1 -1
- package/scripts/gate/verification-gate.ts +0 -2
- package/scripts/gh/fix-gh-packages.ts +15 -12
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
- package/scripts/{git → gh}/git-gh-check.ts +2 -1
- package/scripts/{git → gh}/git-gh-exec.ts +1 -1
- package/scripts/{git → gh}/git-gh-failure.ts +1 -1
- package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
- package/scripts/{git → gh}/git-gh-issue-list.ts +13 -10
- package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
- package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
- package/scripts/{git → gh}/git-gh-issue-write.ts +4 -1
- package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +4 -1
- package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
- package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
- package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
- package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
- package/scripts/{git → gh}/git-gh-pr.ts +3 -1
- package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
- package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
- package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
- package/scripts/{git → gh}/git-pr-checks.ts +2 -1
- package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
- package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
- package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
- package/scripts/{git → gh}/git-pr.ts +3 -3
- package/scripts/git/changed-file-scope.ts +0 -1
- package/scripts/git/git-branch.ts +3 -6
- package/scripts/git/git-command.ts +6 -1
- package/scripts/git/git-commit.ts +1 -1
- package/scripts/git/git-common-directory.ts +80 -24
- package/scripts/git/git-error.ts +66 -9
- package/scripts/git/git-issue.ts +1 -1
- package/scripts/git/git-preflight.ts +2 -2
- package/scripts/git/git-prompt.ts +6 -31
- package/scripts/git/git-push.ts +1 -1
- package/scripts/git/git-spawn-sync.ts +65 -0
- package/scripts/git/git-spawn.ts +5 -4
- package/scripts/git/git-staging.ts +1 -0
- package/scripts/git/git-status.ts +1 -1
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/gone-branch.ts +1 -0
- package/scripts/git/listing-cutoff.ts +1 -1
- package/scripts/git/main-merge.ts +1 -1
- package/scripts/git/main-sync.ts +19 -1
- package/scripts/git/parse-json-array.ts +0 -3
- package/scripts/git/repository-lock.ts +16 -16
- package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
- package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +2 -7
- package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
- package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
- package/scripts/hooks/codex-hook-adapter.ts +0 -1
- package/scripts/hooks/edited-cspell.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +2 -0
- package/scripts/hooks/pre-push-unit.ts +0 -4
- package/scripts/hooks/pretool-guard.ts +22 -4
- package/scripts/hooks/reserved-run.ts +1 -1
- package/scripts/hooks/step-zero-notice.ts +76 -0
- package/scripts/hooks/stop-guard.ts +47 -21
- package/scripts/init/claude-plugin-config.ts +4 -5
- package/scripts/init/hook-command-rewrite.ts +16 -8
- package/scripts/init/hook-launch.ts +41 -15
- package/scripts/init/init-basic.ts +2 -5
- package/scripts/init/init-file-action.ts +54 -0
- package/scripts/init/init-logic-migrate.ts +35 -17
- package/scripts/init/init-logic-secretlint.ts +1 -1
- package/scripts/init/init-logic.ts +10 -19
- package/scripts/init/init.ts +11 -71
- package/scripts/init/kit-written-paths.ts +2 -0
- package/scripts/init/project-profile.ts +9 -17
- package/scripts/init/start-exec.ts +1 -1
- package/scripts/init/start-setup-pr.ts +6 -6
- package/scripts/init/start-steps.ts +3 -1
- package/scripts/issue/behavior-change-lint.ts +0 -1
- package/scripts/issue/defect-rate-cli.ts +64 -23
- package/scripts/issue/defect-rate.ts +1 -2
- package/scripts/{git → issue}/git-next-issues.ts +3 -3
- package/scripts/issue/issue-backlinks-cli.ts +1 -5
- package/scripts/issue/issue-backlinks.ts +7 -14
- package/scripts/issue/issue-cite-cli.ts +2 -6
- package/scripts/issue/issue-cite.ts +12 -8
- package/scripts/issue/issue-classification.ts +1 -9
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +2 -2
- package/scripts/issue/issue-file-cli.ts +5 -5
- package/scripts/issue/issue-file.ts +7 -14
- package/scripts/issue/issue-fold-cli.ts +1 -1
- package/scripts/issue/issue-fold-existing-cli.ts +1 -1
- package/scripts/{git → issue}/issue-labels.ts +8 -0
- package/scripts/issue/issue-lint-cli.ts +1 -1
- package/scripts/issue/issue-merged.ts +2 -2
- package/scripts/{git → issue}/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +8 -47
- package/scripts/issue/issue-read.ts +0 -2
- package/scripts/issue/issue-report-failures.ts +80 -0
- package/scripts/issue/issue-scout-cli.ts +1 -7
- package/scripts/issue/issue-scout-closed.ts +2 -2
- package/scripts/issue/issue-scout.ts +0 -2
- package/scripts/issue/issue-state-cli.ts +5 -46
- package/scripts/issue/issue-state.ts +1 -5
- package/scripts/issue/markdown-section.ts +21 -6
- package/scripts/issue/measure-rerun-cli.ts +74 -15
- package/scripts/issue/reproduction-measure.ts +1 -1
- package/scripts/josh/cli-body.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +0 -3
- package/scripts/josh/josh-command-map.ts +2 -0
- package/scripts/josh/josh-commands-ai.ts +9 -102
- package/scripts/josh/josh-commands-backlog.ts +5 -1
- package/scripts/josh/josh-commands-development.ts +8 -1
- package/scripts/josh/josh-commands-issue.ts +2 -2
- package/scripts/josh/josh-commands-maintenance.ts +7 -0
- package/scripts/josh/josh-commands-project.ts +7 -1
- package/scripts/josh/josh-commands-run.ts +114 -0
- package/scripts/josh/josh-commands-versioning.ts +8 -0
- package/scripts/josh/josh-commands-workflow.ts +3 -3
- package/scripts/josh/path-decision.ts +0 -3
- package/scripts/josh/process-owner.ts +16 -0
- package/scripts/josh/run-github-prerequisite.ts +3 -6
- package/scripts/josh/session-language-cli.ts +0 -1
- package/scripts/lane/lane-await.ts +46 -19
- package/scripts/lane/lane-capacity.ts +6 -3
- package/scripts/lane/lane-child-invocation.ts +20 -7
- package/scripts/lane/lane-cli.ts +1 -4
- package/scripts/lane/lane-close.ts +5 -4
- package/scripts/lane/lane-dispatch.ts +3 -4
- package/scripts/lane/lane-environment.ts +0 -9
- package/scripts/lane/lane-handoff.ts +38 -0
- package/scripts/lane/lane-launch-cli.ts +31 -27
- package/scripts/lane/lane-open.ts +0 -3
- package/scripts/lane/lane-output.ts +0 -1
- package/scripts/lane/lane-registry.ts +9 -0
- package/scripts/lane/openai-lane-ship.ts +2 -0
- package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
- package/scripts/lane/openai-lane-supervisor.ts +6 -4
- package/scripts/lane/openai-review-broker.ts +7 -1
- package/scripts/lib/bounded-pool.ts +1 -0
- package/scripts/lib/cli-flags.ts +31 -2
- package/scripts/lib/error-message.ts +12 -1
- package/scripts/lib/json-value.ts +5 -4
- package/scripts/lib/poll.ts +3 -1
- package/scripts/lib/timed-fetch.ts +15 -0
- package/scripts/lib/timeouts.ts +13 -0
- package/scripts/{yaml → lib}/yaml-document.ts +3 -1
- package/scripts/{bytes → lines}/bytes-command.ts +0 -2
- package/scripts/lines/line-targets.ts +0 -11
- package/scripts/lines/lines-command.ts +5 -4
- package/scripts/lint/lint-related-scope.ts +0 -1
- package/scripts/lint/lint-related.ts +1 -1
- package/scripts/{git → notify}/telegram-notify.ts +2 -2
- package/scripts/{git → notify}/telegram-test.ts +4 -4
- package/scripts/observations/observation-ledger-home.ts +0 -1
- package/scripts/observations/observation-ledger-line.ts +0 -1
- package/scripts/observations/observation-ledger-migrate.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +3 -3
- package/scripts/observations/observations-flush.ts +2 -2
- package/scripts/overrides/lockfile-overrides.ts +1 -1
- package/scripts/overrides/overrides-logic.ts +1 -1
- package/scripts/package/package-scout-cli.ts +2 -7
- package/scripts/package/package-scout.ts +0 -2
- package/scripts/propagate/propagate-git-failure.ts +0 -1
- package/scripts/propagate/propagate-git.ts +3 -10
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +0 -2
- package/scripts/propagate/propagate-steps.ts +3 -5
- package/scripts/propagate/propagate-targets.ts +0 -4
- package/scripts/propagate/propagate.ts +0 -4
- package/scripts/refactor/import-graph.ts +0 -1
- package/scripts/refactor/refactor-lint.ts +0 -2
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +0 -1
- package/scripts/registry-migration/migrate-logic.ts +28 -21
- package/scripts/registry-migration/migrate.ts +25 -14
- package/scripts/release/github-release-cli.ts +19 -6
- package/scripts/release/github-release-environment.ts +46 -0
- package/scripts/release/github-release.ts +151 -94
- package/scripts/release/release-history.ts +0 -1
- package/scripts/release/release-plan.ts +0 -1
- package/scripts/release/release-publish.ts +38 -5
- package/scripts/release/release-scope-cli.ts +1 -2
- package/scripts/release/release-tag.ts +2 -4
- package/scripts/release/release-worktree.ts +97 -2
- package/scripts/repo/auto-merge-setting-logic.ts +1 -4
- package/scripts/repo/repo-setting.ts +1 -1
- package/scripts/repo/repository-labels.ts +3 -3
- package/scripts/repo/required-checks-logic.ts +206 -0
- package/scripts/repo/required-checks-report.ts +71 -0
- package/scripts/repo/ruleset-check-cli.ts +53 -0
- package/scripts/repo/ruleset-check.ts +147 -0
- package/scripts/report/report-lint-cli.ts +0 -4
- package/scripts/review/disposition-cli.ts +1 -1
- package/scripts/review/live-evidence.ts +1 -1
- package/scripts/review/review-attest-cli.ts +0 -6
- package/scripts/review/review-attest.ts +4 -16
- package/scripts/review/review-brief-cli.ts +23 -6
- package/scripts/review/review-brief.ts +21 -8
- package/scripts/review/review-checkout.ts +3 -2
- package/scripts/review/review-diff-parts.ts +89 -0
- package/scripts/review/review-diff-write.ts +97 -0
- package/scripts/review/review-finding-ledger.ts +0 -1
- package/scripts/review/review-record-cli.ts +10 -17
- package/scripts/review/review-record.ts +0 -1
- package/scripts/review/review-round2-cli.ts +1 -1
- package/scripts/review/review-stamps.ts +0 -3
- package/scripts/review/review-tree.ts +14 -2
- package/scripts/rules/decision-oracle-stage.ts +18 -0
- package/scripts/rules/decision-oracle.ts +10 -7
- package/scripts/rules/delivered-rules.ts +9 -1
- package/scripts/rules/destructive-command.ts +119 -0
- package/scripts/rules/direct-filing.ts +1 -1
- package/scripts/rules/early-heartbeat.ts +4 -3
- package/scripts/rules/file-body.ts +0 -3
- package/scripts/rules/filing-cap.ts +0 -2
- package/scripts/rules/gh-api.ts +7 -2
- package/scripts/rules/git-argv.ts +18 -7
- package/scripts/rules/git-force.ts +0 -2
- package/scripts/rules/implementation-cut.ts +0 -1
- package/scripts/rules/index-guard.ts +71 -0
- package/scripts/rules/issue-citation.ts +50 -25
- package/scripts/rules/lane-background.ts +15 -7
- package/scripts/rules/lane-park.ts +22 -6
- package/scripts/rules/last-prompt.ts +1 -0
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +0 -3
- package/scripts/rules/permission-guards.ts +14 -0
- package/scripts/rules/protected-files.ts +74 -0
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +0 -3
- package/scripts/rules/rule-value-cli.ts +0 -1
- package/scripts/rules/shell-body-trigger.ts +0 -1
- package/scripts/rules/shell-segments.ts +0 -1
- package/scripts/rules/stop-rules.ts +20 -9
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +0 -1
- package/scripts/rules/worktree-guard.ts +26 -9
- package/scripts/run/run-carry-args.ts +8 -12
- package/scripts/run/run-carry-cli.ts +0 -2
- package/scripts/run/run-carry-stash.ts +2 -2
- package/scripts/run/run-carry-streak.ts +1 -1
- package/scripts/run/run-cut-args.ts +1 -6
- package/scripts/run/run-cut-cli.ts +0 -7
- package/scripts/run/run-cut.ts +8 -54
- package/scripts/run/run-ending-cli.ts +2 -6
- package/scripts/run/run-ending.ts +1 -4
- package/scripts/run/run-entry-cli.ts +133 -25
- package/scripts/run/run-entry-stop.ts +104 -0
- package/scripts/run/run-entry.ts +0 -1
- package/scripts/run/run-event-cli.ts +0 -2
- package/scripts/run/run-event-follow.ts +1 -0
- package/scripts/run/run-event-render.ts +1 -1
- package/scripts/run/run-event-scope.ts +53 -4
- package/scripts/run/run-event-stream-emit.ts +7 -2
- package/scripts/run/run-event-stream.ts +0 -3
- package/scripts/run/run-event-watch.ts +1 -0
- package/scripts/run/run-halfrun-resume.ts +20 -7
- package/scripts/run/run-headless.ts +2 -2
- package/scripts/run/run-hold-cli.ts +33 -10
- package/scripts/run/run-hold.ts +29 -6
- package/scripts/run/run-issue-number.ts +1 -1
- package/scripts/run/run-liveness-cli.ts +2 -6
- package/scripts/run/run-liveness.ts +2 -3
- package/scripts/run/run-merge-cli.ts +7 -23
- package/scripts/run/run-merge-steps.ts +5 -5
- package/scripts/run/run-merge.ts +1 -1
- package/scripts/run/run-next-cli.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +4 -2
- package/scripts/run/run-preflight.ts +2 -9
- package/scripts/run/run-prep-cli.ts +6 -3
- package/scripts/run/run-prep-locate.ts +1 -1
- package/scripts/run/run-progress-args.ts +20 -4
- package/scripts/run/run-progress-cli.ts +35 -36
- package/scripts/run/run-progress-clock.ts +10 -35
- package/scripts/run/run-progress-config.ts +0 -4
- package/scripts/run/run-progress-read.ts +1 -2
- package/scripts/run/run-progress.ts +1 -2
- package/scripts/run/run-prrun-resume.ts +117 -0
- package/scripts/run/run-report-cli.ts +1 -2
- package/scripts/run/run-report.ts +0 -1
- package/scripts/run/run-retrospective.ts +1 -1
- package/scripts/run/run-review-cli.ts +0 -3
- package/scripts/run/run-review-steps.ts +2 -0
- package/scripts/run/run-review.ts +0 -2
- package/scripts/run/run-ship-cli.ts +29 -19
- package/scripts/run/run-ship-detach.ts +1 -0
- package/scripts/run/run-ship-next.ts +106 -0
- package/scripts/run/run-ship-preflight.ts +1 -1
- package/scripts/run/run-ship-probe.ts +4 -1
- package/scripts/run/run-ship-return.ts +8 -3
- package/scripts/run/run-ship-review-steps.ts +18 -4
- package/scripts/run/run-ship-review.ts +11 -0
- package/scripts/run/run-ship-scoped.ts +1 -0
- package/scripts/run/run-ship-steps.ts +1 -1
- package/scripts/run/run-ship.ts +0 -1
- package/scripts/run/run-stage-read.ts +62 -0
- package/scripts/run/run-stage.ts +160 -0
- package/scripts/run/run-status-cli.ts +3 -16
- package/scripts/run/run-step-cli.ts +21 -14
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stop-notify.ts +1 -3
- package/scripts/run/run-stranded-cli.ts +0 -4
- package/scripts/run/run-stranded-detect.ts +2 -2
- package/scripts/run/run-tail-cli.ts +17 -11
- package/scripts/run/run-tail.ts +2 -0
- package/scripts/run/run-tidy-lanes.ts +6 -2
- package/scripts/run/run-tidy-stashes.ts +12 -12
- package/scripts/run/run-wake-cli.ts +4 -13
- package/scripts/run/run-wake-loop.ts +2 -2
- package/scripts/run/run-wake.ts +2 -4
- package/scripts/run/run-watcher-guard-cli.ts +0 -4
- package/scripts/run/run-watcher-guard.ts +18 -12
- package/scripts/run/run-watcher-hook.ts +1 -1
- package/scripts/safe-chain/ci-installer-pin.ts +11 -5
- package/scripts/safe-chain/pack-hook.ts +92 -0
- package/scripts/safe-chain/project-config.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +0 -1
- package/scripts/security/security-audit-provision.ts +3 -2
- package/scripts/security/security-audit.ts +0 -1
- package/scripts/security/security-updates-logic.ts +0 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
- package/scripts/sonar/sonar-hotspots.ts +0 -1
- package/scripts/sonar/sonar-new-code-cli.ts +150 -0
- package/scripts/sonar/sonar-new-code.ts +79 -0
- package/scripts/sonar/sonar-project.ts +97 -0
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +2 -5
- package/scripts/sync/managed-config-scope-cli.ts +1 -1
- package/scripts/sync/skill-migration.ts +0 -1
- package/scripts/sync/sync-ai-files.ts +4 -0
- package/scripts/sync/sync-hook-safety.ts +2 -3
- package/scripts/sync/sync.ts +1 -8
- package/scripts/sync/template-source-logic.ts +0 -1
- package/scripts/sync/workflow-pin-logic.ts +16 -28
- package/scripts/test/test-declared-changed.ts +13 -16
- package/scripts/test/test-declared-logic.ts +0 -1
- package/scripts/test/test-declared.ts +3 -9
- package/scripts/test/test-red-commit.ts +2 -2
- package/scripts/test/test-red.ts +14 -7
- package/scripts/test/test-type-logic.ts +1 -1
- package/scripts/test/unit-worker-share.ts +7 -16
- package/scripts/time-runtime/time-batch-guard.ts +1 -2
- package/scripts/time-runtime/time-bundle-call.ts +0 -1
- package/scripts/time-runtime/time-bundles.ts +0 -4
- package/scripts/time-runtime/time-density-hook.ts +0 -2
- package/scripts/time-runtime/time-followup-stage.ts +1 -1
- package/scripts/time-runtime/time-format.ts +0 -73
- package/scripts/time-runtime/time-round-trips.ts +0 -4
- package/scripts/time-runtime/time-single-check.ts +1 -1
- package/scripts/time-runtime/time-spans.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +1 -2
- package/scripts/ui/ui-routes-cli.ts +0 -5
- package/scripts/ui/ui-routes.ts +0 -5
- package/scripts/version/effective-upstream.ts +2 -2
- package/scripts/version/latest-corepack.ts +7 -9
- package/scripts/version/latest-scope-cli.ts +0 -2
- package/scripts/version/latest-update.ts +0 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/publishable-range-check.ts +1 -1
- package/scripts/version/release-hold.ts +0 -4
- package/scripts/version/running-binary.ts +2 -2
- package/scripts/version/version-check-logic.ts +0 -2
- package/scripts/version/version-commands.ts +11 -1
- package/scripts/version/version-remote.ts +3 -3
- package/scripts/version/version-targets.ts +4 -4
- package/templates/CLAUDE.basic.md +6 -6
- package/templates/sonar-project.properties +28 -1
- package/templates/workflows/ci.yml +16 -82
- package/templates/workflows/dependabot-auto-merge.yml +6 -3
- package/templates/workflows/github-release.yml +79 -0
- package/tsconfig.sonar.json +4 -22
- package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
- package/prompts/collaboration-workflow/epic-audit.md +0 -5
- package/prompts/collaboration-workflow/epic-bundle.md +0 -5
- package/scripts/init/plugin-install-hint.ts +0 -47
- package/scripts/version/parse-json.ts +0 -13
- /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
- /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
- /package/scripts/{git → gh}/git-gh-command.ts +0 -0
- /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
- /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
- /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
- /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
- /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
- /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
- /package/scripts/{git → gh}/git-pr-error.ts +0 -0
- /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
- /package/scripts/{git → gh}/github-issue-url.ts +0 -0
- /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
- /package/scripts/{git → issue}/issue-reference.ts +0 -0
- /package/scripts/{git → lib}/animation-helpers.ts +0 -0
- /package/scripts/{git → lib}/git-animation.ts +0 -0
- /package/scripts/{git → notify}/git-notify.ts +0 -0
- /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
1
2
|
import { git_command } from '#scripts/git/git-command'
|
|
2
|
-
import { git_gh_command } from '#scripts/git/git-gh-command'
|
|
3
3
|
import { main_sync } from '#scripts/git/main-sync'
|
|
4
4
|
import { error_text } from '#scripts/lib/error-message'
|
|
5
5
|
import { observation_ledger, OBSERVATION_LEDGER_DIRECTORY } from './observation-ledger'
|
|
@@ -308,6 +308,7 @@ async function stage_ledger(): Promise<void> {
|
|
|
308
308
|
const ledger_paths = observation_ledger.ledger_paths(await git_command.status())
|
|
309
309
|
|
|
310
310
|
for (const file_path of ledger_paths) {
|
|
311
|
+
// eslint-disable-next-line no-await-in-loop -- git add holds the index lock, so two at once fail
|
|
311
312
|
await git_command.add_path(file_path)
|
|
312
313
|
}
|
|
313
314
|
}
|
|
@@ -423,7 +424,6 @@ const observations_flush = {
|
|
|
423
424
|
broken_lines_message,
|
|
424
425
|
CLEAN_MESSAGE,
|
|
425
426
|
COMMIT_MESSAGE,
|
|
426
|
-
empty_flush_message,
|
|
427
427
|
flush,
|
|
428
428
|
flush_branch_message,
|
|
429
429
|
has_ledger_change,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
4
|
+
import { timed_fetch } from '#scripts/lib/timed-fetch'
|
|
4
5
|
import { z } from 'zod'
|
|
5
6
|
import {
|
|
6
7
|
package_scout,
|
|
@@ -23,7 +24,6 @@ const SUCCESS_EXIT_CODE = 0
|
|
|
23
24
|
const FAILURE_EXIT_CODE = 1
|
|
24
25
|
const ARGV_OFFSET = 2
|
|
25
26
|
const DEFAULT_SIZE = 10
|
|
26
|
-
const FETCH_TIMEOUT_MS = 10_000
|
|
27
27
|
const REGISTRY = 'https://registry.npmjs.org'
|
|
28
28
|
const DOWNLOADS_API = 'https://api.npmjs.org/downloads/point/last-week'
|
|
29
29
|
const USAGE = 'Usage: josh pkg:scout <keywords> [--size <n>]'
|
|
@@ -51,7 +51,7 @@ type Latest = z.infer<typeof latest_schema>
|
|
|
51
51
|
|
|
52
52
|
async function fetch_json<T>(url: string, schema: z.ZodType<T>): Promise<T | undefined> {
|
|
53
53
|
try {
|
|
54
|
-
const response = await
|
|
54
|
+
const response = await timed_fetch(url)
|
|
55
55
|
if (!response.ok) return undefined
|
|
56
56
|
|
|
57
57
|
return schema.parse(await response.json())
|
|
@@ -172,14 +172,9 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
172
172
|
|
|
173
173
|
const package_scout_cli = {
|
|
174
174
|
USAGE,
|
|
175
|
-
SEARCH_FAILED_MESSAGE,
|
|
176
175
|
DEFAULT_SIZE,
|
|
177
176
|
read_arguments,
|
|
178
|
-
facts_of,
|
|
179
|
-
license_of,
|
|
180
|
-
to_candidate,
|
|
181
177
|
run,
|
|
182
|
-
main,
|
|
183
178
|
}
|
|
184
179
|
|
|
185
180
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
@@ -2,7 +2,7 @@ import { existsSync } from 'node:fs'
|
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { git_location_environment } from '#scripts/git/git-location-environment'
|
|
4
4
|
import { ls_remote_branch_arguments } from '#scripts/git/git-ls-remote'
|
|
5
|
-
import {
|
|
5
|
+
import { git_spawn_sync } from '#scripts/git/git-spawn-sync'
|
|
6
6
|
|
|
7
7
|
// The git probes propagation needs before it writes anything into a working tree.
|
|
8
8
|
//
|
|
@@ -16,7 +16,6 @@ const GIT_TIMEOUT_MS = 10_000
|
|
|
16
16
|
// `rev-parse` and tight for an ssh handshake, and a probe that times out answers "no" — which for
|
|
17
17
|
// the two below would report a push that never reached origin as a push nobody attempted.
|
|
18
18
|
const REMOTE_TIMEOUT_MS = 60_000
|
|
19
|
-
const SUCCESS_EXIT_CODE = 0
|
|
20
19
|
const DEFAULT_BRANCH_REF = 'refs/remotes/origin/HEAD'
|
|
21
20
|
const FALLBACK_DEFAULT_BRANCH = 'main'
|
|
22
21
|
const ORIGIN_PREFIX = 'refs/remotes/origin/'
|
|
@@ -54,15 +53,11 @@ function run_git(
|
|
|
54
53
|
args: ReadonlyArray<string>,
|
|
55
54
|
timeout_ms: number = GIT_TIMEOUT_MS,
|
|
56
55
|
): string | undefined {
|
|
57
|
-
|
|
56
|
+
return git_spawn_sync.read(args, {
|
|
58
57
|
cwd: repository_path,
|
|
59
|
-
reject: false,
|
|
60
58
|
timeout: timeout_ms,
|
|
61
|
-
env: {
|
|
62
|
-
extendEnv: true,
|
|
59
|
+
env: { ...git_spawn_sync.C_LOCALE, ...git_location_environment.location_free_environment() },
|
|
63
60
|
})
|
|
64
|
-
|
|
65
|
-
return result.exitCode === SUCCESS_EXIT_CODE ? result.stdout.trim() : undefined
|
|
66
61
|
}
|
|
67
62
|
|
|
68
63
|
// The repository's default branch, from the remote's own HEAD. Falls back to `main` when the ref is
|
|
@@ -207,7 +202,6 @@ function return_to_default_branch(repository_path: string): boolean {
|
|
|
207
202
|
|
|
208
203
|
const propagate_git = {
|
|
209
204
|
default_branch,
|
|
210
|
-
fetch_branch,
|
|
211
205
|
return_to_default_branch,
|
|
212
206
|
current_branch,
|
|
213
207
|
commit_ahead,
|
|
@@ -215,7 +209,6 @@ const propagate_git = {
|
|
|
215
209
|
has_pre_push_hook,
|
|
216
210
|
can_push_without_hooks,
|
|
217
211
|
is_clean,
|
|
218
|
-
is_up_to_date,
|
|
219
212
|
decide_tree_state,
|
|
220
213
|
tree_state,
|
|
221
214
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { git_gh_exec } from '#scripts/
|
|
1
|
+
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
2
2
|
import { poll } from '#scripts/lib/poll'
|
|
3
3
|
import { with_page_size } from '#scripts/version/version-remote'
|
|
4
4
|
|
|
@@ -161,6 +161,7 @@ async function wait_for_publish(
|
|
|
161
161
|
const { state } = probe_once(resolved, versions_endpoint, target_version, progress)
|
|
162
162
|
|
|
163
163
|
if (state !== undefined) return finish(state, target_version, progress.attempts)
|
|
164
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
164
165
|
await resolved.sleep(resolved.interval_ms)
|
|
165
166
|
}
|
|
166
167
|
|
|
@@ -168,8 +169,6 @@ async function wait_for_publish(
|
|
|
168
169
|
}
|
|
169
170
|
|
|
170
171
|
const propagate_publish = {
|
|
171
|
-
DEFAULT_TIMEOUT_MS,
|
|
172
|
-
DEFAULT_INTERVAL_MS,
|
|
173
172
|
UNREADABLE_THRESHOLD,
|
|
174
173
|
is_version_published,
|
|
175
174
|
should_keep_waiting,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { pr_classification } from '#scripts/ci/pr-classification'
|
|
2
|
-
import { git_gh_exec } from '#scripts/
|
|
3
|
-
import { git_gh_issue_write } from '#scripts/
|
|
4
|
-
import { OTHER_CHANGE_LABEL } from '#scripts/
|
|
2
|
+
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
3
|
+
import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
|
|
4
|
+
import { OTHER_CHANGE_LABEL } from '#scripts/issue/issue-labels'
|
|
5
5
|
import { GATE_COMMAND } from '#scripts/josh/josh-command-types'
|
|
6
6
|
import { error_text } from '#scripts/lib/error-message'
|
|
7
7
|
import { build_upgrade_shell_command } from '#scripts/version/upgrade-shell-command'
|
|
@@ -428,14 +428,12 @@ function describe_step(target: PropagateTarget, step: string): StepResult {
|
|
|
428
428
|
}
|
|
429
429
|
|
|
430
430
|
const propagate_steps = {
|
|
431
|
-
STEP_COMMANDS,
|
|
432
431
|
JOSH_BIN,
|
|
433
432
|
PROPAGATE_ORIGIN,
|
|
434
433
|
sync_command,
|
|
435
434
|
upgrade_command,
|
|
436
435
|
upgrade_commands,
|
|
437
436
|
sync_commands,
|
|
438
|
-
return_step,
|
|
439
437
|
VERIFY_SCRIPT,
|
|
440
438
|
issue_title,
|
|
441
439
|
issue_body,
|
|
@@ -159,11 +159,7 @@ function resolve_targets(
|
|
|
159
159
|
}
|
|
160
160
|
|
|
161
161
|
const propagate_targets = {
|
|
162
|
-
has_checkout,
|
|
163
162
|
read_manifest,
|
|
164
|
-
classify_manifest_absence,
|
|
165
|
-
classify_before_dependency,
|
|
166
|
-
declared_range,
|
|
167
163
|
installed_version,
|
|
168
164
|
classify_target,
|
|
169
165
|
resolve_targets,
|
|
@@ -279,16 +279,12 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
279
279
|
}
|
|
280
280
|
|
|
281
281
|
const propagate = {
|
|
282
|
-
DRY_RUN_REASON,
|
|
283
282
|
KNOWN_FLAGS,
|
|
284
283
|
TARGET_FLAG,
|
|
285
284
|
parse_options,
|
|
286
285
|
refuse_outside_source_repository,
|
|
287
286
|
resolve_target_version,
|
|
288
287
|
resolve_run_version,
|
|
289
|
-
announce_run_version,
|
|
290
|
-
run,
|
|
291
|
-
main,
|
|
292
288
|
}
|
|
293
289
|
|
|
294
290
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { git_command } from '#scripts/git/git-command'
|
|
1
2
|
import { line_targets } from '#scripts/lines/line-targets'
|
|
2
3
|
import { import_graph } from './import-graph'
|
|
3
4
|
import { refactor_lint, type CategoryResult } from './refactor-lint'
|
|
@@ -97,7 +98,7 @@ async function scan(root: string): Promise<ScanResult> {
|
|
|
97
98
|
}
|
|
98
99
|
|
|
99
100
|
async function run_scan(): Promise<number> {
|
|
100
|
-
const root = await
|
|
101
|
+
const root = await git_command.repository_root()
|
|
101
102
|
const result = await scan(root)
|
|
102
103
|
|
|
103
104
|
process.stdout.write(`${render_result(result)}\n`)
|
|
@@ -111,7 +112,6 @@ const refactor_scan = {
|
|
|
111
112
|
render,
|
|
112
113
|
render_result,
|
|
113
114
|
run_scan,
|
|
114
|
-
scan,
|
|
115
115
|
convergence_candidates,
|
|
116
116
|
verdict_line,
|
|
117
117
|
verdict_token,
|
|
@@ -99,25 +99,33 @@ function is_github_tarball_line(line: string): boolean {
|
|
|
99
99
|
return line.trimStart().startsWith('tarball: https://npm.pkg.github.com/')
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
|
|
102
|
+
// Integrities are keyed by `name@version`, so two scoped packages sharing a version never collide.
|
|
103
|
+
function package_id(key: string): string {
|
|
104
|
+
const name = fix_gh_packages_logic.package_path_from_key(key)
|
|
105
|
+
|
|
106
|
+
return `${name}@${fix_gh_packages_logic.package_version_from_key(key)}`
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function clean_scoped_line(
|
|
103
110
|
line: string,
|
|
104
|
-
|
|
111
|
+
id: string,
|
|
105
112
|
integrities: ReadonlyMap<string, IntegrityPair>,
|
|
106
113
|
): string | undefined {
|
|
107
|
-
if (!
|
|
114
|
+
if (!id) return line
|
|
108
115
|
if (is_github_tarball_line(line)) return undefined
|
|
109
116
|
const cleaned = remove_flow_tarball(line)
|
|
110
|
-
const pair = integrities.get(
|
|
117
|
+
const pair = integrities.get(id)
|
|
111
118
|
if (pair === undefined) return cleaned
|
|
112
119
|
|
|
113
120
|
return cleaned.split(`integrity: ${pair[0]}`).join(`integrity: ${pair[1]}`)
|
|
114
121
|
}
|
|
115
122
|
|
|
116
|
-
function
|
|
117
|
-
if (!is_package_entry(line)) return
|
|
118
|
-
const prefix =
|
|
123
|
+
function next_scoped_id(line: string, id: string): string {
|
|
124
|
+
if (!is_package_entry(line)) return id
|
|
125
|
+
const prefix = ` '${SCOPE}/`
|
|
126
|
+
if (!line.startsWith(prefix)) return ''
|
|
119
127
|
|
|
120
|
-
return
|
|
128
|
+
return package_id(line.slice(" '".length).split("'", 1)[0] ?? '')
|
|
121
129
|
}
|
|
122
130
|
|
|
123
131
|
function integrity_pair(
|
|
@@ -135,12 +143,12 @@ function lock_integrities(
|
|
|
135
143
|
): Map<string, IntegrityPair> {
|
|
136
144
|
const packages = fix_gh_packages_logic.parse_lockfile_packages(lockfile)
|
|
137
145
|
const pairs = new Map<string, IntegrityPair>()
|
|
138
|
-
const
|
|
146
|
+
const scoped_entries = Object.entries(packages).filter(([key]) => key.startsWith(`${SCOPE}/`))
|
|
139
147
|
|
|
140
|
-
for (const [key, entry] of
|
|
141
|
-
const
|
|
142
|
-
const pair = integrity_pair(entry.resolution?.integrity, npm_integrities.get(
|
|
143
|
-
if (pair !== undefined) pairs.set(
|
|
148
|
+
for (const [key, entry] of scoped_entries) {
|
|
149
|
+
const id = package_id(key)
|
|
150
|
+
const pair = integrity_pair(entry.resolution?.integrity, npm_integrities.get(id))
|
|
151
|
+
if (pair !== undefined) pairs.set(id, pair)
|
|
144
152
|
}
|
|
145
153
|
|
|
146
154
|
return pairs
|
|
@@ -150,17 +158,17 @@ function push_if_defined(lines: Array<string>, cleaned: string | undefined): voi
|
|
|
150
158
|
if (cleaned !== undefined) lines.push(cleaned)
|
|
151
159
|
}
|
|
152
160
|
|
|
153
|
-
function
|
|
161
|
+
function rewrite_scoped_lockfile(
|
|
154
162
|
lockfile: string,
|
|
155
163
|
npm_integrities: ReadonlyMap<string, string>,
|
|
156
164
|
): string {
|
|
157
|
-
let
|
|
165
|
+
let id = ''
|
|
158
166
|
const lines: Array<string> = []
|
|
159
167
|
const integrities = lock_integrities(lockfile, npm_integrities)
|
|
160
168
|
|
|
161
169
|
for (const line of lockfile.split('\n')) {
|
|
162
|
-
|
|
163
|
-
const cleaned =
|
|
170
|
+
id = next_scoped_id(line, id)
|
|
171
|
+
const cleaned = clean_scoped_line(line, id, integrities)
|
|
164
172
|
|
|
165
173
|
push_if_defined(lines, cleaned)
|
|
166
174
|
}
|
|
@@ -206,7 +214,8 @@ function previous_registry(project_npmrc: string, user_npmrc: string): string {
|
|
|
206
214
|
|
|
207
215
|
function plan(project_npmrc: string, user_npmrc: string, lockfile: string): MigrationPlan {
|
|
208
216
|
const packages = scoped_packages(lockfile)
|
|
209
|
-
|
|
217
|
+
// Every scoped package may migrate; `migrate` blocks any whose locked version is not on public npm.
|
|
218
|
+
const blocked: Array<string> = []
|
|
210
219
|
if (has_duplicate_mapping(project_npmrc, user_npmrc)) blocked.push('duplicate registry mappings')
|
|
211
220
|
const unsupported = unsupported_registry(project_npmrc)
|
|
212
221
|
if (unsupported !== undefined) blocked.push(unsupported)
|
|
@@ -220,9 +229,7 @@ const migrate_logic = {
|
|
|
220
229
|
plan,
|
|
221
230
|
github_tarballs,
|
|
222
231
|
is_github_tarball,
|
|
223
|
-
|
|
224
|
-
registry_of,
|
|
225
|
-
scoped_packages,
|
|
232
|
+
rewrite_scoped_lockfile,
|
|
226
233
|
scoped_versions,
|
|
227
234
|
}
|
|
228
235
|
|
|
@@ -2,6 +2,8 @@ import { existsSync, rmSync, writeFileSync } from 'node:fs'
|
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { fileURLToPath } from 'node:url'
|
|
4
4
|
import { file_reader } from '#scripts/lib/read-file'
|
|
5
|
+
import { timed_fetch } from '#scripts/lib/timed-fetch'
|
|
6
|
+
import { COMMAND_TIMEOUT_MS, INSTALL_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
5
7
|
import { execa } from 'execa'
|
|
6
8
|
import { z } from 'zod'
|
|
7
9
|
import { migrate_logic, type MigrationPlan } from './migrate-logic'
|
|
@@ -11,7 +13,6 @@ const NPMRC = '.npmrc'
|
|
|
11
13
|
const LOCKFILE = 'pnpm-lock.yaml'
|
|
12
14
|
const WORKSPACE = 'pnpm-workspace.yaml'
|
|
13
15
|
const PUBLIC_REGISTRY = 'https://registry.npmjs.org/'
|
|
14
|
-
const FETCH_TIMEOUT_MS = 10_000
|
|
15
16
|
const SCOPE = '@joshuafolkken/'
|
|
16
17
|
const manifest_schema = z.looseObject({
|
|
17
18
|
dependencies: z.record(z.string(), z.string()).optional(),
|
|
@@ -104,13 +105,19 @@ async function verify_public_versions(
|
|
|
104
105
|
lockfile: string,
|
|
105
106
|
probe_version: MigrationDependencies['fetch_version'],
|
|
106
107
|
): Promise<VersionCheck> {
|
|
108
|
+
const versions = migrate_logic.scoped_versions(lockfile)
|
|
109
|
+
// Each probe reads its own package, so they run together; the report keeps the lockfile's order.
|
|
110
|
+
const probed = await Promise.all(
|
|
111
|
+
versions.map(async ([name, version]) => await probe_integrity(name, version, probe_version)),
|
|
112
|
+
)
|
|
107
113
|
const missing: Array<string> = []
|
|
108
114
|
const integrities = new Map<string, string>()
|
|
109
115
|
|
|
110
|
-
for (const [name, version] of
|
|
111
|
-
const integrity =
|
|
112
|
-
|
|
113
|
-
|
|
116
|
+
for (const [index, [name, version]] of versions.entries()) {
|
|
117
|
+
const integrity = probed[index]
|
|
118
|
+
const id = `${name}@${version}`
|
|
119
|
+
if (integrity === undefined) missing.push(id)
|
|
120
|
+
else integrities.set(id, integrity)
|
|
114
121
|
}
|
|
115
122
|
|
|
116
123
|
return { missing, integrities }
|
|
@@ -177,7 +184,7 @@ async function verify_resolution(
|
|
|
177
184
|
const old_tarballs = migrate_logic.github_tarballs(lockfile)
|
|
178
185
|
if (old_tarballs.length > 0) throw new Error(`GitHub tarballs remain: ${old_tarballs.join(', ')}`)
|
|
179
186
|
|
|
180
|
-
if (migrate_logic.
|
|
187
|
+
if (migrate_logic.rewrite_scoped_lockfile(lockfile, integrities) !== lockfile) {
|
|
181
188
|
throw new Error('lockfile integrity does not match public npm')
|
|
182
189
|
}
|
|
183
190
|
}
|
|
@@ -191,7 +198,7 @@ async function apply(
|
|
|
191
198
|
writeFileSync(context.npmrc_path, context.plan.content)
|
|
192
199
|
writeFileSync(
|
|
193
200
|
context.lockfile_path,
|
|
194
|
-
migrate_logic.
|
|
201
|
+
migrate_logic.rewrite_scoped_lockfile(context.original_lockfile, integrities),
|
|
195
202
|
)
|
|
196
203
|
await verify_resolution(context, dependencies, integrities)
|
|
197
204
|
} catch (error) {
|
|
@@ -209,7 +216,7 @@ function is_already_migrated(
|
|
|
209
216
|
): boolean {
|
|
210
217
|
return (
|
|
211
218
|
context.plan.content === context.original_npmrc &&
|
|
212
|
-
migrate_logic.
|
|
219
|
+
migrate_logic.rewrite_scoped_lockfile(context.original_lockfile, integrities) ===
|
|
213
220
|
context.original_lockfile
|
|
214
221
|
)
|
|
215
222
|
}
|
|
@@ -238,9 +245,7 @@ async function migrate(cwd: string, dependencies: MigrationDependencies): Promis
|
|
|
238
245
|
|
|
239
246
|
async function fetch_version(name: string, version: string): Promise<string | undefined> {
|
|
240
247
|
const encoded = encodeURIComponent(name)
|
|
241
|
-
const response = await
|
|
242
|
-
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
243
|
-
})
|
|
248
|
+
const response = await timed_fetch(`${PUBLIC_REGISTRY}${encoded}/${encodeURIComponent(version)}`)
|
|
244
249
|
|
|
245
250
|
if (!response.ok) return undefined
|
|
246
251
|
const parsed = version_schema.safeParse(await response.json())
|
|
@@ -250,11 +255,17 @@ async function fetch_version(name: string, version: string): Promise<string | un
|
|
|
250
255
|
}
|
|
251
256
|
|
|
252
257
|
async function install(cwd: string): Promise<void> {
|
|
253
|
-
await execa('pnpm', ['install', '--lockfile-only', '--ignore-scripts', '--force'], {
|
|
258
|
+
await execa('pnpm', ['install', '--lockfile-only', '--ignore-scripts', '--force'], {
|
|
259
|
+
cwd,
|
|
260
|
+
timeout: INSTALL_TIMEOUT_MS,
|
|
261
|
+
})
|
|
254
262
|
}
|
|
255
263
|
|
|
256
264
|
async function effective_registry(cwd: string): Promise<string> {
|
|
257
|
-
const result = await execa('pnpm', ['config', 'get', '@joshuafolkken:registry'], {
|
|
265
|
+
const result = await execa('pnpm', ['config', 'get', '@joshuafolkken:registry'], {
|
|
266
|
+
cwd,
|
|
267
|
+
timeout: COMMAND_TIMEOUT_MS,
|
|
268
|
+
})
|
|
258
269
|
|
|
259
270
|
return result.stdout.trim()
|
|
260
271
|
}
|
|
@@ -275,7 +286,7 @@ async function main(): Promise<void> {
|
|
|
275
286
|
|
|
276
287
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
|
|
277
288
|
|
|
278
|
-
const registry_migration = { migrate }
|
|
289
|
+
const registry_migration = { migrate, install, effective_registry }
|
|
279
290
|
|
|
280
291
|
export { registry_migration }
|
|
281
292
|
export type { MigrationDependencies }
|
|
@@ -1,11 +1,24 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { fileURLToPath } from 'node:url'
|
|
2
|
+
import { git_spawn_sync } from '#scripts/git/git-spawn-sync'
|
|
2
3
|
import { github_release } from './github-release'
|
|
4
|
+
import { github_release_environment } from './github-release-environment'
|
|
3
5
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
+
// A release published without the tag list would pick its previous tag from nothing, so a failed
|
|
7
|
+
// `git tag` stops the run rather than reading as "no tags".
|
|
8
|
+
function local_tags(): Array<string> {
|
|
9
|
+
const output = git_spawn_sync.read(['tag', '--list'])
|
|
10
|
+
if (output === undefined) throw new Error('git tag --list failed')
|
|
6
11
|
|
|
7
|
-
|
|
12
|
+
return output.split('\n')
|
|
13
|
+
}
|
|
8
14
|
|
|
9
|
-
|
|
15
|
+
async function main(): Promise<void> {
|
|
16
|
+
const { token, tag, settings } = github_release_environment.read_release_input(process.env)
|
|
10
17
|
|
|
11
|
-
console.info(await github_release.publish(fetch, token, tag, { tags }))
|
|
18
|
+
console.info(await github_release.publish(fetch, token, tag, { ...settings, tags: local_tags() }))
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
|
|
22
|
+
|
|
23
|
+
const github_release_cli = { local_tags }
|
|
24
|
+
export { github_release_cli }
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { ReleaseSettings } from './github-release'
|
|
2
|
+
|
|
3
|
+
interface ReleaseInput {
|
|
4
|
+
token: string
|
|
5
|
+
tag: string
|
|
6
|
+
settings: ReleaseSettings
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
type Environment = Readonly<Record<string, string | undefined>>
|
|
10
|
+
|
|
11
|
+
// A workflow expression renders an unset input as the empty string, so empty means "not given".
|
|
12
|
+
function optional(value: string | undefined): string | undefined {
|
|
13
|
+
return value === undefined || value === '' ? undefined : value
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function job_names(value: string | undefined): ReadonlyArray<string> {
|
|
17
|
+
return (optional(value) ?? '')
|
|
18
|
+
.split(',')
|
|
19
|
+
.map((name) => name.trim())
|
|
20
|
+
.filter((name) => name !== '')
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function read_release_input(environment: Environment): ReleaseInput {
|
|
24
|
+
const token = optional(environment['GH_TOKEN'])
|
|
25
|
+
const tag = optional(environment['RELEASE_TAG'])
|
|
26
|
+
const repository = optional(environment['GITHUB_REPOSITORY'])
|
|
27
|
+
|
|
28
|
+
if (!token || !tag || !repository) {
|
|
29
|
+
throw new Error('GH_TOKEN, RELEASE_TAG and GITHUB_REPOSITORY are required')
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
token,
|
|
34
|
+
tag,
|
|
35
|
+
settings: {
|
|
36
|
+
repository,
|
|
37
|
+
start_tag: optional(environment['RELEASE_START_TAG']),
|
|
38
|
+
workflow: optional(environment['RELEASE_WORKFLOW']),
|
|
39
|
+
jobs: job_names(environment['RELEASE_JOBS']),
|
|
40
|
+
},
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const github_release_environment = { read_release_input }
|
|
45
|
+
|
|
46
|
+
export { github_release_environment }
|