@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
package/scripts/run/run-prep.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { delegation_policy } from '#scripts/delegation/delegation-policy'
|
|
1
2
|
import { issue_state, type IssueState } from '#scripts/issue/issue-state'
|
|
2
3
|
|
|
3
4
|
// `josh run:prep <N>` — the reads a `fullrun` makes before its first edit, assembled into one report.
|
|
@@ -22,6 +23,9 @@ const CONTENT_HEADER = '=== issue ==='
|
|
|
22
23
|
const STATE_HEADER = '=== state ==='
|
|
23
24
|
const LATEST_HEADER = '=== dependency update ==='
|
|
24
25
|
const LOCATIONS_HEADER = '=== code locations ==='
|
|
26
|
+
const INVESTIGATION_HEADER = '=== investigation ==='
|
|
27
|
+
// The step the investigation guard would otherwise name only once it refuses, mid-reading (#4345).
|
|
28
|
+
const INVESTIGATION_BODY = `Delegate before the first read — the guard refuses at ${delegation_policy.INVESTIGATION_LIMIT}. ${delegation_policy.INVESTIGATION_STEP} Brief it with the code locations above; read in the main line only the files this run will edit.`
|
|
25
29
|
const SHIP_HEADER = '=== ship preconditions ==='
|
|
26
30
|
const SHIP_MET = 'met — nothing `josh ship` refuses on as the tree stands'
|
|
27
31
|
const SHIP_UNMET =
|
|
@@ -89,12 +93,14 @@ function format_report(parts: PrepParts): string {
|
|
|
89
93
|
section(STATE_HEADER, state_body(parts)),
|
|
90
94
|
section(LATEST_HEADER, `${parts.latest_scope}${LATEST_JOINER}${parts.latest_reason}`),
|
|
91
95
|
section(LOCATIONS_HEADER, parts.locations),
|
|
96
|
+
section(INVESTIGATION_HEADER, INVESTIGATION_BODY),
|
|
92
97
|
section(SHIP_HEADER, ship_body(parts.ship_problems)),
|
|
93
98
|
].join(SECTION_SEPARATOR)
|
|
94
99
|
}
|
|
95
100
|
|
|
96
101
|
const run_prep = {
|
|
97
102
|
CONTENT_HEADER,
|
|
103
|
+
INVESTIGATION_HEADER,
|
|
98
104
|
LATEST_HEADER,
|
|
99
105
|
LOCATIONS_HEADER,
|
|
100
106
|
SHIP_HEADER,
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { cost_cli } from '#scripts/cost-runtime/cost-cli'
|
|
3
4
|
import { git_followup_pending } from '#scripts/followup/git-followup-pending'
|
|
5
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
6
|
+
import { telegram_notify } from '#scripts/notify/telegram-notify'
|
|
4
7
|
import { release_scope_cli } from '#scripts/release/release-scope-cli'
|
|
5
|
-
import {
|
|
8
|
+
import { report_labels } from '#scripts/report/report-labels'
|
|
9
|
+
import { run_carry, type CarryRead } from '#scripts/run/carry/run-carry'
|
|
6
10
|
import { run_event_scope, type EventScope } from '#scripts/run/event/run-event-scope'
|
|
7
11
|
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
8
12
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
9
13
|
import { run_report } from './run-report'
|
|
14
|
+
import { run_report_handoff, type Handoff } from './run-report-handoff'
|
|
10
15
|
|
|
11
16
|
// `josh run:report` — the session-facing report, generated from the run's event stream rather than
|
|
12
17
|
// composed by hand. It reads the events the run appended, asks `release:scope`
|
|
@@ -18,8 +23,23 @@ import { run_report } from './run-report'
|
|
|
18
23
|
// **The body it prints is the Telegram body too.** `josh notify --body-file <file>` sends exactly this
|
|
19
24
|
// output, so the summary a session shows and the message a person reads off-screen are one string from one
|
|
20
25
|
// generator, never a second wording of the same facts.
|
|
26
|
+
//
|
|
27
|
+
// `--handoff` prints the `backlogrun` hand-off report (`run-report-handoff.ts`) from the same reads —
|
|
28
|
+
// the run record and the scoped stream — and sends it itself as the `confirmation`, the resume command
|
|
29
|
+
// as its `recommended` choice (joshuafolkken/kit#4161). The body is built with plain `#N` and linked
|
|
30
|
+
// here, at the print boundary, through `session_cite.text`.
|
|
21
31
|
|
|
32
|
+
const ARGV_OFFSET = 2
|
|
22
33
|
const SUCCESS_EXIT_CODE = 0
|
|
34
|
+
const FAILURE_EXIT_CODE = 1
|
|
35
|
+
const HANDOFF_FLAG = '--handoff'
|
|
36
|
+
const USAGE = `Usage: josh run:report [${HANDOFF_FLAG}]`
|
|
37
|
+
const NO_RECORD_NOTE =
|
|
38
|
+
'No readable run record, so there is no run to hand off. Begin one with `pnpm josh run:carry --begin` first.'
|
|
39
|
+
const HANDOFF_TITLE = 'backlogrun hand-off'
|
|
40
|
+
const HANDOFF_RECOVERY = 'If this did not arrive, the session transcript holds the same report.'
|
|
41
|
+
const NO_RESUME_NOTE =
|
|
42
|
+
'The run record names no resume command, so no hand-off confirmation was sent; the report above is the hand-off.'
|
|
23
43
|
|
|
24
44
|
// An absent or unreadable stream is an empty run, the same fail-quiet direction the stream's own reader
|
|
25
45
|
// takes — a report with no events is a report, not an error.
|
|
@@ -31,40 +51,108 @@ async function read_stream(): Promise<ReadonlyArray<RunEvent>> {
|
|
|
31
51
|
return run_event_stream.read_events(target)
|
|
32
52
|
}
|
|
33
53
|
|
|
54
|
+
// The run record this checkout holds, or `undefined` when the git directory cannot be resolved.
|
|
55
|
+
async function read_record(): Promise<CarryRead | undefined> {
|
|
56
|
+
const directory = await run_carry.repository_directory()
|
|
57
|
+
|
|
58
|
+
if (directory === undefined) return undefined
|
|
59
|
+
|
|
60
|
+
return run_carry.read_carry(run_carry.carry_path(directory))
|
|
61
|
+
}
|
|
62
|
+
|
|
34
63
|
// The invocation this report covers, taken from the run record that already holds the start time.
|
|
35
64
|
// A checkout whose git directory cannot be resolved has no record to read, which is the same
|
|
36
65
|
// undetermined answer an absent record gives — and neither one falls back to the whole stream.
|
|
37
|
-
|
|
38
|
-
|
|
66
|
+
function scope_of(read: CarryRead | undefined): EventScope {
|
|
67
|
+
if (read === undefined) return run_event_scope.UNKNOWN_EVENT_SCOPE
|
|
39
68
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
return run_event_scope.scope_of(run_carry.read_carry(run_carry.carry_path(directory)))
|
|
69
|
+
return run_event_scope.scope_of(read)
|
|
43
70
|
}
|
|
44
71
|
|
|
45
72
|
// The three reads are independent, so they are issued together rather than one after another — the stream, the
|
|
46
73
|
// pending-merge count and the run record share no input.
|
|
47
|
-
async function
|
|
48
|
-
const [events, pending,
|
|
74
|
+
async function run_summary(): Promise<number> {
|
|
75
|
+
const [events, pending, read] = await Promise.all([
|
|
49
76
|
read_stream(),
|
|
50
77
|
git_followup_pending.read_pending({}),
|
|
51
|
-
|
|
78
|
+
read_record(),
|
|
52
79
|
])
|
|
53
80
|
const release = release_scope_cli.decide(pending)
|
|
54
81
|
|
|
55
|
-
process.stdout.write(`${run_report.build_report({ events, release, scope })}\n`)
|
|
82
|
+
process.stdout.write(`${run_report.build_report({ events, release, scope: scope_of(read) })}\n`)
|
|
56
83
|
|
|
57
84
|
return SUCCESS_EXIT_CODE
|
|
58
85
|
}
|
|
59
86
|
|
|
60
|
-
|
|
61
|
-
|
|
87
|
+
type CarriedRead = Extract<CarryRead, { kind: 'carried' }>
|
|
88
|
+
|
|
89
|
+
// The report is the hand-off, so it succeeds once printed. The send is `confirm`'s tolerant one, which
|
|
90
|
+
// already reports its own failure with `HANDOFF_RECOVERY` — a checkout with no Telegram credentials is
|
|
91
|
+
// one, and pointing it at `josh notify` would fail the same way. A record whose invocation names no
|
|
92
|
+
// resume command has no `recommended` to send.
|
|
93
|
+
async function send_handoff(handoff: Handoff): Promise<void> {
|
|
94
|
+
if (handoff.resume === undefined) {
|
|
95
|
+
console.error(NO_RESUME_NOTE)
|
|
96
|
+
|
|
97
|
+
return
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
await telegram_notify.confirm({
|
|
101
|
+
issue_title: HANDOFF_TITLE,
|
|
102
|
+
body: handoff.body,
|
|
103
|
+
recovery: HANDOFF_RECOVERY,
|
|
104
|
+
recommended: handoff.resume,
|
|
105
|
+
alternatives: [],
|
|
106
|
+
})
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function handoff_of(read: CarriedRead, events: ReadonlyArray<RunEvent>): Handoff {
|
|
110
|
+
return run_report_handoff.build_handoff({
|
|
111
|
+
carry: read.carry,
|
|
112
|
+
events: run_event_scope.scoped_events(events, scope_of(read)) ?? [],
|
|
113
|
+
figures: cost_cli.session_figures(),
|
|
114
|
+
labels: report_labels.session_labels(),
|
|
115
|
+
})
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async function run_handoff(): Promise<number> {
|
|
119
|
+
const [events, read] = await Promise.all([read_stream(), read_record()])
|
|
120
|
+
|
|
121
|
+
if (read?.kind !== 'carried') {
|
|
122
|
+
console.error(NO_RECORD_NOTE)
|
|
123
|
+
|
|
124
|
+
return FAILURE_EXIT_CODE
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const built = handoff_of(read, events)
|
|
128
|
+
const handoff = { ...built, body: session_cite.text(built.body) }
|
|
129
|
+
|
|
130
|
+
process.stdout.write(`${handoff.body}\n`)
|
|
131
|
+
await send_handoff(handoff)
|
|
132
|
+
|
|
133
|
+
return SUCCESS_EXIT_CODE
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async function run(argv: ReadonlyArray<string> = []): Promise<number> {
|
|
137
|
+
if (argv.length === 0) return await run_summary()
|
|
138
|
+
if (argv.length === 1 && argv[0] === HANDOFF_FLAG) return await run_handoff()
|
|
139
|
+
|
|
140
|
+
console.error(USAGE)
|
|
141
|
+
|
|
142
|
+
return FAILURE_EXIT_CODE
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
146
|
+
process.exitCode = await run(argv)
|
|
62
147
|
}
|
|
63
148
|
|
|
64
149
|
const run_report_cli = {
|
|
150
|
+
NO_RECORD_NOTE,
|
|
151
|
+
NO_RESUME_NOTE,
|
|
152
|
+
USAGE,
|
|
65
153
|
run,
|
|
66
154
|
}
|
|
67
155
|
|
|
68
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
|
|
156
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
69
157
|
|
|
70
158
|
export { run_report_cli }
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { backlog_drive_restore } from '#scripts/backlog/backlog-drive-restore'
|
|
2
|
+
import type { SessionFigures } from '#scripts/cost-runtime/cost-cli'
|
|
3
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
4
|
+
import type { HandoffLabels, ReportLabels } from '#scripts/report/report-labels'
|
|
5
|
+
import { run_carry, type RunCarry } from '#scripts/run/carry/run-carry'
|
|
6
|
+
import type { RunEvent } from '#scripts/run/event/run-event-stream'
|
|
7
|
+
import { run_invocation } from '#scripts/run/run-invocation'
|
|
8
|
+
|
|
9
|
+
// `josh run:report --handoff` — the report a `backlogrun` writes when it hands the rest of a batch to a
|
|
10
|
+
// new session, generated from the values that already answer each line rather than filled in by hand:
|
|
11
|
+
// the run record (`run:carry`) names what merged, what is left and the command that resumes the run,
|
|
12
|
+
// the invocation's events name what parked, and `cost --cut`'s figures name why it stopped. **The
|
|
13
|
+
// hand-off is a fourth kind of stop**, so it carries the hand-off labels and never the completion
|
|
14
|
+
// report's `cause` / `fix` / `result` — an unfinished epic would read as finished.
|
|
15
|
+
//
|
|
16
|
+
// **The body is the Telegram body too**, as `run:report`'s is: the CLI prints it and sends it as the
|
|
17
|
+
// `confirmation`, the resume command as its `recommended` choice.
|
|
18
|
+
|
|
19
|
+
const LINE_SEPARATOR = '\n'
|
|
20
|
+
const LIST_SEPARATOR = ', '
|
|
21
|
+
const COST_COMMAND = '`pnpm josh cost --cut`'
|
|
22
|
+
|
|
23
|
+
interface HandoffInput {
|
|
24
|
+
carry: RunCarry
|
|
25
|
+
// This invocation's events, already scoped by `run-event-scope.ts`.
|
|
26
|
+
events: ReadonlyArray<RunEvent>
|
|
27
|
+
figures: SessionFigures
|
|
28
|
+
labels: ReportLabels
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface Handoff {
|
|
32
|
+
body: string
|
|
33
|
+
// The command that resumes the run, or `undefined` for a record whose invocation does not parse.
|
|
34
|
+
resume: string | undefined
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function issue_list(issues: ReadonlyArray<number>, labels: HandoffLabels): string {
|
|
38
|
+
if (issues.length === 0) return labels.none
|
|
39
|
+
|
|
40
|
+
return issues.map((issue) => issue_cite.plain(issue)).join(LIST_SEPARATOR)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// The children that parked in this invocation and never merged — named apart from the remaining list,
|
|
44
|
+
// because a parked child is settled for this run but is not done.
|
|
45
|
+
function parked_of(input: HandoffInput): ReadonlyArray<number> {
|
|
46
|
+
const merged = input.carry.merged_issues ?? []
|
|
47
|
+
|
|
48
|
+
return [...backlog_drive_restore.parked_issues(input.events)].filter(
|
|
49
|
+
(issue) => !merged.includes(issue),
|
|
50
|
+
)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// **Never omitted**: it is the one line that tells this report from a completion report. A budget-only
|
|
54
|
+
// invocation named no list, so what is left is the pool rather than a count.
|
|
55
|
+
function remaining_line(input: HandoffInput, remaining: ReadonlyArray<number> | undefined): string {
|
|
56
|
+
const labels = input.labels.handoff
|
|
57
|
+
const parked = parked_of(input)
|
|
58
|
+
const listed = remaining === undefined ? labels.pool : issue_list(remaining, labels)
|
|
59
|
+
const count = remaining === undefined ? '' : ` (${String(remaining.length)})`
|
|
60
|
+
const parked_note =
|
|
61
|
+
parked.length === 0 ? '' : ` · ${labels.parked}: ${issue_list(parked, labels)}`
|
|
62
|
+
|
|
63
|
+
return `${listed}${count}${parked_note}`
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// An unmeasurable session quotes its verdict where the cost would be, never a `0`.
|
|
67
|
+
function measurement_line(figures: SessionFigures): string {
|
|
68
|
+
const cost = figures.cost === undefined ? figures.verdict : String(figures.cost)
|
|
69
|
+
|
|
70
|
+
return `${cost} / ${String(figures.threshold)}`
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function command_line(resume: string | undefined, labels: HandoffLabels): string {
|
|
74
|
+
return resume === undefined ? labels.none : `\`${resume}\``
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function body_lines(
|
|
78
|
+
input: HandoffInput,
|
|
79
|
+
handoff_resume: string | undefined,
|
|
80
|
+
): ReadonlyArray<string> {
|
|
81
|
+
const labels = input.labels.handoff
|
|
82
|
+
const remaining = run_carry.remaining_of(input.carry)
|
|
83
|
+
|
|
84
|
+
return [
|
|
85
|
+
`**${labels.title}**`,
|
|
86
|
+
'',
|
|
87
|
+
`- **${labels.done}**: ${issue_list(input.carry.merged_issues ?? [], labels)}`,
|
|
88
|
+
`- **${labels.remaining}**: ${remaining_line(input, remaining)}`,
|
|
89
|
+
`- **${labels.why_stopped}**: ${COST_COMMAND} → ${input.figures.verdict}`,
|
|
90
|
+
`- **${labels.next_command}**: ${command_line(handoff_resume, labels)}`,
|
|
91
|
+
'',
|
|
92
|
+
`**${input.labels.details}**`,
|
|
93
|
+
'',
|
|
94
|
+
`- ${labels.measurement}: ${measurement_line(input.figures)}`,
|
|
95
|
+
`- ${labels.handover}: ${labels.handover_text}`,
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Handed the same record, events and figures it returns the same report — nothing here reads a clock,
|
|
100
|
+
// the environment or the network, which is what the tests pin. The resume command is the record's own
|
|
101
|
+
// invocation: `run:carry` resumes a record only when the invocation matches it exactly, so a command
|
|
102
|
+
// shrunk to the remaining issues would be refused and its recovery would drop the carried counts.
|
|
103
|
+
function build_handoff(input: HandoffInput): Handoff {
|
|
104
|
+
const resume = run_invocation.rebuild(input.carry.invocation)
|
|
105
|
+
|
|
106
|
+
return { body: body_lines(input, resume).join(LINE_SEPARATOR), resume }
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const run_report_handoff = {
|
|
110
|
+
build_handoff,
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export type { Handoff, HandoffInput }
|
|
114
|
+
export { run_report_handoff }
|
package/scripts/run/run-step.ts
CHANGED
|
@@ -271,7 +271,7 @@ function closed_action(input: StepInput): StepAction {
|
|
|
271
271
|
|
|
272
272
|
return {
|
|
273
273
|
kind: 'decide',
|
|
274
|
-
line: `decide: ${session_cite.issue(input.issue_number)} is closed but this tree holds uncommitted work — keep it with \`
|
|
274
|
+
line: `decide: ${session_cite.issue(input.issue_number)} is closed but this tree holds uncommitted work — keep it with \`pnpm josh stash:push "${message}"\` | carry it into a new issue`,
|
|
275
275
|
}
|
|
276
276
|
}
|
|
277
277
|
|
|
@@ -42,6 +42,8 @@ interface DetectPorts {
|
|
|
42
42
|
notify_stranded: (body: string) => Promise<boolean>
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
type SameProcess = NonNullable<Parameters<typeof run_stranded.supervisor_liveness>[1]>
|
|
46
|
+
|
|
45
47
|
interface RecordTargets {
|
|
46
48
|
carry: string
|
|
47
49
|
wake: string
|
|
@@ -151,6 +153,16 @@ function is_stranded_at(directory: string, ports: DetectPorts = DEFAULT_PORTS):
|
|
|
151
153
|
return input !== undefined && run_stranded.is_stranded(input)
|
|
152
154
|
}
|
|
153
155
|
|
|
156
|
+
// The default ports with both liveness probes asked through `same_process` — `run:board` hands the one
|
|
157
|
+
// that reads its own `ps` snapshot (joshuafolkken/kit#4263).
|
|
158
|
+
function ports_with(same_process: SameProcess): DetectPorts {
|
|
159
|
+
return {
|
|
160
|
+
...DEFAULT_PORTS,
|
|
161
|
+
is_owner_live: (carry) => run_carry.is_owner_live(carry, new Date(), same_process),
|
|
162
|
+
supervisor_liveness: (wake) => run_stranded.supervisor_liveness(wake, same_process),
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
154
166
|
// The judgement a supervisor asks of the run it is about to stop watching. The asker is that
|
|
155
167
|
// supervisor on its way out, so it is taken as gone, and so is an owner that is the asker itself
|
|
156
168
|
// (`run_carry.is_held_by_another`) — that owner is about to be gone. A
|
|
@@ -173,6 +185,7 @@ const run_stranded_detect = {
|
|
|
173
185
|
detect_and_report,
|
|
174
186
|
is_left_stranded,
|
|
175
187
|
is_stranded_at,
|
|
188
|
+
ports_with,
|
|
176
189
|
run_stranded_check,
|
|
177
190
|
}
|
|
178
191
|
|
|
@@ -9,7 +9,7 @@ import { run_watcher_guard } from './run-watcher-guard'
|
|
|
9
9
|
// through `run-watcher-hook.ts` so every tool call is checked.
|
|
10
10
|
//
|
|
11
11
|
// **Exits 0 (ok) or 1 (stale).** A non-zero exit is what the hook mechanism treats as a refusal —
|
|
12
|
-
// the same contract `
|
|
12
|
+
// the same contract `pretool:guard` holds.
|
|
13
13
|
|
|
14
14
|
const SUCCESS_EXIT_CODE = 0
|
|
15
15
|
const FAILURE_EXIT_CODE = 1
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { lane_registry } from '#scripts/lane/lane-registry'
|
|
2
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
2
3
|
import { run_progress_clock } from '#scripts/run/progress/run-progress-clock'
|
|
3
4
|
import { run_headless } from './run-headless'
|
|
4
5
|
|
|
@@ -18,7 +19,6 @@ import { run_headless } from './run-headless'
|
|
|
18
19
|
|
|
19
20
|
const WATCHER_TICK_MS = 30_000
|
|
20
21
|
const TICK_MULTIPLIER = 3
|
|
21
|
-
const MS_PER_SECOND = 1000
|
|
22
22
|
|
|
23
23
|
const STALE_THRESHOLD_MS = WATCHER_TICK_MS * TICK_MULTIPLIER
|
|
24
24
|
const STALE_THRESHOLD_S = STALE_THRESHOLD_MS / MS_PER_SECOND
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
2
|
+
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
3
|
+
import { run_ship_body_draft } from './run-ship-body-draft'
|
|
4
|
+
import type { ShipArguments } from './run-ship-steps'
|
|
5
|
+
|
|
6
|
+
// The command line `josh ship` takes (`run-ship-cli.ts`). The first positional is the
|
|
7
|
+
// `"<title> #<N>"` string `git -y` and `followup` already take; the issue number is read off its tail
|
|
8
|
+
// for `run:tail`. Any further positionals are follow-up citations filed this run (`fullrun-steps.md`
|
|
9
|
+
// routes branch-2 filing before `ship`), forwarded to `run:tail` after the closed issue so `issue:cite`
|
|
10
|
+
// reports them too. A notify body — `--notify-message` or the shell-body-safe `--notify-message-file` —
|
|
11
|
+
// is forwarded to `followup` alone; the completion prose is composed before this command and passed
|
|
12
|
+
// straight through.
|
|
13
|
+
|
|
14
|
+
const FIRST = 0
|
|
15
|
+
const NUMBER_GROUP = 1
|
|
16
|
+
const EXTRA_CITE_START = 1
|
|
17
|
+
// The issue reference at the tail of the title — `git -y` and `followup` read the whole string, and
|
|
18
|
+
// `run:tail` needs the number alone.
|
|
19
|
+
const TRAILING_ISSUE_PATTERN = /#([1-9]\d*)\s*$/u
|
|
20
|
+
// Both body forms `followup` documents, forwarded verbatim: the inline `--notify-message` and the
|
|
21
|
+
// shell-body-safe `--notify-message-file` a body naming a command or path must use (`followup.md`).
|
|
22
|
+
const NOTIFY_OPTIONS = ['notify-message', 'notify-message-file'] as const
|
|
23
|
+
const { BODY_FILE_OPTION, body_arguments } = run_ship_body_draft
|
|
24
|
+
|
|
25
|
+
type NotifyValues = Partial<Record<(typeof NOTIFY_OPTIONS)[number], string>>
|
|
26
|
+
|
|
27
|
+
const OPTIONS = {
|
|
28
|
+
[NOTIFY_OPTIONS[0]]: { type: 'string' },
|
|
29
|
+
[NOTIFY_OPTIONS[1]]: { type: 'string' },
|
|
30
|
+
[BODY_FILE_OPTION]: { type: 'string' },
|
|
31
|
+
review: { type: 'boolean' },
|
|
32
|
+
// Hand the region to a detached supervisor (`run-ship-detach.ts`), print the
|
|
33
|
+
// report a stopped supervisor left, and carry follow-up citations as options so the supervisor's
|
|
34
|
+
// command line still ends with its title.
|
|
35
|
+
detach: { type: 'boolean' },
|
|
36
|
+
log: { type: 'string' },
|
|
37
|
+
cite: { type: 'string', multiple: true },
|
|
38
|
+
} as const
|
|
39
|
+
|
|
40
|
+
type ShipCommand = { kind: 'ship'; args: ShipArguments } | { kind: 'log'; number: string }
|
|
41
|
+
|
|
42
|
+
// The notify tail `followup` takes — whichever body form the caller composed, forwarded unchanged so a
|
|
43
|
+
// path-based body reaches `followup` exactly as passed.
|
|
44
|
+
function notify_arguments(values: NotifyValues): ReadonlyArray<string> {
|
|
45
|
+
return NOTIFY_OPTIONS.flatMap((option) => {
|
|
46
|
+
const value = values[option]
|
|
47
|
+
|
|
48
|
+
return value === undefined ? [] : [`--${option}`, value]
|
|
49
|
+
})
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function issue_number(title: string): string | undefined {
|
|
53
|
+
return TRAILING_ISSUE_PATTERN.exec(title)?.[NUMBER_GROUP]
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
interface ParsedValues extends NotifyValues {
|
|
57
|
+
[BODY_FILE_OPTION]?: string
|
|
58
|
+
review?: boolean
|
|
59
|
+
detach?: boolean
|
|
60
|
+
log?: string
|
|
61
|
+
cite?: Array<string>
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// A follow-up citation passed as a trailing positional is a bare issue number, so a stray flag is
|
|
65
|
+
// refused rather than forwarded to the wrong step.
|
|
66
|
+
function ship_args(
|
|
67
|
+
title: string,
|
|
68
|
+
rest: ReadonlyArray<string>,
|
|
69
|
+
values: ParsedValues,
|
|
70
|
+
): ShipArguments | undefined {
|
|
71
|
+
const number = issue_number(title)
|
|
72
|
+
const cites = [...rest, ...(values.cite ?? [])]
|
|
73
|
+
|
|
74
|
+
if (number === undefined || cites.some((token) => !issue_number_shape.is_issue_number(token))) {
|
|
75
|
+
return undefined
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
title,
|
|
80
|
+
number,
|
|
81
|
+
notify: notify_arguments(values),
|
|
82
|
+
body: body_arguments(values[BODY_FILE_OPTION]),
|
|
83
|
+
body_path: values[BODY_FILE_OPTION],
|
|
84
|
+
cites,
|
|
85
|
+
is_review: values.review === true,
|
|
86
|
+
is_detach: values.detach === true,
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// `--log <N>` stands alone: a bare issue number and nothing to ship.
|
|
91
|
+
function log_command(number: string, positionals: ReadonlyArray<string>): ShipCommand | undefined {
|
|
92
|
+
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(number) && positionals.length === 0
|
|
93
|
+
? { kind: 'log', number }
|
|
94
|
+
: undefined
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function command_of(
|
|
98
|
+
values: ParsedValues,
|
|
99
|
+
positionals: ReadonlyArray<string>,
|
|
100
|
+
): ShipCommand | undefined {
|
|
101
|
+
if (values.log !== undefined) return log_command(values.log, positionals)
|
|
102
|
+
|
|
103
|
+
const title = positionals[FIRST]
|
|
104
|
+
const args =
|
|
105
|
+
title === undefined ? undefined : ship_args(title, positionals.slice(EXTRA_CITE_START), values)
|
|
106
|
+
|
|
107
|
+
return args === undefined ? undefined : { kind: 'ship', args }
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Numbers-only tail and a strict parse, so a title with no `#<N>` or a stray flag is refused rather
|
|
111
|
+
// than shipped past the wrong step.
|
|
112
|
+
function parse(argv: ReadonlyArray<string>): ShipCommand | undefined {
|
|
113
|
+
const parsed = cli_flags.arguments_of(argv, OPTIONS)
|
|
114
|
+
|
|
115
|
+
return parsed === undefined ? undefined : command_of(parsed.values, parsed.positionals)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const run_ship_args = { parse }
|
|
119
|
+
|
|
120
|
+
export { run_ship_args }
|
|
121
|
+
export type { ShipCommand }
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { access, rm, writeFile } from 'node:fs/promises'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { git_command } from '#scripts/git/git-command'
|
|
4
|
+
import { acceptance_map } from '#scripts/review/acceptance-map'
|
|
5
|
+
import { live_evidence } from '#scripts/review/live-evidence'
|
|
6
|
+
import { removed_tests } from '#scripts/review/removed-tests'
|
|
7
|
+
import type { ShipArguments } from './run-ship-steps'
|
|
8
|
+
|
|
9
|
+
// **The pull-request body a run fills in before `josh ship`, written where ship reads it.** The
|
|
10
|
+
// acceptance-map and live-evidence refusals stopped about one ship per merge: their rows were printed
|
|
11
|
+
// at `run:prep`, long before the ship, and the lane child's ship carried no `--body-file` at all
|
|
12
|
+
// (joshuafolkken/kit#4168). The rows now land in a file in the work tree's own git directory — outside
|
|
13
|
+
// the tree, so no check sees it as a change — and `josh ship` reads it when `--body-file` is omitted,
|
|
14
|
+
// handing it to the preflight, `git -y` and a detached supervisor alike (`with_draft`).
|
|
15
|
+
// Nothing is satisfied for the run: each row still carries its pending ending and the evidence section is empty, so
|
|
16
|
+
// the same refusals stand until the run writes them.
|
|
17
|
+
|
|
18
|
+
// The PR body carrying the live-execution evidence `followup` gates the merge
|
|
19
|
+
// on, forwarded to `git -y` as a path because it holds commands and their output.
|
|
20
|
+
const BODY_FILE_OPTION = 'body-file' as const
|
|
21
|
+
const DRAFT_PREFIX = 'josh-ship-body-'
|
|
22
|
+
const DRAFT_SUFFIX = '.md'
|
|
23
|
+
const EXISTS_CODE = 'EEXIST'
|
|
24
|
+
const NO_GIT_DIRECTORY = 'no git directory to hold the ship body draft'
|
|
25
|
+
|
|
26
|
+
async function path_of(issue_number: string): Promise<string> {
|
|
27
|
+
const [git_directory] = await git_command.git_directories()
|
|
28
|
+
|
|
29
|
+
if (git_directory === undefined) throw new Error(NO_GIT_DIRECTORY)
|
|
30
|
+
|
|
31
|
+
return path.join(git_directory, `${DRAFT_PREFIX}${issue_number}${DRAFT_SUFFIX}`)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function is_exists_error(error: unknown): boolean {
|
|
35
|
+
return error instanceof Error && 'code' in error && error.code === EXISTS_CODE
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// The formats the preflight refuses on, as comments a rendered body hides: lanes that wrote the rows and
|
|
39
|
+
// the evidence in shapes of their own met them only at the refusal (joshuafolkken/kit#4478). They sit
|
|
40
|
+
// above the evidence heading, so their backticks are never read as that section's command.
|
|
41
|
+
const FORMAT_HINTS: ReadonlyArray<string> = [
|
|
42
|
+
acceptance_map.ROW_FORMAT,
|
|
43
|
+
live_evidence.EVIDENCE_FORMAT,
|
|
44
|
+
`when the change removes or renames a test, ${removed_tests.ROW_FORMAT}`,
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
function hint_line(format: string): string {
|
|
48
|
+
return `<!-- ${format} -->`
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function draft_text(acceptance_rows: string): string {
|
|
52
|
+
const hints = FORMAT_HINTS.map((format) => hint_line(format)).join('\n')
|
|
53
|
+
|
|
54
|
+
return `${acceptance_rows}\n\n${hints}\n\n${live_evidence.EVIDENCE_HEADING}\n`
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Written once: a draft the run has already filled in is never replaced by pending rows.
|
|
58
|
+
async function prepare(issue_number: string, acceptance_rows: string): Promise<string> {
|
|
59
|
+
const target = await path_of(issue_number)
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
await writeFile(target, draft_text(acceptance_rows), { flag: 'wx' })
|
|
63
|
+
} catch (error) {
|
|
64
|
+
if (!is_exists_error(error)) throw error
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return target
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async function existing(issue_number: string): Promise<string | undefined> {
|
|
71
|
+
const target = await path_of(issue_number)
|
|
72
|
+
|
|
73
|
+
try {
|
|
74
|
+
await access(target)
|
|
75
|
+
|
|
76
|
+
return target
|
|
77
|
+
} catch {
|
|
78
|
+
return undefined
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Removed once the pull request merged: keyed by issue number alone, a draft left in a git directory
|
|
83
|
+
// no lane close prunes (the main checkout's `.git`) would hand a reopened issue's ship the old body.
|
|
84
|
+
async function remove(issue_number: string): Promise<void> {
|
|
85
|
+
await rm(await path_of(issue_number), { force: true })
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function body_arguments(body_path: string | undefined): ReadonlyArray<string> {
|
|
89
|
+
return body_path === undefined ? [] : [`--${BODY_FILE_OPTION}`, body_path]
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// The ship's `--body-file`, or the draft when it was omitted and one exists.
|
|
93
|
+
async function with_draft(args: ShipArguments): Promise<ShipArguments> {
|
|
94
|
+
if (args.body_path !== undefined) return args
|
|
95
|
+
const draft = await existing(args.number)
|
|
96
|
+
|
|
97
|
+
return draft === undefined ? args : { ...args, body: body_arguments(draft), body_path: draft }
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const run_ship_body_draft = {
|
|
101
|
+
BODY_FILE_OPTION,
|
|
102
|
+
body_arguments,
|
|
103
|
+
existing,
|
|
104
|
+
path_of,
|
|
105
|
+
prepare,
|
|
106
|
+
remove,
|
|
107
|
+
with_draft,
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export { run_ship_body_draft }
|