@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,6 @@
|
|
|
1
|
-
import { execFileSync } from 'node:child_process'
|
|
2
1
|
import { project_checks } from '#scripts/gate/project-checks'
|
|
2
|
+
import { PORCELAIN_FLAG } from '#scripts/git/constants'
|
|
3
|
+
import { git_spawn_sync } from '#scripts/git/git-spawn-sync'
|
|
3
4
|
import { test_declared_logic, type Verdict } from './test-declared-logic'
|
|
4
5
|
|
|
5
6
|
// The working-tree change set and the verdict over it, read **synchronously** for the `PreToolUse`
|
|
@@ -30,21 +31,17 @@ function path_of(line: string): string {
|
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
function read_changed_paths_sync(): Array<string> {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
.map((line) => path_of(line))
|
|
45
|
-
} catch {
|
|
46
|
-
return []
|
|
47
|
-
}
|
|
34
|
+
// Outside a repository git fails with `fatal: not a git repository`, which reads as an empty change
|
|
35
|
+
// set; its stderr is captured rather than surfaced, since it would only be noise.
|
|
36
|
+
// Unbounded (`timeout: 0`) on purpose: a timed-out status would read as an empty change set, and so
|
|
37
|
+
// as `exempt`, letting an untested runtime change through on a slow checkout.
|
|
38
|
+
const output = git_spawn_sync.run(['status', PORCELAIN_FLAG], { timeout: 0 })
|
|
39
|
+
if (output.exit_code !== 0) return []
|
|
40
|
+
|
|
41
|
+
return output.stdout
|
|
42
|
+
.split('\n')
|
|
43
|
+
.filter((line) => line.length > STATUS_PREFIX_LENGTH)
|
|
44
|
+
.map((line) => path_of(line))
|
|
48
45
|
}
|
|
49
46
|
|
|
50
47
|
// The working-tree read behind `current_verdict`, injectable so the delivery path can be exercised
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { text } from 'node:stream/consumers'
|
|
3
3
|
import { fileURLToPath } from 'node:url'
|
|
4
|
-
import { parseArgs } from 'node:util'
|
|
5
4
|
import { project_checks } from '#scripts/gate/project-checks'
|
|
5
|
+
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
6
6
|
import { test_declared_changed } from './test-declared-changed'
|
|
7
7
|
import { test_declared_logic, type Verdict } from './test-declared-logic'
|
|
8
8
|
import { test_declared_match, type MatchResult } from './test-declared-match'
|
|
@@ -55,13 +55,9 @@ interface Options {
|
|
|
55
55
|
// The parsed flags, or `undefined` when an unknown one was passed — the strict parse is what turns a
|
|
56
56
|
// typo into a refusal rather than a silent re-print of the verdict.
|
|
57
57
|
function parse(argv: ReadonlyArray<string>): Options | undefined {
|
|
58
|
-
|
|
59
|
-
const { values } = parseArgs({ args: [...argv], options: PARSE_ARGS_OPTIONS, strict: true })
|
|
58
|
+
const values = cli_flags.values_of(argv, PARSE_ARGS_OPTIONS)
|
|
60
59
|
|
|
61
|
-
|
|
62
|
-
} catch {
|
|
63
|
-
return undefined
|
|
64
|
-
}
|
|
60
|
+
return values === undefined ? undefined : { is_help: values.help, is_match: values.match }
|
|
65
61
|
}
|
|
66
62
|
|
|
67
63
|
// The next command a verdict leaves to run, or `undefined` when there is nothing to do next. Only
|
|
@@ -192,12 +188,10 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
|
192
188
|
|
|
193
189
|
const test_declared = {
|
|
194
190
|
USAGE,
|
|
195
|
-
detail_for,
|
|
196
191
|
format_match,
|
|
197
192
|
next_step,
|
|
198
193
|
parse,
|
|
199
194
|
report,
|
|
200
|
-
run,
|
|
201
195
|
run_match,
|
|
202
196
|
}
|
|
203
197
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { git_gh_issue_read } from '#scripts/
|
|
1
|
+
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
2
2
|
import { test_red, type RedRun } from './test-red'
|
|
3
3
|
import { test_red_logic } from './test-red-logic'
|
|
4
4
|
|
|
@@ -45,7 +45,7 @@ async function assert_reproduces(
|
|
|
45
45
|
if (test_red_logic.is_refused(body, verdict)) throw new Error(reason_for(issue_number, files))
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
const test_red_commit = { assert_reproduces
|
|
48
|
+
const test_red_commit = { assert_reproduces }
|
|
49
49
|
|
|
50
50
|
export type { RedCommitPorts }
|
|
51
51
|
export { test_red_commit }
|
package/scripts/test/test-red.ts
CHANGED
|
@@ -40,13 +40,20 @@ async function changed_tests(): Promise<Array<string>> {
|
|
|
40
40
|
return test_red_logic.unit_test_files(paths).filter((file) => existsSync(file))
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
async function
|
|
44
|
-
|
|
45
|
-
const target = path.join(tree, file)
|
|
43
|
+
async function copy_one(tree: string, file: string): Promise<void> {
|
|
44
|
+
const target = path.join(tree, file)
|
|
46
45
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
await mkdir(path.dirname(target), { recursive: true })
|
|
47
|
+
await copyFile(file, target)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Each file has its own target, and a recursive `mkdir` tolerates a sibling creating the same parent.
|
|
51
|
+
async function copy_in(tree: string, files: ReadonlyArray<string>): Promise<void> {
|
|
52
|
+
await Promise.all(
|
|
53
|
+
files.map(async (file) => {
|
|
54
|
+
await copy_one(tree, file)
|
|
55
|
+
}),
|
|
56
|
+
)
|
|
50
57
|
}
|
|
51
58
|
|
|
52
59
|
async function prepare(tree: string, base: string, files: ReadonlyArray<string>): Promise<void> {
|
|
@@ -148,7 +155,7 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
|
148
155
|
process.exitCode = await main(process.argv.slice(ARGV_OFFSET))
|
|
149
156
|
}
|
|
150
157
|
|
|
151
|
-
const test_red = {
|
|
158
|
+
const test_red = { run }
|
|
152
159
|
|
|
153
160
|
export type { RedRun }
|
|
154
161
|
export { test_red }
|
|
@@ -25,7 +25,7 @@ function test_type_for(path: string): TestType {
|
|
|
25
25
|
return E2E_PREFIXES.some((prefix) => normalized.startsWith(prefix)) ? E2E : UNIT
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
const test_type_logic = { E2E,
|
|
28
|
+
const test_type_logic = { E2E, UNIT, test_type_for }
|
|
29
29
|
|
|
30
30
|
export type { TestType }
|
|
31
31
|
export { test_type_logic }
|
|
@@ -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,
|
|
@@ -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
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
1
2
|
import { migrate_logic } from '#scripts/registry-migration/migrate-logic'
|
|
2
3
|
import { execaSync } from 'execa'
|
|
3
4
|
import { z } from 'zod'
|
|
4
|
-
import { safe_json_parse } from './parse-json'
|
|
5
5
|
import { release_age } from './release-age'
|
|
6
6
|
|
|
7
7
|
// The public npm registry, read without credentials so a consumer who installed from public npm
|
|
@@ -46,7 +46,7 @@ function read_packument(package_name: string, accept: string): unknown {
|
|
|
46
46
|
)
|
|
47
47
|
if (result.exitCode !== 0) return undefined
|
|
48
48
|
|
|
49
|
-
return
|
|
49
|
+
return json_value.parse_or_undefined(result.stdout)
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
// Whether this checkout installs the package's scope from GitHub Packages, read with the same
|
|
@@ -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,
|