@joshuafolkken/kit 1.1471.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 +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- 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 +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- 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-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- 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 +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- 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 +6 -7
- 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 +54 -7
- 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 +39 -8
- 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 +69 -0
- 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 +137 -18
- 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 +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- 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 +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- 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 +31 -60
- 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 +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- 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 +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- 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 +65 -129
- 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-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- 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/gh/git-pr.ts +13 -1
- 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 +78 -0
- package/scripts/git/main-merge.ts +39 -14
- 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 +5 -16
- 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 +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- 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 +60 -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 +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- 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 +7 -13
- 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 +19 -25
- 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/markdown-section.ts +19 -5
- 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 +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- 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 +31 -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 +112 -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 +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- 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 +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- 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 +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- 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 +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- 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-preserve.ts +29 -1
- 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 +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- 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 +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- 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 +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- 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 +14 -5
- 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 +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -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 +12 -11
- 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 +4 -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-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -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 +82 -16
- 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 +67 -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 +90 -3
- 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 +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -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 +76 -7
- 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/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- 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 +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- 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 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- 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 +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- 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 +118 -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 +240 -61
- 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 +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- 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 -47
- 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 +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -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 +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- 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-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- 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 +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- 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-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- 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 +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- 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 +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- 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-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -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 +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- 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 +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- 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 +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- 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-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- 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 +55 -6
- 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 +54 -21
- 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 +71 -137
- 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 +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- 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 +10 -3
- 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-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- 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/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 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -32,8 +32,9 @@ const SEGMENT_PATTERN = /&&|\|\||;|\|/u
|
|
|
32
32
|
// last, while `||` keeps the first command's and runs the second only when it failed. `|&` is a pipe
|
|
33
33
|
// and is cut here, its `&` left in the fragment that follows.
|
|
34
34
|
const PIPE_PATTERN = /(?<!\|)\|(?!\|)/u
|
|
35
|
-
// What `SEGMENT_PATTERN` cuts on minus the pipe, for reading *inside* one pipe segment
|
|
36
|
-
|
|
35
|
+
// What `SEGMENT_PATTERN` cuts on minus the pipe, for reading *inside* one pipe segment — plus the
|
|
36
|
+
// newline, which ends a command as `;` does, so a line typed before the piped check is not read as it.
|
|
37
|
+
const CHAIN_PATTERN = /&&|\|\||;|\n/u
|
|
37
38
|
// A quoted span is text, not shell syntax, and it is removed before the pipe reading below. This
|
|
38
39
|
// repository's issue bodies, comment bodies and commit messages quote command chains constantly, so
|
|
39
40
|
// `--body "cd x && pnpm josh gate | tail"` is a `gh` call and nothing else — a reader that split its
|
|
@@ -52,10 +53,26 @@ const CHAIN_PATTERN = /&&|\|\||;/u
|
|
|
52
53
|
// body is not shell syntax at all — an `it's` there is prose — so it is removed before the quotes are
|
|
53
54
|
// paired, keeping the rest of its marker line (`cat <<EOF > f && git add f`) where the shell reads it.
|
|
54
55
|
// Without both, a stray quote paired with one much later and erased every command between them.
|
|
55
|
-
|
|
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
|
+
)
|
|
56
68
|
const HEREDOC_MARKER = /(?<!<)<<-?\s*(['"]?)(\w+)\1/u
|
|
57
69
|
const HEREDOC_DELIMITER_GROUP = 2
|
|
58
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
|
|
59
76
|
// `set -o pipefail` tells the shell to report the pipeline with the first failing command's status,
|
|
60
77
|
// so nothing in it is discarded. The flag letters are loose because `set -eo pipefail` and
|
|
61
78
|
// `set -euo pipefail` are the same instruction, and the `set` word is required so that a path or a
|
|
@@ -76,14 +93,36 @@ const FLAG_PREFIX = '-'
|
|
|
76
93
|
// Two kinds of prefix, and they are not interchangeable. A wrapper runs the command that follows it,
|
|
77
94
|
// so the walk continues past it; a navigation builtin runs nothing, so its segment yields no command
|
|
78
95
|
// at all and the walk moves to the next segment.
|
|
79
|
-
|
|
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
|
+
])
|
|
80
117
|
const NAVIGATION_COMMANDS = new Set(['cd', 'pushd', 'popd', 'export', 'source', 'set', '.'])
|
|
118
|
+
const PATH_SEPARATOR = '/'
|
|
119
|
+
const FLAG_AND_VALUE = 2
|
|
81
120
|
|
|
82
121
|
// Anchored at a segment's command position, not searched anywhere in the string. A loose search
|
|
83
122
|
// charged `git commit -m "ran pnpm josh gate"` to `josh gate`, and this repository's own commit
|
|
84
123
|
// messages and issue comments name josh subcommands constantly. Only the first match counts: a
|
|
85
124
|
// compound command naming two would otherwise charge its whole duration to each.
|
|
86
|
-
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
|
|
87
126
|
const JOSH_PREFIX = 'josh '
|
|
88
127
|
const COMMAND_KEY = 'command'
|
|
89
128
|
|
|
@@ -98,19 +137,45 @@ function bash_command(input: unknown): string {
|
|
|
98
137
|
// A wrapper's own flags are skipped with it. Skipping only the wrapper word left the walk on a flag,
|
|
99
138
|
// which is not command-shaped, so `env -i pnpm test` yielded no command at all and its duration left
|
|
100
139
|
// the per-command table entirely.
|
|
101
|
-
function
|
|
102
|
-
|
|
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] ?? ''
|
|
103
157
|
|
|
104
|
-
|
|
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))
|
|
161
|
+
|
|
162
|
+
if (wrapper === undefined) return index
|
|
163
|
+
|
|
164
|
+
return after_flags(words, index + 1, wrapper.valued) + wrapper.operands
|
|
105
165
|
}
|
|
106
166
|
|
|
107
167
|
// One segment with its leading assignments and wrappers dropped, so the first entry is the command
|
|
108
168
|
// position. Shared by both readers below: what counts as the command is one rule, not two.
|
|
109
169
|
function command_words(segment: string): Array<string> {
|
|
110
170
|
const words = segment.replaceAll(SUBSHELL_OPENER, ' ').trim().split(WHITESPACE_PATTERN)
|
|
111
|
-
|
|
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
|
+
}
|
|
112
177
|
|
|
113
|
-
return
|
|
178
|
+
return words.slice(start)
|
|
114
179
|
}
|
|
115
180
|
|
|
116
181
|
// The command this segment runs, or nothing. Nothing has two causes and both are deliberate: a
|
|
@@ -185,15 +250,35 @@ function without_heredoc_bodies(command: string): string {
|
|
|
185
250
|
// removal for a different reason — a quoted `sed` script holds `|` and slashes that read as a
|
|
186
251
|
// pipeline and as paths — and two spellings of "remove the quotes" would disagree the first time one
|
|
187
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
|
+
|
|
188
267
|
function unquoted(command: string): string {
|
|
189
|
-
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
|
+
)
|
|
190
271
|
}
|
|
191
272
|
|
|
192
273
|
// Quoted text replaced by spaces of its own length, so an offset found here is the same offset in the
|
|
193
274
|
// command — what a caller cutting the command where the unquoted reading says to needs. `undefined`
|
|
194
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
|
+
|
|
195
280
|
function blanked(command: string): string | undefined {
|
|
196
|
-
if (
|
|
281
|
+
if (has_heredoc(command)) return undefined
|
|
197
282
|
|
|
198
283
|
return command.replaceAll(QUOTED_SPAN_PATTERN, (span) => ' '.repeat(span.length))
|
|
199
284
|
}
|
|
@@ -299,8 +384,8 @@ function drop_redirections(words: ReadonlyArray<string>): Array<string> {
|
|
|
299
384
|
// **The match's own text is what is sliced off, not a fixed word count.** The prefix is two words in
|
|
300
385
|
// `josh lint`, three in `pnpm josh lint` and four in `pnpm exec josh lint`, so counting words would
|
|
301
386
|
// leave `josh` itself in the argument list for one of the three spellings.
|
|
302
|
-
function
|
|
303
|
-
const text = command_words(
|
|
387
|
+
function josh_arguments_of_segment(segment: string): Array<string> {
|
|
388
|
+
const text = command_words(segment).join(' ')
|
|
304
389
|
const match = JOSH_PATTERN.exec(text)
|
|
305
390
|
|
|
306
391
|
if (match === null) return []
|
|
@@ -313,6 +398,29 @@ function josh_arguments(command: string): Array<string> {
|
|
|
313
398
|
return drop_redirections(words)
|
|
314
399
|
}
|
|
315
400
|
|
|
401
|
+
function josh_arguments(command: string): Array<string> {
|
|
402
|
+
return josh_arguments_of_segment(command_segment(command))
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// The josh subcommand one segment runs plus every argument it passes, redirections dropped, or `''`
|
|
406
|
+
// for a segment that runs none. **Flags are kept**: which of them ask nothing new (`run:board --chat`)
|
|
407
|
+
// and which turn a read into a write (`run:carry --cut`) is the reader's rule, not this one's.
|
|
408
|
+
function josh_signature_of_segment(segment: string): string {
|
|
409
|
+
const name = josh_command_of_segment(segment)
|
|
410
|
+
|
|
411
|
+
if (name === '') return ''
|
|
412
|
+
|
|
413
|
+
return [name, ...josh_arguments_of_segment(segment)].join(' ')
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// Every segment's signature, read over the same unquoted chain `josh_commands_of` walks.
|
|
417
|
+
function josh_signatures_of(command: string): Array<string> {
|
|
418
|
+
return unquoted(command)
|
|
419
|
+
.split(SEGMENT_PATTERN)
|
|
420
|
+
.map((segment) => josh_signature_of_segment(segment))
|
|
421
|
+
.filter((signature) => signature !== '')
|
|
422
|
+
}
|
|
423
|
+
|
|
316
424
|
const time_shell = {
|
|
317
425
|
JOSH_PREFIX,
|
|
318
426
|
bash_command,
|
|
@@ -320,11 +428,15 @@ const time_shell = {
|
|
|
320
428
|
blanked,
|
|
321
429
|
command_segment,
|
|
322
430
|
discarded_commands,
|
|
431
|
+
has_heredoc,
|
|
323
432
|
josh_arguments,
|
|
324
433
|
josh_command_of,
|
|
434
|
+
josh_command_of_segment,
|
|
325
435
|
josh_commands_of,
|
|
436
|
+
josh_signatures_of,
|
|
326
437
|
leading_word,
|
|
327
438
|
unquoted,
|
|
439
|
+
without_heredoc_bodies,
|
|
328
440
|
}
|
|
329
441
|
|
|
330
442
|
export { time_shell }
|
|
@@ -334,6 +334,7 @@ function to_spans(events: ReadonlyArray<TimelineEvent>, finished: FinishedAt): A
|
|
|
334
334
|
label: event.label,
|
|
335
335
|
josh_command: event.josh_command,
|
|
336
336
|
josh_commands: event.josh_commands,
|
|
337
|
+
josh_signatures: event.josh_signatures,
|
|
337
338
|
check_key: event.check_key,
|
|
338
339
|
marker: event.marker,
|
|
339
340
|
is_bundleable: event.is_bundleable,
|
|
@@ -55,6 +55,9 @@ interface ToolCall {
|
|
|
55
55
|
// A chained `pnpm josh lint:related && pnpm josh test:related` carries both; the count tables expand
|
|
56
56
|
// it so the ones `josh_command` drops are still counted.
|
|
57
57
|
josh_commands: ReadonlyArray<string>
|
|
58
|
+
// Each of those with the operands it named, flags dropped — what tells `lane:output 1` from
|
|
59
|
+
// `lane:output 2` once the span has kept no command string. `run-poll-hook.ts` reads it.
|
|
60
|
+
josh_signatures: ReadonlyArray<string>
|
|
58
61
|
check_key: string
|
|
59
62
|
marker: PhaseMarker
|
|
60
63
|
is_bundleable: boolean
|
|
@@ -83,6 +86,7 @@ const NO_CALL: ToolCall = {
|
|
|
83
86
|
label: '',
|
|
84
87
|
josh_command: '',
|
|
85
88
|
josh_commands: [],
|
|
89
|
+
josh_signatures: [],
|
|
86
90
|
check_key: time_single_check.NO_CHECK,
|
|
87
91
|
marker: time_markers.NO_MARKER,
|
|
88
92
|
message_id: NO_MESSAGE_ID,
|
|
@@ -95,6 +99,7 @@ const UNKNOWN_CALL: ToolCall = {
|
|
|
95
99
|
label: UNKNOWN_TOOL,
|
|
96
100
|
josh_command: '',
|
|
97
101
|
josh_commands: [],
|
|
102
|
+
josh_signatures: [],
|
|
98
103
|
check_key: time_single_check.NO_CHECK,
|
|
99
104
|
marker: time_markers.NO_MARKER,
|
|
100
105
|
message_id: NO_MESSAGE_ID,
|
|
@@ -111,6 +116,7 @@ function non_bash_call(name: string, input: unknown, message_id: string): ToolCa
|
|
|
111
116
|
label: name,
|
|
112
117
|
josh_command: '',
|
|
113
118
|
josh_commands: [],
|
|
119
|
+
josh_signatures: [],
|
|
114
120
|
check_key: time_single_check.NO_CHECK,
|
|
115
121
|
marker: time_markers.tool_marker(name, input),
|
|
116
122
|
message_id,
|
|
@@ -132,6 +138,7 @@ function bash_call(input: unknown, message_id: string): ToolCall {
|
|
|
132
138
|
label: time_shell.bash_label(command),
|
|
133
139
|
josh_command,
|
|
134
140
|
josh_commands: time_shell.josh_commands_of(command),
|
|
141
|
+
josh_signatures: time_shell.josh_signatures_of(command),
|
|
135
142
|
check_key: time_single_check.check_key(josh_command, command),
|
|
136
143
|
marker: time_markers.bash_marker(command),
|
|
137
144
|
message_id,
|
|
@@ -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
|
|