@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
|
@@ -44,6 +44,9 @@ interface ShipState {
|
|
|
44
44
|
is_committed: boolean
|
|
45
45
|
is_pushed: boolean
|
|
46
46
|
is_merged: boolean
|
|
47
|
+
// The issue changed after the recorded review's brief (`issue-watch-gate.ts`), so the review re-runs
|
|
48
|
+
// even on a committed tree (joshuafolkken/kit#4221).
|
|
49
|
+
is_review_stale?: boolean
|
|
47
50
|
}
|
|
48
51
|
|
|
49
52
|
const RECORD_PREFIX = 'josh-ship-stages-'
|
|
@@ -56,15 +59,24 @@ const STARTED_INDEX = 3
|
|
|
56
59
|
const WORD_COUNT = STARTED_INDEX + 1
|
|
57
60
|
|
|
58
61
|
// `started` lists the stages the current attempt started, kept across a supervisor that ended without a
|
|
59
|
-
// stop so its successor's lines still carry them.
|
|
62
|
+
// stop so its successor's lines still carry them. `is_merge_waiting` is set only while `josh followup`
|
|
63
|
+
// itself runs, `is_place_waiting` only while a followup stop waits for a lane place
|
|
64
|
+
// (`run-ship-place.ts`) (joshuafolkken/kit#4466).
|
|
60
65
|
const record_schema = z.object({
|
|
61
66
|
done: z.array(z.string()),
|
|
62
67
|
started: z.array(z.string()).default([]),
|
|
68
|
+
is_merge_waiting: z.boolean().default(false),
|
|
69
|
+
is_place_waiting: z.boolean().default(false),
|
|
63
70
|
})
|
|
64
71
|
|
|
65
72
|
type ShipRecord = z.infer<typeof record_schema>
|
|
66
73
|
|
|
67
|
-
const EMPTY_RECORD: ShipRecord = {
|
|
74
|
+
const EMPTY_RECORD: ShipRecord = {
|
|
75
|
+
done: [],
|
|
76
|
+
started: [],
|
|
77
|
+
is_merge_waiting: false,
|
|
78
|
+
is_place_waiting: false,
|
|
79
|
+
}
|
|
68
80
|
|
|
69
81
|
// Keyed on the repository and the issue: every lane of one repository shares the common git directory,
|
|
70
82
|
// and two issues shipping from two lanes keep two records.
|
|
@@ -109,7 +121,36 @@ function mark_started(target: string, stage: Stage): void {
|
|
|
109
121
|
// A `ship-stop` ends the attempt on the board (`run-board-phase.ts`), so the next attempt lists afresh
|
|
110
122
|
// while the completed stages stay recorded.
|
|
111
123
|
function end_attempt(target: string): void {
|
|
112
|
-
stamp_file.replace_stamp(target, { ...read_record(target), started: [] })
|
|
124
|
+
stamp_file.replace_stamp(target, { ...read_record(target), started: [], is_merge_waiting: false })
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Whether the ship waits on CI, CodeRabbit and the merge alone: its lane then holds no place under the
|
|
128
|
+
// lane limit (`backlog-occupied.ts`). Cleared before any gate the followup stage runs, at a stop, and
|
|
129
|
+
// when a successor supervisor opens the record, so a dead supervisor's flag frees nothing.
|
|
130
|
+
function read_merge_waiting(target: string): boolean {
|
|
131
|
+
return read_record(target).is_merge_waiting
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function mark_merge_waiting(target: string, is_merge_waiting: boolean): void {
|
|
135
|
+
stamp_file.replace_stamp(target, { ...read_record(target), is_merge_waiting })
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Whether a followup stop waits for a place before it relaunches its child (`run-ship-place.ts`).
|
|
139
|
+
function read_place_waiting(target: string): boolean {
|
|
140
|
+
return read_record(target).is_place_waiting
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function mark_place_waiting(target: string, is_place_waiting: boolean): void {
|
|
144
|
+
stamp_file.replace_stamp(target, { ...read_record(target), is_place_waiting })
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// A supervisor that died mid-wait left its wait marked; its successor waits on nothing yet.
|
|
148
|
+
function clear_waits(target: string): void {
|
|
149
|
+
stamp_file.replace_stamp(target, {
|
|
150
|
+
...read_record(target),
|
|
151
|
+
is_merge_waiting: false,
|
|
152
|
+
is_place_waiting: false,
|
|
153
|
+
})
|
|
113
154
|
}
|
|
114
155
|
|
|
115
156
|
// Removed once the report stage completes, so a later ship of the same issue starts from the preflight.
|
|
@@ -129,8 +170,9 @@ const DONE_BY: Record<Stage, (done: ReadonlySet<string>, state: ShipState) => bo
|
|
|
129
170
|
[STAGE.PREFLIGHT]: (_done, state) => state.is_merged || state.is_committed,
|
|
130
171
|
// The `--review` round precedes the commit, so a commit is its output as it
|
|
131
172
|
// is the gate's. A record alone is not honored: before a commit the tree may have been edited since
|
|
132
|
-
// the recorded round, and only a commit pins the tree that round read.
|
|
133
|
-
[STAGE.REVIEW]: (_done, state) =>
|
|
173
|
+
// the recorded round, and only a commit pins the tree that round read — unless the issue changed since.
|
|
174
|
+
[STAGE.REVIEW]: (_done, state) =>
|
|
175
|
+
state.is_merged || (state.is_committed && state.is_review_stale !== true),
|
|
134
176
|
[STAGE.GATE]: (_done, state) => state.is_merged || state.is_committed,
|
|
135
177
|
// The merge of the default branch before the commit: once committed, a
|
|
136
178
|
// conflicting pull request is the followup's to merge again.
|
|
@@ -173,9 +215,11 @@ function commit_flags(state: ShipState): ReadonlyArray<string> {
|
|
|
173
215
|
// **The newest line carries the attempt's history**: a fourth word lists every
|
|
174
216
|
// stage the attempt has started, so the one line per issue a stream full of positions keeps still
|
|
175
217
|
// draws the whole track. A line with no started stage keeps the three-word form.
|
|
218
|
+
// The stage is a word rather than a `Stage`: the pre-detach checks, which are not one, are written in
|
|
219
|
+
// the same form (`run-ship-pre-detach-timed.ts`).
|
|
176
220
|
function event_text(
|
|
177
221
|
issue: string,
|
|
178
|
-
stage:
|
|
222
|
+
stage: string,
|
|
179
223
|
phase: Phase,
|
|
180
224
|
started: ReadonlyArray<string> = [],
|
|
181
225
|
): string {
|
|
@@ -205,13 +249,18 @@ const run_ship_stage = {
|
|
|
205
249
|
PHASE,
|
|
206
250
|
STAGE,
|
|
207
251
|
clear,
|
|
252
|
+
clear_waits,
|
|
208
253
|
commit_flags,
|
|
209
254
|
end_attempt,
|
|
210
255
|
event_text,
|
|
211
256
|
is_done,
|
|
212
257
|
mark_done,
|
|
258
|
+
mark_merge_waiting,
|
|
259
|
+
mark_place_waiting,
|
|
213
260
|
mark_started,
|
|
214
261
|
read_done,
|
|
262
|
+
read_merge_waiting,
|
|
263
|
+
read_place_waiting,
|
|
215
264
|
read_started,
|
|
216
265
|
record_path,
|
|
217
266
|
started_of,
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
2
2
|
import { run_ship } from './run-ship'
|
|
3
|
+
import { run_ship_body_draft } from './run-ship-body-draft'
|
|
3
4
|
import { run_ship_preflight } from './run-ship-preflight'
|
|
5
|
+
import { run_ship_probe } from './run-ship-probe'
|
|
4
6
|
import { run_ship_review_steps } from './run-ship-review-steps'
|
|
5
7
|
import { run_ship_scoped } from './run-ship-scoped'
|
|
6
8
|
import { run_ship_stage, type ShipState, type Stage } from './run-ship-stage'
|
|
7
|
-
import { run_ship_sync, type StepResult } from './run-ship-sync'
|
|
9
|
+
import { run_ship_sync, type StepResult, type WaitMark } from './run-ship-sync'
|
|
8
10
|
|
|
9
11
|
// The stages `josh ship` runs, in the order a change ships, kept apart from the chaining
|
|
10
12
|
// CLI so the order is read in one place.
|
|
11
13
|
|
|
12
14
|
const should_forward_stderr = true
|
|
15
|
+
const SUCCESS_EXIT_CODE = 0
|
|
13
16
|
|
|
14
17
|
interface ShipArguments {
|
|
15
18
|
title: string
|
|
@@ -54,19 +57,22 @@ async function gate_stage(): Promise<StepResult> {
|
|
|
54
57
|
return { ...result, is_skipped }
|
|
55
58
|
}
|
|
56
59
|
|
|
60
|
+
// The default branch is merged before the gate, so the pull request opens on a branch that is current;
|
|
61
|
+
// a clean merge goes on without waking anyone. A merge after the gate would move the merge base the
|
|
62
|
+
// gate's record pins, so the pre-push hook could not reuse that record. **With `--review` it runs before
|
|
63
|
+
// round 1 too**: the gate round 1 launches then reads the base the commit carries, so a clean round
|
|
64
|
+
// leaves the gate stage a reuse rather than a whole second gate over a moved base (joshuafolkken/kit#4442).
|
|
65
|
+
const SYNC_STEP: Step = {
|
|
66
|
+
stage: STAGE.SYNC,
|
|
67
|
+
header: run_ship.SYNC_HEADER,
|
|
68
|
+
run: async (args) => await run_ship_sync.sync_stage(args.number),
|
|
69
|
+
}
|
|
70
|
+
|
|
57
71
|
// The gate before the commit, the commit/push/PR before the merge. The gate meets the scoped pair
|
|
58
72
|
// first: a round-1 reviewer may have edited the tree since the preflight, and `josh gate` refuses a tree
|
|
59
73
|
// with no green record. The commit step carries the `--skip-*` flags a resumed ship needs, so an
|
|
60
74
|
// existing commit or push is never made twice.
|
|
61
75
|
const COMMIT_STEPS: ReadonlyArray<Step> = [
|
|
62
|
-
// The default branch is merged again before the commit, so the pull request opens on a branch that
|
|
63
|
-
// is current; a clean merge goes on without waking anyone. It runs before the gate: a merge after it
|
|
64
|
-
// would move the merge base the gate's record pins, so the pre-push hook could not reuse that record.
|
|
65
|
-
{
|
|
66
|
-
stage: STAGE.SYNC,
|
|
67
|
-
header: run_ship.SYNC_HEADER,
|
|
68
|
-
run: async () => await run_ship_sync.sync_stage(),
|
|
69
|
-
},
|
|
70
76
|
{
|
|
71
77
|
stage: STAGE.GATE,
|
|
72
78
|
header: run_ship.GATE_HEADER,
|
|
@@ -80,12 +86,36 @@ const COMMIT_STEPS: ReadonlyArray<Step> = [
|
|
|
80
86
|
},
|
|
81
87
|
]
|
|
82
88
|
|
|
89
|
+
// The followup's merge wait on the stage record, written best-effort as the stages are
|
|
90
|
+
// (`run-ship-cli.ts`): a lost mark only keeps the lane counted (joshuafolkken/kit#4466).
|
|
91
|
+
function wait_mark(target: string | undefined): WaitMark {
|
|
92
|
+
return function mark(is_merge_waiting: boolean): void {
|
|
93
|
+
if (target === undefined) return
|
|
94
|
+
|
|
95
|
+
try {
|
|
96
|
+
run_ship_stage.mark_merge_waiting(target, is_merge_waiting)
|
|
97
|
+
} catch {
|
|
98
|
+
// Best-effort: an unmarked wait holds the lane's place, the safe direction.
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// The merge, then the ship body draft goes with it (`run-ship-body-draft.ts`).
|
|
104
|
+
async function followup_stage(args: ShipArguments): Promise<StepResult> {
|
|
105
|
+
const mark = wait_mark(await run_ship_probe.record_target(args.number))
|
|
106
|
+
const result = await run_ship_sync.followup_stage(args.title, args.notify, mark)
|
|
107
|
+
|
|
108
|
+
if (result.code === SUCCESS_EXIT_CODE) await run_ship_body_draft.remove(args.number)
|
|
109
|
+
|
|
110
|
+
return result
|
|
111
|
+
}
|
|
112
|
+
|
|
83
113
|
// The merge before the report bookkeeping.
|
|
84
114
|
const MERGE_STEPS: ReadonlyArray<Step> = [
|
|
85
115
|
{
|
|
86
116
|
stage: STAGE.FOLLOWUP,
|
|
87
117
|
header: run_ship.FOLLOWUP_HEADER,
|
|
88
|
-
run: async (args) => await
|
|
118
|
+
run: async (args) => await followup_stage(args),
|
|
89
119
|
},
|
|
90
120
|
{
|
|
91
121
|
stage: STAGE.REPORT,
|
|
@@ -95,14 +125,15 @@ const MERGE_STEPS: ReadonlyArray<Step> = [
|
|
|
95
125
|
]
|
|
96
126
|
|
|
97
127
|
// `--review` puts the supervised round-1 review in front of the gate: it launches the gate itself, so
|
|
98
|
-
// the gate stage that follows reuses that tree's green record unless the
|
|
99
|
-
//
|
|
128
|
+
// the gate stage that follows reuses that tree's green record unless the round changed the tree. It
|
|
129
|
+
// also puts the round-2 pass between the commit
|
|
100
130
|
// and the followup, so the PR opens between the rounds and round 2 runs beside CI — a no-op when
|
|
101
131
|
// round 1 left no fix delta.
|
|
102
132
|
const REVIEW_STEP: Step = {
|
|
103
133
|
stage: STAGE.REVIEW,
|
|
104
134
|
header: run_ship.REVIEW_HEADER,
|
|
105
|
-
run: async (args) =>
|
|
135
|
+
run: async (args, state) =>
|
|
136
|
+
await run_ship_review_steps.review_stage(args.number, state.is_review_stale === true),
|
|
106
137
|
}
|
|
107
138
|
const ROUND_TWO_STEP: Step = {
|
|
108
139
|
stage: STAGE.ROUND_TWO,
|
|
@@ -111,9 +142,9 @@ const ROUND_TWO_STEP: Step = {
|
|
|
111
142
|
}
|
|
112
143
|
|
|
113
144
|
function steps(args: ShipArguments): ReadonlyArray<Step> {
|
|
114
|
-
if (!args.is_review) return [PREFLIGHT_STEP, ...COMMIT_STEPS, ...MERGE_STEPS]
|
|
145
|
+
if (!args.is_review) return [PREFLIGHT_STEP, SYNC_STEP, ...COMMIT_STEPS, ...MERGE_STEPS]
|
|
115
146
|
|
|
116
|
-
return [PREFLIGHT_STEP, REVIEW_STEP, ...COMMIT_STEPS, ROUND_TWO_STEP, ...MERGE_STEPS]
|
|
147
|
+
return [PREFLIGHT_STEP, SYNC_STEP, REVIEW_STEP, ...COMMIT_STEPS, ROUND_TWO_STEP, ...MERGE_STEPS]
|
|
117
148
|
}
|
|
118
149
|
|
|
119
150
|
const run_ship_steps = { PREFLIGHT_STEP, steps }
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { api_auth } from '#scripts/agent/api-auth'
|
|
2
|
+
import { NO_CHECKS_MESSAGE } from '#scripts/gh/git-pr-checks-watch'
|
|
3
|
+
import type { StopRecord } from '#scripts/lane/lane-ledger'
|
|
4
|
+
import { run_ship_review, type StopFinding } from './run-ship-review'
|
|
5
|
+
import { run_ship_stage, type Stage } from './run-ship-stage'
|
|
6
|
+
|
|
7
|
+
// Why a `josh ship` stage stopped, beside the stage it stopped at: a review that found something, a
|
|
8
|
+
// merge git could not finish, a check that went red, or the infrastructure — a rate limit, a check list
|
|
9
|
+
// GitHub did not return, a network blip — that a re-run clears (joshuafolkken/kit#3998).
|
|
10
|
+
//
|
|
11
|
+
// **Only a stage whose output is the tooling's own is read for infrastructure**: a gate's or a review's
|
|
12
|
+
// output carries test titles and findings, which may name a rate limit without being one, and their
|
|
13
|
+
// stops are the quality gate's own verdict — never retried, never relabelled.
|
|
14
|
+
//
|
|
15
|
+
// **A review round names its own cause**: the step of the round that stopped tags its result — a red
|
|
16
|
+
// join or scoped pair `check`, a reviewer that did not finish `infra`, a refused attestation `attest` —
|
|
17
|
+
// so only a stop on a recorded finding counts as one (joshuafolkken/kit#4431). An untagged review stop
|
|
18
|
+
// stays a finding.
|
|
19
|
+
|
|
20
|
+
const CAUSE = {
|
|
21
|
+
FINDING: 'finding',
|
|
22
|
+
INFRA: 'infra',
|
|
23
|
+
CONFLICT: 'conflict',
|
|
24
|
+
CHECK: 'check',
|
|
25
|
+
AUTH: 'auth',
|
|
26
|
+
ATTEST: 'attest',
|
|
27
|
+
} as const
|
|
28
|
+
|
|
29
|
+
type Cause = (typeof CAUSE)[keyof typeof CAUSE]
|
|
30
|
+
|
|
31
|
+
const { STAGE } = run_ship_stage
|
|
32
|
+
const REVIEW_STAGES: ReadonlySet<Stage> = new Set([STAGE.REVIEW, STAGE.ROUND_TWO])
|
|
33
|
+
const INFRA_STAGES: ReadonlySet<Stage> = new Set([
|
|
34
|
+
STAGE.SYNC,
|
|
35
|
+
STAGE.COMMIT,
|
|
36
|
+
STAGE.FOLLOWUP,
|
|
37
|
+
STAGE.REPORT,
|
|
38
|
+
])
|
|
39
|
+
const INFRA_PATTERNS: ReadonlyArray<RegExp> = [
|
|
40
|
+
/rate limit/iu,
|
|
41
|
+
new RegExp(NO_CHECKS_MESSAGE, 'u'),
|
|
42
|
+
/\b(?:ECONNRESET|ECONNREFUSED|ETIMEDOUT|EAI_AGAIN|ENOTFOUND)\b/u,
|
|
43
|
+
/socket hang up/iu,
|
|
44
|
+
/could not resolve host/iu,
|
|
45
|
+
/\bHTTP 50[234]\b/u,
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
function is_infra(output: string): boolean {
|
|
49
|
+
return INFRA_PATTERNS.some((pattern) => pattern.test(output))
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// A reviewer that could not authenticate is no finding: the review steps put `AUTH_FAILURE_NOTE` at the
|
|
53
|
+
// head of a stop line (`isolated reviewer failed: <note>` or `<note>`), and only there is it read — a
|
|
54
|
+
// finding that quotes the note mid-line stays a finding (joshuafolkken/kit#4216).
|
|
55
|
+
const AUTH_LINE = new RegExp(
|
|
56
|
+
`^(?:isolated reviewer failed: (?:the broker answered a failure: )?)?${api_auth.AUTH_FAILURE_NOTE}`,
|
|
57
|
+
'mu',
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
function is_review(stage: Stage): boolean {
|
|
61
|
+
return REVIEW_STAGES.has(stage)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function review_cause(output: string, tagged: Cause = CAUSE.FINDING): Cause {
|
|
65
|
+
return AUTH_LINE.test(output) ? CAUSE.AUTH : tagged
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// What a stopped stage handed back: its output, the paths a stopped merge left unmerged, the kinds
|
|
69
|
+
// of the preconditions a stopped preflight found unmet, and the cause a review round tagged its stop with.
|
|
70
|
+
interface StoppedOutput {
|
|
71
|
+
body: string
|
|
72
|
+
// The standard output alone, read for the infrastructure in place of the body when present.
|
|
73
|
+
out?: string
|
|
74
|
+
conflicts?: ReadonlyArray<string>
|
|
75
|
+
preconditions?: ReadonlyArray<string>
|
|
76
|
+
cause?: Cause
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const NO_OUTPUT: StoppedOutput = { body: '' }
|
|
80
|
+
|
|
81
|
+
// A failed stage's body also carries its stderr, where a poll warns of a transient rate limit it then
|
|
82
|
+
// recovered from — so the infrastructure is read on the standard output alone wherever the stage kept it.
|
|
83
|
+
function infra_text({ body, out = body }: StoppedOutput): string {
|
|
84
|
+
return out
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function cause_of(stage: Stage, failed: StoppedOutput): Cause {
|
|
88
|
+
const { body, conflicts, cause } = failed
|
|
89
|
+
const reason = run_ship_stage.stop_reason(stage, conflicts)
|
|
90
|
+
|
|
91
|
+
if (reason === run_ship_stage.CONFLICT) return CAUSE.CONFLICT
|
|
92
|
+
if (is_review(stage)) return review_cause(body, cause)
|
|
93
|
+
|
|
94
|
+
return INFRA_STAGES.has(stage) && is_infra(infra_text(failed)) ? CAUSE.INFRA : CAUSE.CHECK
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Whether a finding decided the stop — false on any other stop, and on a review stop no finding decided
|
|
98
|
+
// (a red gate at the join, a reviewer that never answered).
|
|
99
|
+
function is_finding_stop(stage: Stage, cause: Cause): boolean {
|
|
100
|
+
return is_review(stage) && cause === CAUSE.FINDING
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// The kind of every blocking finding a review stop's output lists.
|
|
104
|
+
function findings_of(stage: Stage, cause: Cause, body: string): ReadonlyArray<string> {
|
|
105
|
+
return is_finding_stop(stage, cause) ? run_ship_review.blocking_kinds(body) : []
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Each finding that decided a review stop, whole, for the durable stop log (joshuafolkken/kit#4519).
|
|
109
|
+
function details_of(stage: Stage, failed: StoppedOutput = NO_OUTPUT): ReadonlyArray<StopFinding> {
|
|
110
|
+
if (!is_finding_stop(stage, cause_of(stage, failed))) return []
|
|
111
|
+
|
|
112
|
+
return run_ship_review.blocking_details(failed.body)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// The lane ledger's record of one stop — the stage, its cause and, for a preflight, which
|
|
116
|
+
// preconditions were unmet, so `lane:stats` counts the one worth meeting before a ship
|
|
117
|
+
// (joshuafolkken/kit#4166); for a review, which kinds of finding stopped it (joshuafolkken/kit#4426).
|
|
118
|
+
function record_of(issue: number, stage: Stage, failed: StoppedOutput = NO_OUTPUT): StopRecord {
|
|
119
|
+
const { body, conflicts, preconditions } = failed
|
|
120
|
+
const cause = cause_of(stage, failed)
|
|
121
|
+
const findings = findings_of(stage, cause, body)
|
|
122
|
+
|
|
123
|
+
return {
|
|
124
|
+
issue,
|
|
125
|
+
reason: run_ship_stage.stop_reason(stage, conflicts),
|
|
126
|
+
cause,
|
|
127
|
+
...(preconditions !== undefined && { preconditions: [...preconditions] }),
|
|
128
|
+
...(findings.length > 0 && { findings: [...findings] }),
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const run_ship_stop_cause = { CAUSE, cause_of, details_of, is_review, record_of }
|
|
133
|
+
|
|
134
|
+
export type { Cause }
|
|
135
|
+
export { run_ship_stop_cause }
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { stripVTControlCharacters } from 'node:util'
|
|
2
|
+
import { agent_role_profile } from '#scripts/agent/agent-role-profile'
|
|
3
|
+
import { changed_paths } from '#scripts/git/changed-paths'
|
|
4
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
5
|
+
import { z } from 'zod'
|
|
6
|
+
import { run_ship_next } from './run-ship-next'
|
|
7
|
+
import { run_ship_probe } from './run-ship-probe'
|
|
8
|
+
|
|
9
|
+
// What a relaunched lane child needs in front of it to fix a stopped ship: the tail of the failed
|
|
10
|
+
// stage's output — a red check, or the High/Medium findings a review stage reports — and the branch's
|
|
11
|
+
// changed files. Without them the resumed session opened `josh ship --log` and `git diff` itself before
|
|
12
|
+
// doing anything (joshuafolkken/kit#3923).
|
|
13
|
+
//
|
|
14
|
+
// **Both are bounded**, so a long gate log never becomes the whole prompt. The tail is kept because a
|
|
15
|
+
// check reports its verdict last; the lines left out go to a file whose path and line range the prompt
|
|
16
|
+
// names, so nothing is lost and the session reads only the range it needs.
|
|
17
|
+
|
|
18
|
+
const EXCERPT_LINE_LIMIT = 40
|
|
19
|
+
const EXCERPT_LINE_WIDTH = 240
|
|
20
|
+
const CHANGED_PATH_LIMIT = 30
|
|
21
|
+
const OUTPUT_PREFIX = 'josh-ship-stop-'
|
|
22
|
+
const OUTPUT_SUFFIX = '.log'
|
|
23
|
+
const KEY_SEPARATOR = '-'
|
|
24
|
+
const LINE_BREAK = '\n'
|
|
25
|
+
const CARRIAGE_RETURN = '\r'
|
|
26
|
+
|
|
27
|
+
const omitted_schema = z
|
|
28
|
+
.object({ path: z.string().optional(), last_line: z.number().int() })
|
|
29
|
+
.strict()
|
|
30
|
+
const stop_context_schema = z
|
|
31
|
+
.object({
|
|
32
|
+
excerpt: z.array(z.string()).readonly(),
|
|
33
|
+
omitted: omitted_schema.optional(),
|
|
34
|
+
changed: z.array(z.string()).readonly().optional(),
|
|
35
|
+
more_changed: z.number().int(),
|
|
36
|
+
})
|
|
37
|
+
.strict()
|
|
38
|
+
|
|
39
|
+
type StopContext = z.infer<typeof stop_context_schema>
|
|
40
|
+
type Omitted = z.infer<typeof omitted_schema>
|
|
41
|
+
|
|
42
|
+
// A spinner redraws its line with a carriage return, so only the frame after the last one is what the
|
|
43
|
+
// terminal showed; a CRLF line ends in one and keeps its whole text.
|
|
44
|
+
function shown_frame(line: string): string {
|
|
45
|
+
return line.trimEnd().split(CARRIAGE_RETURN).at(-1) ?? ''
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function output_lines(output: string): Array<string> {
|
|
49
|
+
return stripVTControlCharacters(output)
|
|
50
|
+
.trimEnd()
|
|
51
|
+
.split(LINE_BREAK)
|
|
52
|
+
.map((line) => agent_role_profile.printable(shown_frame(line)))
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// The full output is kept beside the ship log, keyed the same way, so the prompt's line range points at
|
|
56
|
+
// text that reads exactly as the excerpt was cut from.
|
|
57
|
+
async function keep_full_output(issue: string, output: string): Promise<string | undefined> {
|
|
58
|
+
const repository = await run_ship_probe.repository_directory()
|
|
59
|
+
|
|
60
|
+
if (repository === undefined) return undefined
|
|
61
|
+
|
|
62
|
+
const target = stamp_file.stamp_path(
|
|
63
|
+
`${OUTPUT_PREFIX}${issue}${KEY_SEPARATOR}`,
|
|
64
|
+
repository,
|
|
65
|
+
OUTPUT_SUFFIX,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
return stamp_file.replace_text_stamp(target, output)
|
|
70
|
+
} catch {
|
|
71
|
+
return undefined
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// A full output that could not be kept still reports the cut, with no path: the prompt then points at
|
|
76
|
+
// the stopped report, which holds the same lines.
|
|
77
|
+
async function omitted_range(issue: string, lines: ReadonlyArray<string>): Promise<Omitted> {
|
|
78
|
+
const path = await keep_full_output(issue, lines.join(LINE_BREAK))
|
|
79
|
+
const last_line = lines.length - EXCERPT_LINE_LIMIT
|
|
80
|
+
|
|
81
|
+
return path === undefined ? { last_line } : { path, last_line }
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// A line is cut to a width, so one minified or wrapped line cannot spend the prompt's whole budget.
|
|
85
|
+
function clipped(lines: ReadonlyArray<string>): Array<string> {
|
|
86
|
+
return lines.map((line) => line.slice(0, EXCERPT_LINE_WIDTH))
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async function excerpt_of(
|
|
90
|
+
issue: string,
|
|
91
|
+
output: string,
|
|
92
|
+
): Promise<Pick<StopContext, 'excerpt' | 'omitted'>> {
|
|
93
|
+
const lines = output.trim() === '' ? [] : output_lines(output)
|
|
94
|
+
|
|
95
|
+
if (lines.length <= EXCERPT_LINE_LIMIT) return { excerpt: clipped(lines) }
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
excerpt: clipped(lines.slice(-EXCERPT_LINE_LIMIT)),
|
|
99
|
+
omitted: await omitted_range(issue, lines),
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// A git that cannot answer leaves the list out rather than costing the relaunch — never empty, which
|
|
104
|
+
// would read as a branch with no changes.
|
|
105
|
+
async function read_paths(): Promise<Array<string> | undefined> {
|
|
106
|
+
try {
|
|
107
|
+
return await changed_paths.read_changed_paths(false)
|
|
108
|
+
} catch {
|
|
109
|
+
return undefined
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
async function changed_of(): Promise<Pick<StopContext, 'changed' | 'more_changed'>> {
|
|
114
|
+
const paths = await read_paths()
|
|
115
|
+
|
|
116
|
+
if (paths === undefined) return { more_changed: 0 }
|
|
117
|
+
|
|
118
|
+
return {
|
|
119
|
+
changed: paths.slice(0, CHANGED_PATH_LIMIT),
|
|
120
|
+
more_changed: Math.max(0, paths.length - CHANGED_PATH_LIMIT),
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async function build(issue: string, output: string): Promise<StopContext> {
|
|
125
|
+
return { ...(await excerpt_of(issue, output)), ...(await changed_of()) }
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function has_excerpt(context: StopContext | undefined): boolean {
|
|
129
|
+
return context !== undefined && context.excerpt.length > 0
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function excerpt_heading(issue: string, omitted: Omitted | undefined, shown: number): string {
|
|
133
|
+
if (omitted === undefined) return 'The failed stage output:'
|
|
134
|
+
|
|
135
|
+
const source = omitted.path ?? `the stopped report (\`${run_ship_next.COMMAND.LOG} ${issue}\`)`
|
|
136
|
+
const range = `lines 1-${String(omitted.last_line)} are in ${source}`
|
|
137
|
+
|
|
138
|
+
return `The failed stage output (its last ${String(shown)} lines; ${range}):`
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// The head lines a budget leaves out join the range the heading names; the file, when one was kept,
|
|
142
|
+
// still holds every line.
|
|
143
|
+
function with_dropped(omitted: Omitted | undefined, dropped: number): Omitted | undefined {
|
|
144
|
+
if (dropped === 0) return omitted
|
|
145
|
+
|
|
146
|
+
return { ...omitted, last_line: (omitted?.last_line ?? 0) + dropped }
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function excerpt_block(
|
|
150
|
+
issue: string,
|
|
151
|
+
context: StopContext,
|
|
152
|
+
changed: string,
|
|
153
|
+
dropped: number,
|
|
154
|
+
): string {
|
|
155
|
+
const shown = context.excerpt.slice(dropped)
|
|
156
|
+
const heading = excerpt_heading(issue, with_dropped(context.omitted, dropped), shown.length)
|
|
157
|
+
|
|
158
|
+
return [heading, ...shown, changed].join(LINE_BREAK)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function changed_text(context: StopContext): string {
|
|
162
|
+
if (context.changed === undefined) return 'The changed files could not be read from git.'
|
|
163
|
+
|
|
164
|
+
if (context.changed.length === 0) return 'No files changed against the default branch.'
|
|
165
|
+
|
|
166
|
+
const more = context.more_changed > 0 ? ` (and ${String(context.more_changed)} more)` : ''
|
|
167
|
+
|
|
168
|
+
return `Changed files on the branch: ${context.changed.join(', ')}${more}.`
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// The block the ship-stop prompt carries between the next command and the closing invocation.
|
|
172
|
+
//
|
|
173
|
+
// **It fits the `budget` the prompt leaves it** — the prompt is one argv element, refused past
|
|
174
|
+
// `MAX_VALUE_LENGTH` (joshuafolkken/kit#3964) — by dropping the excerpt's head first, since a check
|
|
175
|
+
// reports its verdict last; the tail line always stays.
|
|
176
|
+
function describe(
|
|
177
|
+
issue: string,
|
|
178
|
+
context: StopContext,
|
|
179
|
+
budget: number = agent_role_profile.MAX_VALUE_LENGTH,
|
|
180
|
+
): string {
|
|
181
|
+
const changed = changed_text(context)
|
|
182
|
+
|
|
183
|
+
if (!has_excerpt(context)) return changed
|
|
184
|
+
|
|
185
|
+
let dropped = 0
|
|
186
|
+
let block = excerpt_block(issue, context, changed, dropped)
|
|
187
|
+
|
|
188
|
+
while (block.length > budget && dropped < context.excerpt.length - 1) {
|
|
189
|
+
dropped += 1
|
|
190
|
+
block = excerpt_block(issue, context, changed, dropped)
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return block
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const run_ship_stop_context = {
|
|
197
|
+
CHANGED_PATH_LIMIT,
|
|
198
|
+
EXCERPT_LINE_LIMIT,
|
|
199
|
+
build,
|
|
200
|
+
describe,
|
|
201
|
+
has_excerpt,
|
|
202
|
+
stop_context_schema,
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export type { StopContext }
|
|
206
|
+
export { run_ship_stop_context }
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
2
2
|
|
|
3
3
|
// The text a `josh ship` supervisor records when a stage stops, written and read in one place so the
|
|
4
|
-
// retrospective's per-stage count never drifts from the writer.
|
|
5
|
-
|
|
4
|
+
// retrospective's per-stage count never drifts from the writer. The cause rides in parentheses after
|
|
5
|
+
// `failed` (`run-ship-stop-cause.ts`); a text written before it had one reads back with none.
|
|
6
|
+
const STOP_PATTERN = /^#\d+ (?<reason>\S+) failed(?: \((?<cause>\S+)\))? — /u
|
|
6
7
|
|
|
7
|
-
function format(issue: string, reason: string): string {
|
|
8
|
-
return `${issue_cite.plain(issue)} ${reason} failed — pnpm josh ship --log ${issue}`
|
|
8
|
+
function format(issue: string, reason: string, cause: string): string {
|
|
9
|
+
return `${issue_cite.plain(issue)} ${reason} failed (${cause}) — pnpm josh ship --log ${issue}`
|
|
9
10
|
}
|
|
10
11
|
|
|
11
12
|
function reason_of(text: string): string | undefined {
|
|
12
|
-
return STOP_PATTERN.exec(text)?.[
|
|
13
|
+
return STOP_PATTERN.exec(text)?.groups?.['reason']
|
|
13
14
|
}
|
|
14
15
|
|
|
15
|
-
|
|
16
|
+
function cause_of(text: string): string | undefined {
|
|
17
|
+
return STOP_PATTERN.exec(text)?.groups?.['cause']
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const run_ship_stop_text = { format, reason_of, cause_of }
|