@joshuafolkken/kit 1.1471.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -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 }
|
|
@@ -14,15 +14,16 @@ import { run_prep, type PrepParts } from './run-prep'
|
|
|
14
14
|
import { run_prep_cli } from './run-prep-cli'
|
|
15
15
|
import { run_retrospective } from './run-retrospective'
|
|
16
16
|
import { run_step, type ParentInput, type StepInput } from './run-step'
|
|
17
|
+
import { run_step_section } from './run-step-section'
|
|
17
18
|
|
|
18
|
-
// `josh run:step [<N>]` — print the run's next single action,
|
|
19
|
+
// `josh run:step [<N>]` — print the run's next single action, followed by the section that governs it
|
|
20
|
+
// (`run-step-section.ts`), computed from the event stream, the carry
|
|
19
21
|
// record and the issue state. It reads exactly those three, never the
|
|
20
22
|
// conversation: the issue facts through `run:prep`'s own gather (so this and `run:next` never answer
|
|
21
23
|
// from different reads), the newest event off the stream, and the carry record's kind. The reader runs
|
|
22
24
|
// the printed line, returns the result through `run:event`, and asks again — the loop `run:step`
|
|
23
25
|
// exists to close.
|
|
24
26
|
|
|
25
|
-
const SUCCESS_EXIT_CODE = 0
|
|
26
27
|
const FAILURE_EXIT_CODE = 1
|
|
27
28
|
const ARGV_OFFSET = 2
|
|
28
29
|
const USAGE =
|
|
@@ -154,16 +155,31 @@ function parent_input(directory: string | undefined): ParentInput {
|
|
|
154
155
|
// `unknown` is the one answer with nothing to run — no record this session drives — so it exits non-zero
|
|
155
156
|
// with the usage, exactly as a position missing its issue state does.
|
|
156
157
|
async function run_parent(): Promise<number> {
|
|
157
|
-
const
|
|
158
|
+
const action = run_step.parent_action(parent_input(await run_carry.repository_directory()))
|
|
158
159
|
|
|
159
|
-
console.info(line)
|
|
160
|
-
if (line !== run_step.UNKNOWN) return
|
|
160
|
+
console.info(action.line)
|
|
161
|
+
if (action.line !== run_step.UNKNOWN) return run_step_section.print_for(action)
|
|
161
162
|
|
|
162
163
|
console.error(USAGE)
|
|
163
164
|
|
|
164
165
|
return FAILURE_EXIT_CODE
|
|
165
166
|
}
|
|
166
167
|
|
|
168
|
+
function report({ input, ship_problems }: Gathered): number {
|
|
169
|
+
const action = run_step.next_action(input)
|
|
170
|
+
|
|
171
|
+
console.info(action.line)
|
|
172
|
+
// On stderr, so stdout stays the action line and its rule: what `josh ship` would
|
|
173
|
+
// refuse on is said at every step, while it is still cheap to meet.
|
|
174
|
+
if (ship_problems.length > 0) console.error(run_prep.ship_body(ship_problems))
|
|
175
|
+
|
|
176
|
+
// A state that could not be read exits non-zero, exactly as `run:prep` and `run:next` exit on the
|
|
177
|
+
// same failure, so a position missing its issue state is never read as a confident next step.
|
|
178
|
+
if (input.state === undefined) return FAILURE_EXIT_CODE
|
|
179
|
+
|
|
180
|
+
return run_step_section.print_for(action)
|
|
181
|
+
}
|
|
182
|
+
|
|
167
183
|
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
168
184
|
if (argv.length === 0) return await run_parent()
|
|
169
185
|
|
|
@@ -175,16 +191,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
175
191
|
return FAILURE_EXIT_CODE
|
|
176
192
|
}
|
|
177
193
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
console.info(run_step.next_action(input).line)
|
|
181
|
-
// On stderr, so stdout stays the one action line: what `josh ship` would
|
|
182
|
-
// refuse on is said at every step, while it is still cheap to meet.
|
|
183
|
-
if (ship_problems.length > 0) console.error(run_prep.ship_body(ship_problems))
|
|
184
|
-
|
|
185
|
-
// A state that could not be read exits non-zero, exactly as `run:prep` and `run:next` exit on the
|
|
186
|
-
// same failure, so a position missing its issue state is never read as a confident next step.
|
|
187
|
-
return input.state === undefined ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
|
|
194
|
+
return report(await gather(issue_number))
|
|
188
195
|
}
|
|
189
196
|
|
|
190
197
|
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { document_section_cli } from '#scripts/document/document-section-cli'
|
|
2
|
+
import { run_step, type StepAction } from './run-step'
|
|
3
|
+
|
|
4
|
+
// The section that governs each action `run:step` and `run:entry` print — the one table the action →
|
|
5
|
+
// rule mapping lives in, so the manifests no longer carry a route table the reader walks to find it.
|
|
6
|
+
// The command prints the section after its action line, which saves the `doc:section` turn the reader
|
|
7
|
+
// would otherwise spend fetching a section the action already determined.
|
|
8
|
+
//
|
|
9
|
+
// **A heading that does not resolve fails the command**, exactly as `doc:section` refuses it: a pointer
|
|
10
|
+
// renamed away would otherwise print the action without its rule, and the reader would act unread.
|
|
11
|
+
|
|
12
|
+
const JOSH_PREFIX = 'pnpm josh '
|
|
13
|
+
const COMMAND_SEPARATOR = ' '
|
|
14
|
+
const SUCCESS_EXIT_CODE = 0
|
|
15
|
+
|
|
16
|
+
// The key `run:entry` prints under — not a `run:step` action, but the entry's own read, kept in the
|
|
17
|
+
// same table so every mechanically-chosen section has one home.
|
|
18
|
+
const ENTRY = 'entry'
|
|
19
|
+
|
|
20
|
+
interface SectionReference {
|
|
21
|
+
document: string
|
|
22
|
+
heading: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function reference(document: string, heading: string): SectionReference {
|
|
26
|
+
return { document, heading }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// The gate's chain governs both the implementation it follows and a stopped ship's report.
|
|
30
|
+
const CHAIN = reference('chain-rule.md', 'Run the review-to-merge chain')
|
|
31
|
+
const PROGRESS = 'backlogrun-progress.md'
|
|
32
|
+
|
|
33
|
+
// Keyed on a verdict token, or on the josh subcommand a command action runs. An action with no row —
|
|
34
|
+
// `wait`, `stop`, a `decide:` line — has no rule to read beyond its own line.
|
|
35
|
+
const GOVERNING_SECTIONS: ReadonlyMap<string, SectionReference> = new Map([
|
|
36
|
+
[ENTRY, reference('split-assessment.md', 'The question')],
|
|
37
|
+
[run_step.IMPLEMENT, CHAIN],
|
|
38
|
+
[run_step.HUMAN_REVIEW, reference('needs-human-review.md', '`needs-human-review`')],
|
|
39
|
+
[run_step.UPDATE_DEPS, reference('latest-gate.md', 'The dependency update')],
|
|
40
|
+
['followup', reference('followup.md', 'Run `pnpm josh followup`')],
|
|
41
|
+
['review:round2', reference('prompts/review.md', 'Review round cap')],
|
|
42
|
+
['run:merge', reference(PROGRESS, "Running a named epic's children")],
|
|
43
|
+
['backlog:next', reference('backlogrun-steps.md', 'The loop')],
|
|
44
|
+
['run:cut', reference('pre-gate-cut.md', 'Resuming')],
|
|
45
|
+
['ship', CHAIN],
|
|
46
|
+
['retrospective', reference('retrospective.md', 'The end-of-run retrospective')],
|
|
47
|
+
['run:carry', reference(PROGRESS, 'The hand-off')],
|
|
48
|
+
])
|
|
49
|
+
|
|
50
|
+
function key_of(action: StepAction): string {
|
|
51
|
+
if (action.kind !== 'command') return action.line
|
|
52
|
+
|
|
53
|
+
const [subcommand = ''] = action.line.slice(JOSH_PREFIX.length).split(COMMAND_SEPARATOR)
|
|
54
|
+
|
|
55
|
+
return subcommand
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function section_for(key: string): SectionReference | undefined {
|
|
59
|
+
return GOVERNING_SECTIONS.get(key)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Printed through `doc:section` itself, so the extent, the Bash-cap split and the refusal of an
|
|
63
|
+
// unresolved heading are that command's, never a second copy of them.
|
|
64
|
+
function print_section(key: string, root: string = process.cwd()): number {
|
|
65
|
+
const found = section_for(key)
|
|
66
|
+
|
|
67
|
+
if (found === undefined) return SUCCESS_EXIT_CODE
|
|
68
|
+
|
|
69
|
+
return document_section_cli.run([found.document, found.heading], root)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function print_for(action: StepAction, root: string = process.cwd()): number {
|
|
73
|
+
return print_section(key_of(action), root)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const run_step_section = {
|
|
77
|
+
ENTRY,
|
|
78
|
+
GOVERNING_SECTIONS,
|
|
79
|
+
key_of,
|
|
80
|
+
print_for,
|
|
81
|
+
print_section,
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export type { SectionReference }
|
|
85
|
+
export { run_step_section }
|
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 }
|