@joshuafolkken/kit 1.1035.0 → 1.1094.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/verify-ui/SKILL.md +1 -1
- package/.claude/skills/workflow-commands/SKILL.md +21 -13
- package/.claude/skills/workflow-commands/background-commands.md +5 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +3 -3
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +9 -7
- package/.claude/skills/workflow-commands/backlogrun-park.md +6 -0
- package/.claude/skills/workflow-commands/backlogrun-progress.md +31 -37
- package/.claude/skills/workflow-commands/backlogrun-steps.md +25 -25
- package/.claude/skills/workflow-commands/backlogrun.md +2 -2
- package/.claude/skills/workflow-commands/chain-rule.md +6 -4
- package/.claude/skills/workflow-commands/delegation.md +3 -3
- package/.claude/skills/workflow-commands/followup-reference.md +3 -3
- 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 +3 -2
- package/.claude/skills/workflow-commands/halfrun.md +16 -19
- package/.claude/skills/workflow-commands/issue-comments.md +2 -2
- 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 +1 -1
- package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
- package/.claude/skills/workflow-commands/observation-filing.md +44 -89
- package/.claude/skills/workflow-commands/pre-gate-cut.md +33 -36
- 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/working-tree-hold.md +24 -4
- package/.codex/hooks.json +16 -20
- package/.github/actions/setup-pnpm/action.yml +93 -0
- package/.github/dependabot.yml +5 -1
- package/.github/workflows/auto-tag.yml +21 -0
- package/.github/workflows/ci.yml +26 -128
- package/.github/workflows/pr-classification.yml +5 -41
- package/.github/workflows/publish.yml +42 -48
- package/.github/workflows/sonar-qube.yml +37 -4
- package/AGENTS.md +12 -2
- package/CLAUDE.md +15 -16
- package/GEMINI.md +14 -2
- package/README.md +59 -18
- package/SECURITY.md +36 -6
- package/cspell/index.yaml +2 -1
- package/dist/CLAUDE.md +15 -16
- package/dist/config-merge/index.js +15 -3
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-Y27M6A7X.js → chunk-3C4YCCEF.js} +5 -13
- package/dist/hooks/{chunk-D67KVGGY.js → chunk-7ZPFAVR7.js} +17 -88
- package/dist/hooks/{chunk-HOYJU5RM.js → chunk-E54KGFEQ.js} +11 -4
- package/dist/hooks/{chunk-KG6PZD72.js → chunk-IL27YTPH.js} +2 -2
- package/dist/hooks/{chunk-GJT4BNVE.js → chunk-KHWHKJOM.js} +3 -3
- package/dist/hooks/{chunk-HU66PWWL.js → chunk-M2XDCUKD.js} +1076 -509
- package/dist/hooks/{chunk-GLBDBJOK.js → chunk-NKOG3XAV.js} +199 -304
- package/dist/hooks/{chunk-ZXNE6NY3.js → chunk-O4LL4HTI.js} +2 -7
- package/dist/hooks/{chunk-XPLP27WA.js → chunk-OIZUHPJI.js} +5 -27
- package/dist/hooks/{chunk-EIFCAJRB.js → chunk-UD24EAIL.js} +2546 -1636
- package/dist/hooks/codex-hook-adapter.js +10 -11
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +15 -34
- package/dist/hooks/inputs.json +279 -0
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +23 -16
- package/dist/hooks/session-lang.js +0 -1
- package/dist/hooks/stop-guard.js +188 -509
- package/dist/josh.js +166 -225
- package/dist/managed-marker/index.js +2 -1
- package/dist/version/index.js +412 -64
- package/eslint/rules/promise.js +5 -0
- package/package.json +13 -8
- package/prompts/collaboration-workflow/file-edits.md +6 -53
- package/prompts/collaboration-workflow/issue-citation.md +5 -5
- package/prompts/collaboration-workflow/operating-rules.md +4 -4
- package/prompts/collaboration-workflow/overview.md +13 -1
- package/prompts/collaboration-workflow/report-format.md +1 -1
- package/prompts/collaboration-workflow/residency.md +4 -4
- package/prompts/collaboration-workflow/rule-delivery.md +5 -36
- package/prompts/collaboration-workflow/shell-body.md +7 -9
- package/prompts/collaboration-workflow/turn-batching.md +21 -37
- package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
- package/prompts/collaboration-workflow/wip-cap.md +36 -36
- package/prompts/collaboration-workflow.md +5 -8
- package/prompts/review-rubric.md +1 -1
- package/prompts/review.md +3 -3
- package/prompts/sonar-hotspot-handling.md +12 -4
- package/prompts/testing-guide.md +3 -3
- package/scripts/adopt/adopt-toolkits.ts +2 -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 +15 -25
- 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 +32 -22
- package/scripts/backlog/backlog-offer-cli.ts +0 -5
- package/scripts/backlog/backlog-plan-cli.ts +6 -8
- package/scripts/backlog/backlog-plan.ts +1 -1
- package/scripts/backlog/backlog-pool.ts +34 -17
- package/scripts/backlog/backlog-rank.ts +106 -0
- package/scripts/backlog/backlog-ready.ts +19 -3
- 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 +47 -31
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/build/build-codex-hooks.ts +26 -0
- package/scripts/build/build-hooks.ts +92 -11
- 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/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 +0 -3
- 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 +11 -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 +4 -6
- package/scripts/doctor/doctor-logic.ts +0 -4
- package/scripts/doctor/doctor.ts +14 -9
- package/scripts/document/document-byte-budget.ts +8 -9
- 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 +13 -4
- package/scripts/document/lane-child-read-set.ts +1 -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 +1 -0
- package/scripts/document/read-set-pricing.ts +0 -1
- package/scripts/document/read-set-trim.ts +1 -1
- 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 +5 -4
- 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 +20 -30
- 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 +37 -0
- 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 +32 -30
- 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 +2 -0
- 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-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 +1 -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-execa-error.ts +6 -1
- package/scripts/git/git-issue.ts +1 -1
- package/scripts/git/git-preflight.ts +24 -6
- package/scripts/git/git-prompt.ts +6 -31
- package/scripts/git/git-push-transport.ts +12 -69
- package/scripts/git/git-push.ts +1 -1
- package/scripts/git/git-spawn.ts +79 -3
- package/scripts/git/git-ssh-keepalive.ts +74 -0
- 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 +4 -2
- 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} +1 -1
- 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-cli.ts +15 -0
- package/scripts/hooks/format-edited-file.ts +4 -9
- package/scripts/hooks/pre-push-unit.ts +0 -4
- package/scripts/hooks/pretool-guard-cli.ts +21 -0
- package/scripts/hooks/pretool-guard.ts +36 -19
- 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-logic.ts +7 -0
- package/scripts/init/init.ts +0 -3
- package/scripts/init/project-profile.ts +6 -11
- package/scripts/init/start-exec.ts +8 -2
- package/scripts/init/start-plan.ts +18 -5
- package/scripts/init/start-setup-pr.ts +52 -25
- package/scripts/init/start-steps.ts +42 -9
- package/scripts/init/start.ts +40 -10
- package/scripts/issue/behavior-change-lint.ts +0 -1
- package/scripts/issue/defect-rate-cli.ts +3 -3
- package/scripts/issue/defect-rate.ts +1 -2
- package/scripts/{git → issue}/git-next-issues.ts +37 -8
- package/scripts/issue/issue-backlinks-cli.ts +1 -5
- package/scripts/issue/issue-cite-cli.ts +2 -6
- package/scripts/issue/issue-cite.ts +19 -3
- 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 +2 -2
- 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 +20 -0
- package/scripts/issue/issue-lint-cli.ts +1 -1
- package/scripts/issue/issue-merged.ts +2 -2
- package/scripts/issue/issue-rank.ts +89 -0
- 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 +1 -1
- package/scripts/issue/measure-rerun-cli.ts +1 -1
- 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 -102
- 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 +10 -3
- 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 +2 -2
- package/scripts/josh/path-decision.ts +0 -3
- package/scripts/josh/process-owner.ts +16 -0
- package/scripts/josh/session-language-cli.ts +0 -1
- package/scripts/lane/lane-await.ts +3 -6
- package/scripts/lane/lane-capacity.ts +6 -3
- package/scripts/lane/lane-child-invocation.ts +20 -7
- package/scripts/lane/lane-child-marker.ts +16 -2
- package/scripts/lane/lane-cli.ts +33 -18
- package/scripts/lane/lane-close.ts +1 -3
- 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 +21 -11
- 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/lane-report.ts +10 -4
- 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 +3 -0
- package/scripts/lib/bounded-pool.ts +1 -0
- 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/lines-command.ts +0 -1
- 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 +0 -2
- package/scripts/propagate/propagate-plan.ts +185 -0
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -3
- package/scripts/propagate/propagate-steps.ts +19 -6
- package/scripts/propagate/propagate-targets.ts +13 -6
- package/scripts/propagate/propagate.ts +60 -46
- package/scripts/refactor/import-graph.ts +0 -1
- package/scripts/refactor/refactor-lint.ts +0 -2
- package/scripts/refactor/refactor-scan.ts +0 -1
- package/scripts/refactor/refactor-targets.ts +0 -1
- package/scripts/registry-migration/migrate-logic.ts +1 -2
- package/scripts/registry-migration/migrate.ts +19 -9
- package/scripts/release/github-release-cli.ts +8 -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 +2 -3
- package/scripts/release/release-scope-cli.ts +1 -2
- package/scripts/release/release-tag.ts +2 -4
- 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 +48 -16
- package/scripts/review/review-brief-cli.ts +72 -8
- package/scripts/review/review-brief.ts +67 -9
- 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 +1 -1
- package/scripts/review/review-record.ts +0 -1
- package/scripts/review/review-round2-cli.ts +1 -1
- package/scripts/review/review-stamps.ts +6 -2
- 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/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 +1 -2
- package/scripts/rules/index-guard.ts +71 -0
- package/scripts/rules/issue-citation.ts +50 -25
- package/scripts/rules/issue-fold.ts +1 -2
- package/scripts/rules/lane-background.ts +15 -7
- package/scripts/rules/lane-carry-conflict.ts +1 -2
- package/scripts/rules/lane-park.ts +14 -8
- 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/pre-gate-cut.ts +2 -2
- 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 +13 -5
- 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-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-cli.ts +0 -7
- package/scripts/run/run-cut.ts +8 -54
- package/scripts/run/run-ending-cli.ts +1 -1
- package/scripts/run/run-ending.ts +1 -4
- package/scripts/run/run-entry-cli.ts +101 -24
- 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.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 +24 -8
- package/scripts/run/run-hold-cli.ts +33 -10
- package/scripts/run/run-hold.ts +25 -5
- package/scripts/run/run-issue-number.ts +1 -1
- package/scripts/run/run-liveness-cli.ts +1 -1
- package/scripts/run/run-liveness.ts +2 -3
- package/scripts/run/run-merge-cli.ts +5 -13
- 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 +143 -0
- package/scripts/run/run-preflight.ts +2 -9
- package/scripts/run/run-prep-cli.ts +2 -2
- package/scripts/run/run-prep-locate.ts +1 -1
- package/scripts/run/run-progress-cli.ts +4 -7
- package/scripts/run/run-progress-clock.ts +6 -34
- package/scripts/run/run-progress-config.ts +0 -4
- package/scripts/run/run-progress-read.ts +3 -3
- package/scripts/run/run-progress.ts +22 -10
- 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 +27 -77
- 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 +87 -0
- package/scripts/run/run-ship-return.ts +8 -3
- package/scripts/run/run-ship-review-steps.ts +23 -30
- package/scripts/run/run-ship-review.ts +20 -0
- package/scripts/run/run-ship-scoped.ts +45 -0
- package/scripts/run/run-ship-stage.ts +5 -1
- package/scripts/run/run-ship-steps.ts +105 -0
- package/scripts/run/run-ship.ts +2 -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 +1 -1
- 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 +2 -1
- package/scripts/run/run-tidy-stashes.ts +12 -12
- package/scripts/run/run-wake-cli.ts +4 -5
- package/scripts/run/run-wake-describe.ts +19 -1
- 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 +9 -7
- package/scripts/run/run-watcher-hook.ts +1 -1
- package/scripts/safe-chain/ci-installer-pin.ts +11 -5
- 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-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-logic.ts +0 -1
- package/scripts/test/test-declared.ts +0 -2
- 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 +2 -3
- 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 +97 -0
- 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 +5 -4
- package/scripts/version/version-remote.ts +28 -14
- package/scripts/version/version-targets.ts +4 -4
- package/templates/sonar-project.properties +28 -1
- package/templates/workflows/dependabot-auto-merge.yml +5 -3
- package/templates/workflows/github-release.yml +81 -0
- 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-write.ts +0 -0
- /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
- /package/scripts/{git → gh}/git-gh-pr-auto-merge.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
|
@@ -3,8 +3,9 @@ import { availableParallelism } from 'node:os'
|
|
|
3
3
|
import path from 'node:path'
|
|
4
4
|
import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
|
|
5
5
|
import { process_identity } from '#scripts/josh/process-identity'
|
|
6
|
+
import { process_owner_schema, type ProcessOwner } from '#scripts/josh/process-owner'
|
|
6
7
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
7
|
-
import {
|
|
8
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
8
9
|
|
|
9
10
|
// How wide one vitest run may fan out when it is not the only one on the machine
|
|
10
11
|
// (joshuafolkken/kit#1515).
|
|
@@ -41,12 +42,9 @@ const MIN_WORKERS = 1
|
|
|
41
42
|
// One run in flight is this run alone, which is the case that changes nothing.
|
|
42
43
|
const SOLO_RUNS = 1
|
|
43
44
|
|
|
44
|
-
//
|
|
45
|
-
//
|
|
46
|
-
|
|
47
|
-
const run_marker_schema = z.object({ pid: z.number(), process_start: z.string().optional() })
|
|
48
|
-
|
|
49
|
-
type RunMarker = z.infer<typeof run_marker_schema>
|
|
45
|
+
// A marker is the writing process's identity and nothing else; a pid-only marker has an answer of its
|
|
46
|
+
// own below (`is_running`) rather than being rejected here.
|
|
47
|
+
type RunMarker = ProcessOwner
|
|
50
48
|
|
|
51
49
|
function marker_path(pid: number = process.pid): string {
|
|
52
50
|
return stamp_file.stamp_path(RUN_PREFIX, String(pid))
|
|
@@ -82,13 +80,9 @@ function read_marker(source: string): RunMarker | undefined {
|
|
|
82
80
|
|
|
83
81
|
if (raw === undefined) return undefined
|
|
84
82
|
|
|
85
|
-
|
|
86
|
-
const parsed = run_marker_schema.safeParse(JSON.parse(raw))
|
|
83
|
+
const parsed = process_owner_schema.safeParse(json_value.parse_or_undefined(raw))
|
|
87
84
|
|
|
88
|
-
|
|
89
|
-
} catch {
|
|
90
|
-
return undefined
|
|
91
|
-
}
|
|
85
|
+
return parsed.success ? parsed.data : undefined
|
|
92
86
|
}
|
|
93
87
|
|
|
94
88
|
// An unreadable temp directory answers "no other run", which is the direction that leaves behavior
|
|
@@ -235,12 +229,9 @@ const unit_worker_share = {
|
|
|
235
229
|
NESTED_KEY,
|
|
236
230
|
RUN_PREFIX,
|
|
237
231
|
SOLO_RUNS,
|
|
238
|
-
WORKER_FLAG,
|
|
239
232
|
current_share,
|
|
240
233
|
is_nested_run,
|
|
241
|
-
is_running,
|
|
242
234
|
live_run_count,
|
|
243
|
-
marker_files,
|
|
244
235
|
marker_path,
|
|
245
236
|
read_marker,
|
|
246
237
|
resolve_unit_workers,
|
|
@@ -147,7 +147,7 @@ interface GuardedCall {
|
|
|
147
147
|
//
|
|
148
148
|
// **The dispatch it adds is measured, and it is not the figure the deleted text quoted.** One hook run
|
|
149
149
|
// is **0.53 s** in this checkout and about 0.4 s in a consumer, essentially all of it process startup —
|
|
150
|
-
// measured under `docs/josh-commands.md` → "`josh format:edited`", which is where that reading was
|
|
150
|
+
// measured under `docs/josh-commands-automation.md` → "`josh format:edited`", which is where that reading was
|
|
151
151
|
// taken. The "about 2.4 s" above was a `pnpm josh` dispatch measured before joshuafolkken/kit#1342 made
|
|
152
152
|
// this command eligible for the in-process path. Against that, one recovered round trip is a whole
|
|
153
153
|
// model turn.
|
|
@@ -509,7 +509,6 @@ const time_batch_guard = {
|
|
|
509
509
|
CONSECUTIVE_LIMIT,
|
|
510
510
|
GUARD_LABEL,
|
|
511
511
|
LANE_NOTICE,
|
|
512
|
-
NAMED_CANDIDATE_COUNT,
|
|
513
512
|
NOTICE,
|
|
514
513
|
NOTICE_REFIRE_EVERY,
|
|
515
514
|
NOTICE_STAMP_PREFIX,
|
|
@@ -336,8 +336,8 @@ function josh_subcommand(command: string): string | undefined {
|
|
|
336
336
|
}
|
|
337
337
|
|
|
338
338
|
// Whether a shell line is one of the read-only `josh` bookkeeping commands, and nothing else. A chained
|
|
339
|
-
// line falls through. An alias is resolved to its canonical name first
|
|
340
|
-
//
|
|
339
|
+
// line falls through. An alias is resolved to its canonical name first, so the allow-list holds
|
|
340
|
+
// canonical names alone. Everything not on the list falls
|
|
341
341
|
// through to the read/mutation test, which is what keeps `josh gate` / `followup` / `git`
|
|
342
342
|
// non-bundleable (joshuafolkken/kit#1875).
|
|
343
343
|
function is_read_josh(command: string): boolean {
|
|
@@ -555,7 +555,6 @@ const time_bundle_call = {
|
|
|
555
555
|
tool_targets,
|
|
556
556
|
// Exported for the batching guard's own word scan (joshuafolkken/kit#1390), so the two scanners
|
|
557
557
|
// cannot come to disagree about where one word of a shell line ends and the next begins.
|
|
558
|
-
words_of,
|
|
559
558
|
// Exported for the read-fold notice (joshuafolkken/kit#2311), which offers `read:files <path>` only
|
|
560
559
|
// over file-shaped targets — a bare directory like `scripts/` is a target here but not something
|
|
561
560
|
// `read:files` can read, so the notice reuses this test rather than keep a second copy that could
|
|
@@ -520,11 +520,7 @@ function bundle_lines(totals: BundleTotals, price: TripPrice): Array<string> {
|
|
|
520
520
|
|
|
521
521
|
const time_bundles = {
|
|
522
522
|
HEADING,
|
|
523
|
-
SEQUENCE_LABEL,
|
|
524
|
-
RECOVERABLE_LABEL,
|
|
525
|
-
SAVING_LABEL,
|
|
526
523
|
BY_TOOL_LABEL,
|
|
527
|
-
MIN_SEQUENCE,
|
|
528
524
|
NO_BUNDLES,
|
|
529
525
|
build_bundles,
|
|
530
526
|
bundle_lines,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { git_followup_stages, type FollowupStage } from '#scripts/
|
|
1
|
+
import { git_followup_stages, type FollowupStage } from '#scripts/followup/git-followup-stages'
|
|
2
2
|
|
|
3
3
|
// Reading `followup`'s own stage rows back out of what it printed (joshuafolkken/kit#1445).
|
|
4
4
|
//
|
|
@@ -31,21 +31,6 @@ const NOT_MEASURED = 'not measured'
|
|
|
31
31
|
// than in `time-report.ts` because two blocks print it — the round-trip price and the bundling block —
|
|
32
32
|
// and `time-bundles.ts` cannot import `time-report.ts`, which imports it (joshuafolkken/kit#1344).
|
|
33
33
|
const NO_CALLS = 'no tool call to divide'
|
|
34
|
-
// The word both the CI-cycle block and the gate-runtime block put in front of their naked-seconds
|
|
35
|
-
// figure (joshuafolkken/kit#1812). Two renderers of the same report, and `time-cycles.ts` cannot
|
|
36
|
-
// import `time-gate-runs.ts` nor the reverse, so it is written once here — the rule this file's header
|
|
37
|
-
// states, and the reason `NO_CALLS` already sits beside it.
|
|
38
|
-
const NAKED_PREFIX = 'naked '
|
|
39
|
-
// The category labels, shared with the epic scope's table and with the round-trip block's price row
|
|
40
|
-
// rather than spelled out in each. The tables answer the same question at three scales, so a label
|
|
41
|
-
// renamed in one and not the others is a report that disagrees with itself — which is the defect
|
|
42
|
-
// joshuafolkken/kit#1295 was filed for. They moved here from `time-report.ts` when the price row
|
|
43
|
-
// became a third printer and its block a module that cannot import that file
|
|
44
|
-
// (joshuafolkken/kit#1385).
|
|
45
|
-
const MODEL_LABEL = 'model wait'
|
|
46
|
-
const TOOL_LABEL = 'tool execution'
|
|
47
|
-
const HUMAN_LABEL = 'human wait'
|
|
48
|
-
const CI_LABEL = 'CI wait'
|
|
49
34
|
// How many rows of a table any of these reports prints. Capped, because a long run touches thirty-odd
|
|
50
35
|
// distinct leading commands and a table that long is read by nobody. `--json` carries every row the
|
|
51
36
|
// report holds, so the display cap costs a caller nothing.
|
|
@@ -54,28 +39,6 @@ const CI_LABEL = 'CI wait'
|
|
|
54
39
|
// need it** (joshuafolkken/kit#1311). Those two cannot import `time-report.ts`, which imports them —
|
|
55
40
|
// and a second cap beside a second renderer is exactly the drift this file was split out to prevent.
|
|
56
41
|
const MAX_ROWS = 15
|
|
57
|
-
// What separates the facts inside one row's third column — a check's conclusion from its outcome
|
|
58
|
-
// note, a distribution's range from its sample count. Written once so two renderers of the same
|
|
59
|
-
// report cannot come to punctuate their suffixes differently (joshuafolkken/kit#1312).
|
|
60
|
-
const SUFFIX_SEPARATOR = ' · '
|
|
61
|
-
// What joins the two ends of an aggregated row's range, and the unit the sample behind it is counted
|
|
62
|
-
// in. They sit here rather than beside one renderer because two of them print a spread now — the
|
|
63
|
-
// duration tables of `--last` and the turn-count table both scopes share — and a private copy beside
|
|
64
|
-
// the second is how one report would come to punctuate its ranges two ways
|
|
65
|
-
// (joshuafolkken/kit#1763).
|
|
66
|
-
const RANGE_SEPARATOR = ' – '
|
|
67
|
-
const RUN_UNIT = 'run(s)'
|
|
68
|
-
// The `HH:MM:SS` slice of an ISO instant, and what joins two of them into a window. UTC rather than
|
|
69
|
-
// local time, because the report's own `started_at` / `ended_at` already are — a table in one zone
|
|
70
|
-
// beside a header in another is a report that cannot be read against itself.
|
|
71
|
-
//
|
|
72
|
-
// **They moved here from `time-segments.ts` when the model-gap block became a second renderer of a
|
|
73
|
-
// clock window** (joshuafolkken/kit#1386). A private copy beside the second block is the clone
|
|
74
|
-
// `CLAUDE.md` prohibits, in the one place a drift would make two tables of the same report disagree
|
|
75
|
-
// about which hour a stretch sat in.
|
|
76
|
-
const CLOCK_START = 11
|
|
77
|
-
const CLOCK_END = 19
|
|
78
|
-
const WINDOW_ARROW = ' → '
|
|
79
42
|
|
|
80
43
|
// **The parenthetical says "this report" rather than "them all"** (joshuafolkken/kit#1301): since
|
|
81
44
|
// `--top` can cut the record itself before either rendering, a promise that `--json` carries every row
|
|
@@ -133,54 +96,18 @@ function unmeasured_row(label: string): string {
|
|
|
133
96
|
return format_columns(label, '', NOT_MEASURED)
|
|
134
97
|
}
|
|
135
98
|
|
|
136
|
-
// **The ends are handed over already formatted**, so one aggregated table can spell its range in
|
|
137
|
-
// minutes and another in turns while both are punctuated identically. The sample count rides at the
|
|
138
|
-
// end because it is the qualifier: two rows with the same spread are not the same evidence when one
|
|
139
|
-
// was read from nine runs and the other from two.
|
|
140
|
-
function format_spread(min: string, max: string, sample_count: number): string {
|
|
141
|
-
const range = `${min}${RANGE_SEPARATOR}${max}`
|
|
142
|
-
|
|
143
|
-
return `${range}${SUFFIX_SEPARATOR}${String(sample_count)} ${RUN_UNIT}`
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
function format_clock(timestamp_ms: number): string {
|
|
147
|
-
return new Date(timestamp_ms).toISOString().slice(CLOCK_START, CLOCK_END)
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
function format_window(started_ms: number, ended_ms: number): string {
|
|
151
|
-
return `${format_clock(started_ms)}${WINDOW_ARROW}${format_clock(ended_ms)}`
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// The indent a report's notes sit under, beneath its heading. Written once because three renderers
|
|
155
|
-
// print them — the run scope, the epic scope and the distribution — and a fourth copy is how two
|
|
156
|
-
// tables of one command would come to indent the same sentence differently (joshuafolkken/kit#1312).
|
|
157
|
-
function note_lines(notes: ReadonlyArray<string>): Array<string> {
|
|
158
|
-
return notes.map((note) => ` ${note}`)
|
|
159
|
-
}
|
|
160
|
-
|
|
161
99
|
const time_format = {
|
|
162
100
|
MAX_ROWS,
|
|
163
101
|
NO_CALLS,
|
|
164
|
-
NAKED_PREFIX,
|
|
165
|
-
SUFFIX_SEPARATOR,
|
|
166
|
-
NOT_MEASURED,
|
|
167
|
-
MODEL_LABEL,
|
|
168
|
-
TOOL_LABEL,
|
|
169
|
-
HUMAN_LABEL,
|
|
170
|
-
CI_LABEL,
|
|
171
102
|
overflow_line,
|
|
172
|
-
format_minutes,
|
|
173
103
|
format_seconds,
|
|
174
104
|
format_share,
|
|
175
105
|
usd,
|
|
176
106
|
format_columns,
|
|
177
107
|
format_row,
|
|
178
|
-
format_spread,
|
|
179
108
|
// `format_clock` stays private: `format_window` is its only caller, and a namespace that offers
|
|
180
109
|
// both invites a second renderer to join the two with its own arrow.
|
|
181
|
-
format_window,
|
|
182
110
|
unmeasured_row,
|
|
183
|
-
note_lines,
|
|
184
111
|
}
|
|
185
112
|
|
|
186
113
|
export { time_format }
|
|
@@ -269,11 +269,7 @@ const time_round_trips = {
|
|
|
269
269
|
// `time-model-gaps.ts` and needed the same predicates and the same opener test this walk uses. A
|
|
270
270
|
// private copy there would be the clone `CLAUDE.md` prohibits, in the one place a drift would have
|
|
271
271
|
// the distribution and the count disagreeing about what a round trip is.
|
|
272
|
-
is_call,
|
|
273
|
-
is_model,
|
|
274
|
-
opens_round_trip,
|
|
275
272
|
per_round_trip,
|
|
276
|
-
started_ms,
|
|
277
273
|
}
|
|
278
274
|
|
|
279
275
|
export { time_round_trips }
|
|
@@ -60,6 +60,6 @@ function check_key(josh_command: string, command: string): string {
|
|
|
60
60
|
return [josh_command, ...argument_key(command)].join(KEY_SEPARATOR)
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
const time_single_check = {
|
|
63
|
+
const time_single_check = { NO_CHECK, check_key }
|
|
64
64
|
|
|
65
65
|
export { time_single_check }
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
|
|
2
|
-
import type { FollowupStage } from '#scripts/
|
|
2
|
+
import type { FollowupStage } from '#scripts/followup/git-followup-stages'
|
|
3
3
|
import { time_background } from './time-background'
|
|
4
4
|
import { time_bundle_call } from './time-bundle-call'
|
|
5
5
|
import { time_followup_stage } from './time-followup-stage'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FollowupStage } from '#scripts/
|
|
1
|
+
import type { FollowupStage } from '#scripts/followup/git-followup-stages'
|
|
2
2
|
import { json_value } from '#scripts/lib/json-value'
|
|
3
3
|
import { z } from 'zod'
|
|
4
4
|
import { time_background } from './time-background'
|
|
@@ -247,7 +247,6 @@ function parse_line(line: string): TranscriptLine | undefined {
|
|
|
247
247
|
|
|
248
248
|
const time_transcript_line = {
|
|
249
249
|
ERROR_TEXT_LIMIT,
|
|
250
|
-
REFUSAL_MARKER,
|
|
251
250
|
NO_MESSAGE_ID,
|
|
252
251
|
guard_from_refusal,
|
|
253
252
|
parse_line,
|
package/scripts/ui/ui-routes.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from 'node:fs'
|
|
2
2
|
import { createRequire } from 'node:module'
|
|
3
3
|
import path from 'node:path'
|
|
4
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
4
5
|
import { package_named_version_schema } from '#scripts/lib/schemas'
|
|
5
|
-
import { safe_json_parse } from './parse-json'
|
|
6
6
|
|
|
7
7
|
const PACKAGE_JSON = 'package.json'
|
|
8
8
|
// Node module paths never nest anywhere near this deep; the bound only guards against an unexpected
|
|
@@ -23,7 +23,7 @@ interface EffectiveUpstreamOptions {
|
|
|
23
23
|
function read_matching_version(manifest_path: string, package_name: string): string | undefined {
|
|
24
24
|
if (!existsSync(manifest_path)) return undefined
|
|
25
25
|
const parsed = package_named_version_schema.safeParse(
|
|
26
|
-
|
|
26
|
+
json_value.parse_or_undefined(readFileSync(manifest_path, 'utf8')),
|
|
27
27
|
)
|
|
28
28
|
if (!parsed.success) return undefined
|
|
29
29
|
if (parsed.data.name !== package_name) return undefined
|
|
@@ -37,11 +37,11 @@
|
|
|
37
37
|
*/
|
|
38
38
|
import { readFileSync, writeFileSync } from 'node:fs'
|
|
39
39
|
import { fileURLToPath } from 'node:url'
|
|
40
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
40
41
|
import { execaSync } from 'execa'
|
|
41
42
|
import semver from 'semver'
|
|
42
43
|
import { z } from 'zod'
|
|
43
44
|
import { package_manager_version } from './package-manager-version'
|
|
44
|
-
import { safe_json_parse } from './parse-json'
|
|
45
45
|
import { release_age } from './release-age'
|
|
46
46
|
|
|
47
47
|
const PACKAGE_JSON_PATH = 'package.json'
|
|
@@ -59,7 +59,9 @@ const DEV_ENGINES_SCHEMA = z.object({ packageManager: PNPM_DEVELOPMENT_MANAGER_S
|
|
|
59
59
|
const DEV_ENGINES_PNPM_SCHEMA = z.object({ devEngines: DEV_ENGINES_SCHEMA.optional() })
|
|
60
60
|
|
|
61
61
|
function extract_development_engines_version(package_json_content: string): string | undefined {
|
|
62
|
-
const parsed = DEV_ENGINES_PNPM_SCHEMA.safeParse(
|
|
62
|
+
const parsed = DEV_ENGINES_PNPM_SCHEMA.safeParse(
|
|
63
|
+
json_value.parse_or_undefined(package_json_content),
|
|
64
|
+
)
|
|
63
65
|
|
|
64
66
|
return parsed.success ? parsed.data.devEngines?.packageManager.version : undefined
|
|
65
67
|
}
|
|
@@ -108,7 +110,7 @@ function extract_times_json(stdout: string): Record<string, string> | undefined
|
|
|
108
110
|
const end = stdout.lastIndexOf('}')
|
|
109
111
|
if (start === -1 || end <= start) return undefined
|
|
110
112
|
const parsed = release_age.release_times_schema.safeParse(
|
|
111
|
-
|
|
113
|
+
json_value.parse_or_undefined(stdout.slice(start, end + 1)),
|
|
112
114
|
)
|
|
113
115
|
|
|
114
116
|
return parsed.success ? parsed.data : undefined
|
|
@@ -236,7 +238,7 @@ function decode_integrity(encoded: string): string | undefined {
|
|
|
236
238
|
function extract_encoded_integrity(stdout: string): string | undefined {
|
|
237
239
|
const payload = /"sha512-[A-Za-z0-9+/]+={0,2}"/u.exec(stdout)?.[0]
|
|
238
240
|
if (payload === undefined) return undefined
|
|
239
|
-
const parsed: unknown =
|
|
241
|
+
const parsed: unknown = json_value.parse_or_undefined(payload)
|
|
240
242
|
if (typeof parsed !== 'string') return undefined
|
|
241
243
|
|
|
242
244
|
return INTEGRITY_RE.exec(parsed)?.[1]
|
|
@@ -319,7 +321,7 @@ function restore_after_update(original: string, target: string, integrity: strin
|
|
|
319
321
|
}
|
|
320
322
|
|
|
321
323
|
function pin_unpinned_manifest(original: string, target: string, integrity: string): void {
|
|
322
|
-
const manifest = z.record(z.string(), z.unknown()).parse(
|
|
324
|
+
const manifest = z.record(z.string(), z.unknown()).parse(json_value.parse_or_undefined(original))
|
|
323
325
|
const pinned = JSON.stringify(
|
|
324
326
|
{ ...manifest, packageManager: `${target}+${integrity}` },
|
|
325
327
|
undefined,
|
|
@@ -386,18 +388,14 @@ const latest_corepack = {
|
|
|
386
388
|
is_target_not_newer_than_pin,
|
|
387
389
|
notify_skipped_bump,
|
|
388
390
|
extract_times_json,
|
|
389
|
-
query_release_times,
|
|
390
391
|
query_major_latest_version,
|
|
391
392
|
resolve_corepack_target,
|
|
392
|
-
warn_skip,
|
|
393
|
-
warn_unresolved,
|
|
394
393
|
run_pnpm_update,
|
|
395
394
|
query_integrity,
|
|
396
395
|
restore_integrity,
|
|
397
396
|
did_warn_skip,
|
|
398
397
|
sync_development_engines,
|
|
399
398
|
restore_package_json,
|
|
400
|
-
bump_package_manager,
|
|
401
399
|
main,
|
|
402
400
|
}
|
|
403
401
|
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
2
|
+
import { migrate_logic } from '#scripts/registry-migration/migrate-logic'
|
|
3
|
+
import { execaSync } from 'execa'
|
|
4
|
+
import { z } from 'zod'
|
|
5
|
+
import { release_age } from './release-age'
|
|
6
|
+
|
|
7
|
+
// The public npm registry, read without credentials so a consumer who installed from public npm
|
|
8
|
+
// can see the latest release without a `read:packages` GitHub token (joshuafolkken/kit#2882). The
|
|
9
|
+
// GitHub Packages versions API stays the source for a scope routed there, and the fallback for a
|
|
10
|
+
// package public npm does not carry.
|
|
11
|
+
const PUBLIC_REGISTRY = 'https://registry.npmjs.org'
|
|
12
|
+
// The abbreviated packument carries `dist-tags` without every version's full manifest.
|
|
13
|
+
const ABBREVIATED_ACCEPT = 'application/vnd.npm.install-v1+json'
|
|
14
|
+
const FULL_ACCEPT = 'application/json'
|
|
15
|
+
const REQUEST_TIMEOUT_MS = 10_000
|
|
16
|
+
const SCOPE_SEPARATOR = '/'
|
|
17
|
+
const ENCODED_SCOPE_SEPARATOR = '%2f'
|
|
18
|
+
const SCOPE_PATTERN = /^@[^/]+(?=\/)/u
|
|
19
|
+
const SCOPE_REGISTRY_SUFFIX = ':registry'
|
|
20
|
+
const github_scopes = new Map<string, boolean>()
|
|
21
|
+
|
|
22
|
+
// The version commands are synchronous end to end and exported that way to consumers, so the
|
|
23
|
+
// request runs in a child Node process rather than turning the whole chain async. Node's own
|
|
24
|
+
// `fetch` needs no external binary, and a non-2xx answer exits non-zero so it reads as "no answer".
|
|
25
|
+
const FETCH_SCRIPT = [
|
|
26
|
+
'const [url, accept] = process.argv.slice(1)',
|
|
27
|
+
'const response = await fetch(url, { headers: { accept } })',
|
|
28
|
+
'if (!response.ok) process.exit(1)',
|
|
29
|
+
'process.stdout.write(await response.text())',
|
|
30
|
+
].join('\n')
|
|
31
|
+
|
|
32
|
+
const latest_schema = z.looseObject({ 'dist-tags': z.looseObject({ latest: z.string() }) })
|
|
33
|
+
const times_schema = z.looseObject({ time: release_age.release_times_schema })
|
|
34
|
+
|
|
35
|
+
// The packument URL for a package name; a scoped name keeps its `@` and encodes the separator, the
|
|
36
|
+
// form the registry documents for scoped packages.
|
|
37
|
+
function packument_url(package_name: string): string {
|
|
38
|
+
return `${PUBLIC_REGISTRY}/${package_name.replace(SCOPE_SEPARATOR, () => ENCODED_SCOPE_SEPARATOR)}`
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function read_packument(package_name: string, accept: string): unknown {
|
|
42
|
+
const result = execaSync(
|
|
43
|
+
process.execPath,
|
|
44
|
+
['--input-type=module', '-e', FETCH_SCRIPT, packument_url(package_name), accept],
|
|
45
|
+
{ reject: false, timeout: REQUEST_TIMEOUT_MS },
|
|
46
|
+
)
|
|
47
|
+
if (result.exitCode !== 0) return undefined
|
|
48
|
+
|
|
49
|
+
return json_value.parse_or_undefined(result.stdout)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Whether this checkout installs the package's scope from GitHub Packages, read with the same
|
|
53
|
+
// `pnpm config get` `josh registry:migrate` uses (project `.npmrc` over user `~/.npmrc`). The two
|
|
54
|
+
// registries are published by parallel jobs and can drift, so a consumer routed to GitHub Packages
|
|
55
|
+
// keeps reading it: public npm could otherwise offer a release its registry does not carry yet.
|
|
56
|
+
// Memoized per scope — kit and app-kit share one, and one report asks for both packages.
|
|
57
|
+
function is_github_scope(scope: string): boolean {
|
|
58
|
+
const is_cached_github = github_scopes.get(scope)
|
|
59
|
+
if (is_cached_github !== undefined) return is_cached_github
|
|
60
|
+
const result = execaSync('pnpm', ['config', 'get', `${scope}${SCOPE_REGISTRY_SUFFIX}`], {
|
|
61
|
+
reject: false,
|
|
62
|
+
timeout: REQUEST_TIMEOUT_MS,
|
|
63
|
+
})
|
|
64
|
+
const is_github = result.exitCode === 0 && migrate_logic.is_github_tarball(result.stdout.trim())
|
|
65
|
+
|
|
66
|
+
github_scopes.set(scope, is_github)
|
|
67
|
+
|
|
68
|
+
return is_github
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function is_public_source(package_name: string): boolean {
|
|
72
|
+
const scope = SCOPE_PATTERN.exec(package_name)?.[0]
|
|
73
|
+
|
|
74
|
+
return scope === undefined || !is_github_scope(scope)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The `latest` dist-tag on public npm, or nothing when the package is not installed from there or
|
|
78
|
+
// the registry cannot answer for it (offline, timed out, or not published there).
|
|
79
|
+
function read_latest(package_name: string): string | undefined {
|
|
80
|
+
if (!is_public_source(package_name)) return undefined
|
|
81
|
+
const parsed = latest_schema.safeParse(read_packument(package_name, ABBREVIATED_ACCEPT))
|
|
82
|
+
|
|
83
|
+
return parsed.success ? parsed.data['dist-tags'].latest : undefined
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// The version → publish-date map from public npm, under the same source rule as `read_latest`. It
|
|
87
|
+
// also carries `created` / `modified` keys, which the release-age selector skips as non-semver.
|
|
88
|
+
function read_release_times(package_name: string): Record<string, string> | undefined {
|
|
89
|
+
if (!is_public_source(package_name)) return undefined
|
|
90
|
+
const parsed = times_schema.safeParse(read_packument(package_name, FULL_ACCEPT))
|
|
91
|
+
|
|
92
|
+
return parsed.success ? parsed.data.time : undefined
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const npm_registry = { packument_url, read_latest, read_release_times }
|
|
96
|
+
|
|
97
|
+
export { npm_registry }
|
|
@@ -129,13 +129,9 @@ function build_release_hold_notes(
|
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
const release_hold = {
|
|
132
|
-
HOLD_LABEL,
|
|
133
|
-
is_at_or_above,
|
|
134
|
-
is_latest_withheld,
|
|
135
132
|
resolve_installable,
|
|
136
133
|
is_release_age_hold,
|
|
137
134
|
format_window,
|
|
138
|
-
format_release_hold_note,
|
|
139
135
|
build_release_hold_notes,
|
|
140
136
|
}
|
|
141
137
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
3
4
|
import { package_version_schema } from '#scripts/lib/schemas'
|
|
4
|
-
import { safe_json_parse } from './parse-json'
|
|
5
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
|
|
@@ -27,7 +27,7 @@ function read_running_version(self_directory: string): string | undefined {
|
|
|
27
27
|
const package_path = resolve_self_package_path(self_directory)
|
|
28
28
|
if (!existsSync(package_path)) return undefined
|
|
29
29
|
const parsed = package_version_schema.safeParse(
|
|
30
|
-
|
|
30
|
+
json_value.parse_or_undefined(readFileSync(package_path, 'utf8')),
|
|
31
31
|
)
|
|
32
32
|
|
|
33
33
|
return parsed.success ? parsed.data.version : undefined
|
|
@@ -309,13 +309,11 @@ const version_check_logic = {
|
|
|
309
309
|
format_dual_version_output,
|
|
310
310
|
format_running_line,
|
|
311
311
|
format_upstream_lines,
|
|
312
|
-
format_upstream_global_line,
|
|
313
312
|
build_dual_upgrade_commands,
|
|
314
313
|
build_upstream_upgrade_commands,
|
|
315
314
|
build_upstream_upgrade_notes,
|
|
316
315
|
build_effective_upgrade_commands,
|
|
317
316
|
build_effective_upgrade_notes,
|
|
318
|
-
build_project_upgrade_commands,
|
|
319
317
|
format_update_command,
|
|
320
318
|
format_effective_outcome,
|
|
321
319
|
build_upgrade_shell_command,
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
type VersionSnapshot,
|
|
14
14
|
} from './version-check-logic'
|
|
15
15
|
import type {
|
|
16
|
+
PackageVersionConfig,
|
|
16
17
|
UpstreamHookContext,
|
|
17
18
|
UpstreamVersionConfig,
|
|
18
19
|
VersionCommandConfig,
|
|
@@ -29,11 +30,11 @@ const NO_QUARANTINE_MINUTES = 0
|
|
|
29
30
|
// whose `installable` is undefined when the timestamps cannot be read — the report then renders
|
|
30
31
|
// exactly as it did before (joshuafolkken/kit#808).
|
|
31
32
|
//
|
|
32
|
-
// Skipped entirely unless some target is behind `latest`: the timestamps cost a second
|
|
33
|
+
// Skipped entirely unless some target is behind `latest`: the timestamps cost a second registry
|
|
33
34
|
// round trip per package, and a package with nothing stale has no gap for a hold to explain. On the
|
|
34
35
|
// common all-current run the report costs exactly what it did before this feature.
|
|
35
36
|
function read_release_hold(
|
|
36
|
-
|
|
37
|
+
package_config: PackageVersionConfig,
|
|
37
38
|
latest: string,
|
|
38
39
|
versions: ReadonlyArray<string | undefined>,
|
|
39
40
|
): ReleaseHold | undefined {
|
|
@@ -45,7 +46,7 @@ function read_release_hold(
|
|
|
45
46
|
// a registry round trip discovering that.
|
|
46
47
|
if (minimum_age_minutes <= NO_QUARANTINE_MINUTES) return undefined
|
|
47
48
|
const installable = release_hold.resolve_installable(
|
|
48
|
-
fetch_release_times(versions_endpoint),
|
|
49
|
+
fetch_release_times(package_config.versions_endpoint, package_config.package_name),
|
|
49
50
|
latest,
|
|
50
51
|
minimum_age_minutes,
|
|
51
52
|
Date.now(),
|
|
@@ -157,7 +158,7 @@ function read_upstream_report(
|
|
|
157
158
|
// After the effective install is attached, so its version counts toward the staleness gate.
|
|
158
159
|
// Only the effective install is peer-resolved, so it is the only target the window can hold back.
|
|
159
160
|
const hold = is_hold_wanted
|
|
160
|
-
? read_release_hold(upstream
|
|
161
|
+
? read_release_hold(upstream, latest, [report.effective?.version])
|
|
161
162
|
: undefined
|
|
162
163
|
if (hold !== undefined) report.hold = hold
|
|
163
164
|
|