@joshuafolkken/kit 1.1514.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +5 -5
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +53 -6
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +30 -7
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +8 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +27 -24
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-write.ts +67 -29
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +2 -2
- package/scripts/git/main-merge.ts +25 -9
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +0 -8
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +1 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +2 -10
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +157 -158
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +103 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +2 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +81 -15
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +8 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +80 -2
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +9 -1
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +82 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +116 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +207 -265
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +6 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +34 -8
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +42 -24
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +61 -149
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +97 -10
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +4 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -53,10 +53,26 @@ const CHAIN_PATTERN = /&&|\|\||;|\n/u
|
|
|
53
53
|
// body is not shell syntax at all — an `it's` there is prose — so it is removed before the quotes are
|
|
54
54
|
// paired, keeping the rest of its marker line (`cat <<EOF > f && git add f`) where the shell reads it.
|
|
55
55
|
// Without both, a stray quote paired with one much later and erased every command between them.
|
|
56
|
-
|
|
56
|
+
//
|
|
57
|
+
// **A `$(…)` inside double quotes is one atom of the span** (joshuafolkken/kit#4525): the quotes in
|
|
58
|
+
// `"$(gh issue create --title "x")"` belong to the substitution, so the span closes at the outer `"`
|
|
59
|
+
// rather than at the first inner one, which left the substitution cut in half. A `$` is read one way
|
|
60
|
+
// only — the atom where one follows, a character where none does — because a `$` either could take
|
|
61
|
+
// made an unclosed `"` followed by many `$(…)` try every split of them before failing.
|
|
62
|
+
const SUBSTITUTION_ATOM = /\$\([^()]*\)/u
|
|
63
|
+
const LONE_DOLLAR = /\$(?!\([^()]*\))/u
|
|
64
|
+
const QUOTED_SPAN_PATTERN = new RegExp(
|
|
65
|
+
String.raw`\\[\s\S]|'[^']*'|"(?:\\[\s\S]|${SUBSTITUTION_ATOM.source}|${LONE_DOLLAR.source}|[^"\\$])*"`,
|
|
66
|
+
'gu',
|
|
67
|
+
)
|
|
57
68
|
const HEREDOC_MARKER = /(?<!<)<<-?\s*(['"]?)(\w+)\1/u
|
|
58
69
|
const HEREDOC_DELIMITER_GROUP = 2
|
|
59
70
|
const LINE_BREAK = '\n'
|
|
71
|
+
const DOUBLE_QUOTE = '"'
|
|
72
|
+
// A command substitution with no nested parenthesis — the shape a quoted `"$(cmd …)"` is written in —
|
|
73
|
+
// or its backtick spelling. An escaped `\$(` or `` \` `` is literal text inside double quotes, so it
|
|
74
|
+
// runs nothing.
|
|
75
|
+
const SUBSTITUTION_PATTERN = /(?<!\\)\$\((?<dollar>[^()]*)\)|(?<!\\)`(?<tick>[^`]*)`/gu
|
|
60
76
|
// `set -o pipefail` tells the shell to report the pipeline with the first failing command's status,
|
|
61
77
|
// so nothing in it is discarded. The flag letters are loose because `set -eo pipefail` and
|
|
62
78
|
// `set -euo pipefail` are the same instruction, and the `set` word is required so that a path or a
|
|
@@ -77,14 +93,36 @@ const FLAG_PREFIX = '-'
|
|
|
77
93
|
// Two kinds of prefix, and they are not interchangeable. A wrapper runs the command that follows it,
|
|
78
94
|
// so the walk continues past it; a navigation builtin runs nothing, so its segment yields no command
|
|
79
95
|
// at all and the walk moves to the next segment.
|
|
80
|
-
|
|
96
|
+
//
|
|
97
|
+
// **A wrapper is skipped with the flag values and operands it takes, and named by its basename**
|
|
98
|
+
// (joshuafolkken/kit#4525). `/usr/bin/time -f %e pnpm josh gate` left the walk on `%e`, and
|
|
99
|
+
// `timeout 600 pnpm josh gate` stopped at `timeout`, so a refusal keyed on the command was escaped by
|
|
100
|
+
// wrapping it. Every reader that asks which command a segment runs goes through this one walk.
|
|
101
|
+
interface WrapperShape {
|
|
102
|
+
readonly valued: ReadonlySet<string>
|
|
103
|
+
readonly operands: number
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const WRAPPER_COMMANDS: ReadonlyMap<string, WrapperShape> = new Map([
|
|
107
|
+
['time', { valued: new Set(['-f', '-o', '--format', '--output']), operands: 0 }],
|
|
108
|
+
['env', { valued: new Set(['-u', '-C', '-S', '--unset', '--chdir']), operands: 0 }],
|
|
109
|
+
['sudo', { valued: new Set(['-u', '-g', '-C', '-D']), operands: 0 }],
|
|
110
|
+
['timeout', { valued: new Set(['-s', '-k', '--signal', '--kill-after']), operands: 1 }],
|
|
111
|
+
['nohup', { valued: new Set(), operands: 0 }],
|
|
112
|
+
['nice', { valued: new Set(['-n', '--adjustment']), operands: 0 }],
|
|
113
|
+
['command', { valued: new Set(), operands: 0 }],
|
|
114
|
+
['exec', { valued: new Set(['-a']), operands: 0 }],
|
|
115
|
+
['stdbuf', { valued: new Set(['-i', '-o', '-e']), operands: 0 }],
|
|
116
|
+
])
|
|
81
117
|
const NAVIGATION_COMMANDS = new Set(['cd', 'pushd', 'popd', 'export', 'source', 'set', '.'])
|
|
118
|
+
const PATH_SEPARATOR = '/'
|
|
119
|
+
const FLAG_AND_VALUE = 2
|
|
82
120
|
|
|
83
121
|
// Anchored at a segment's command position, not searched anywhere in the string. A loose search
|
|
84
122
|
// charged `git commit -m "ran pnpm josh gate"` to `josh gate`, and this repository's own commit
|
|
85
123
|
// messages and issue comments name josh subcommands constantly. Only the first match counts: a
|
|
86
124
|
// compound command naming two would otherwise charge its whole duration to each.
|
|
87
|
-
const JOSH_PATTERN = /^(?:pnpm\s+(?:exec\s+)?)?josh\s+([a-z][\w:-]*)/u
|
|
125
|
+
const JOSH_PATTERN = /^(?:(?:pnpm|npx)\s+(?:exec\s+)?)?josh\s+([a-z][\w:-]*)/u
|
|
88
126
|
const JOSH_PREFIX = 'josh '
|
|
89
127
|
const COMMAND_KEY = 'command'
|
|
90
128
|
|
|
@@ -99,19 +137,45 @@ function bash_command(input: unknown): string {
|
|
|
99
137
|
// A wrapper's own flags are skipped with it. Skipping only the wrapper word left the walk on a flag,
|
|
100
138
|
// which is not command-shaped, so `env -i pnpm test` yielded no command at all and its duration left
|
|
101
139
|
// the per-command table entirely.
|
|
102
|
-
function
|
|
103
|
-
|
|
140
|
+
function after_flags(
|
|
141
|
+
words: ReadonlyArray<string>,
|
|
142
|
+
start: number,
|
|
143
|
+
valued: ReadonlySet<string>,
|
|
144
|
+
): number {
|
|
145
|
+
let index = start
|
|
146
|
+
|
|
147
|
+
while (words[index]?.startsWith(FLAG_PREFIX) === true) {
|
|
148
|
+
index += valued.has(words[index] ?? '') ? FLAG_AND_VALUE : 1
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return index
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// The index past the prefix word at `index`, or `index` itself when that word is the command.
|
|
155
|
+
function after_prefix_word(words: ReadonlyArray<string>, index: number): number {
|
|
156
|
+
const word = words[index] ?? ''
|
|
157
|
+
|
|
158
|
+
if (word.startsWith(FLAG_PREFIX) || ASSIGNMENT_PATTERN.test(word)) return index + 1
|
|
159
|
+
|
|
160
|
+
const wrapper = WRAPPER_COMMANDS.get(word.slice(word.lastIndexOf(PATH_SEPARATOR) + 1))
|
|
104
161
|
|
|
105
|
-
|
|
162
|
+
if (wrapper === undefined) return index
|
|
163
|
+
|
|
164
|
+
return after_flags(words, index + 1, wrapper.valued) + wrapper.operands
|
|
106
165
|
}
|
|
107
166
|
|
|
108
167
|
// One segment with its leading assignments and wrappers dropped, so the first entry is the command
|
|
109
168
|
// position. Shared by both readers below: what counts as the command is one rule, not two.
|
|
110
169
|
function command_words(segment: string): Array<string> {
|
|
111
170
|
const words = segment.replaceAll(SUBSHELL_OPENER, ' ').trim().split(WHITESPACE_PATTERN)
|
|
112
|
-
|
|
171
|
+
let start = 0
|
|
172
|
+
|
|
173
|
+
for (let next = after_prefix_word(words, start); next !== start;) {
|
|
174
|
+
start = next
|
|
175
|
+
next = after_prefix_word(words, start)
|
|
176
|
+
}
|
|
113
177
|
|
|
114
|
-
return
|
|
178
|
+
return words.slice(start)
|
|
115
179
|
}
|
|
116
180
|
|
|
117
181
|
// The command this segment runs, or nothing. Nothing has two causes and both are deliberate: a
|
|
@@ -186,15 +250,35 @@ function without_heredoc_bodies(command: string): string {
|
|
|
186
250
|
// removal for a different reason — a quoted `sed` script holds `|` and slashes that read as a
|
|
187
251
|
// pipeline and as paths — and two spellings of "remove the quotes" would disagree the first time one
|
|
188
252
|
// of them learned about a quoting form the other did not.
|
|
253
|
+
//
|
|
254
|
+
// **A `$(…)` inside double quotes runs, so it is kept as a command of its own** (joshuafolkken/kit#4525):
|
|
255
|
+
// `out="$(pnpm josh gate)"` runs the gate, and removing the span with its quotes hid it. A single-quoted
|
|
256
|
+
// span expands nothing and goes whole. The substitution's own quoted arguments go as any other.
|
|
257
|
+
function spoken_substitutions(span: string): string {
|
|
258
|
+
if (!span.startsWith(DOUBLE_QUOTE)) return ' '
|
|
259
|
+
|
|
260
|
+
const inner = [...span.matchAll(SUBSTITUTION_PATTERN)].map((match) =>
|
|
261
|
+
(match.groups?.['dollar'] ?? match.groups?.['tick'] ?? '').replaceAll(QUOTED_SPAN_PATTERN, ' '),
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
return inner.length === 0 ? ' ' : ` ; ${inner.join(' ; ')} ; `
|
|
265
|
+
}
|
|
266
|
+
|
|
189
267
|
function unquoted(command: string): string {
|
|
190
|
-
return without_heredoc_bodies(command).replaceAll(QUOTED_SPAN_PATTERN,
|
|
268
|
+
return without_heredoc_bodies(command).replaceAll(QUOTED_SPAN_PATTERN, (span) =>
|
|
269
|
+
spoken_substitutions(span),
|
|
270
|
+
)
|
|
191
271
|
}
|
|
192
272
|
|
|
193
273
|
// Quoted text replaced by spaces of its own length, so an offset found here is the same offset in the
|
|
194
274
|
// command — what a caller cutting the command where the unquoted reading says to needs. `undefined`
|
|
195
275
|
// for a line carrying a heredoc, whose body lines a cut would read as commands of their own.
|
|
276
|
+
function has_heredoc(command: string): boolean {
|
|
277
|
+
return HEREDOC_MARKER.test(command)
|
|
278
|
+
}
|
|
279
|
+
|
|
196
280
|
function blanked(command: string): string | undefined {
|
|
197
|
-
if (
|
|
281
|
+
if (has_heredoc(command)) return undefined
|
|
198
282
|
|
|
199
283
|
return command.replaceAll(QUOTED_SPAN_PATTERN, (span) => ' '.repeat(span.length))
|
|
200
284
|
}
|
|
@@ -344,12 +428,15 @@ const time_shell = {
|
|
|
344
428
|
blanked,
|
|
345
429
|
command_segment,
|
|
346
430
|
discarded_commands,
|
|
431
|
+
has_heredoc,
|
|
347
432
|
josh_arguments,
|
|
348
433
|
josh_command_of,
|
|
434
|
+
josh_command_of_segment,
|
|
349
435
|
josh_commands_of,
|
|
350
436
|
josh_signatures_of,
|
|
351
437
|
leading_word,
|
|
352
438
|
unquoted,
|
|
439
|
+
without_heredoc_bodies,
|
|
353
440
|
}
|
|
354
441
|
|
|
355
442
|
export { time_shell }
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import type { FollowupStage } from '#scripts/followup/git-followup-stages'
|
|
2
2
|
import { json_value } from '#scripts/lib/json-value'
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
transcript_record,
|
|
5
|
+
type TranscriptBlock,
|
|
6
|
+
type TranscriptContent,
|
|
7
|
+
type TranscriptMessage,
|
|
8
|
+
type TranscriptRecord,
|
|
9
|
+
} from '#scripts/lib/transcript-record'
|
|
4
10
|
import { time_background } from './time-background'
|
|
5
11
|
import { time_followup_stage } from './time-followup-stage'
|
|
6
12
|
import { time_instant } from './time-instant'
|
|
@@ -10,56 +16,20 @@ import { time_reported_failure } from './time-reported-failure'
|
|
|
10
16
|
//
|
|
11
17
|
// It moved out of `time-spans.ts` when that file passed its length limit — the seam that file is
|
|
12
18
|
// already cut along elsewhere (`time-shell.ts`, `time-single-check.ts`), where the *reading* of a
|
|
13
|
-
// field lives beside the field and the arithmetic stays next door. What is here is
|
|
14
|
-
//
|
|
15
|
-
// into one.
|
|
19
|
+
// field lives beside the field and the arithmetic stays next door. What is here is nothing about
|
|
20
|
+
// time: the two records a line yields, and the read that turns a parsed line into one.
|
|
16
21
|
//
|
|
17
22
|
// **The block reader is not `cost-blocks.ts` and could not have been.** That module flattens every
|
|
18
23
|
// line into one list of blocks for a token estimate, dropping the `id` / `tool_use_id` pair a call is
|
|
19
24
|
// matched to its result by and the line boundary a timestamp belongs to. Both are the whole input
|
|
20
25
|
// here.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
input: z.unknown().nullish(),
|
|
29
|
-
// Whether the harness wrote this result back as a failure. Present on a
|
|
30
|
-
// `tool_result` block and on nothing else, and absent even there for the tools that never report
|
|
31
|
-
// one — which is why it is read as three answers rather than as a boolean with a default.
|
|
32
|
-
is_error: z.boolean().nullish(),
|
|
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
|
|
35
|
-
// the whole of what `time-reported-failure.ts` asks of it.
|
|
36
|
-
content: z.unknown().nullish(),
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
const CONTENT_SCHEMA = z.union([z.string(), z.array(BLOCK_SCHEMA)])
|
|
40
|
-
// `id` is the assistant *message* the line belongs to, and Claude Code writes one line per content
|
|
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.
|
|
45
|
-
const MESSAGE_SCHEMA = z.object({ id: z.string().nullish(), content: CONTENT_SCHEMA.nullish() })
|
|
46
|
-
|
|
47
|
-
const LINE_SCHEMA = z.object({
|
|
48
|
-
type: z.string().nullish(),
|
|
49
|
-
timestamp: z.string().nullish(),
|
|
50
|
-
// The branch the line was written on, which is where the issue number lives — `josh git` names a
|
|
51
|
-
// branch `<N>-<slug>`. Read here rather than re-parsed by a second reader so `josh time --issue`
|
|
52
|
-
// and `josh cost --issue` answer from the same field.
|
|
53
|
-
gitBranch: z.string().nullish(),
|
|
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
|
|
56
|
-
// insisting on a string here would reject every line whose `content` is a list of blocks — which is
|
|
57
|
-
// most of them — and a rejected line is dropped from the timeline entirely, so the shares would stop
|
|
58
|
-
// reconstructing the elapsed time. The shape is checked at the read below instead.
|
|
59
|
-
content: z.unknown().nullish(),
|
|
60
|
-
attachment: z.unknown().nullish(),
|
|
61
|
-
message: MESSAGE_SCHEMA.nullish(),
|
|
62
|
-
})
|
|
26
|
+
//
|
|
27
|
+
// The line's schema is `transcript-record.ts`'s, shared with every other reader of these lines. A
|
|
28
|
+
// message `id` groups the lines of one assistant turn — Claude Code writes one line per content block
|
|
29
|
+
// — so "how many calls did that turn make" groups by it. `gitBranch` is where the issue number lives
|
|
30
|
+
// (`josh git` names a branch `<N>-<slug>`), read here so `josh time --issue` and `josh cost --issue`
|
|
31
|
+
// answer from the same field. A `tool_result`'s `is_error` is read as three answers — absent for the
|
|
32
|
+
// tools that never report one — and its `content` only to recover the outcome a pipeline threw away.
|
|
63
33
|
|
|
64
34
|
const UNKNOWN_BRANCH = ''
|
|
65
35
|
// The field an attachment line carries the notice in, named rather than written as a literal.
|
|
@@ -137,8 +107,8 @@ interface TranscriptLine {
|
|
|
137
107
|
type: string
|
|
138
108
|
timestamp_ms: number
|
|
139
109
|
branch: string
|
|
140
|
-
// The background run this line is the harness's end-of-task notice for
|
|
141
|
-
// line. It is read here rather than downstream for the reason every
|
|
110
|
+
// The background run this line is the harness's end-of-task notice for — or the `TaskStop` result
|
|
111
|
+
// that stopped it, which gets no notice — and `''` for every other line. It is read here rather than downstream for the reason every
|
|
142
112
|
// derived field above is: the notice is the line's whole content, which a span does not keep, and
|
|
143
113
|
// it is the only thing in a transcript that says a command had *finished* rather than merely been
|
|
144
114
|
// looked at.
|
|
@@ -156,9 +126,7 @@ interface TranscriptLine {
|
|
|
156
126
|
// The four string fields, defaulted together and apart from the two that are not strings. Split out
|
|
157
127
|
// so neither half carries every `??` in the block: read as one function the defaulting alone reached
|
|
158
128
|
// the complexity limit, and the next field added would have had to be squeezed in beside them.
|
|
159
|
-
function block_names(
|
|
160
|
-
raw: z.infer<typeof BLOCK_SCHEMA>,
|
|
161
|
-
): Pick<Block, 'type' | 'name' | 'id' | 'result_id'> {
|
|
129
|
+
function block_names(raw: TranscriptBlock): Pick<Block, 'type' | 'name' | 'id' | 'result_id'> {
|
|
162
130
|
return {
|
|
163
131
|
type: raw.type ?? '',
|
|
164
132
|
name: raw.name ?? '',
|
|
@@ -190,7 +158,7 @@ function guard_from_refusal(text: string): string {
|
|
|
190
158
|
// **Only the harness's own feedback line counts.** It writes a Stop block back as a user turn whose
|
|
191
159
|
// whole body is `Stop hook feedback:` and the reason, so a prompt that merely quotes one never opens
|
|
192
160
|
// with the label and reads `''`.
|
|
193
|
-
function stop_guard_of(data:
|
|
161
|
+
function stop_guard_of(data: TranscriptRecord): string {
|
|
194
162
|
const content = data.message?.content
|
|
195
163
|
if (typeof content !== 'string' || !STOP_FEEDBACK_LABEL.test(content)) return ''
|
|
196
164
|
|
|
@@ -209,7 +177,7 @@ function token_lines_of(text: string): Array<string> {
|
|
|
209
177
|
// content field that may be a string or a list of blocks into one string, and it is idempotent on a
|
|
210
178
|
// string — so passing its own output back to `has_failure_line` reads exactly as passing the raw
|
|
211
179
|
// field did, at one flattening instead of two.
|
|
212
|
-
function to_block(raw:
|
|
180
|
+
function to_block(raw: TranscriptBlock): Block {
|
|
213
181
|
const text = time_reported_failure.result_text(raw.content)
|
|
214
182
|
const is_error = raw.is_error ?? undefined
|
|
215
183
|
|
|
@@ -229,9 +197,7 @@ function to_block(raw: z.infer<typeof BLOCK_SCHEMA>): Block {
|
|
|
229
197
|
|
|
230
198
|
// A user turn written as a bare string carries no blocks, which is exactly right: it is a prompt,
|
|
231
199
|
// and a prompt has no tool result to match.
|
|
232
|
-
function to_blocks(
|
|
233
|
-
content: string | Array<z.infer<typeof BLOCK_SCHEMA>> | null | undefined,
|
|
234
|
-
): Array<Block> {
|
|
200
|
+
function to_blocks(content: TranscriptContent | null | undefined): Array<Block> {
|
|
235
201
|
return typeof content === 'string' || content === null || content === undefined
|
|
236
202
|
? []
|
|
237
203
|
: content.map((block) => to_block(block))
|
|
@@ -241,7 +207,7 @@ function to_blocks(
|
|
|
241
207
|
// is written as one line per content block with the message's id repeated on each, so the id is what
|
|
242
208
|
// says which blocks belonged to the same turn.
|
|
243
209
|
function message_fields(
|
|
244
|
-
message:
|
|
210
|
+
message: TranscriptMessage | null | undefined,
|
|
245
211
|
): Pick<TranscriptLine, 'message_id' | 'blocks'> {
|
|
246
212
|
return { message_id: message?.id ?? NO_MESSAGE_ID, blocks: to_blocks(message?.content) }
|
|
247
213
|
}
|
|
@@ -253,16 +219,37 @@ function message_fields(
|
|
|
253
219
|
// session happened to hold a different one. All three are read, and `time_background.finished_at`
|
|
254
220
|
// keeps the earliest instant per id, so what is paired with the launch is when the task *ended* rather
|
|
255
221
|
// than when the run was told about it.
|
|
256
|
-
function notice_text(data:
|
|
222
|
+
function notice_text(data: TranscriptRecord): string {
|
|
257
223
|
const attachment = json_value.is_record(data.attachment) ? data.attachment[PROMPT_KEY] : undefined
|
|
258
224
|
const carried = [data.message?.content, data.content, attachment]
|
|
259
225
|
|
|
260
226
|
return carried.find((one): one is string => typeof one === 'string') ?? ''
|
|
261
227
|
}
|
|
262
228
|
|
|
229
|
+
// The task a `TaskStop` result on this line stopped, which is an end the harness writes no notice for.
|
|
230
|
+
// Its result body is a plain string, so only string contents are read and nothing is flattened again.
|
|
231
|
+
function stopped_background(content: TranscriptContent | null | undefined): string {
|
|
232
|
+
if (!Array.isArray(content)) return time_background.NO_BACKGROUND
|
|
233
|
+
|
|
234
|
+
const ids = content.map((block) =>
|
|
235
|
+
typeof block.content === 'string' ? time_background.stopped_id(block.content) : '',
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
return ids.find((id) => id !== time_background.NO_BACKGROUND) ?? time_background.NO_BACKGROUND
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// The task this line reports the end of: the harness's notice, or else a `TaskStop` result.
|
|
242
|
+
function finished_background(data: TranscriptRecord): string {
|
|
243
|
+
const notice = time_background.finished_id(notice_text(data))
|
|
244
|
+
|
|
245
|
+
return notice === time_background.NO_BACKGROUND
|
|
246
|
+
? stopped_background(data.message?.content)
|
|
247
|
+
: notice
|
|
248
|
+
}
|
|
249
|
+
|
|
263
250
|
// A line without a parseable timestamp is dropped rather than dated: it has no place on a timeline,
|
|
264
251
|
// and inventing one would move every span around it.
|
|
265
|
-
function to_line(data:
|
|
252
|
+
function to_line(data: TranscriptRecord): TranscriptLine | undefined {
|
|
266
253
|
const timestamp_ms = time_instant.parse_instant(data.timestamp)
|
|
267
254
|
|
|
268
255
|
if (timestamp_ms === undefined) return undefined
|
|
@@ -271,16 +258,16 @@ function to_line(data: z.infer<typeof LINE_SCHEMA>): TranscriptLine | undefined
|
|
|
271
258
|
type: data.type ?? '',
|
|
272
259
|
timestamp_ms,
|
|
273
260
|
branch: data.gitBranch ?? UNKNOWN_BRANCH,
|
|
274
|
-
finished_background:
|
|
261
|
+
finished_background: finished_background(data),
|
|
275
262
|
stop_guard: stop_guard_of(data),
|
|
276
263
|
...message_fields(data.message),
|
|
277
264
|
}
|
|
278
265
|
}
|
|
279
266
|
|
|
280
267
|
function parse_line(line: string): TranscriptLine | undefined {
|
|
281
|
-
const
|
|
268
|
+
const record = transcript_record.parse(line)
|
|
282
269
|
|
|
283
|
-
return
|
|
270
|
+
return record === undefined ? undefined : to_line(record)
|
|
284
271
|
}
|
|
285
272
|
|
|
286
273
|
// A whole transcript's text read as its parsed lines, the unparseable ones dropped.
|
|
@@ -11,6 +11,7 @@ import { init_logic_sonar } from '#scripts/init/init-logic-sonar'
|
|
|
11
11
|
import { PACKAGE_DIR, PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
12
12
|
import { project_profile, type ProjectProfile } from '#scripts/init/project-profile'
|
|
13
13
|
import { error_text } from '#scripts/lib/error-message'
|
|
14
|
+
import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
|
|
14
15
|
import { file_reader } from '#scripts/lib/read-file'
|
|
15
16
|
import { PROJECT_CONFIG_FILE } from '#scripts/safe-chain/project-config'
|
|
16
17
|
import { did_refuse_self_run } from '#scripts/self-sync-guard/self-sync-refusal'
|
|
@@ -20,7 +21,6 @@ import { distributed_files } from './distributed-files'
|
|
|
20
21
|
import { IGNORE_FILE, uninstall_plan, type FilePlan } from './uninstall-plan'
|
|
21
22
|
import { uninstall_report, type UninstallPlan } from './uninstall-report'
|
|
22
23
|
|
|
23
|
-
const PACKAGE_JSON = 'package.json'
|
|
24
24
|
const LEFTHOOK_BIN = 'lefthook'
|
|
25
25
|
const ARGUMENT_START_INDEX = 2
|
|
26
26
|
const YES_FLAG = '--yes'
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { run_bump_version } from './bump-version'
|
|
4
|
+
|
|
5
|
+
// The `josh bump` entry, kept apart from `bump-version.ts` because `release-publish.ts` imports that
|
|
6
|
+
// one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = run_bump_version(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
import { readFileSync, writeFileSync } from 'node:fs'
|
|
3
|
-
import path from 'node:path'
|
|
4
|
-
import { fileURLToPath } from 'node:url'
|
|
1
|
+
import { writeFileSync } from 'node:fs'
|
|
5
2
|
import { error_text } from '#scripts/lib/error-message'
|
|
3
|
+
import { package_manifest } from '#scripts/lib/package-manifest'
|
|
6
4
|
import { json_object_schema, package_with_version_schema } from '#scripts/lib/schemas'
|
|
7
5
|
import semver from 'semver'
|
|
8
6
|
|
|
9
7
|
const VALID_BUMP_TYPES = ['major', 'minor', 'patch'] as const
|
|
10
8
|
type BumpType = (typeof VALID_BUMP_TYPES)[number]
|
|
11
9
|
|
|
10
|
+
const BUMP_TYPE_NAMES: ReadonlySet<string> = new Set(VALID_BUMP_TYPES)
|
|
12
11
|
const PACKAGE_JSON_INDENT = '\t'
|
|
12
|
+
const USAGE = 'Usage: josh bump [major|minor|patch]'
|
|
13
|
+
const FAILURE_EXIT_CODE = 1
|
|
13
14
|
|
|
14
15
|
function compute_new_version(version: string, bump_type: BumpType): string {
|
|
15
16
|
const new_version = semver.inc(version, bump_type)
|
|
@@ -19,28 +20,21 @@ function compute_new_version(version: string, bump_type: BumpType): string {
|
|
|
19
20
|
return new_version
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
function package_json_path(): string {
|
|
23
|
-
return path.join(process.cwd(), 'package.json')
|
|
24
|
-
}
|
|
25
|
-
|
|
26
23
|
// **Set the version to an already-decided number.** `bump_version` below is this plus the decision;
|
|
27
24
|
// `pnpm josh release` supplies its own, because a release raises the version by as many minors as
|
|
28
25
|
// main has taken merges rather than by one. Written once so the two agree
|
|
29
26
|
// on the file's shape and indentation.
|
|
30
27
|
function write_version(new_version: string): void {
|
|
31
|
-
const
|
|
32
|
-
const package_json = json_object_schema.parse(JSON.parse(readFileSync(package_path, 'utf8')))
|
|
28
|
+
const package_json = package_manifest.read_manifest(process.cwd(), json_object_schema)
|
|
33
29
|
|
|
34
30
|
writeFileSync(
|
|
35
|
-
|
|
31
|
+
package_manifest.manifest_path(process.cwd()),
|
|
36
32
|
`${JSON.stringify({ ...package_json, version: new_version }, undefined, PACKAGE_JSON_INDENT)}\n`,
|
|
37
33
|
)
|
|
38
34
|
}
|
|
39
35
|
|
|
40
36
|
function read_current_version(): string {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return package_with_version_schema.parse(JSON.parse(file_content)).version
|
|
37
|
+
return package_manifest.read_manifest(process.cwd(), package_with_version_schema).version
|
|
44
38
|
}
|
|
45
39
|
|
|
46
40
|
function bump_version(bump_type: BumpType): void {
|
|
@@ -50,23 +44,29 @@ function bump_version(bump_type: BumpType): void {
|
|
|
50
44
|
console.info(new_version)
|
|
51
45
|
}
|
|
52
46
|
|
|
53
|
-
function
|
|
54
|
-
|
|
55
|
-
|
|
47
|
+
function is_bump_type(value: string): value is BumpType {
|
|
48
|
+
return BUMP_TYPE_NAMES.has(value)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// `josh bump`'s body, answering its exit code to `bump-version-main.ts`.
|
|
52
|
+
function run_bump_version(args: ReadonlyArray<string>): number {
|
|
53
|
+
const [bump_type = 'minor'] = args
|
|
56
54
|
|
|
57
|
-
if (!
|
|
58
|
-
console.error(
|
|
59
|
-
|
|
55
|
+
if (!is_bump_type(bump_type)) {
|
|
56
|
+
console.error(USAGE)
|
|
57
|
+
|
|
58
|
+
return FAILURE_EXIT_CODE
|
|
60
59
|
}
|
|
61
60
|
|
|
62
61
|
try {
|
|
63
|
-
bump_version(bump_type
|
|
62
|
+
bump_version(bump_type)
|
|
64
63
|
} catch (error) {
|
|
65
64
|
console.error(error_text.message_of(error))
|
|
66
|
-
|
|
65
|
+
|
|
66
|
+
return FAILURE_EXIT_CODE
|
|
67
67
|
}
|
|
68
|
-
}
|
|
69
68
|
|
|
70
|
-
|
|
69
|
+
return 0
|
|
70
|
+
}
|
|
71
71
|
|
|
72
|
-
export { bump_version, compute_new_version, write_version }
|
|
72
|
+
export { bump_version, compute_new_version, run_bump_version, USAGE, write_version }
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from 'node:fs'
|
|
2
1
|
import { createRequire } from 'node:module'
|
|
3
2
|
import path from 'node:path'
|
|
4
3
|
import { ancestor_directories } from '#scripts/lib/ancestor-directories'
|
|
5
|
-
import {
|
|
4
|
+
import { package_manifest } from '#scripts/lib/package-manifest'
|
|
6
5
|
import { package_named_version_schema } from '#scripts/lib/schemas'
|
|
7
6
|
|
|
8
|
-
const PACKAGE_JSON = 'package.json'
|
|
9
|
-
|
|
10
7
|
// Options for `resolve_effective_upstream_version`. `resolve_marker` is a subpath specifier used for
|
|
11
8
|
// `createRequire().resolve()` when the package root itself is not directly resolvable — e.g. kit does
|
|
12
9
|
// not list `package.json` (nor a `.` entry) in `exports`, so a subpath like
|
|
@@ -18,21 +15,18 @@ interface EffectiveUpstreamOptions {
|
|
|
18
15
|
// Read the `version` from a package.json only when its `name` matches the target package — undefined
|
|
19
16
|
// when the file is missing, malformed, or belongs to a different (e.g. nested) package. Matching by
|
|
20
17
|
// name is what lets the walk-up skip intermediate package.json files and land on the true root.
|
|
21
|
-
function read_matching_version(
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
json_value.parse_or_undefined(readFileSync(manifest_path, 'utf8')),
|
|
25
|
-
)
|
|
26
|
-
if (!parsed.success || parsed.data.name !== package_name) return undefined
|
|
18
|
+
function read_matching_version(directory: string, package_name: string): string | undefined {
|
|
19
|
+
const manifest = package_manifest.read_manifest_if_valid(directory, package_named_version_schema)
|
|
20
|
+
if (manifest?.name !== package_name) return undefined
|
|
27
21
|
|
|
28
|
-
return
|
|
22
|
+
return manifest.version
|
|
29
23
|
}
|
|
30
24
|
|
|
31
25
|
// Walk up from a resolved file's directory to the package root, returning the version of the first
|
|
32
26
|
// ancestor package.json whose `name` matches the target — or undefined when no matching root exists.
|
|
33
27
|
function walk_up_for_version(start_directory: string, package_name: string): string | undefined {
|
|
34
28
|
for (const directory of ancestor_directories.list(start_directory)) {
|
|
35
|
-
const version = read_matching_version(
|
|
29
|
+
const version = read_matching_version(directory, package_name)
|
|
36
30
|
if (version !== undefined) return version
|
|
37
31
|
}
|
|
38
32
|
|
|
@@ -42,14 +42,14 @@
|
|
|
42
42
|
import { readFileSync, writeFileSync } from 'node:fs'
|
|
43
43
|
import { fileURLToPath } from 'node:url'
|
|
44
44
|
import { json_value } from '#scripts/lib/json-value'
|
|
45
|
-
import {
|
|
45
|
+
import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
|
|
46
46
|
import { execaSync } from 'execa'
|
|
47
47
|
import semver from 'semver'
|
|
48
48
|
import { z } from 'zod'
|
|
49
|
+
import { npm_registry } from './npm-registry'
|
|
49
50
|
import { package_manager_version } from './package-manager-version'
|
|
50
51
|
import { release_age } from './release-age'
|
|
51
52
|
|
|
52
|
-
const PACKAGE_JSON_PATH = 'package.json'
|
|
53
53
|
const PACKAGE_MANAGER_RE = /"packageManager"\s*:\s*"pnpm@(\d+)(?:[^\d]|$)/u
|
|
54
54
|
const PINNED_VERSION_RE = /"packageManager"\s*:\s*"pnpm@([^"+]+)/u
|
|
55
55
|
const TARGET_PREFIX = 'pnpm@'
|
|
@@ -133,13 +133,10 @@ function extract_times_json(stdout: string): Record<string, string> | undefined
|
|
|
133
133
|
// The registry's publish timestamps for every pnpm release (version → ISO date, plus the
|
|
134
134
|
// created/modified bookkeeping keys the selector ignores).
|
|
135
135
|
function query_release_times(): Record<string, string> | undefined {
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
timeout: COMMAND_TIMEOUT_MS,
|
|
139
|
-
})
|
|
140
|
-
if ((result.exitCode ?? FAILURE_EXIT_CODE) !== 0) return undefined
|
|
136
|
+
const answer = npm_registry.view('pnpm', 'time', 'json')
|
|
137
|
+
if (answer.exit_code !== 0) return undefined
|
|
141
138
|
|
|
142
|
-
return extract_times_json(
|
|
139
|
+
return extract_times_json(answer.stdout)
|
|
143
140
|
}
|
|
144
141
|
|
|
145
142
|
function to_resolution(
|
|
@@ -179,13 +176,10 @@ function parse_latest_version(stdout: string): string | undefined {
|
|
|
179
176
|
}
|
|
180
177
|
|
|
181
178
|
function query_latest_version(): string | undefined {
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
timeout: COMMAND_TIMEOUT_MS,
|
|
185
|
-
})
|
|
186
|
-
if ((result.exitCode ?? FAILURE_EXIT_CODE) !== 0) return undefined
|
|
179
|
+
const answer = npm_registry.view('pnpm', 'version', 'json')
|
|
180
|
+
if (answer.exit_code !== 0) return undefined
|
|
187
181
|
|
|
188
|
-
return parse_latest_version(
|
|
182
|
+
return parse_latest_version(answer.stdout)
|
|
189
183
|
}
|
|
190
184
|
|
|
191
185
|
// The target handed to pnpm self-update: an exact registry-resolved version on the pinned major, or
|
|
@@ -239,7 +233,7 @@ function run_pnpm_update(target: string): number {
|
|
|
239
233
|
// match). Runs on every path, not just after a successful bump: a repository that arrives
|
|
240
234
|
// with the two fields already out of step sits in the no-bump steady state forever, so an
|
|
241
235
|
// alignment gated on a bump would never repair it.
|
|
242
|
-
function sync_development_engines(package_json_path: string =
|
|
236
|
+
function sync_development_engines(package_json_path: string = PACKAGE_JSON): void {
|
|
243
237
|
const content = readFileSync(package_json_path, 'utf8')
|
|
244
238
|
const aligned = package_manager_version.align_development_engines_version(content)
|
|
245
239
|
if (aligned === content) return
|
|
@@ -249,10 +243,7 @@ function sync_development_engines(package_json_path: string = PACKAGE_JSON_PATH)
|
|
|
249
243
|
}
|
|
250
244
|
|
|
251
245
|
// Restore the pre-run manifest if self-update fails after changing it.
|
|
252
|
-
function restore_package_json(
|
|
253
|
-
content: string,
|
|
254
|
-
package_json_path: string = PACKAGE_JSON_PATH,
|
|
255
|
-
): void {
|
|
246
|
+
function restore_package_json(content: string, package_json_path: string = PACKAGE_JSON): void {
|
|
256
247
|
writeFileSync(package_json_path, content)
|
|
257
248
|
console.info('✔ Restored package.json pin (pnpm bump failed)')
|
|
258
249
|
}
|
|
@@ -274,20 +265,17 @@ function extract_encoded_integrity(stdout: string): string | undefined {
|
|
|
274
265
|
}
|
|
275
266
|
|
|
276
267
|
function query_integrity(target: string): string | undefined {
|
|
277
|
-
const
|
|
278
|
-
|
|
279
|
-
timeout: COMMAND_TIMEOUT_MS,
|
|
280
|
-
})
|
|
281
|
-
if ((result.exitCode ?? FAILURE_EXIT_CODE) !== 0) return undefined
|
|
268
|
+
const answer = npm_registry.view(target, 'dist.integrity', 'json')
|
|
269
|
+
if (answer.exit_code !== 0) return undefined
|
|
282
270
|
|
|
283
|
-
const encoded = extract_encoded_integrity(
|
|
271
|
+
const encoded = extract_encoded_integrity(answer.stdout)
|
|
284
272
|
if (encoded === undefined) return undefined
|
|
285
273
|
|
|
286
274
|
return decode_integrity(encoded)
|
|
287
275
|
}
|
|
288
276
|
|
|
289
277
|
function restore_integrity(target: string, integrity: string): void {
|
|
290
|
-
const content = readFileSync(
|
|
278
|
+
const content = readFileSync(PACKAGE_JSON, 'utf8')
|
|
291
279
|
const version = target.slice(TARGET_PREFIX.length)
|
|
292
280
|
const expected = `pnpm@${version}`
|
|
293
281
|
const current = PACKAGE_MANAGER_VALUE_RE.exec(content)?.[0]
|
|
@@ -303,10 +291,7 @@ function restore_integrity(target: string, integrity: string): void {
|
|
|
303
291
|
},
|
|
304
292
|
)
|
|
305
293
|
|
|
306
|
-
writeFileSync(
|
|
307
|
-
PACKAGE_JSON_PATH,
|
|
308
|
-
package_manager_version.align_development_engines_version(pinned),
|
|
309
|
-
)
|
|
294
|
+
writeFileSync(PACKAGE_JSON, package_manager_version.align_development_engines_version(pinned))
|
|
310
295
|
}
|
|
311
296
|
|
|
312
297
|
// The equal case is the steady state of every up-to-date run, so it logs as success; only
|
|
@@ -342,7 +327,7 @@ function pin_unpinned_manifest(original: string, target: string, integrity: stri
|
|
|
342
327
|
)
|
|
343
328
|
|
|
344
329
|
writeFileSync(
|
|
345
|
-
|
|
330
|
+
PACKAGE_JSON,
|
|
346
331
|
package_manager_version.align_development_engines_version(`${pinned}\n`),
|
|
347
332
|
)
|
|
348
333
|
|
|
@@ -403,7 +388,7 @@ function bump_to_registry_target(original: string, major: string | undefined): n
|
|
|
403
388
|
}
|
|
404
389
|
|
|
405
390
|
function main(): number {
|
|
406
|
-
const original = readFileSync(
|
|
391
|
+
const original = readFileSync(PACKAGE_JSON, 'utf8')
|
|
407
392
|
const status = bump_to_registry_target(original, extract_pnpm_major(original))
|
|
408
393
|
|
|
409
394
|
sync_development_engines()
|