@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
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
import { OPTIONAL_ENV_FILE_FLAGS, type CommandEntry } from './josh-command-types'
|
|
2
2
|
|
|
3
|
+
const PR_TITLE = '"PR title #N"'
|
|
4
|
+
const BODY_FILE_NOTE =
|
|
5
|
+
'(`-` reads stdin); use this whenever the body carries a backtick or `$`. Passing both forms is refused.'
|
|
6
|
+
const ISSUE_URL = '--issue-url "https://..."'
|
|
7
|
+
const REVIEW_ISSUE = '--issue 2325'
|
|
8
|
+
const CHECK = '--check'
|
|
9
|
+
const YES = '-y'
|
|
10
|
+
const SKIP_COMMIT = '--skip-commit'
|
|
11
|
+
const SKIP_PUSH = '--skip-push'
|
|
12
|
+
|
|
3
13
|
const GIT_WORKFLOW_SCRIPT = 'scripts/git/git-workflow.ts'
|
|
4
14
|
const GIT_MESSAGE_ARGUMENTS = '[-y] <message>'
|
|
5
15
|
|
|
@@ -10,6 +20,28 @@ const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
|
|
|
10
20
|
description: 'Git workflow helper',
|
|
11
21
|
category: 'Workflow',
|
|
12
22
|
reference: [GIT_MESSAGE_ARGUMENTS, 'developer', ['git', 'network']],
|
|
23
|
+
usage: {
|
|
24
|
+
examples: [
|
|
25
|
+
{ arguments: '', note: 'interactive' },
|
|
26
|
+
{ arguments: YES, note: 'unattended (no TTY required)' },
|
|
27
|
+
{ arguments: '-y "title"', note: 'set commit message prefix' },
|
|
28
|
+
{ arguments: '-y "<title> #<N>"', note: 'follow-up commit on the same branch' },
|
|
29
|
+
{
|
|
30
|
+
arguments: '-y --skip-commit --skip-push',
|
|
31
|
+
note: 'open the PR without committing/pushing',
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
flags: [
|
|
35
|
+
{
|
|
36
|
+
names: [YES, '--yes'],
|
|
37
|
+
description: 'run non-interactively; works without a TTY (agent or CI shell).',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
names: [SKIP_COMMIT, SKIP_PUSH],
|
|
41
|
+
description: 'recover/open a PR without a new commit or push.',
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
},
|
|
13
45
|
},
|
|
14
46
|
pr: {
|
|
15
47
|
script: GIT_WORKFLOW_SCRIPT,
|
|
@@ -18,7 +50,8 @@ const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
|
|
|
18
50
|
// Not `GIT_MESSAGE_ARGUMENTS`: `-y` is already in the default arguments below, so advertising
|
|
19
51
|
// it would document a flag that cannot change what this command does.
|
|
20
52
|
reference: ['<message>', 'developer', ['network']],
|
|
21
|
-
default_script_arguments: [
|
|
53
|
+
default_script_arguments: [YES, SKIP_COMMIT, SKIP_PUSH],
|
|
54
|
+
usage: { examples: [{ arguments: '', note: 'open the PR for the current <N>-<slug> branch' }] },
|
|
22
55
|
},
|
|
23
56
|
// **The optional form, on both**. The mandatory `--env-file=.env` is resolved by node before the
|
|
24
57
|
// script's first line: on a machine with no `.env` it dies as `.env: not found` with exit code 9,
|
|
@@ -41,9 +74,37 @@ const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
|
|
|
41
74
|
['git', 'network', 'notifications'],
|
|
42
75
|
],
|
|
43
76
|
tsx_arguments: OPTIONAL_ENV_FILE_FLAGS,
|
|
77
|
+
usage: {
|
|
78
|
+
examples: [
|
|
79
|
+
{ arguments: PR_TITLE, note: 'merges (default)' },
|
|
80
|
+
{ arguments: String.raw`${PR_TITLE} --notify-message "Implemented X:\n- change 1"` },
|
|
81
|
+
{ arguments: `${PR_TITLE} --notify-message-file completion.md` },
|
|
82
|
+
{ arguments: `${PR_TITLE} --ai-review-ignore-reason "false positive"` },
|
|
83
|
+
{ arguments: `${PR_TITLE} --no-merge`, note: 'do the work, leave the PR open' },
|
|
84
|
+
],
|
|
85
|
+
flags: [
|
|
86
|
+
{
|
|
87
|
+
names: ['--no-merge'],
|
|
88
|
+
description:
|
|
89
|
+
'do the follow-up work but do not merge; leaves the PR open (the only flag that stops the merge). `--merge` is a deprecated no-op. A PR already merged by hand skips the CI wait, the AI-review scan and the merge and runs only the post-merge tail; a completion report already on the Issue is not posted again.',
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
names: ['--notify-message'],
|
|
93
|
+
description: 'inline completion body; `\\n` expands to newlines.',
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
names: ['--notify-message-file'],
|
|
97
|
+
description: `read the completion body from a file ${BODY_FILE_NOTE}`,
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
names: ['--ai-review-ignore-reason'],
|
|
101
|
+
description: 'reason to dismiss an AI-review finding.',
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
},
|
|
44
105
|
},
|
|
45
106
|
notify: {
|
|
46
|
-
script: 'scripts/notify/telegram-test.ts',
|
|
107
|
+
script: 'scripts/notify/telegram-test-main.ts',
|
|
47
108
|
description: 'Send Telegram notification',
|
|
48
109
|
category: 'Workflow',
|
|
49
110
|
reference: [
|
|
@@ -52,6 +113,38 @@ const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
|
|
|
52
113
|
['notifications'],
|
|
53
114
|
],
|
|
54
115
|
tsx_arguments: OPTIONAL_ENV_FILE_FLAGS,
|
|
116
|
+
usage: {
|
|
117
|
+
examples: [
|
|
118
|
+
{
|
|
119
|
+
arguments: String.raw`--task-type planning ${ISSUE_URL} --body="- bullet 1\n- bullet 2"`,
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
arguments: `--task-type confirmation ${ISSUE_URL} --body-file r.md --recommended "Go" --alternative "Wait"`,
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
flags: [
|
|
126
|
+
{
|
|
127
|
+
names: ['--task-type'],
|
|
128
|
+
description:
|
|
129
|
+
'one of `planning` 📋, `completion` ✅, `failure` ❌, `warning` ⚠️, `kickoff_retry` 🔄, `confirmation` ⏸️. Do not send `completion` or `warning` by hand — `josh followup` sends them.',
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
names: ['--body', "--body=$'…'"],
|
|
133
|
+
description: "inline body; use `--body=$'…'` when it starts with `-`.",
|
|
134
|
+
},
|
|
135
|
+
{ names: ['--body-file'], description: `read the body from a file ${BODY_FILE_NOTE}` },
|
|
136
|
+
{
|
|
137
|
+
names: ['--repo-name', '--issue-url', '--pr-url'],
|
|
138
|
+
description:
|
|
139
|
+
'header repository, resolved in that order, then the working directory. The issue title is read from `--issue-url`.',
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
names: ['--recommended', '--alternative'],
|
|
143
|
+
description:
|
|
144
|
+
'the choices appended under `JOSH_SESSION_LANG` headings; `--recommended` is required for `confirmation`, `--alternative` is repeatable.',
|
|
145
|
+
},
|
|
146
|
+
],
|
|
147
|
+
},
|
|
55
148
|
},
|
|
56
149
|
// One observation-ledger sighting: the key's count, the append and the second-sighting verdict,
|
|
57
150
|
// which a run used to type as a `cat | grep -c` and judge by hand.
|
|
@@ -60,6 +153,21 @@ const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
|
|
|
60
153
|
description: 'Record an observation sighting and answer whether it is now filed',
|
|
61
154
|
category: 'Workflow',
|
|
62
155
|
reference: ['<key> <depth> <where> <what> [--checkout <path>]', 'automation', ['files']],
|
|
156
|
+
usage: {
|
|
157
|
+
examples: [
|
|
158
|
+
{ arguments: "flaky-e2e d1 'tests/e2e/login.test.ts' 'times out on CI only'" },
|
|
159
|
+
{
|
|
160
|
+
arguments: "flaky-e2e d1 'src/app.ts' 'fails there too' --checkout ~/Development/app",
|
|
161
|
+
note: "another repository's ledger",
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
flags: [
|
|
165
|
+
{
|
|
166
|
+
names: ['--checkout <path>'],
|
|
167
|
+
description: "count and append in that repository's `.josh/observations/` instead.",
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
},
|
|
63
171
|
},
|
|
64
172
|
// The observation ledger's commit path for the lines no run's own commit carried:
|
|
65
173
|
// a lane's lines sit in the primary checkout, which
|
|
@@ -69,20 +177,46 @@ const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
|
|
|
69
177
|
description: 'Commit the observation ledger as a pull request of its own, and merge it',
|
|
70
178
|
category: 'Workflow',
|
|
71
179
|
reference: ['', 'automation', ['git', 'network']],
|
|
180
|
+
usage: { examples: [{ arguments: '' }] },
|
|
72
181
|
},
|
|
73
182
|
// The one write path for a `/code-review` round's findings, plus the
|
|
74
183
|
// `--check` gate `followup` runs before it merges. It appends a `- rf:`
|
|
75
184
|
// line per finding — or one zero-finding line for a clean round — to the observation ledger, so
|
|
76
185
|
// `observations:flush` commits them and the recurrence count survives the run.
|
|
77
186
|
'review:record': {
|
|
78
|
-
script: 'scripts/review/review-record-
|
|
187
|
+
script: 'scripts/review/review-record-main.ts',
|
|
79
188
|
description: 'Record a review round’s findings, or check a round was recorded',
|
|
80
189
|
category: 'Workflow',
|
|
81
190
|
reference: [
|
|
82
|
-
'--issue <N> [--comment] [<category>:<severity>:<file> ...] | --check --issue <N>',
|
|
191
|
+
'--issue <N> [--comment | --interaction] [<category>:<severity>:<file> ...] | --check [--interaction] --issue <N>',
|
|
83
192
|
'automation',
|
|
84
193
|
['files', 'network'],
|
|
85
194
|
],
|
|
195
|
+
usage: {
|
|
196
|
+
examples: [
|
|
197
|
+
{ arguments: `${REVIEW_ISSUE} bug-risks:medium:src/foo.ts:42 tests:low:a.test.ts` },
|
|
198
|
+
{ arguments: REVIEW_ISSUE, note: 'a zero-finding round — records one `none` line' },
|
|
199
|
+
{
|
|
200
|
+
arguments: `${REVIEW_ISSUE} --comment`,
|
|
201
|
+
note: 'a round that passed after the PR opened — an Issue comment, no append',
|
|
202
|
+
},
|
|
203
|
+
{ arguments: `${CHECK} ${REVIEW_ISSUE}`, note: 'the merge gate: was it recorded?' },
|
|
204
|
+
{
|
|
205
|
+
arguments: `${REVIEW_ISSUE} --interaction`,
|
|
206
|
+
note: 'the interaction review’s pass — a `- ri:` line',
|
|
207
|
+
},
|
|
208
|
+
],
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
// The reader over the durable review stop log: each finding that stopped a ship, with its file:line
|
|
212
|
+
// and first sentence, so a period's stops are classified without reading ship logs.
|
|
213
|
+
'review:stops': {
|
|
214
|
+
script: 'scripts/review/review-stops-cli.ts',
|
|
215
|
+
description:
|
|
216
|
+
'List the review findings that stopped a josh ship over a period, by kind, file:line and first sentence',
|
|
217
|
+
category: 'Workflow',
|
|
218
|
+
reference: ['[--period <days>]', 'developer', ['none']],
|
|
219
|
+
usage: { examples: [{ arguments: '--period 30', note: 'the last 30 days (default 7)' }] },
|
|
86
220
|
},
|
|
87
221
|
// The reader over what `review:record` wrote: each recurring category’s
|
|
88
222
|
// count, and the number of zero-finding rounds that distinguishes a quiet category from an unwatched one.
|
|
@@ -91,6 +225,7 @@ const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
|
|
|
91
225
|
description: 'Count review findings by category from the observation ledger',
|
|
92
226
|
category: 'Workflow',
|
|
93
227
|
reference: ['', 'developer', ['files']],
|
|
228
|
+
usage: { examples: [{ arguments: '' }] },
|
|
94
229
|
},
|
|
95
230
|
// After a behavior-change Issue merges, re-run its declared baseline and print before/after; a value
|
|
96
231
|
// that did not move appends a refuted-premise line to the observation ledger.
|
|
@@ -99,15 +234,17 @@ const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
|
|
|
99
234
|
description: 'Re-run a merged issue’s baseline command and print the before/after pair',
|
|
100
235
|
category: 'Workflow',
|
|
101
236
|
reference: ['<issue-number>', 'automation', ['network', 'processes', 'files']],
|
|
237
|
+
usage: { examples: [{ arguments: '2212' }] },
|
|
102
238
|
},
|
|
103
239
|
// A script rather than an `sh -c` chain, because it has a precondition to enforce: run inside a
|
|
104
240
|
// linked work tree it would hijack the default branch from every other one.
|
|
105
241
|
'main:sync': {
|
|
106
|
-
script: 'scripts/git/main-sync.ts',
|
|
242
|
+
script: 'scripts/git/main-sync-main.ts',
|
|
107
243
|
description:
|
|
108
244
|
'Checkout default branch, pull latest, and prune merged remote-gone branches (refuses inside a lane)',
|
|
109
245
|
category: 'Workflow',
|
|
110
246
|
reference: ['', 'developer', ['git', 'network']],
|
|
247
|
+
usage: { examples: [{ arguments: '' }] },
|
|
111
248
|
},
|
|
112
249
|
// A script rather than an `sh -c` chain, because the strategy has to be named rather than left to
|
|
113
250
|
// the caller's git configuration: a bare `git pull` aborts with `Need to specify how to reconcile
|
|
@@ -118,10 +255,11 @@ const WORKFLOW_COMMANDS: Record<string, CommandEntry> = {
|
|
|
118
255
|
// hooks — its regenerated catalog's commit runs them — which reserve themselves, and a weight here
|
|
119
256
|
// would set the held mark they inherit, folding the parallel hook tools into this one place.
|
|
120
257
|
'main:merge': {
|
|
121
|
-
script: 'scripts/git/main-merge.ts',
|
|
258
|
+
script: 'scripts/git/main-merge-main.ts',
|
|
122
259
|
description: 'Merge origin default branch into the current branch',
|
|
123
260
|
category: 'Workflow',
|
|
124
261
|
reference: ['', 'developer', ['git', 'network']],
|
|
262
|
+
usage: { examples: [{ arguments: '' }] },
|
|
125
263
|
},
|
|
126
264
|
}
|
|
127
265
|
/* eslint-enable @typescript-eslint/naming-convention */
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { existsSync
|
|
1
|
+
import { existsSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { fileURLToPath } from 'node:url'
|
|
4
4
|
import { resolve_local_bin, resolve_package_bin } from '#scripts/build/local-bin'
|
|
5
5
|
import { core_budget } from '#scripts/gate/core-budget'
|
|
6
|
+
import { package_manifest } from '#scripts/lib/package-manifest'
|
|
6
7
|
import { package_version_schema } from '#scripts/lib/schemas'
|
|
7
8
|
import { resolve_spawn_exit } from '#scripts/lib/spawn-exit'
|
|
8
9
|
import { execaSync } from 'execa'
|
|
@@ -24,7 +25,6 @@ const COLUMN_WIDTH = 26
|
|
|
24
25
|
const ALIAS_PAD_WIDTH = 2
|
|
25
26
|
const TSX_BIN = 'tsx'
|
|
26
27
|
const TSX_PACKAGE = 'tsx'
|
|
27
|
-
const PACKAGE_JSON = 'package.json'
|
|
28
28
|
// Not an exit code the shell ever sees: `josh.ts` reads it as "no such command" and answers with
|
|
29
29
|
// the listing on stderr. It is named because `run_command` now reports through a promise, where a
|
|
30
30
|
// bare `-1` is one step further from the check that reads it.
|
|
@@ -71,9 +71,7 @@ function resolve_tsx_runner(): TsxRunner {
|
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
function read_package_version(): string {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
return package_version_schema.parse(JSON.parse(raw)).version
|
|
74
|
+
return package_manifest.read_manifest(PACKAGE_DIR, package_version_schema).version
|
|
77
75
|
}
|
|
78
76
|
|
|
79
77
|
const HEADER = `josh v${read_package_version()} — Joshua Folkken's dev toolkit`
|
|
@@ -165,16 +163,11 @@ function format_unknown_command(cmd: string): string {
|
|
|
165
163
|
return `Unknown command: ${cmd}.${hint} Run 'josh --help' for common commands or 'josh --all' for the full list.`
|
|
166
164
|
}
|
|
167
165
|
|
|
168
|
-
//
|
|
169
|
-
//
|
|
170
|
-
function should_use_shell(executable: string): boolean {
|
|
171
|
-
return process.platform === 'win32' && executable !== process.execPath
|
|
172
|
-
}
|
|
173
|
-
|
|
166
|
+
// No `shell` option on purpose: execa runs a Windows `.cmd` shim itself and escapes the arguments
|
|
167
|
+
// for cmd.exe, which the shell would receive unescaped.
|
|
174
168
|
function spawn_script(tsx_executable: string, script_arguments: Array<string>): number {
|
|
175
169
|
const result = execaSync(tsx_executable, script_arguments, {
|
|
176
170
|
stdio: 'inherit',
|
|
177
|
-
shell: should_use_shell(tsx_executable),
|
|
178
171
|
reject: false,
|
|
179
172
|
})
|
|
180
173
|
|
|
@@ -287,7 +280,7 @@ async function dispatch_entry(
|
|
|
287
280
|
return await core_budget.with_command_reservation(
|
|
288
281
|
weight,
|
|
289
282
|
async () => await run_entry(entry, subcommand_arguments),
|
|
290
|
-
{ memory_mb: declared(entry.memory_mb), command },
|
|
283
|
+
{ memory_mb: declared(entry.memory_mb), command, is_unit: entry.is_unit_claim },
|
|
291
284
|
)
|
|
292
285
|
}
|
|
293
286
|
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs'
|
|
2
|
-
import path from 'node:path'
|
|
3
2
|
import { ancestor_directories } from '#scripts/lib/ancestor-directories'
|
|
4
|
-
|
|
5
|
-
const PACKAGE_JSON = 'package.json'
|
|
3
|
+
import { package_manifest } from '#scripts/lib/package-manifest'
|
|
6
4
|
|
|
7
5
|
// Resolve the kit package root by ascending to the nearest package.json. This works both
|
|
8
6
|
// from the bundled dist/josh.js (one level under the root) and from the tsx source at
|
|
@@ -12,7 +10,7 @@ const PACKAGE_JSON = 'package.json'
|
|
|
12
10
|
function find_package_directory(start_directory: string): string {
|
|
13
11
|
return (
|
|
14
12
|
ancestor_directories.nearest(start_directory, (directory) =>
|
|
15
|
-
existsSync(
|
|
13
|
+
existsSync(package_manifest.manifest_path(directory)),
|
|
16
14
|
) ?? start_directory
|
|
17
15
|
)
|
|
18
16
|
}
|
|
@@ -3,8 +3,8 @@ import { randomUUID } from 'node:crypto'
|
|
|
3
3
|
import { readFileSync, rmSync } from 'node:fs'
|
|
4
4
|
import { createServer, type Server } from 'node:net'
|
|
5
5
|
import path from 'node:path'
|
|
6
|
+
import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
|
|
6
7
|
import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
7
|
-
import { PLATFORM_TEMP_ROOT } from './platform-temporary'
|
|
8
8
|
|
|
9
9
|
// Whether the process a record names is still the one that wrote it.
|
|
10
10
|
//
|
|
@@ -30,7 +30,7 @@ import { PLATFORM_TEMP_ROOT } from './platform-temporary'
|
|
|
30
30
|
// `Tue Sep 8 09:15:33 2026` in one shell and `Tue Sep 8 02:15:33 2026` in another that exported
|
|
31
31
|
// `TZ=UTC` — and a writer and reader disagreeing about `TZ` would read a live process as a stranger.
|
|
32
32
|
// That failure is worse than the one this module fixes, because it fires on a gate that really is
|
|
33
|
-
// running: `unit-
|
|
33
|
+
// running: `unit-run-marker` would sweep the marker of a live run and put every suite back on the
|
|
34
34
|
// whole machine, and `bench-guard` would clear the caches out from under a running gate. The probe
|
|
35
35
|
// therefore pins `TZ` and `LC_ALL` rather than inheriting them.
|
|
36
36
|
|
|
@@ -237,11 +237,16 @@ function beacon_target(token: string): string | undefined {
|
|
|
237
237
|
}
|
|
238
238
|
|
|
239
239
|
// No status is a probe killed by its timeout or a signal — unknown, the same as its own timeout.
|
|
240
|
-
|
|
240
|
+
// `kill_after_ms` is a parameter so a test can ask what the probe itself reports for a socket
|
|
241
|
+
// without a loaded machine's slow start turning the answer into the timeout's.
|
|
242
|
+
function run_socket_probe(
|
|
243
|
+
target: string,
|
|
244
|
+
kill_after_ms: number = PROBE_TIMEOUT_MS,
|
|
245
|
+
): number | undefined {
|
|
241
246
|
return (
|
|
242
247
|
spawnSync(process.execPath, ['-e', SOCKET_PROBE_SOURCE, target], {
|
|
243
248
|
stdio: 'ignore',
|
|
244
|
-
timeout:
|
|
249
|
+
timeout: kill_after_ms,
|
|
245
250
|
}).status ?? undefined
|
|
246
251
|
)
|
|
247
252
|
}
|
|
@@ -359,6 +364,9 @@ function is_own_process(pid: number | undefined, recorded_start: string | undefi
|
|
|
359
364
|
}
|
|
360
365
|
|
|
361
366
|
const process_identity = {
|
|
367
|
+
PROBE_ENVIRONMENT,
|
|
368
|
+
START_PROBES,
|
|
369
|
+
START_TIME_FORMAT,
|
|
362
370
|
close_beacon,
|
|
363
371
|
is_live_beacon,
|
|
364
372
|
is_live_pid,
|
|
@@ -371,6 +379,7 @@ const process_identity = {
|
|
|
371
379
|
own_start,
|
|
372
380
|
read_start,
|
|
373
381
|
resolve_own_start,
|
|
382
|
+
run_socket_probe,
|
|
374
383
|
}
|
|
375
384
|
|
|
376
385
|
export { process_identity }
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { backlogrun_launch } from '#scripts/backlog/backlogrun-launch'
|
|
4
2
|
import { run_carry } from '#scripts/run/carry/run-carry'
|
|
5
|
-
import { josh_environment_file } from './josh-environment-file'
|
|
6
3
|
import { session_language, type Resolution } from './session-language'
|
|
7
4
|
|
|
8
5
|
// `josh session:lang` — say, on stdout, which language this session writes in, so a
|
|
@@ -43,7 +40,8 @@ const LIVE_PORTS: LivePorts = {
|
|
|
43
40
|
is_running: backlogrun_launch.is_running,
|
|
44
41
|
}
|
|
45
42
|
|
|
46
|
-
// The file load happens in `main`, on the command path only; the resolver reads
|
|
43
|
+
// The file load happens in `session-language-main.ts`, on the command path only; the resolver reads
|
|
44
|
+
// the environment.
|
|
47
45
|
// The line carries the value alone: what the language covers is `CLAUDE.md` → "Output language",
|
|
48
46
|
// already in context every turn, so repeating it here only spent context on each prompt. The default
|
|
49
47
|
// prints nothing — that resident line already names `ja`.
|
|
@@ -68,8 +66,7 @@ function prompt_lines(resolution: Resolution, is_live: boolean): Array<string> {
|
|
|
68
66
|
return [format_line(resolution), is_live ? BOARD_LINE : ''].filter((line) => line !== '')
|
|
69
67
|
}
|
|
70
68
|
|
|
71
|
-
async function
|
|
72
|
-
josh_environment_file.load_environment_file()
|
|
69
|
+
async function print_prompt_lines(): Promise<void> {
|
|
73
70
|
const lines = prompt_lines(resolve_session_lang(), await is_run_live())
|
|
74
71
|
|
|
75
72
|
for (const line of lines) console.info(line)
|
|
@@ -81,11 +78,10 @@ const session_language_cli = {
|
|
|
81
78
|
ENV_KEY,
|
|
82
79
|
format_line,
|
|
83
80
|
is_run_live,
|
|
81
|
+
print_prompt_lines,
|
|
84
82
|
prompt_lines,
|
|
85
83
|
resolve_session_lang,
|
|
86
84
|
}
|
|
87
85
|
|
|
88
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
|
|
89
|
-
|
|
90
86
|
export type { LivePorts }
|
|
91
87
|
export { session_language_cli }
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { josh_environment_file } from './josh-environment-file'
|
|
4
|
+
import { session_language_cli } from './session-language-cli'
|
|
5
|
+
|
|
6
|
+
// The `josh session:lang` entry and the `session-lang` hook bundle, kept apart from
|
|
7
|
+
// `session-language-cli.ts` because `metrics-logic.ts` imports that one: a bundle is one file, so a
|
|
8
|
+
// main guard there would fire for every command that carries it (joshuafolkken/kit#4186). `.env` is
|
|
9
|
+
// read here, inside the guard, so a developer's own `.env` cannot decide what the unit tests see.
|
|
10
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
11
|
+
josh_environment_file.load_environment_file()
|
|
12
|
+
await session_language_cli.print_prompt_lines()
|
|
13
|
+
}
|
|
@@ -24,7 +24,12 @@ function resolve_session_lang(): Resolution {
|
|
|
24
24
|
return { lang: DEFAULT_SESSION_LANG, is_default: true }
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
// `ja` and any regional form of it (`ja-JP`) is Japanese; every other language is the English fallback.
|
|
28
|
+
function is_japanese(lang: string): boolean {
|
|
29
|
+
return lang.toLowerCase().startsWith(DEFAULT_SESSION_LANG)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const session_language = { DEFAULT_SESSION_LANG, ENV_KEY, resolve_session_lang, is_japanese }
|
|
28
33
|
|
|
29
34
|
export type { Resolution }
|
|
30
35
|
export { session_language }
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
2
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
3
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
4
|
+
import { z } from 'zod'
|
|
5
|
+
import { stamp_file } from './stamp-file'
|
|
6
|
+
|
|
7
|
+
// An answer one josh process read from GitHub, kept for the next process to reuse while it is fresh
|
|
8
|
+
// (joshuafolkken/kit#4550).
|
|
9
|
+
//
|
|
10
|
+
// **Keyed to the repository's common git directory, so every work tree shares one record.** A
|
|
11
|
+
// backlogrun asks the same question from its drive, its arrival probe and every lane at once; keying on
|
|
12
|
+
// `PROJECT_ROOT` would give each work tree its own copy and each would read GitHub again.
|
|
13
|
+
//
|
|
14
|
+
// One record per slot: a different `key` replaces it rather than accumulating beside it, so the temp
|
|
15
|
+
// directory holds at most one file per slot however many keys a run walks through.
|
|
16
|
+
|
|
17
|
+
interface CacheSlot {
|
|
18
|
+
prefix: string
|
|
19
|
+
ttl_ms: number
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const record_schema = z.object({
|
|
23
|
+
key: z.string(),
|
|
24
|
+
saved_at: z.number(),
|
|
25
|
+
value: z.unknown(),
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
function slot_path(slot: CacheSlot): string {
|
|
29
|
+
return stamp_file.stamp_path(slot.prefix, git_common_directory.repository() ?? PROJECT_ROOT)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function is_fresh(saved_at: number, slot: CacheSlot, now_ms: number): boolean {
|
|
33
|
+
return saved_at <= now_ms && now_ms - saved_at < slot.ttl_ms
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function read_value(slot: CacheSlot, key: string, now_ms: number): unknown {
|
|
37
|
+
const raw = stamp_file.read_stamp_text(slot_path(slot))
|
|
38
|
+
const record = raw === undefined ? undefined : json_value.parse_with(raw, record_schema)
|
|
39
|
+
|
|
40
|
+
return record?.key === key && is_fresh(record.saved_at, slot, now_ms) ? record.value : undefined
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// `undefined` is a miss: no record, another key's record, a stale one, or one that does not parse.
|
|
44
|
+
function read<T>(
|
|
45
|
+
slot: CacheSlot,
|
|
46
|
+
key: string,
|
|
47
|
+
schema: z.ZodType<T>,
|
|
48
|
+
now_ms: number,
|
|
49
|
+
): T | undefined {
|
|
50
|
+
const parsed = schema.safeParse(read_value(slot, key, now_ms))
|
|
51
|
+
|
|
52
|
+
return parsed.success ? parsed.data : undefined
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// A write that fails leaves the next process to read GitHub itself — the answer this process already
|
|
56
|
+
// has is still right, so the failure is not its caller's to handle.
|
|
57
|
+
function write(slot: CacheSlot, key: string, value: unknown, now_ms: number): void {
|
|
58
|
+
try {
|
|
59
|
+
stamp_file.replace_stamp(slot_path(slot), { key, saved_at: now_ms, value })
|
|
60
|
+
} catch {
|
|
61
|
+
// The record is an optimization; a missing one costs one read.
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// The cached answer for `key`, or `compute`'s — stored only when it is defined, so a failed read is
|
|
66
|
+
// asked again by the next process rather than remembered for the whole TTL.
|
|
67
|
+
async function remember<T>(
|
|
68
|
+
request: { slot: CacheSlot; key: string; schema: z.ZodType<T> },
|
|
69
|
+
compute: () => Promise<T | undefined>,
|
|
70
|
+
now_ms: number = Date.now(),
|
|
71
|
+
): Promise<T | undefined> {
|
|
72
|
+
const cached = read(request.slot, request.key, request.schema, now_ms)
|
|
73
|
+
|
|
74
|
+
if (cached !== undefined) return cached
|
|
75
|
+
|
|
76
|
+
const value = await compute()
|
|
77
|
+
|
|
78
|
+
if (value !== undefined) write(request.slot, request.key, value, now_ms)
|
|
79
|
+
|
|
80
|
+
return value
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function clear(slot: CacheSlot): void {
|
|
84
|
+
stamp_file.remove_stamp(slot_path(slot))
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const shared_cache = { clear, read, remember, write }
|
|
88
|
+
|
|
89
|
+
export { shared_cache }
|
|
90
|
+
export type { CacheSlot }
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { createHash
|
|
2
|
-
import { lstatSync, readFileSync,
|
|
1
|
+
import { createHash } from 'node:crypto'
|
|
2
|
+
import { lstatSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
|
|
3
3
|
import path from 'node:path'
|
|
4
4
|
import { PACKAGE_DIR } from '#scripts/init/init-paths'
|
|
5
|
-
import { PLATFORM_TEMP_ROOT } from '
|
|
5
|
+
import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
|
|
6
|
+
import { atomic_write } from '#scripts/lib/atomic-write'
|
|
6
7
|
|
|
7
8
|
// A small record one josh command writes and another reads, kept per checkout in the temp directory.
|
|
8
9
|
//
|
|
9
|
-
// Extracted from `
|
|
10
|
+
// Extracted from `tools/eval/eval-stamp.ts` when `josh latest:scope` needed the same handoff.
|
|
10
11
|
// The mechanics below are not boilerplate — the symlink defense on the
|
|
11
12
|
// write, the ownership check on the read, and the deterministic per-checkout path are each load
|
|
12
13
|
// bearing — so a second copy of them is the clone `CLAUDE.md` prohibits. What differs between the
|
|
@@ -121,8 +122,8 @@ function is_foreign_file(target: string): boolean {
|
|
|
121
122
|
}
|
|
122
123
|
|
|
123
124
|
// Mutable coordination state cannot disappear between an unlink and its replacement: a reader that
|
|
124
|
-
// mistakes that gap for "no child" can start the same generation twice.
|
|
125
|
-
// beside the target
|
|
125
|
+
// mistakes that gap for "no child" can start the same generation twice. `atomic-write.ts` stages the
|
|
126
|
+
// text beside the target with the same exclusive create and renames it over the target.
|
|
126
127
|
// `rename` replaces the path itself rather than following a symlink planted there, so the write still
|
|
127
128
|
// never lands somewhere else; a regular file another account owns is refused before it is replaced,
|
|
128
129
|
// the same answer the unlink gives on a sticky temp directory.
|
|
@@ -131,16 +132,9 @@ function replace_text_stamp(target: string, text: string): string {
|
|
|
131
132
|
throw new Error(`refusing to replace another account's file: ${target}`)
|
|
132
133
|
}
|
|
133
134
|
|
|
134
|
-
|
|
135
|
+
atomic_write.replace_file(target, text, { mode: STAMP_FILE_MODE })
|
|
135
136
|
|
|
136
|
-
|
|
137
|
-
writeFileSync(temporary, text, { flag: STAMP_CREATE_FLAG, mode: STAMP_FILE_MODE })
|
|
138
|
-
renameSync(temporary, target)
|
|
139
|
-
|
|
140
|
-
return target
|
|
141
|
-
} finally {
|
|
142
|
-
rmSync(temporary, { force: true })
|
|
143
|
-
}
|
|
137
|
+
return target
|
|
144
138
|
}
|
|
145
139
|
|
|
146
140
|
function replace_stamp(target: string, payload: unknown): string {
|