@joshuafolkken/kit 1.1240.0 → 1.1373.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +52 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +19 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +26 -16
- package/.claude/skills/workflow-commands/latest-gate.md +17 -28
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +23 -66
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +43 -11
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-7UBFU3CL.js} +18 -20
- package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-7WKYHEGU.js} +8 -44
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-AKGCP4LX.js} +285 -363
- package/dist/hooks/{chunk-QVSWU24O.js → chunk-BZMPVFDY.js} +7 -5
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-XZYKEM6J.js → chunk-JCRDBQXB.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-JGW24KKM.js} +4 -4
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-SLSFIWTX.js} +550 -875
- package/dist/hooks/chunk-UTHMB4O2.js +1590 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-V4TKZHER.js} +4 -4
- package/dist/hooks/chunk-YLBBSSTF.js +3705 -0
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +195 -181
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -187
- package/dist/josh.js +282 -95
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +17 -11
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +3 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +30 -5
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +2 -2
- package/scripts/gate/core-budget.ts +15 -26
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +70 -35
- package/scripts/gate/gate-report.ts +14 -15
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +168 -30
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +53 -51
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +7 -7
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +1 -1
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +24 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +52 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +9 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +34 -38
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +17 -7
- package/scripts/issue/issue-release.ts +3 -3
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +30 -35
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +25 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +4 -5
- package/scripts/josh/josh-commands-lane.ts +14 -4
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-run.ts +21 -7
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +6 -7
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +12 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +2 -2
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +20 -19
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +12 -11
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +16 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +1 -1
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cross-file-recheck.ts +155 -0
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +35 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-runs.ts +1 -1
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +6 -7
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +54 -36
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +9 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +171 -46
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +26 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +64 -18
- package/scripts/run/run-step.ts +107 -51
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -32
- package/scripts/run/wake/run-wake-describe.ts +24 -28
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +9 -9
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -279
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +26 -26
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -6,8 +6,7 @@ import { time_followup_stage } from './time-followup-stage'
|
|
|
6
6
|
import { time_instant } from './time-instant'
|
|
7
7
|
import { time_reported_failure } from './time-reported-failure'
|
|
8
8
|
|
|
9
|
-
// One line of a session transcript, read into the shape the span walk works on
|
|
10
|
-
// (joshuafolkken/kit#1406).
|
|
9
|
+
// One line of a session transcript, read into the shape the span walk works on.
|
|
11
10
|
//
|
|
12
11
|
// It moved out of `time-spans.ts` when that file passed its length limit — the seam that file is
|
|
13
12
|
// already cut along elsewhere (`time-shell.ts`, `time-single-check.ts`), where the *reading* of a
|
|
@@ -27,22 +26,22 @@ const BLOCK_SCHEMA = z.object({
|
|
|
27
26
|
|
|
28
27
|
tool_use_id: z.string().nullish(),
|
|
29
28
|
input: z.unknown().nullish(),
|
|
30
|
-
// Whether the harness wrote this result back as a failure
|
|
29
|
+
// Whether the harness wrote this result back as a failure. Present on a
|
|
31
30
|
// `tool_result` block and on nothing else, and absent even there for the tools that never report
|
|
32
31
|
// one — which is why it is read as three answers rather than as a boolean with a default.
|
|
33
32
|
is_error: z.boolean().nullish(),
|
|
34
|
-
// What the call printed. Read only to recover the outcome a pipeline threw away
|
|
35
|
-
//
|
|
33
|
+
// What the call printed. Read only to recover the outcome a pipeline threw away:
|
|
34
|
+
// it is kept as flattened text rather than as blocks, because that is
|
|
36
35
|
// the whole of what `time-reported-failure.ts` asks of it.
|
|
37
36
|
content: z.unknown().nullish(),
|
|
38
37
|
})
|
|
39
38
|
|
|
40
39
|
const CONTENT_SCHEMA = z.union([z.string(), z.array(BLOCK_SCHEMA)])
|
|
41
40
|
// `id` is the assistant *message* the line belongs to, and Claude Code writes one line per content
|
|
42
|
-
// block — a turn that thought and then issued two calls is three lines carrying one id
|
|
43
|
-
//
|
|
44
|
-
// group by this field; counting one line's blocks answers one, whatever the turn actually did.
|
|
45
|
-
//
|
|
41
|
+
// block — a turn that thought and then issued two calls is three lines carrying one id.
|
|
42
|
+
// Anything asking "how many calls did that turn make" therefore has to
|
|
43
|
+
// group by this field; counting one line's blocks answers one, whatever the turn actually did. The
|
|
44
|
+
// same field is what says how many *turns* a run had.
|
|
46
45
|
const MESSAGE_SCHEMA = z.object({ id: z.string().nullish(), content: CONTENT_SCHEMA.nullish() })
|
|
47
46
|
|
|
48
47
|
const LINE_SCHEMA = z.object({
|
|
@@ -50,10 +49,10 @@ const LINE_SCHEMA = z.object({
|
|
|
50
49
|
timestamp: z.string().nullish(),
|
|
51
50
|
// The branch the line was written on, which is where the issue number lives — `josh git` names a
|
|
52
51
|
// branch `<N>-<slug>`. Read here rather than re-parsed by a second reader so `josh time --issue`
|
|
53
|
-
// and `josh cost --issue` answer from the same field
|
|
52
|
+
// and `josh cost --issue` answer from the same field.
|
|
54
53
|
gitBranch: z.string().nullish(),
|
|
55
|
-
// The two fields outside `message` that the harness writes an end-of-task notice on
|
|
56
|
-
//
|
|
54
|
+
// The two fields outside `message` that the harness writes an end-of-task notice on.
|
|
55
|
+
// **Both are read as `unknown` rather than as strings**: a schema
|
|
57
56
|
// insisting on a string here would reject every line whose `content` is a list of blocks — which is
|
|
58
57
|
// most of them — and a rejected line is dropped from the timeline entirely, so the shares would stop
|
|
59
58
|
// reconstructing the elapsed time. The shape is checked at the read below instead.
|
|
@@ -63,17 +62,14 @@ const LINE_SCHEMA = z.object({
|
|
|
63
62
|
})
|
|
64
63
|
|
|
65
64
|
const UNKNOWN_BRANCH = ''
|
|
66
|
-
// The field an attachment line carries the notice in
|
|
67
|
-
// reason `time-background.ts`'s `BASH_ID_KEY` is: `dot-notation` rewrote `record['prompt']` into
|
|
68
|
-
// `record.prompt`, which a value read as an index-signature record does not have — until
|
|
69
|
-
// joshuafolkken/kit#1783 switched that fix off. The name is kept for its own sake.
|
|
65
|
+
// The field an attachment line carries the notice in, named rather than written as a literal.
|
|
70
66
|
const PROMPT_KEY = 'prompt'
|
|
71
67
|
const NO_MESSAGE_ID = ''
|
|
72
|
-
// How much of an errored body is kept
|
|
68
|
+
// How much of an errored body is kept. A refusal's body *is* the reason the
|
|
73
69
|
// harness wrote back, from its first character, so an opening this long identifies the speaker
|
|
74
70
|
// without retaining the output of every failed command a session ran.
|
|
75
71
|
const ERROR_TEXT_LIMIT = 256
|
|
76
|
-
// The icon every guard refusal opens with
|
|
72
|
+
// The icon every guard refusal opens with. It is not `status_icons.FAIL_ICON`
|
|
77
73
|
// — that one (`✗`) marks a josh check's failing item, which `has_failure_line` scans for; this one
|
|
78
74
|
// marks a PreToolUse hook's *deny* reason, which is a different body carried in a different result. No
|
|
79
75
|
// shared constant exists because each guard writes the literal in its own reason, so the one place a
|
|
@@ -81,8 +77,11 @@ const ERROR_TEXT_LIMIT = 256
|
|
|
81
77
|
const REFUSAL_MARKER = '⛔'
|
|
82
78
|
// The label the harness puts in front of a PreToolUse hook's deny reason, naming the hook and the tool.
|
|
83
79
|
const HOOK_ERROR_LABEL = /^PreToolUse:\S+ hook error: /u
|
|
80
|
+
// The label the harness puts in front of a Stop hook's block reason when it sends the turn back.
|
|
81
|
+
// The reason follows on the next line, opening with the same `⛔` a deny does.
|
|
82
|
+
const STOP_FEEDBACK_LABEL = /^Stop hook feedback:\s*/u
|
|
84
83
|
// A line that is one bare verdict token — `cut`, `busy`, `not-a-lane` — the single word a josh verdict
|
|
85
|
-
// command prints on standard output
|
|
84
|
+
// command prints on standard output. How many are kept bounds the field the
|
|
86
85
|
// way `ERROR_TEXT_LIMIT` bounds `error_text`.
|
|
87
86
|
const TOKEN_LINE = /^[a-z][a-z-]*$/u
|
|
88
87
|
const TOKEN_LINE_LIMIT = 8
|
|
@@ -97,40 +96,40 @@ interface Block {
|
|
|
97
96
|
// `false`: one is a tool that reports no outcome, the other a call that succeeded.
|
|
98
97
|
is_error: boolean | undefined
|
|
99
98
|
// Whether the body carried a line opening with josh's failure icon — the one bit of it anything
|
|
100
|
-
// reads
|
|
99
|
+
// reads. The text itself is deliberately not kept: a field holding it
|
|
101
100
|
// would retain every byte the session's tools printed for the length of the parse.
|
|
102
101
|
has_failure_line: boolean
|
|
103
|
-
// The stage rows a `pnpm josh followup` call printed into its own output
|
|
104
|
-
//
|
|
102
|
+
// The stage rows a `pnpm josh followup` call printed into its own output.
|
|
103
|
+
// Read here for the same reason the bit above is, and it obeys the same
|
|
105
104
|
// prohibition: what is kept is the ten-odd parsed laps, never the body they were read from. Empty
|
|
106
105
|
// for every other tool result, which is nearly all of them.
|
|
107
106
|
followup_stages: ReadonlyArray<FollowupStage>
|
|
108
107
|
// The opening of the body of a result the harness wrote back as a failure, and `''` for every
|
|
109
|
-
// other block
|
|
108
|
+
// other block. It obeys the same prohibition as the two fields above —
|
|
110
109
|
// what is kept is a bounded opening, never the whole body — and it exists so a reader asking
|
|
111
110
|
// which refusal a line carried can be answered from the parsed block rather than by matching
|
|
112
111
|
// `"is_error":true` against the raw line, a test one whitespace in the serializer defeats and
|
|
113
112
|
// which cannot tell one errored block from another on the same line.
|
|
114
113
|
error_text: string
|
|
115
114
|
// Which guard refused this call, read off the opening of an errored result and `''` for every other
|
|
116
|
-
// block
|
|
115
|
+
// block. It obeys the same prohibition as `error_text` — what is kept is a
|
|
117
116
|
// short label, never the body — and it exists so the per-guard refusal breakdown can be answered from
|
|
118
117
|
// the parsed block rather than by re-scanning the body downstream. `''` where the result was not a
|
|
119
118
|
// `⛔` refusal, so a reader tells "no guard spoke" from "this guard spoke" without a second parse.
|
|
120
119
|
refusal_guard: string
|
|
121
|
-
// The bare-token lines of a result that did not fail, and `[]` for every other block
|
|
122
|
-
//
|
|
120
|
+
// The bare-token lines of a result that did not fail, and `[]` for every other block.
|
|
121
|
+
// It obeys the same prohibition as `error_text` — what is kept is a few
|
|
123
122
|
// single words, never the body — and it exists so the verdict a josh command answered with
|
|
124
123
|
// (`run:cut`'s `cut`) is read from the parsed block rather than by searching the raw line.
|
|
125
124
|
token_lines: ReadonlyArray<string>
|
|
126
125
|
// The id the harness assigned to a command it took into the background, and `''` for every other
|
|
127
|
-
// block
|
|
126
|
+
// block. It is the fourth field read off the body under the same
|
|
128
127
|
// prohibition as the three above — what is kept is the id, never the text it was read from — and
|
|
129
128
|
// it is what pairs a launch with the call that later reads its output, so the minutes the command
|
|
130
129
|
// actually ran can be placed on the timeline instead of only the seconds its launch call took.
|
|
131
130
|
background_id: string
|
|
132
131
|
// The id of a subagent this block launched into the background, and `''` for every other block
|
|
133
|
-
//
|
|
132
|
+
// — apart from `background_id` so the timeline windows stay commands only.
|
|
134
133
|
agent_id: string
|
|
135
134
|
}
|
|
136
135
|
|
|
@@ -139,7 +138,7 @@ interface TranscriptLine {
|
|
|
139
138
|
timestamp_ms: number
|
|
140
139
|
branch: string
|
|
141
140
|
// The background run this line is the harness's end-of-task notice for, and `''` for every other
|
|
142
|
-
// line
|
|
141
|
+
// line. It is read here rather than downstream for the reason every
|
|
143
142
|
// derived field above is: the notice is the line's whole content, which a span does not keep, and
|
|
144
143
|
// it is the only thing in a transcript that says a command had *finished* rather than merely been
|
|
145
144
|
// looked at.
|
|
@@ -149,6 +148,9 @@ interface TranscriptLine {
|
|
|
149
148
|
// every line lacking an id would otherwise fall into one bucket spanning the whole file.
|
|
150
149
|
message_id: string
|
|
151
150
|
blocks: Array<Block>
|
|
151
|
+
// The guard whose Stop-hook block sent this turn back, or `''` for every other line
|
|
152
|
+
// — read the way `Block.refusal_guard` is, off the reason's opening.
|
|
153
|
+
stop_guard: string
|
|
152
154
|
}
|
|
153
155
|
|
|
154
156
|
// The four string fields, defaulted together and apart from the two that are not strings. Split out
|
|
@@ -165,15 +167,15 @@ function block_names(
|
|
|
165
167
|
}
|
|
166
168
|
}
|
|
167
169
|
|
|
168
|
-
// **A refusal is identified by what its body opens with, never by what it carries inside
|
|
169
|
-
//
|
|
170
|
+
// **A refusal is identified by what its body opens with, never by what it carries inside**.
|
|
171
|
+
// The hook denies a call on behalf of the one guard whose trigger fired and
|
|
170
172
|
// writes that guard's reason back as the whole result, so the speaker is the token after the `⛔` and
|
|
171
173
|
// before the first `:` — `⛔ pre-gate cut: …` is `pre-gate cut`. A reason with no colon (a headline
|
|
172
174
|
// like `⛔ scoped checks not green on this tree`) is taken whole. Reading the opening rather than
|
|
173
175
|
// searching the body is what stops a result that merely quoted a reason being read as a refusal.
|
|
174
176
|
//
|
|
175
177
|
// **The harness writes the reason behind its own label** — `PreToolUse:Edit hook error: ⛔ …` — so that
|
|
176
|
-
// label is stripped before the opening is read
|
|
178
|
+
// label is stripped before the opening is read. Without it no live refusal
|
|
177
179
|
// carried a guard: the fixtures wrote the bare `⛔` body and passed while every recorded one read `''`.
|
|
178
180
|
function guard_from_refusal(text: string): string {
|
|
179
181
|
const trimmed = text.trimStart().replace(HOOK_ERROR_LABEL, '')
|
|
@@ -185,6 +187,16 @@ function guard_from_refusal(text: string): string {
|
|
|
185
187
|
return (colon === -1 ? headline : headline.slice(0, colon)).trim()
|
|
186
188
|
}
|
|
187
189
|
|
|
190
|
+
// **Only the harness's own feedback line counts.** It writes a Stop block back as a user turn whose
|
|
191
|
+
// whole body is `Stop hook feedback:` and the reason, so a prompt that merely quotes one never opens
|
|
192
|
+
// with the label and reads `''`.
|
|
193
|
+
function stop_guard_of(data: z.infer<typeof LINE_SCHEMA>): string {
|
|
194
|
+
const content = data.message?.content
|
|
195
|
+
if (typeof content !== 'string' || !STOP_FEEDBACK_LABEL.test(content)) return ''
|
|
196
|
+
|
|
197
|
+
return guard_from_refusal(content.replace(STOP_FEEDBACK_LABEL, ''))
|
|
198
|
+
}
|
|
199
|
+
|
|
188
200
|
function token_lines_of(text: string): Array<string> {
|
|
189
201
|
return text
|
|
190
202
|
.split('\n')
|
|
@@ -196,7 +208,7 @@ function token_lines_of(text: string): Array<string> {
|
|
|
196
208
|
// **The body is flattened once and both readers are handed the text.** `result_text` is what turns a
|
|
197
209
|
// content field that may be a string or a list of blocks into one string, and it is idempotent on a
|
|
198
210
|
// string — so passing its own output back to `has_failure_line` reads exactly as passing the raw
|
|
199
|
-
// field did, at one flattening instead of two
|
|
211
|
+
// field did, at one flattening instead of two.
|
|
200
212
|
function to_block(raw: z.infer<typeof BLOCK_SCHEMA>): Block {
|
|
201
213
|
const text = time_reported_failure.result_text(raw.content)
|
|
202
214
|
const is_error = raw.is_error ?? undefined
|
|
@@ -235,7 +247,7 @@ function message_fields(
|
|
|
235
247
|
}
|
|
236
248
|
|
|
237
249
|
// **One notice reaches the transcript on any of three line kinds, and which of them a session holds
|
|
238
|
-
// varies
|
|
250
|
+
// varies**. The harness writes it on a `queue-operation` line when the notice
|
|
239
251
|
// is generated, on an `attachment` line when it is delivered, and on a `user` line where it enters the
|
|
240
252
|
// conversation — and a run measured against one carrier alone came back unmeasured whenever the
|
|
241
253
|
// session happened to hold a different one. All three are read, and `time_background.finished_at`
|
|
@@ -260,6 +272,7 @@ function to_line(data: z.infer<typeof LINE_SCHEMA>): TranscriptLine | undefined
|
|
|
260
272
|
timestamp_ms,
|
|
261
273
|
branch: data.gitBranch ?? UNKNOWN_BRANCH,
|
|
262
274
|
finished_background: time_background.finished_id(notice_text(data)),
|
|
275
|
+
stop_guard: stop_guard_of(data),
|
|
263
276
|
...message_fields(data.message),
|
|
264
277
|
}
|
|
265
278
|
}
|
|
@@ -270,12 +283,18 @@ function parse_line(line: string): TranscriptLine | undefined {
|
|
|
270
283
|
return parsed.success ? to_line(parsed.data) : undefined
|
|
271
284
|
}
|
|
272
285
|
|
|
286
|
+
// A whole transcript's text read as its parsed lines, the unparseable ones dropped.
|
|
287
|
+
function parse_text(text: string): Array<TranscriptLine> {
|
|
288
|
+
return text.split('\n').flatMap((line) => parse_line(line) ?? [])
|
|
289
|
+
}
|
|
290
|
+
|
|
273
291
|
const time_transcript_line = {
|
|
274
292
|
ERROR_TEXT_LIMIT,
|
|
275
293
|
NO_MESSAGE_ID,
|
|
276
294
|
TOKEN_LINE_LIMIT,
|
|
277
295
|
guard_from_refusal,
|
|
278
296
|
parse_line,
|
|
297
|
+
parse_text,
|
|
279
298
|
}
|
|
280
299
|
|
|
281
300
|
export type { Block, TranscriptLine }
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { time_bundle_call } from './time-bundle-call'
|
|
2
2
|
import { time_markers } from './time-markers'
|
|
3
3
|
|
|
4
|
-
// Which files one tool call **wrote
|
|
4
|
+
// Which files one tool call **wrote**.
|
|
5
5
|
//
|
|
6
6
|
// **A span keeps no tool input**, so anything read off the input has to be read while the input is
|
|
7
7
|
// still in hand — the reason `marker`, `targets` and `check_key` are already carried on `ToolCall`
|
|
@@ -22,11 +22,11 @@ import { time_markers } from './time-markers'
|
|
|
22
22
|
// **This module is the one place that answers the question**, so the two callers cannot come to
|
|
23
23
|
// disagree about it, and it reuses the extraction `time-bundle-call.ts` already owns rather than
|
|
24
24
|
// writing a second one: `tool_targets` for a tool's own path fields, `targets_in` for a shell line.
|
|
25
|
-
// Nothing here widens `BUNDLEABLE_TOOLS` — that set is what the batching measurement
|
|
26
|
-
//
|
|
25
|
+
// Nothing here widens `BUNDLEABLE_TOOLS` — that set is what the batching measurement is
|
|
26
|
+
// defined over, and a call that writes is deliberately not bundleable.
|
|
27
27
|
|
|
28
|
-
// **Whether a line is an in-place `sed` is `time-bundle-call.ts`'s answer, not a second one here
|
|
29
|
-
//
|
|
28
|
+
// **Whether a line is an in-place `sed` is `time-bundle-call.ts`'s answer, not a second one here**.
|
|
29
|
+
// That module needs the same test as a boolean for the batching sequences,
|
|
30
30
|
// and while the two were written separately they disagreed in both directions at once — one read the
|
|
31
31
|
// whole line, so a piped `grep -i` made a read into a write; the other missed a bundled `sed -ni`, so
|
|
32
32
|
// one span could carry `writes: ['x.ts']` beside `is_writing: false`. The segment scoping and the
|
|
@@ -7,8 +7,7 @@ import { git_command } from '#scripts/git/git-command'
|
|
|
7
7
|
import { file_reader } from '#scripts/lib/read-file'
|
|
8
8
|
import { ui_routes } from './ui-routes'
|
|
9
9
|
|
|
10
|
-
// `josh ui:routes [--staged]` — list the screenshot-target routes the current change touches
|
|
11
|
-
// (joshuafolkken/kit#2182).
|
|
10
|
+
// `josh ui:routes [--staged]` — list the screenshot-target routes the current change touches.
|
|
12
11
|
//
|
|
13
12
|
// The derivation lives in `ui-routes.ts`; this file is the I/O around it: read the changed paths
|
|
14
13
|
// (the branch diff, or the staged diff with `--staged`), and resolve a shared component to the routes
|
package/scripts/ui/ui-routes.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
// The screenshot-target routes a change touches, derived from the diff rather than chosen by eye
|
|
2
|
-
// (joshuafolkken/kit#2182).
|
|
1
|
+
// The screenshot-target routes a change touches, derived from the diff rather than chosen by eye.
|
|
3
2
|
//
|
|
4
3
|
// The `verify-ui` skill's §1 asked the reader to read `git diff` and name the routes whose
|
|
5
4
|
// components, styles or copy it touches — but in SvelteKit a file path maps to a route path
|
|
@@ -25,7 +25,7 @@ function package_json_path(): string {
|
|
|
25
25
|
|
|
26
26
|
// **Set the version to an already-decided number.** `bump_version` below is this plus the decision;
|
|
27
27
|
// `pnpm josh release` supplies its own, because a release raises the version by as many minors as
|
|
28
|
-
// main has taken merges rather than by one
|
|
28
|
+
// main has taken merges rather than by one. Written once so the two agree
|
|
29
29
|
// on the file's shape and indentation.
|
|
30
30
|
function write_version(new_version: string): void {
|
|
31
31
|
const package_path = package_json_path()
|
|
@@ -16,8 +16,8 @@ function with_cache_directory(
|
|
|
16
16
|
|
|
17
17
|
// A cached metadata file written through safe-chain lacks every version that was under 24 hours old
|
|
18
18
|
// at the time, and with `minimumReleaseAge` set pnpm reuses a cache file younger than that age
|
|
19
|
-
// instead of refetching it — so a version that has since aged in stays invisible for up to a day
|
|
20
|
-
//
|
|
19
|
+
// instead of refetching it — so a version that has since aged in stays invisible for up to a day.
|
|
20
|
+
// A fresh directory per run means nothing filtered earlier is ever read.
|
|
21
21
|
function run_in_fresh_cache<T>(
|
|
22
22
|
stages: ReadonlyArray<ReadonlyArray<string>>,
|
|
23
23
|
run_stages: (stages: Array<Array<string>>) => T,
|
|
@@ -5,34 +5,34 @@
|
|
|
5
5
|
* The target version is resolved from the registry's publish timestamps
|
|
6
6
|
* (`pnpm view pnpm time --json`) instead of a dist-tag, because pnpm publishes its
|
|
7
7
|
* per-major tag `latest-<major>` only for SUPERSEDED majors — while <major> is the newest
|
|
8
|
-
* major, the only tag covering it is `latest
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
8
|
+
* major, the only tag covering it is `latest`, so a `latest-<major>` pin would fail on every
|
|
9
|
+
* run in the common case, and `latest` itself can momentarily point below the devEngines
|
|
10
|
+
* floor. Picking the newest registry version whose major equals the `packageManager` pin keeps
|
|
11
|
+
* both invariants: never below the adopted major, and advancing while that major is the
|
|
12
|
+
* current one.
|
|
13
13
|
*
|
|
14
|
-
* The `minimumReleaseAge` quarantine is applied natively from `pnpm-workspace.yaml
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
14
|
+
* The `minimumReleaseAge` quarantine is applied natively from `pnpm-workspace.yaml`.
|
|
15
|
+
* safe-chain filters the registry only when the process tree was launched through one of its
|
|
16
|
+
* wrapped shell commands, so `josh latest` and `pnpm josh latest` would resolve different
|
|
17
|
+
* answers and the pin would oscillate. Reading the window from the repo-managed
|
|
18
18
|
* `pnpm-workspace.yaml` and filtering by publish timestamp makes the resolution identical in
|
|
19
19
|
* every invocation context; right after a pnpm release the answer is simply the previous
|
|
20
|
-
* release, exactly as the filtered view
|
|
20
|
+
* release, exactly as the filtered view behaves.
|
|
21
21
|
*
|
|
22
22
|
* The resolved version is floored at the current `packageManager` pin: a filtered registry
|
|
23
23
|
* view legitimately answers below a freshly adopted pin for the first 24 hours after every
|
|
24
|
-
* pnpm release, and writing that answer would downgrade the protected toolchain pin
|
|
25
|
-
*
|
|
24
|
+
* pnpm release, and writing that answer would downgrade the protected toolchain pin.
|
|
25
|
+
* Not-newer answers skip the bump non-fatally instead.
|
|
26
26
|
*
|
|
27
27
|
* `devEngines.packageManager.version` is realigned with the `packageManager` pin on every
|
|
28
|
-
* path — bumped, skipped, or unresolvable
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
28
|
+
* path — bumped, skipped, or unresolvable. A bump never fires in the steady state of an
|
|
29
|
+
* up-to-date repository, so alignment gated on one would leave a manifest that arrived with
|
|
30
|
+
* the two fields out of step warning forever. The alignment is idempotent, so running it
|
|
31
|
+
* unconditionally is free.
|
|
32
32
|
*
|
|
33
|
-
* A failed bump exits non-zero with its cause, the manifest restored
|
|
34
|
-
*
|
|
35
|
-
*
|
|
33
|
+
* A failed bump exits non-zero with its cause, the manifest restored — a skip would let
|
|
34
|
+
* `latest:scope --record` mark the run fresh while a pnpm that could not self-update (the
|
|
35
|
+
* Corepack shim refuses it) stayed pinned silently. `josh latest` runs this step
|
|
36
36
|
* last, right before the record, so the dependency update and the audit still finish and only the
|
|
37
37
|
* record is withheld. A registry answer not newer than the pin, or nothing aged past the
|
|
38
38
|
* quarantine window yet, remains a non-fatal skip.
|
|
@@ -60,7 +60,7 @@ const INTEGRITY_RE = /^sha512-([A-Za-z0-9+/]+={0,2})$/u
|
|
|
60
60
|
const PACKAGE_MANAGER_VALUE_RE = /("packageManager"\s*:\s*")pnpm@[^"]+(")/u
|
|
61
61
|
|
|
62
62
|
// `target` is undefined both when the registry did not answer and when it answered but nothing has
|
|
63
|
-
// aged past the quarantine window yet; only the first is a failure
|
|
63
|
+
// aged past the quarantine window yet; only the first is a failure.
|
|
64
64
|
interface TargetResolution {
|
|
65
65
|
target: string | undefined
|
|
66
66
|
is_registry_reachable: boolean
|
|
@@ -70,7 +70,7 @@ const PNPM_DEVELOPMENT_MANAGER_SCHEMA = z.object({ name: z.literal('pnpm'), vers
|
|
|
70
70
|
const DEV_ENGINES_SCHEMA = z.object({ packageManager: PNPM_DEVELOPMENT_MANAGER_SCHEMA })
|
|
71
71
|
const DEV_ENGINES_PNPM_SCHEMA = z.object({ devEngines: DEV_ENGINES_SCHEMA.optional() })
|
|
72
72
|
const COREPACK_REMEDY =
|
|
73
|
-
'pnpm runs through the Corepack shim, where pnpm 11+ refuses self-update (ERR_PNPM_CANT_SELF_UPDATE_IN_COREPACK). Run `corepack disable pnpm`, install a standalone pnpm (https://pnpm.io/installation), then rerun josh latest.'
|
|
73
|
+
'pnpm runs through the Corepack shim, where pnpm 11+ refuses self-update (ERR_PNPM_CANT_SELF_UPDATE_IN_COREPACK). Run `corepack disable pnpm`, install a standalone pnpm (https://pnpm.io/installation), run josh sync so a devEngines.packageManager.onFail of "error" becomes "download" (the standalone pnpm then fetches the pinned version), then rerun josh latest.'
|
|
74
74
|
|
|
75
75
|
function extract_development_engines_version(package_json_content: string): string | undefined {
|
|
76
76
|
const parsed = DEV_ENGINES_PNPM_SCHEMA.safeParse(
|
|
@@ -108,7 +108,7 @@ function extract_pinned_version(package_json_content: string): string | undefine
|
|
|
108
108
|
|
|
109
109
|
// Never move the pin backwards. A filtered registry view (safe-chain's minimum-release-age
|
|
110
110
|
// proxy) answers below a freshly adopted pin for 24 hours after every pnpm release, and an
|
|
111
|
-
// equal answer would only rewrite the same value — both skip instead
|
|
111
|
+
// equal answer would only rewrite the same value — both skip instead.
|
|
112
112
|
function is_target_not_newer_than_pin(target: string, pinned_version: string | undefined): boolean {
|
|
113
113
|
if (pinned_version === undefined) return false
|
|
114
114
|
const target_version = target.slice(TARGET_PREFIX.length)
|
|
@@ -160,7 +160,7 @@ function resolve_major_target(major: string): TargetResolution {
|
|
|
160
160
|
// The project's own `pnpm-workspace.yaml`, deliberately not the upward walk the version check
|
|
161
161
|
// uses: `josh latest` reads `package.json` and writes the pnpm pin relative to the working
|
|
162
162
|
// directory, so it has no subdirectory case — and honouring an ancestor's policy here could freeze
|
|
163
|
-
// pnpm bumps in a project that declares none
|
|
163
|
+
// pnpm bumps in a project that declares none.
|
|
164
164
|
const version = release_age.select_aged_version(
|
|
165
165
|
times,
|
|
166
166
|
major,
|
|
@@ -238,7 +238,7 @@ function run_pnpm_update(target: string): number {
|
|
|
238
238
|
// fields keep matching (pnpm suppresses the dual-declaration warning only on an exact
|
|
239
239
|
// match). Runs on every path, not just after a successful bump: a repository that arrives
|
|
240
240
|
// with the two fields already out of step sits in the no-bump steady state forever, so an
|
|
241
|
-
// alignment gated on a bump would never repair it
|
|
241
|
+
// alignment gated on a bump would never repair it.
|
|
242
242
|
function sync_development_engines(package_json_path: string = PACKAGE_JSON_PATH): void {
|
|
243
243
|
const content = readFileSync(package_json_path, 'utf8')
|
|
244
244
|
const aligned = package_manager_version.align_development_engines_version(content)
|
|
@@ -311,7 +311,7 @@ function restore_integrity(target: string, integrity: string): void {
|
|
|
311
311
|
}
|
|
312
312
|
|
|
313
313
|
// The equal case is the steady state of every up-to-date run, so it logs as success; only
|
|
314
|
-
// an answer strictly below the pin is the anomaly worth a warning
|
|
314
|
+
// an answer strictly below the pin is the anomaly worth a warning.
|
|
315
315
|
function notify_skipped_bump(target: string, pinned_version: string): void {
|
|
316
316
|
if (target === `${TARGET_PREFIX}${pinned_version}`) {
|
|
317
317
|
console.info(`✔ pnpm pin ${pinned_version} already matches the newest registry release.`)
|
|
@@ -376,7 +376,7 @@ function bump_package_manager(original: string, target: string): number {
|
|
|
376
376
|
}
|
|
377
377
|
|
|
378
378
|
// An unreachable registry fails, so the unrecorded run is retried. A reachable one with nothing
|
|
379
|
-
// aged past the quarantine window is the
|
|
379
|
+
// aged past the quarantine window is the quarantine skip — like a not-newer answer, there is nothing
|
|
380
380
|
// to adopt yet, and failing would stall every run for up to the whole window.
|
|
381
381
|
function report_unresolved(major: string | undefined, is_registry_reachable: boolean): number {
|
|
382
382
|
const label = `pnpm ${major ?? ''}`.trimEnd()
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { lane_paths, type LaneEnvironment } from '#scripts/lane/lane-paths'
|
|
4
4
|
|
|
5
|
-
// Refuse a dependency update inside a lane
|
|
5
|
+
// Refuse a dependency update inside a lane.
|
|
6
6
|
//
|
|
7
7
|
// `latest:scope` reads how long ago `josh latest` last finished, and that stamp is keyed to the
|
|
8
8
|
// project root. A lane is a linked work tree whose project root is its own directory, so a fresh
|
|
@@ -3,7 +3,7 @@ import { fileURLToPath } from 'node:url'
|
|
|
3
3
|
import { latest_lane_guard } from './latest-lane-guard'
|
|
4
4
|
import { latest_stamp, type LatestStamp } from './latest-stamp'
|
|
5
5
|
|
|
6
|
-
// `josh latest:scope` — say whether this run has to update dependencies
|
|
6
|
+
// `josh latest:scope` — say whether this run has to update dependencies.
|
|
7
7
|
//
|
|
8
8
|
// A command rather than a paragraph in a procedure, for the reason `josh review:level` is a command:
|
|
9
9
|
// a rule an agent applies from memory is a rule an agent can talk itself out of, and this one is
|
|
@@ -65,7 +65,7 @@ function decide(): Decision {
|
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
// A lane is answered `skip` before the stamp is even read
|
|
68
|
+
// A lane is answered `skip` before the stamp is even read: the stamp is
|
|
69
69
|
// keyed to the project root, so a lane always reads as stale, and every lane would otherwise run its
|
|
70
70
|
// own dependency update. `latest_lane_guard` is the single source of the reason and of the refusal
|
|
71
71
|
// `josh latest` prints.
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
2
2
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
3
3
|
|
|
4
|
-
// When `josh latest` last finished in this checkout, and whether that is recent enough to skip
|
|
5
|
-
// (joshuafolkken/kit#1215).
|
|
4
|
+
// When `josh latest` last finished in this checkout, and whether that is recent enough to skip.
|
|
6
5
|
//
|
|
7
6
|
// `josh latest` is a network-bound chain — pnpm update, every dependency, `ranges`, `pnpm audit` — that
|
|
8
7
|
// took 60–120 seconds at the head of every `fullrun` / `halfrun` and of every child a batch ran, and
|
|
@@ -63,8 +63,8 @@ function report_kept_back(regressions: ReadonlyArray<VersionRegression>): void {
|
|
|
63
63
|
|
|
64
64
|
// The direct-dependency `--latest` bump lifts the package.json ranges; this second, argument-less
|
|
65
65
|
// pass then re-resolves every tier the lockfile carries within those ranges, which is the only stage
|
|
66
|
-
// that reaches the indirect packages a direct-only update leaves pinned at a stale resolution
|
|
67
|
-
//
|
|
66
|
+
// that reaches the indirect packages a direct-only update leaves pinned at a stale resolution.
|
|
67
|
+
// `pnpm update` defaults to depth Infinity, so no flag is needed to reach
|
|
68
68
|
// the whole tree. The re-resolution stage always runs — even when every direct dependency is
|
|
69
69
|
// overridden and the `--latest` stage is absent, the indirect tiers still need re-resolving.
|
|
70
70
|
const PNPM_UPDATE_ALL_TIERS = ['pnpm', 'update']
|
|
@@ -7,7 +7,7 @@ import { z } from 'zod'
|
|
|
7
7
|
import { release_age } from './release-age'
|
|
8
8
|
|
|
9
9
|
// The public npm registry, read without credentials so a consumer who installed from public npm
|
|
10
|
-
// can see the latest release without a `read:packages` GitHub token
|
|
10
|
+
// can see the latest release without a `read:packages` GitHub token. The
|
|
11
11
|
// GitHub Packages versions API stays the source for a scope routed there, and the fallback for a
|
|
12
12
|
// package public npm does not carry.
|
|
13
13
|
const PUBLIC_REGISTRY = 'https://registry.npmjs.org'
|
|
@@ -99,7 +99,7 @@ function read_release_times(package_name: string): Record<string, string> | unde
|
|
|
99
99
|
// Whether public npm already carries `<name>@<version>`. **Asked of public npm regardless of how this
|
|
100
100
|
// checkout routes the scope**, unlike the two readers above: `josh release` waits for `publish.yml`'s
|
|
101
101
|
// `publish-npm` job and links the npmjs.com page, so GitHub Packages answering would not be the
|
|
102
|
-
// question it asks
|
|
102
|
+
// question it asks.
|
|
103
103
|
function has_public_version(package_name: string, version: string): boolean {
|
|
104
104
|
const parsed = times_schema.safeParse(read_packument(package_name, FULL_ACCEPT))
|
|
105
105
|
|
|
@@ -14,6 +14,12 @@ const PNPM_PIN_REGEX = /^pnpm@(.+)$/u
|
|
|
14
14
|
const DEV_ENGINES_NAME_FIRST_REGEX = /("name":\s*"pnpm"\s*,\s*"version":\s*")[^"]+(")/u
|
|
15
15
|
const DEV_ENGINES_VERSION_FIRST_REGEX = /("version":\s*")[^"]+("\s*,\s*"name":\s*"pnpm")/u
|
|
16
16
|
|
|
17
|
+
// An `onFail: "error"` inside a `"packageManager": { … }` object — in a manifest that is only
|
|
18
|
+
// `devEngines.packageManager`, since the top-level `packageManager` is a string — and never
|
|
19
|
+
// `devEngines.runtime`, because `[^{}]` cannot cross into another block.
|
|
20
|
+
const DEV_ENGINES_ON_FAIL_ERROR_REGEX = /("packageManager":\s*\{[^{}]*"onFail":\s*")error(")/u
|
|
21
|
+
const ON_FAIL_DOWNLOAD = 'download'
|
|
22
|
+
|
|
17
23
|
const optional_version_schema = z.object({ version: z.string().optional() }).optional()
|
|
18
24
|
|
|
19
25
|
const alignment_read_schema = z.object({
|
|
@@ -86,10 +92,22 @@ function align_development_engines_version(content: string): string {
|
|
|
86
92
|
return set_development_engines_version(content, target)
|
|
87
93
|
}
|
|
88
94
|
|
|
95
|
+
// `onFail: "error"` rejects any pnpm that is not byte-for-byte the pin, so a machine that left
|
|
96
|
+
// Corepack for a standalone pnpm cannot run pnpm at all; `"download"` fetches the pinned version
|
|
97
|
+
// instead. Only `"error"` is rewritten — a `"warn"` / `"ignore"` the
|
|
98
|
+
// project chose itself is kept, and the rest of the file is preserved byte-for-byte.
|
|
99
|
+
function upgrade_development_engines_on_fail(content: string): string {
|
|
100
|
+
return content.replace(
|
|
101
|
+
DEV_ENGINES_ON_FAIL_ERROR_REGEX,
|
|
102
|
+
(_match: string, prefix: string, suffix: string) => `${prefix}${ON_FAIL_DOWNLOAD}${suffix}`,
|
|
103
|
+
)
|
|
104
|
+
}
|
|
105
|
+
|
|
89
106
|
const package_manager_version = {
|
|
90
107
|
extract_pnpm_pin,
|
|
91
108
|
align_development_engines_version,
|
|
92
109
|
set_development_engines_version,
|
|
110
|
+
upgrade_development_engines_on_fail,
|
|
93
111
|
}
|
|
94
112
|
|
|
95
113
|
export { package_manager_version }
|
|
@@ -24,7 +24,8 @@ const FAILURE_EXIT_CODE = 1
|
|
|
24
24
|
// consumer can resolve — the exact blind spot this guard exists to close.
|
|
25
25
|
//
|
|
26
26
|
// `pnpm view` rather than `npm view` because npm refuses to run at all inside a project whose
|
|
27
|
-
// `devEngines.packageManager` names pnpm with `onFail
|
|
27
|
+
// `devEngines.packageManager` names pnpm with an `onFail` other than `"warn"` / `"ignore"` (kit
|
|
28
|
+
// ships `"download"`, which npm refuses on just the same), failing every probe with
|
|
28
29
|
// EBADDEVENGINES instead of answering. Both are shimmed, so the filtered view is preserved.
|
|
29
30
|
function probe_range(name: string, range: string): ProbeResult {
|
|
30
31
|
const result = execaSync('pnpm', ['view', `${name}@${range}`, 'version'], {
|
|
@@ -4,7 +4,7 @@ import semver from 'semver'
|
|
|
4
4
|
// kit ships a `preinstall` hook that installs @aikidosec/safe-chain, whose minimum-age policy hides
|
|
5
5
|
// releases younger than its window from every install running behind it. A range whose floor sits
|
|
6
6
|
// inside that window has no satisfying version for a consumer, so `pnpm install` fails with
|
|
7
|
-
// ERR_PNPM_NO_MATCHING_VERSION naming a version that demonstrably exists and is tagged latest
|
|
7
|
+
// ERR_PNPM_NO_MATCHING_VERSION naming a version that demonstrably exists and is tagged latest.
|
|
8
8
|
//
|
|
9
9
|
// The check asks the registry through that same filtered view instead of modelling the policy:
|
|
10
10
|
// `pnpm view <name>@<range> version` prints no version and exits non-zero
|
|
@@ -4,14 +4,14 @@ import { yaml_document } from '#scripts/lib/yaml-document'
|
|
|
4
4
|
import semver from 'semver'
|
|
5
5
|
import { z } from 'zod'
|
|
6
6
|
|
|
7
|
-
// The minimum-release-age quarantine
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
7
|
+
// The minimum-release-age quarantine, applied natively instead of inherited from safe-chain's
|
|
8
|
+
// interception. safe-chain filters the registry only when the process tree was started through one
|
|
9
|
+
// of its wrapped shell commands, so `josh latest` and `pnpm josh latest` would resolve different
|
|
10
|
+
// "newest release" answers. These functions make the resolution deterministic: the policy comes
|
|
11
|
+
// from the repo-managed `pnpm-workspace.yaml`, the publish timestamps from the registry, and the
|
|
12
|
+
// selection is a pure computation over both. pnpm 12 reads its settings from `pnpm-workspace.yaml`
|
|
13
|
+
// — a `minimum-release-age` line in `.npmrc` is ignored there, so reading it would report a window
|
|
14
|
+
// pnpm does not apply.
|
|
15
15
|
|
|
16
16
|
const NO_QUARANTINE_MINUTES = 0
|
|
17
17
|
const WORKSPACE_PATH = 'pnpm-workspace.yaml'
|
|
@@ -78,7 +78,7 @@ function is_eligible(
|
|
|
78
78
|
// `major` pins the search to one major line — what `josh latest` needs, since corepack validates the
|
|
79
79
|
// resolved pnpm version against `devEngines`. Pass `undefined` to search every major, which is what
|
|
80
80
|
// an "is this installable at all" question wants: `pnpm add pkg@latest` resolves to the newest
|
|
81
|
-
// permitted release regardless of major
|
|
81
|
+
// permitted release regardless of major.
|
|
82
82
|
function select_aged_version(
|
|
83
83
|
times: Record<string, string>,
|
|
84
84
|
major: string | undefined,
|
|
@@ -112,7 +112,7 @@ function read_declared_minimum_release_age(workspace_path: string): number | und
|
|
|
112
112
|
//
|
|
113
113
|
// Deliberately not the upward walk below: `josh latest` resolves this against the working directory
|
|
114
114
|
// it also writes `corepack use` into, and honouring an ancestor's policy there could freeze pnpm
|
|
115
|
-
// bumps in a project that declares none
|
|
115
|
+
// bumps in a project that declares none.
|
|
116
116
|
function read_minimum_release_age(workspace_path: string = WORKSPACE_PATH): number {
|
|
117
117
|
return read_declared_minimum_release_age(workspace_path) ?? NO_QUARANTINE_MINUTES
|
|
118
118
|
}
|
|
@@ -121,7 +121,7 @@ function read_minimum_release_age(workspace_path: string = WORKSPACE_PATH): numb
|
|
|
121
121
|
//
|
|
122
122
|
// This walks rather than reading one path because `josh version` and `josh latest` both run from
|
|
123
123
|
// anywhere inside a project — and from outside one — so resolving against the working directory
|
|
124
|
-
// alone would silently read "no quarantine" in every subdirectory
|
|
124
|
+
// alone would silently read "no quarantine" in every subdirectory. pnpm
|
|
125
125
|
// finds its workspace root the same way, by walking up to the nearest `pnpm-workspace.yaml`.
|
|
126
126
|
//
|
|
127
127
|
// `boundary` stops the walk at a known root. Production passes none, while tests bound the search
|
|
@@ -5,7 +5,7 @@ import { release_age } from './release-age'
|
|
|
5
5
|
// *unpinned* resolution, so anything resolved without an explicit version stops one or more releases
|
|
6
6
|
// short of `latest`. Reporting that as a bare `⚠ → <latest>` is indistinguishable from an install the
|
|
7
7
|
// user forgot to upgrade — and it recurs after every successful upgrade, because the newest release
|
|
8
|
-
// is by definition the youngest
|
|
8
|
+
// is by definition the youngest.
|
|
9
9
|
//
|
|
10
10
|
// **The window binds unpinned resolution only.** Measured on pnpm 11.22.0 with
|
|
11
11
|
// `minimumReleaseAge: 1440` and a release published 3.5 h earlier:
|
|
@@ -14,7 +14,7 @@ import { release_age } from './release-age'
|
|
|
14
14
|
// pnpm add pkg -> 1.78.0 (the newest release past the window)
|
|
15
15
|
//
|
|
16
16
|
// So a pinned `Run:` hint always works and is never suppressed. What the window actually holds back
|
|
17
|
-
// is peer resolution — the mechanism behind an upstream's effective install
|
|
17
|
+
// is peer resolution — the mechanism behind an upstream's effective install,
|
|
18
18
|
// which is why this explanation is attached there and nowhere else.
|
|
19
19
|
|
|
20
20
|
const MINUTES_PER_HOUR = 60
|