@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
|
@@ -4,10 +4,12 @@ import path from 'node:path'
|
|
|
4
4
|
import { setTimeout as sleep } from 'node:timers/promises'
|
|
5
5
|
import { agent_event, type AgentEventState } from '#scripts/agent/agent-event'
|
|
6
6
|
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
7
|
-
import {
|
|
7
|
+
import { has_parked_label } from '#scripts/issue/issue-labels'
|
|
8
8
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
9
9
|
import { issue_state } from '#scripts/issue/issue-state'
|
|
10
10
|
import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
|
|
11
|
+
import { lane_state, type LaneState } from '#scripts/lane/lane-state'
|
|
12
|
+
import { MS_PER_MINUTE, MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
11
13
|
import { run_hold } from '#scripts/run/hold/run-hold'
|
|
12
14
|
|
|
13
15
|
// `josh run:liveness <N>` — whether the delegated unit running child `<N>` is still working, or
|
|
@@ -33,13 +35,22 @@ import { run_hold } from '#scripts/run/hold/run-hold'
|
|
|
33
35
|
// dead. `statSync` follows the link, and the size is compared as well as the modification time,
|
|
34
36
|
// because it is the two-sample size comparison that actually proves liveness.
|
|
35
37
|
|
|
38
|
+
//
|
|
39
|
+
// **The lane state record answers before any trace** (joshuafolkken/kit#4270): a lane `lane:pause`
|
|
40
|
+
// suspended has a live process and frozen output, which the traces read as `alive` for as long as it
|
|
41
|
+
// stays paused; the record says `paused`. An `ended` record is a lane done with its child. Whether a
|
|
42
|
+
// child that parked or died is still there is not the record's — it writes nothing then — so the
|
|
43
|
+
// traces still decide every other lane.
|
|
44
|
+
|
|
36
45
|
const ALIVE_VERDICT = 'alive'
|
|
46
|
+
const PAUSED_VERDICT = 'paused'
|
|
37
47
|
const SETTLED_VERDICT = 'settled'
|
|
38
48
|
const STOPPED_VERDICT = 'stopped'
|
|
39
49
|
const UNDETERMINED_VERDICT = 'undetermined'
|
|
40
50
|
|
|
41
51
|
type LivenessVerdict =
|
|
42
52
|
| typeof ALIVE_VERDICT
|
|
53
|
+
| typeof PAUSED_VERDICT
|
|
43
54
|
| typeof SETTLED_VERDICT
|
|
44
55
|
| typeof STOPPED_VERDICT
|
|
45
56
|
| typeof UNDETERMINED_VERDICT
|
|
@@ -58,8 +69,6 @@ const DEFAULT_SILENT_MINUTES = 30
|
|
|
58
69
|
// Two samples, a few seconds apart. The gap is what turns "this file has an old timestamp" into
|
|
59
70
|
// "this file is not being written", and five seconds is long enough for a unit mid-turn to append.
|
|
60
71
|
const DEFAULT_GAP_SECONDS = 5
|
|
61
|
-
const MS_PER_MINUTE = 60_000
|
|
62
|
-
const MS_PER_SECOND = 1000
|
|
63
72
|
const OPEN_STATE = 'OPEN'
|
|
64
73
|
const STATE_FIELDS = 'state,labels'
|
|
65
74
|
|
|
@@ -73,6 +82,8 @@ interface Traces {
|
|
|
73
82
|
is_child_settled: boolean | undefined
|
|
74
83
|
is_output_frozen: boolean | undefined
|
|
75
84
|
is_tree_dirty: boolean
|
|
85
|
+
// The lane's state record's state; `undefined` where the lane has none.
|
|
86
|
+
lane_state?: LaneState | undefined
|
|
76
87
|
process_trace: ProcessTrace
|
|
77
88
|
}
|
|
78
89
|
|
|
@@ -95,15 +106,19 @@ interface LivenessRequest {
|
|
|
95
106
|
const REASONS: Record<LivenessVerdict, string> = {
|
|
96
107
|
[ALIVE_VERDICT]:
|
|
97
108
|
'The unit is still working: its output moved, or a process of the child is alive.',
|
|
109
|
+
[PAUSED_VERDICT]:
|
|
110
|
+
'The lane state record says the lane is paused: its child is suspended, not working, and nothing moves until someone resumes it.',
|
|
98
111
|
[SETTLED_VERDICT]:
|
|
99
|
-
'The child is closed, parked with `needs-decision`, or marked `already-done`, so there is nothing here to recover.',
|
|
112
|
+
'The child is closed, parked with `needs-decision` or `run:stalled`, or marked `already-done`, so there is nothing here to recover.',
|
|
100
113
|
[STOPPED_VERDICT]:
|
|
101
114
|
'The output has been frozen past the silent window and no process of the child is alive in that checkout.',
|
|
102
115
|
[UNDETERMINED_VERDICT]:
|
|
103
116
|
'A trace could not be read, so this says nothing about the unit. A trace that could not be read answers `undetermined`, never `stopped`.',
|
|
104
117
|
}
|
|
105
118
|
|
|
106
|
-
const ALIVE_ADVICE = 'Keep
|
|
119
|
+
const ALIVE_ADVICE = 'Keep waiting on `pnpm josh lane:await`; do not touch the child.'
|
|
120
|
+
const PAUSED_ADVICE =
|
|
121
|
+
'Do not wait on it and do not recover it: tell the person the lane is paused; `pnpm josh lane:resume <N>` resumes it once they ask.'
|
|
107
122
|
const SETTLED_ADVICE =
|
|
108
123
|
'Read the child with `pnpm josh issue:state <N>` and take the branch its state says.'
|
|
109
124
|
// The unit stopped, but *why* it stopped — abandoned mid-implementation, or dead because it could not
|
|
@@ -112,11 +127,11 @@ const SETTLED_ADVICE =
|
|
|
112
127
|
// routed through `run:merge --output`, the same composite a returned child takes: it reads the exit
|
|
113
128
|
// record without waiting for the unit to return, re-dispatches an outage child (counting the outage,
|
|
114
129
|
// and stopping the run on the environment guard once a run of them trips it), and parks an abandoned
|
|
115
|
-
// child with `
|
|
130
|
+
// child with `run:stalled` against the consecutive-failure guard.
|
|
116
131
|
const STOPPED_CLEAN_ADVICE =
|
|
117
|
-
'The unit ended — classify how before booking it. Run `pnpm josh run:merge <N> --output <path>` (add `--epic <E> --repo <owner/repo> --owner "$PPID"` for a named epic): it reads the child\'s exit record without waiting for the unit to return, re-dispatches a child that could not reach the API (counting the outage; a run of them trips the environment guard and stops the run), and parks an abandoned child with `
|
|
132
|
+
'The unit ended — classify how before booking it. Run `pnpm josh run:merge <N> --output <path>` (add `--epic <E> --repo <owner/repo> --owner "$PPID"` for a named epic): it reads the child\'s exit record without waiting for the unit to return, re-dispatches a child that could not reach the API (counting the outage; a run of them trips the environment guard and stops the run), and parks an abandoned child with `run:stalled` against the consecutive-failure guard. The checkout is clean, so there is nothing to stash.'
|
|
118
133
|
const STOPPED_DIRTY_ADVICE =
|
|
119
|
-
'Stash the half-finished work with `
|
|
134
|
+
'Stash the half-finished work with `pnpm josh stash:push "backlogrun: stopped unit for #<N>"` and record it on the Issue, then classify how the unit ended with `pnpm josh run:merge <N> --output <path>` (add `--epic <E> --repo <owner/repo> --owner "$PPID"` for a named epic): it re-dispatches an API-outage child (counting the outage; a run of them trips the environment guard) and parks an abandoned child with `run:stalled` against the consecutive-failure guard, without waiting for the unit to return.'
|
|
120
135
|
const UNDETERMINED_ADVICE =
|
|
121
136
|
'Read the trace that failed and ask again. Where the process trace was given as `unknown`, leave `--process` out so the command reads it. Two of these in a row is a fault in the check itself rather than a slow unit: stop polling and report it.'
|
|
122
137
|
|
|
@@ -134,8 +149,19 @@ function is_agent_finished(traces: Traces): boolean {
|
|
|
134
149
|
return is_agent_state_finished(traces.agent_state)
|
|
135
150
|
}
|
|
136
151
|
|
|
152
|
+
// What the lane state record answers on its own: a paused lane, or one done with its child.
|
|
153
|
+
function recorded_verdict(state: LaneState | undefined): LivenessVerdict | undefined {
|
|
154
|
+
if (state === 'paused') return PAUSED_VERDICT
|
|
155
|
+
|
|
156
|
+
return state === 'ended' ? SETTLED_VERDICT : undefined
|
|
157
|
+
}
|
|
158
|
+
|
|
137
159
|
function definitive_verdict(traces: Traces): LivenessVerdict | undefined {
|
|
138
160
|
if (traces.is_child_settled === true) return SETTLED_VERDICT
|
|
161
|
+
|
|
162
|
+
const recorded = recorded_verdict(traces.lane_state)
|
|
163
|
+
|
|
164
|
+
if (recorded !== undefined) return recorded
|
|
139
165
|
if (is_agent_finished(traces)) return STOPPED_VERDICT
|
|
140
166
|
if (is_output_moving(traces)) return ALIVE_VERDICT
|
|
141
167
|
|
|
@@ -171,10 +197,16 @@ function to_verdict(traces: Traces): LivenessVerdict {
|
|
|
171
197
|
return is_check_running(traces) ? ALIVE_VERDICT : STOPPED_VERDICT
|
|
172
198
|
}
|
|
173
199
|
|
|
200
|
+
// The advice for every verdict but `stopped`, whose advice turns on the work left to stash.
|
|
201
|
+
const ADVICE: Record<Exclude<LivenessVerdict, typeof STOPPED_VERDICT>, string> = {
|
|
202
|
+
[ALIVE_VERDICT]: ALIVE_ADVICE,
|
|
203
|
+
[PAUSED_VERDICT]: PAUSED_ADVICE,
|
|
204
|
+
[SETTLED_VERDICT]: SETTLED_ADVICE,
|
|
205
|
+
[UNDETERMINED_VERDICT]: UNDETERMINED_ADVICE,
|
|
206
|
+
}
|
|
207
|
+
|
|
174
208
|
function to_advice(verdict: LivenessVerdict, has_work_to_stash: boolean): string {
|
|
175
|
-
if (verdict
|
|
176
|
-
if (verdict === SETTLED_VERDICT) return SETTLED_ADVICE
|
|
177
|
-
if (verdict === UNDETERMINED_VERDICT) return UNDETERMINED_ADVICE
|
|
209
|
+
if (verdict !== STOPPED_VERDICT) return ADVICE[verdict]
|
|
178
210
|
|
|
179
211
|
return has_work_to_stash ? STOPPED_DIRTY_ADVICE : STOPPED_CLEAN_ADVICE
|
|
180
212
|
}
|
|
@@ -307,19 +339,13 @@ async function read_output_frozen(request: FreshnessRequest): Promise<boolean |
|
|
|
307
339
|
return second.mtime_ms === first.mtime_ms && second.size === first.size
|
|
308
340
|
}
|
|
309
341
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
// The labels that say a unit stopped on purpose. `needs-decision` is the park branch; `already-done`
|
|
315
|
-
// is the exit a child takes when it verifies its Issue's work is already merged
|
|
316
|
-
// — it comments the evidence, applies the label and stops with the checkout
|
|
342
|
+
// The park labels (`PARKED_LABELS`) say a unit stopped on purpose. `needs-decision` and `run:stalled`
|
|
343
|
+
// are the park branches; `already-done` is the exit a child takes when it verifies its Issue's work is
|
|
344
|
+
// already merged — it comments the evidence, applies the label and stops with the checkout
|
|
317
345
|
// clean, which is settled by the same reasoning. Left out, this command reports a child that
|
|
318
346
|
// finished correctly as `stopped` and a supervisor restarts the investigation it just completed.
|
|
319
|
-
const SETTLED_LABELS: ReadonlyArray<string> = [NEEDS_DECISION_LABEL, ALREADY_DONE_LABEL]
|
|
320
|
-
|
|
321
347
|
function carries_settled_label(labels: ReadonlyArray<string>): boolean {
|
|
322
|
-
return
|
|
348
|
+
return has_parked_label(labels)
|
|
323
349
|
}
|
|
324
350
|
|
|
325
351
|
// Settled needs positive evidence that the child is done with: it closed, or the unit parked it and
|
|
@@ -340,20 +366,25 @@ async function read_child_settled(issue: string, repo?: string): Promise<boolean
|
|
|
340
366
|
return state.state !== OPEN_STATE || carries_settled_label(state.labels)
|
|
341
367
|
}
|
|
342
368
|
|
|
369
|
+
function freshness_of(request: LivenessRequest): FreshnessRequest {
|
|
370
|
+
return {
|
|
371
|
+
gap_ms: request.gap_ms ?? DEFAULT_GAP_SECONDS * MS_PER_SECOND,
|
|
372
|
+
now_ms: Date.now(),
|
|
373
|
+
output_path: request.output_path,
|
|
374
|
+
silent_window_ms: request.silent_window_ms ?? DEFAULT_SILENT_MINUTES * MS_PER_MINUTE,
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
343
378
|
// The dirty tree is deliberately not one of the traces, so it is the one input that does not answer
|
|
344
379
|
// `undetermined`. `run_hold.is_tree_dirty` reports an unreadable checkout as dirty, which here means
|
|
345
380
|
// the advice offers a stash that may find nothing — the safe direction for the only question this
|
|
346
381
|
// input decides, and one that cannot move the verdict.
|
|
347
382
|
async function read_traces(request: LivenessRequest): Promise<Traces> {
|
|
348
|
-
const [is_initial_child_settled, is_output_frozen, is_tree_dirty] = await Promise.all([
|
|
383
|
+
const [is_initial_child_settled, is_output_frozen, is_tree_dirty, record] = await Promise.all([
|
|
349
384
|
read_child_settled(request.issue, request.repo),
|
|
350
|
-
read_output_frozen(
|
|
351
|
-
gap_ms: request.gap_ms ?? DEFAULT_GAP_SECONDS * MS_PER_SECOND,
|
|
352
|
-
now_ms: Date.now(),
|
|
353
|
-
output_path: request.output_path,
|
|
354
|
-
silent_window_ms: request.silent_window_ms ?? DEFAULT_SILENT_MINUTES * MS_PER_MINUTE,
|
|
355
|
-
}),
|
|
385
|
+
read_output_frozen(freshness_of(request)),
|
|
356
386
|
run_hold.is_tree_dirty(),
|
|
387
|
+
lane_state.read_state(request.issue),
|
|
357
388
|
])
|
|
358
389
|
const agent_state = read_agent_state(request.output_path)
|
|
359
390
|
// A child can close or park its Issue and append its terminal event after the parallel GitHub read
|
|
@@ -370,6 +401,7 @@ async function read_traces(request: LivenessRequest): Promise<Traces> {
|
|
|
370
401
|
is_child_settled,
|
|
371
402
|
is_output_frozen,
|
|
372
403
|
is_tree_dirty,
|
|
404
|
+
lane_state: record?.state,
|
|
373
405
|
process_trace: request.process_trace,
|
|
374
406
|
}
|
|
375
407
|
}
|
|
@@ -400,8 +432,7 @@ export {
|
|
|
400
432
|
ALIVE_VERDICT,
|
|
401
433
|
DEFAULT_GAP_SECONDS,
|
|
402
434
|
DEFAULT_SILENT_MINUTES,
|
|
403
|
-
|
|
404
|
-
MS_PER_SECOND,
|
|
435
|
+
PAUSED_VERDICT,
|
|
405
436
|
PROCESS_ALIVE,
|
|
406
437
|
PROCESS_NONE,
|
|
407
438
|
PROCESS_UNKNOWN,
|
package/scripts/run/run-next.ts
CHANGED
|
@@ -14,7 +14,7 @@ import { run_step, type PreVerdict } from './run-step'
|
|
|
14
14
|
const ALREADY_DONE_STEP =
|
|
15
15
|
'Issue is CLOSED — nothing to run. Verify it against merged code before starting.'
|
|
16
16
|
const KEEP_WORK_STEP =
|
|
17
|
-
'Issue is CLOSED but this lane holds uncommitted work — stash it with `
|
|
17
|
+
'Issue is CLOSED but this lane holds uncommitted work — stash it with `pnpm josh stash:push "<N>: uncommitted work at already-done"` before ending.'
|
|
18
18
|
const LATEST_STEP =
|
|
19
19
|
'Update dependencies first (latest: required), load the dependency-update skill, then implement.'
|
|
20
20
|
const HUMAN_REVIEW_STEP =
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { CONTEXT_CUT_THRESHOLD } from '#scripts/cost-runtime/context-cut-threshold'
|
|
2
2
|
import { cost_cli, type CostVerdict } from '#scripts/cost-runtime/cost-cli'
|
|
3
|
-
import { cost_format } from '#scripts/cost-runtime/cost-format'
|
|
4
3
|
import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
|
|
5
4
|
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
6
5
|
import { error_text } from '#scripts/lib/error-message'
|
|
6
|
+
import { figure_format } from '#scripts/lib/figure-format'
|
|
7
7
|
import { implementation_cut_verdict } from '#scripts/rules/implementation-cut-verdict'
|
|
8
8
|
import type { RunCarry } from '#scripts/run/carry/run-carry'
|
|
9
9
|
import { run_headless } from './run-headless'
|
|
@@ -50,7 +50,7 @@ function current_state(): ParentCutState {
|
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
const THRESHOLD_TEXT = `${
|
|
53
|
+
const THRESHOLD_TEXT = `${figure_format.format_tokens(CONTEXT_CUT_THRESHOLD)}-token`
|
|
54
54
|
|
|
55
55
|
const PARENT_CUT_REASON =
|
|
56
56
|
'⛔ backlogrun parent hand-off: this session drives a `backlogrun` and its recent-context cost ' +
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
2
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
3
|
+
import { time_density_hook } from '#scripts/time-runtime/time-density-hook'
|
|
4
|
+
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
5
|
+
import { time_spans, type Span } from '#scripts/time-runtime/time-spans'
|
|
6
|
+
import { run_headless } from './run-headless'
|
|
7
|
+
import { run_watcher_hook } from './run-watcher-hook'
|
|
8
|
+
|
|
9
|
+
// The `backlogrun` parent's and the wake session's poll, refused at its first repeat.
|
|
10
|
+
//
|
|
11
|
+
// **The parent waits on a blocking command, never on a re-read.** `backlog:drive` and `lane:await` hold
|
|
12
|
+
// the turn until something the model has to read happens; a state read issued again with nothing
|
|
13
|
+
// decided in between is a poll, and each one is a model turn spent on an answer that has not changed.
|
|
14
|
+
//
|
|
15
|
+
// **"Nothing decided in between" is read off the transcript**: the last completed call before this one
|
|
16
|
+
// ran the same state read on the same operands, with no person's prompt after it. A different command, a person's prompt or
|
|
17
|
+
// any other tool call in between breaks the streak, so a progress question answered twice is not one.
|
|
18
|
+
//
|
|
19
|
+
// **The parent test is `run_headless.driving_carry`'s**, the one the parent hand-off guard reads, so a
|
|
20
|
+
// lane child, a person's session and a handed-off record are left alone. A wake session adopts the
|
|
21
|
+
// record, so it reads as the parent here.
|
|
22
|
+
|
|
23
|
+
const SWITCH_ENV_KEY = 'JOSH_POLL_GUARD'
|
|
24
|
+
const BASH_TOOL = 'Bash'
|
|
25
|
+
const STATE_READS: ReadonlySet<string> = new Set([
|
|
26
|
+
'josh lane:list',
|
|
27
|
+
'josh lane:output',
|
|
28
|
+
'josh run:board',
|
|
29
|
+
'josh run:carry',
|
|
30
|
+
'josh run:liveness',
|
|
31
|
+
'josh run:progress',
|
|
32
|
+
'josh run:wake',
|
|
33
|
+
])
|
|
34
|
+
|
|
35
|
+
const POLL_REASON =
|
|
36
|
+
'⛔ poll: this `backlogrun` session repeats a state read with nothing decided in between, on every ' +
|
|
37
|
+
'occurrence. Wait on `pnpm josh backlog:drive`, or `pnpm josh lane:await <N...> --owner "$PPID"` in ' +
|
|
38
|
+
'the background, and end the turn; its exit is the wake.'
|
|
39
|
+
|
|
40
|
+
// The flags that make a state-read command write: `run:carry --filed` twice is two filings, and
|
|
41
|
+
// `run:carry --cut` after `run:carry --json` is the hand-off, so neither is a re-read.
|
|
42
|
+
const WRITING_FLAGS: ReadonlySet<string> = new Set([
|
|
43
|
+
'--begin',
|
|
44
|
+
'--cut',
|
|
45
|
+
'--done',
|
|
46
|
+
'--end',
|
|
47
|
+
'--every',
|
|
48
|
+
'--filed',
|
|
49
|
+
'--loop',
|
|
50
|
+
'--mark',
|
|
51
|
+
'--merged',
|
|
52
|
+
'--resume',
|
|
53
|
+
'--retrospective',
|
|
54
|
+
'--start',
|
|
55
|
+
'--stop',
|
|
56
|
+
'--wait',
|
|
57
|
+
])
|
|
58
|
+
|
|
59
|
+
const FLAG_PREFIX = '-'
|
|
60
|
+
const NAME_WORDS = 2
|
|
61
|
+
const SIGNATURE_SEPARATOR = ' '
|
|
62
|
+
|
|
63
|
+
// A state read keyed by the command and its operands, or `undefined` for a call that is none.
|
|
64
|
+
// **Operands, not flags**: `lane:output 1 <path>` then `lane:output 2 <path>` read two children, while
|
|
65
|
+
// `run:board` and `run:board --chat` print one answer.
|
|
66
|
+
function read_key(signature: string): string | undefined {
|
|
67
|
+
const words = signature.split(SIGNATURE_SEPARATOR)
|
|
68
|
+
const name = words.slice(0, NAME_WORDS).join(SIGNATURE_SEPARATOR)
|
|
69
|
+
|
|
70
|
+
if (!STATE_READS.has(name) || words.some((word) => WRITING_FLAGS.has(word))) return undefined
|
|
71
|
+
|
|
72
|
+
return words.filter((word) => !word.startsWith(FLAG_PREFIX)).join(SIGNATURE_SEPARATOR)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function read_keys(signatures: ReadonlyArray<string>): Array<string> {
|
|
76
|
+
return signatures.map((signature) => read_key(signature)).filter((key) => key !== undefined)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function state_reads_of(command: string): ReadonlyArray<string> {
|
|
80
|
+
return read_keys(time_shell.josh_signatures_of(command))
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function command_of(input: unknown): string {
|
|
84
|
+
if (typeof input !== 'object' || input === null || !('command' in input)) return ''
|
|
85
|
+
|
|
86
|
+
return typeof input.command === 'string' ? input.command : ''
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// The state reads the call runs, or none for a call this guard never judges: not a shell call, or a
|
|
90
|
+
// delegated unit's (it names the parent's transcript, so only `agent_id` tells it apart).
|
|
91
|
+
function candidate_reads(raw_payload: string): ReadonlyArray<string> {
|
|
92
|
+
const payload = hook_decision.parse_hook_payload(raw_payload)
|
|
93
|
+
|
|
94
|
+
if (payload?.tool_name !== BASH_TOOL || (payload.agent_id ?? '') !== '') return []
|
|
95
|
+
|
|
96
|
+
return state_reads_of(command_of(payload.tool_input))
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// The last completed call or person's prompt; a model span is the turn itself, never a decision.
|
|
100
|
+
function last_step(tail: string): Span | undefined {
|
|
101
|
+
return time_spans
|
|
102
|
+
.parse_timeline(tail)
|
|
103
|
+
.spans.findLast((span) => span.category !== time_spans.MODEL_CATEGORY)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function repeats_last_call(tail: string, reads: ReadonlyArray<string>): boolean {
|
|
107
|
+
const last = last_step(tail)
|
|
108
|
+
|
|
109
|
+
if (last?.category !== time_spans.TOOL_CATEGORY) return false
|
|
110
|
+
|
|
111
|
+
const last_reads = read_keys(last.josh_signatures)
|
|
112
|
+
|
|
113
|
+
return reads.some((key) => last_reads.includes(key))
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Every cheap test first: the carry record is read only for a call that already repeats a state read.
|
|
117
|
+
function is_repeat(raw_payload: string): boolean {
|
|
118
|
+
const reads = hook_decision.is_switch_enabled(SWITCH_ENV_KEY) ? candidate_reads(raw_payload) : []
|
|
119
|
+
const transcript = reads.length === 0 ? undefined : run_watcher_hook.transcript_of(raw_payload)
|
|
120
|
+
|
|
121
|
+
if (transcript === undefined) return false
|
|
122
|
+
|
|
123
|
+
return repeats_last_call(time_density_hook.read_tail(transcript), reads)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* The deny reason for a state read the driving `backlogrun` parent (or its wake session) issues again
|
|
128
|
+
* with nothing decided since the last one, or `undefined` when the call proceeds.
|
|
129
|
+
*/
|
|
130
|
+
async function poll_reason(
|
|
131
|
+
raw_payload: string,
|
|
132
|
+
is_parent: () => Promise<boolean> = run_headless.is_backlog_parent,
|
|
133
|
+
): Promise<string | undefined> {
|
|
134
|
+
if (!is_repeat(raw_payload)) return undefined
|
|
135
|
+
|
|
136
|
+
return (await is_parent()) ? POLL_REASON : undefined
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// It fails open: an unreadable transcript or carry record allows the call rather than wedging the run.
|
|
140
|
+
async function safe_poll_reason(raw_payload: string): Promise<string | undefined> {
|
|
141
|
+
try {
|
|
142
|
+
return await poll_reason(raw_payload)
|
|
143
|
+
} catch (error) {
|
|
144
|
+
error_text.trace_swallowed('run_poll_hook.poll_reason', error)
|
|
145
|
+
|
|
146
|
+
return undefined
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const run_poll_hook = {
|
|
151
|
+
POLL_REASON,
|
|
152
|
+
SWITCH_ENV_KEY,
|
|
153
|
+
poll_reason,
|
|
154
|
+
safe_poll_reason,
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export { run_poll_hook }
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { git_gh_pr_read } from '#scripts/gh/git-gh-pr-read'
|
|
2
2
|
import { git_command } from '#scripts/git/git-command'
|
|
3
|
+
import { git_stash } from '#scripts/git/stash/git-stash'
|
|
3
4
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
4
5
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
5
6
|
import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
|
|
7
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
6
8
|
import { json_value } from '#scripts/lib/json-value'
|
|
7
9
|
import { run_hold } from '#scripts/run/hold/run-hold'
|
|
8
10
|
import { z } from 'zod'
|
|
@@ -162,13 +164,13 @@ function to_reason(verdict: PreflightVerdict, tree: TreeState, child: ChildState
|
|
|
162
164
|
// comment is the only thing that can ever bring it back.
|
|
163
165
|
//
|
|
164
166
|
// **The stash lines appear only over a dirty tree.** `reclaim` also answers a clean checkout parked on
|
|
165
|
-
// a feature branch, and printing them there tells the caller to record a stash `
|
|
167
|
+
// a feature branch, and printing them there tells the caller to record a stash `stash:push` never
|
|
166
168
|
// created — an Issue comment naming nothing, under a rule that says the comment is what restores it.
|
|
167
169
|
function reclaim_steps(tree: TreeState, issue: string): Array<string> {
|
|
168
170
|
if (!tree.is_dirty) return []
|
|
169
171
|
|
|
170
172
|
return [
|
|
171
|
-
`
|
|
173
|
+
`pnpm josh stash:push "${STASH_LABEL_PREFIX}${issue}"`,
|
|
172
174
|
`Record the stash on ${session_cite.issue(issue)} — the comment is what gets it popped; nothing pops it for you.`,
|
|
173
175
|
]
|
|
174
176
|
}
|
|
@@ -211,9 +213,22 @@ function to_pr_state(raw: string): PrState {
|
|
|
211
213
|
return (state === undefined ? undefined : GH_PR_STATES.get(state)) ?? NO_PR
|
|
212
214
|
}
|
|
213
215
|
|
|
216
|
+
// Dirty means work `stash:push` would set aside: a tree whose only change is the observation ledger
|
|
217
|
+
// would otherwise be told to stash, get `clean`, and be told to stash again. Unreadable is dirty, as
|
|
218
|
+
// in `run_hold.is_tree_dirty`.
|
|
219
|
+
async function has_stashable_work(): Promise<boolean> {
|
|
220
|
+
try {
|
|
221
|
+
return await git_stash.has_stashable_changes()
|
|
222
|
+
} catch (error) {
|
|
223
|
+
error_text.trace_swallowed('run_preflight.has_stashable_work', error)
|
|
224
|
+
|
|
225
|
+
return true
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
214
229
|
async function read_tree_state(): Promise<TreeState> {
|
|
215
230
|
const [is_dirty, current, default_branch] = await Promise.all([
|
|
216
|
-
|
|
231
|
+
has_stashable_work(),
|
|
217
232
|
git_command.branch(),
|
|
218
233
|
git_command.get_default_branch(),
|
|
219
234
|
])
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { fileURLToPath } from 'node:url'
|
|
3
1
|
import { git_stash } from '#scripts/git/stash/git-stash'
|
|
4
2
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
5
3
|
import { issue_read_cli, type BlockRead } from '#scripts/issue/issue-read-cli'
|
|
@@ -26,7 +24,6 @@ import { run_prep_locate } from './run-prep-locate'
|
|
|
26
24
|
|
|
27
25
|
const SUCCESS_EXIT_CODE = 0
|
|
28
26
|
const FAILURE_EXIT_CODE = 1
|
|
29
|
-
const ARGV_OFFSET = 2
|
|
30
27
|
const USAGE = 'Usage: josh run:prep <issue-number>'
|
|
31
28
|
const LANE_SKIP_SCOPE = 'not asked'
|
|
32
29
|
const LANE_SKIP_REASON =
|
|
@@ -88,7 +85,7 @@ async function lane_has_changes(): Promise<boolean> {
|
|
|
88
85
|
if (!lane_child_marker.is_child_of(process.cwd())) return false
|
|
89
86
|
|
|
90
87
|
try {
|
|
91
|
-
return await git_stash.
|
|
88
|
+
return await git_stash.has_stashable_changes(process.cwd())
|
|
92
89
|
} catch (error) {
|
|
93
90
|
error_text.trace_swallowed('run_prep_cli.lane_has_changes', error)
|
|
94
91
|
|
|
@@ -155,14 +152,8 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
155
152
|
return exit_code(reads)
|
|
156
153
|
}
|
|
157
154
|
|
|
158
|
-
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
159
|
-
process.exitCode = await run(argv)
|
|
160
|
-
}
|
|
161
|
-
|
|
162
155
|
// `gather` and `to_parts` are exported so `run:next` reads the same state from the same three reads
|
|
163
156
|
// rather than growing a second copy of the gather.
|
|
164
157
|
const run_prep_cli = { gather, parse_number, run, to_parts }
|
|
165
158
|
|
|
166
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
167
|
-
|
|
168
159
|
export { run_prep_cli }
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { git_grep_hits, type Hit } from '#scripts/git/git-grep-hits'
|
|
2
2
|
import { git_spawn } from '#scripts/git/git-spawn'
|
|
3
3
|
|
|
4
4
|
// The code locations an issue names, bundled into `run:prep`. Investigation is most of a run's
|
|
@@ -17,18 +17,13 @@ const LINE_SUFFIX = /(?::\d+)+$/u
|
|
|
17
17
|
// A name carries a separator a prose word does not — `run:prep`, `run_prep`, `run-prep.ts`, `a/b`.
|
|
18
18
|
const NAME_CHARACTERS = /^[\w@./:-]+$/u
|
|
19
19
|
const NAME_SEPARATOR = /[./:_-]/u
|
|
20
|
-
const GREP_LINE = /^(?<path>[^:]+):(?<line>\d+):(?<text>.*)$/u
|
|
21
20
|
const MIN_TARGET_LENGTH = 3
|
|
22
21
|
const MAX_TARGETS = 10
|
|
23
22
|
const MAX_FILES_PER_TARGET = 3
|
|
24
|
-
const MAX_EXCERPT_LENGTH = 80
|
|
25
|
-
const ELLIPSIS = '…'
|
|
26
23
|
const INDENT = ' '
|
|
27
24
|
const HIT_SEPARATOR = ' '
|
|
28
25
|
const NO_MATCH = ' — no match in code'
|
|
29
26
|
const SEARCH_FAILED = ' — git grep failed; not searched'
|
|
30
|
-
// `git grep` exits 1 for no match; any other exit is a search that never ran.
|
|
31
|
-
const GREP_NO_MATCH_EXIT = 1
|
|
32
27
|
const FILE_PATHSPEC = ':(glob)**/'
|
|
33
28
|
const FILE_HIT = { line: '1', excerpt: '(file named in the issue)' }
|
|
34
29
|
const NO_TARGETS = '(no backticked path or identifier in the issue)'
|
|
@@ -43,12 +38,6 @@ const CODE_PATHS = [
|
|
|
43
38
|
':(exclude)*.snap',
|
|
44
39
|
]
|
|
45
40
|
|
|
46
|
-
interface Hit {
|
|
47
|
-
path: string
|
|
48
|
-
line: string
|
|
49
|
-
excerpt: string
|
|
50
|
-
}
|
|
51
|
-
|
|
52
41
|
interface Located {
|
|
53
42
|
target: string
|
|
54
43
|
hits: ReadonlyArray<Hit>
|
|
@@ -73,32 +62,6 @@ function extract_targets(text: string): Array<string> {
|
|
|
73
62
|
return [...new Set(targets.filter((target) => is_name(target)))].slice(0, MAX_TARGETS)
|
|
74
63
|
}
|
|
75
64
|
|
|
76
|
-
function shorten(text: string): string {
|
|
77
|
-
const trimmed = text.trim()
|
|
78
|
-
|
|
79
|
-
if (trimmed.length <= MAX_EXCERPT_LENGTH) return trimmed
|
|
80
|
-
|
|
81
|
-
return `${trimmed.slice(0, MAX_EXCERPT_LENGTH)}${ELLIPSIS}`
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// `git grep -n` prints `path:line:text`; the text may itself hold colons, so only the first two split.
|
|
85
|
-
function to_hit(output_line: string): Hit | undefined {
|
|
86
|
-
const groups = GREP_LINE.exec(output_line)?.groups
|
|
87
|
-
|
|
88
|
-
if (groups === undefined) return undefined
|
|
89
|
-
|
|
90
|
-
// All three groups are non-optional in `GREP_LINE`, so a match always carries each of them.
|
|
91
|
-
const { path, line, text } = groups as Record<'line' | 'path' | 'text', string>
|
|
92
|
-
|
|
93
|
-
return { path, line, excerpt: shorten(text) }
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function parse_hits(stdout: string): Array<Hit> {
|
|
97
|
-
const hits = stdout.split('\n').map((line) => to_hit(line))
|
|
98
|
-
|
|
99
|
-
return hits.filter((hit): hit is Hit => hit !== undefined).slice(0, MAX_FILES_PER_TARGET)
|
|
100
|
-
}
|
|
101
|
-
|
|
102
65
|
function format_target(located: Located): string {
|
|
103
66
|
if (located.has_failed) return `${located.target}${SEARCH_FAILED}`
|
|
104
67
|
if (located.hits.length === 0) return `${located.target}${NO_MATCH}`
|
|
@@ -116,18 +79,12 @@ function format_locations(located: ReadonlyArray<Located>): string {
|
|
|
116
79
|
return located.map((entry) => format_target(entry)).join('\n')
|
|
117
80
|
}
|
|
118
81
|
|
|
119
|
-
//
|
|
120
|
-
//
|
|
121
|
-
// the first is reported as "no match": a git without `grep -m` (older than 2.38) exits 129, and naming
|
|
122
|
-
// every target absent then would send the reader away from code that is there.
|
|
82
|
+
// Neither a no-match nor a search that could not run fails the bundle — the issue body is still worth
|
|
83
|
+
// printing without it — but only the first is reported as "no match" (`git-grep-hits.ts`).
|
|
123
84
|
async function grep(target: string): Promise<Located> {
|
|
124
|
-
const
|
|
85
|
+
const { hits, has_failed } = await git_grep_hits.search(target, ['-m', '1'], CODE_PATHS)
|
|
125
86
|
|
|
126
|
-
|
|
127
|
-
return { target, hits: parse_hits(await git_spawn.read(grep_arguments)), has_failed: false }
|
|
128
|
-
} catch (error) {
|
|
129
|
-
return { target, hits: [], has_failed: get_exit_code(error) !== GREP_NO_MATCH_EXIT }
|
|
130
|
-
}
|
|
87
|
+
return { target, hits: hits.slice(0, MAX_FILES_PER_TARGET), has_failed }
|
|
131
88
|
}
|
|
132
89
|
|
|
133
90
|
// A path is rarely spelled out inside code — imports drop the extension and resolve relatively — so
|
|
@@ -158,7 +115,7 @@ async function locate(text: string): Promise<string> {
|
|
|
158
115
|
return format_locations(located)
|
|
159
116
|
}
|
|
160
117
|
|
|
161
|
-
const run_prep_locate = { extract_targets, locate
|
|
118
|
+
const run_prep_locate = { extract_targets, locate }
|
|
162
119
|
|
|
163
|
-
export type {
|
|
120
|
+
export type { Located }
|
|
164
121
|
export { run_prep_locate }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { run_prep_cli } from './run-prep-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh run:prep` entry, kept apart from `run-prep-cli.ts` because other modules import that
|
|
6
|
+
// one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = await run_prep_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|
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,
|