@joshuafolkken/kit 1.1514.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +5 -5
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +53 -6
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +30 -7
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +8 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +27 -24
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-write.ts +67 -29
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +2 -2
- package/scripts/git/main-merge.ts +25 -9
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +0 -8
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +1 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +2 -10
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +157 -158
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +103 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +2 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +81 -15
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +8 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +80 -2
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +9 -1
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +82 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +116 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +207 -265
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +6 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +34 -8
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +42 -24
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +61 -149
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +97 -10
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +4 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -23,12 +23,18 @@ const LINE_SEPARATOR = /\r?\n/u
|
|
|
23
23
|
const HIGH = 'high'
|
|
24
24
|
const MEDIUM = 'medium'
|
|
25
25
|
const FIXED_PREFIX = 'fixed '
|
|
26
|
+
const KIND_FIELDS = 2
|
|
26
27
|
// What a finding line carries after its spec: one sentence saying what is wrong, so a stopped ship's
|
|
27
28
|
// log tells the resumed lane child the defect rather than only its location.
|
|
28
29
|
const DESCRIPTION_SEPARATOR = ' — '
|
|
29
30
|
// Where the spec ends on read: a reviewer that types the dash as `-`, `--` or `–` still ends it there,
|
|
30
31
|
// so its sentence never lands in the ledger's file field.
|
|
31
32
|
const DESCRIPTION_BOUNDARY = / [—–-]{1,2} /u
|
|
33
|
+
// Where a description's first sentence ends, and the cap that keeps a run-on one a line. Japanese
|
|
34
|
+
// sets no space after `。`, so it ends a sentence on its own.
|
|
35
|
+
const SENTENCE_END = /(?<=[.!?])\s|(?<=。)/u
|
|
36
|
+
const SENTENCE_LIMIT = 200
|
|
37
|
+
const ELLIPSIS = '…'
|
|
32
38
|
|
|
33
39
|
const VERDICT = {
|
|
34
40
|
CLEAN: 'clean',
|
|
@@ -57,6 +63,15 @@ interface Finding {
|
|
|
57
63
|
spec: string
|
|
58
64
|
is_fixed: boolean
|
|
59
65
|
line: string
|
|
66
|
+
description: string
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// One finding that decided a stopped review, as the durable stop log keeps it: its kind, the
|
|
70
|
+
// `<file>[:<line>]` it cites and the first sentence of what it said (joshuafolkken/kit#4519).
|
|
71
|
+
interface StopFinding {
|
|
72
|
+
kind: string
|
|
73
|
+
location: string
|
|
74
|
+
sentence: string
|
|
60
75
|
}
|
|
61
76
|
|
|
62
77
|
const MISSING_NOTE = 'the reviewer wrote no findings file — the review did not complete'
|
|
@@ -120,17 +135,30 @@ function verification_prompt(brief_path: string, findings_path: string, issue: s
|
|
|
120
135
|
].join(' ')
|
|
121
136
|
}
|
|
122
137
|
|
|
123
|
-
// The spec is what `review:record` reads; the description after it travels
|
|
124
|
-
|
|
125
|
-
|
|
138
|
+
// The spec is what `review:record` reads; the description after it travels in the stage output and,
|
|
139
|
+
// for a finding that stopped the ship, its first sentence in the durable stop log.
|
|
140
|
+
function split_description(unmarked: string): { spec: string; description: string } {
|
|
141
|
+
const boundary = DESCRIPTION_BOUNDARY.exec(unmarked)
|
|
142
|
+
|
|
143
|
+
if (boundary === null) return { spec: unmarked.trim(), description: '' }
|
|
126
144
|
|
|
127
|
-
|
|
145
|
+
const rest = unmarked.slice(boundary.index + boundary[0].length)
|
|
146
|
+
|
|
147
|
+
return { spec: unmarked.slice(0, boundary.index).trim(), description: rest.trim() }
|
|
128
148
|
}
|
|
129
149
|
|
|
130
150
|
function finding_of(line: string): Finding {
|
|
131
151
|
const is_fixed = line.startsWith(FIXED_PREFIX)
|
|
132
152
|
|
|
133
|
-
return {
|
|
153
|
+
return { ...split_description(is_fixed ? line.slice(FIXED_PREFIX.length) : line), is_fixed, line }
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function first_sentence(description: string): string {
|
|
157
|
+
const [sentence = ''] = description.split(SENTENCE_END, 1)
|
|
158
|
+
|
|
159
|
+
if (sentence.length <= SENTENCE_LIMIT) return sentence
|
|
160
|
+
|
|
161
|
+
return `${sentence.slice(0, SENTENCE_LIMIT - ELLIPSIS.length)}${ELLIPSIS}`
|
|
134
162
|
}
|
|
135
163
|
|
|
136
164
|
function spec_findings(text: string): ReadonlyArray<Finding> {
|
|
@@ -153,6 +181,43 @@ function is_blocking(finding: Finding): boolean {
|
|
|
153
181
|
return severity === HIGH || (severity === MEDIUM && !finding.is_fixed)
|
|
154
182
|
}
|
|
155
183
|
|
|
184
|
+
function kind_of(finding: Finding): string {
|
|
185
|
+
return finding.spec.split(':', KIND_FIELDS).join(':')
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function kinds_of(findings: ReadonlyArray<Finding>): ReadonlyArray<string> {
|
|
189
|
+
return [...new Set(findings.map((finding) => kind_of(finding)))]
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function stop_finding_of(finding: Finding): StopFinding {
|
|
193
|
+
const location = review_record_cli.parse_finding(finding.spec)?.file ?? ''
|
|
194
|
+
|
|
195
|
+
return { kind: kind_of(finding), location, sentence: first_sentence(finding.description) }
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// `bug-risks:medium` — each kind of finding that decided a stopped stage, once per kind (the stop
|
|
199
|
+
// counts once under each in `lane:stats`), so the lane ledger records which kinds of finding stop a
|
|
200
|
+
// lane rather than only that one did (joshuafolkken/kit#4426). The blocking findings decide it where
|
|
201
|
+
// there are any; otherwise the stop was decided by the fixes — round-1 fixes red on the scoped pair, or
|
|
202
|
+
// a round 2 that edited the tree — so the fixed findings do. A line outside the grammar is the stage's
|
|
203
|
+
// own prose and never counts.
|
|
204
|
+
function deciding_findings(text: string): ReadonlyArray<Finding> {
|
|
205
|
+
const findings = spec_findings(text).filter((finding) => is_recordable(finding))
|
|
206
|
+
const blocking = findings.filter((finding) => is_blocking(finding))
|
|
207
|
+
|
|
208
|
+
return blocking.length > 0 ? blocking : findings.filter((finding) => finding.is_fixed)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function blocking_kinds(text: string): ReadonlyArray<string> {
|
|
212
|
+
return kinds_of(deciding_findings(text))
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// The same findings `blocking_kinds` counts, each one whole — every finding, not once per kind — so a
|
|
216
|
+
// stop can be classified by what was found where, not only by its kind (joshuafolkken/kit#4519).
|
|
217
|
+
function blocking_details(text: string): ReadonlyArray<StopFinding> {
|
|
218
|
+
return deciding_findings(text).map((finding) => stop_finding_of(finding))
|
|
219
|
+
}
|
|
220
|
+
|
|
156
221
|
function scored_kind(findings: ReadonlyArray<Finding>): ScoredVerdict['kind'] {
|
|
157
222
|
if (findings.some((finding) => is_blocking(finding))) return VERDICT.BLOCKING
|
|
158
223
|
|
|
@@ -216,6 +281,8 @@ const run_ship_review = {
|
|
|
216
281
|
FIXED_PREFIX,
|
|
217
282
|
UNVERIFIED_OUTCOME,
|
|
218
283
|
VERDICT,
|
|
284
|
+
blocking_details,
|
|
285
|
+
blocking_kinds,
|
|
219
286
|
has_fixes,
|
|
220
287
|
is_clean_round_one,
|
|
221
288
|
read_verdict,
|
|
@@ -225,5 +292,5 @@ const run_ship_review = {
|
|
|
225
292
|
verification_prompt,
|
|
226
293
|
}
|
|
227
294
|
|
|
228
|
-
export type { ReviewVerdict, RoundOutcome, ScoredVerdict }
|
|
295
|
+
export type { ReviewVerdict, RoundOutcome, ScoredVerdict, StopFinding }
|
|
229
296
|
export { run_ship_review }
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { agent_argv, type AgentArgv } from '#scripts/agent/agent-argv'
|
|
2
|
+
import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
3
|
+
import { api_auth } from '#scripts/agent/api-auth'
|
|
4
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
5
|
+
import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
6
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
7
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
8
|
+
import { lane_session_broker } from '#scripts/lane/lane-session-broker'
|
|
9
|
+
import { detached_launch } from '#scripts/run/detached-launch'
|
|
10
|
+
import { run_ship_review } from './run-ship-review'
|
|
11
|
+
import type { Phase } from './run-ship-scoped'
|
|
12
|
+
import { run_ship_stop_cause, type Cause } from './run-ship-stop-cause'
|
|
13
|
+
import type { StepResult } from './run-ship-sync'
|
|
14
|
+
|
|
15
|
+
// The reviewer half of `josh ship --review` (`run-ship-review-steps.ts`): a brief-minting command, a
|
|
16
|
+
// reviewer session handed what it printed, and the attestation that the session read this checkout.
|
|
17
|
+
// Every review round the ship runs — round 1, the interaction review, round 2 — launches through here.
|
|
18
|
+
|
|
19
|
+
const SUCCESS_EXIT_CODE = 0
|
|
20
|
+
const FAILURE_EXIT_CODE = 1
|
|
21
|
+
const should_forward_stderr = true
|
|
22
|
+
const ATTEST_CHECK = ['review:attest', '--check']
|
|
23
|
+
const KEPT_REVIEW_NOTE =
|
|
24
|
+
'the reviewer wrote its findings before it failed — its review is kept; attest and record judge it.'
|
|
25
|
+
type Round = '1' | '2'
|
|
26
|
+
|
|
27
|
+
const ROUND_ONE: Round = '1'
|
|
28
|
+
const ROUND_TWO: Round = '2'
|
|
29
|
+
type PromptOf = (brief_path: string, findings_path: string, issue: string) => string
|
|
30
|
+
|
|
31
|
+
const { CAUSE } = run_ship_stop_cause
|
|
32
|
+
|
|
33
|
+
// **Every stop is tagged with the step's own cause**, so a round that stopped on a red join, a reviewer
|
|
34
|
+
// that did not finish or a refused attestation is not booked as a finding (joshuafolkken/kit#4431).
|
|
35
|
+
function failure(out: string, cause: Cause): StepResult {
|
|
36
|
+
return { code: FAILURE_EXIT_CODE, out, cause }
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function tagged(cause: Cause, result: JoshResult): StepResult {
|
|
40
|
+
return result.code === SUCCESS_EXIT_CODE ? result : { ...result, cause }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function tagged_phase(cause: Cause, phase: Phase): Phase {
|
|
44
|
+
return async () => tagged(cause, await phase())
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function paths(): { brief: string; findings: string; log: string } {
|
|
48
|
+
return lane_session_broker.review_paths(PROJECT_ROOT)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function josh(argv: ReadonlyArray<string>): Promise<JoshResult> {
|
|
52
|
+
return await josh_command.josh_run(argv, should_forward_stderr)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function note(text: string): void {
|
|
56
|
+
process.stderr.write(`${text}\n`)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// A reviewer that could not authenticate is named as such (`api-auth.ts`), so the stop is not booked as
|
|
60
|
+
// a review finding (joshuafolkken/kit#4216).
|
|
61
|
+
function exited_note(log_path: string): string {
|
|
62
|
+
const exited = `reviewer failed — log: ${log_path}`
|
|
63
|
+
|
|
64
|
+
if (!api_auth.is_auth_failed_transcript(stamp_file.read_stamp_text(log_path))) return exited
|
|
65
|
+
|
|
66
|
+
return `${api_auth.AUTH_FAILURE_NOTE}: ${exited}`
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function current_verdict(): ReturnType<typeof run_ship_review.read_verdict> {
|
|
70
|
+
return run_ship_review.read_verdict(stamp_file.read_stamp_text(paths().findings))
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// **A session that ran and then failed keeps the review it wrote** (joshuafolkken/kit#4562). The
|
|
74
|
+
// findings file is removed before the launch and written as the reviewer's last step, so a readable one
|
|
75
|
+
// is this session's finished review — a late auth failure or a lost broker reply then costs nothing,
|
|
76
|
+
// where a relaunch would review the whole change again. The attest and record phases still judge it.
|
|
77
|
+
function ended_session(failed_note: string): JoshResult {
|
|
78
|
+
if (current_verdict().kind === run_ship_review.VERDICT.INVALID) {
|
|
79
|
+
return failure(failed_note, CAUSE.INFRA)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
note(`${failed_note}\n${KEPT_REVIEW_NOTE}`)
|
|
83
|
+
|
|
84
|
+
return { code: SUCCESS_EXIT_CODE, out: '' }
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Under the round's reviewer profile — the same model and effort (`JOSH_REVIEWER_*` included) the
|
|
88
|
+
// chain's subagent is given — and waited on, so the join below runs only once the review has finished.
|
|
89
|
+
// Each call is its own process, so round 2 is a fresh session by construction.
|
|
90
|
+
async function run_direct_session(
|
|
91
|
+
argv: AgentArgv,
|
|
92
|
+
profile: AgentProfile,
|
|
93
|
+
log_path: string,
|
|
94
|
+
round: Round,
|
|
95
|
+
): Promise<JoshResult> {
|
|
96
|
+
const request = { argv, cwd: PROJECT_ROOT, log_path, profile }
|
|
97
|
+
|
|
98
|
+
note(agent_role_profile.describe_review(Number(round), profile))
|
|
99
|
+
const result = await detached_launch.launch_attached(request, note)
|
|
100
|
+
|
|
101
|
+
if (result.kind === 'failed') {
|
|
102
|
+
return failure(`reviewer could not start: ${result.note}`, CAUSE.INFRA)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (result.exit_code !== SUCCESS_EXIT_CODE) return ended_session(exited_note(log_path))
|
|
106
|
+
|
|
107
|
+
return { code: SUCCESS_EXIT_CODE, out: '' }
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// A lane child's reviewer is started by the lane's broker: an OpenAI lane's always, since a nested Codex
|
|
111
|
+
// cannot write outside its sandbox, and a Claude lane's whenever the `run:wake` supervisor serves it, since this
|
|
112
|
+
// ship was started from the child's Bash tool and so never received a token-only credential
|
|
113
|
+
// (joshuafolkken/kit#3817). A Claude lane nobody serves starts the reviewer itself, as before.
|
|
114
|
+
function is_brokered(profile: AgentProfile, issue: string): boolean {
|
|
115
|
+
if (!lane_child_marker.is_child_of(PROJECT_ROOT)) return false
|
|
116
|
+
|
|
117
|
+
return profile.provider === 'openai' || lane_session_broker.is_serving(PROJECT_ROOT, issue)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
async function run_session(
|
|
121
|
+
prompt: string,
|
|
122
|
+
log_path: string,
|
|
123
|
+
issue: string,
|
|
124
|
+
round: Round,
|
|
125
|
+
): Promise<JoshResult> {
|
|
126
|
+
const built = agent_argv.review_in(prompt, Number(round), PROJECT_ROOT)
|
|
127
|
+
|
|
128
|
+
if (built.kind === 'rejected') {
|
|
129
|
+
return failure(`reviewer profile rejected: ${built.note}`, CAUSE.INFRA)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (!is_brokered(built.profile, issue)) {
|
|
133
|
+
return await run_direct_session(built.argv, built.profile, log_path, round)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const answer = await lane_session_broker.request(PROJECT_ROOT, issue, { kind: 'review', round })
|
|
137
|
+
|
|
138
|
+
return answer.is_success
|
|
139
|
+
? { code: SUCCESS_EXIT_CODE, out: '' }
|
|
140
|
+
: ended_session(`isolated reviewer failed: ${answer.reason}`)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// The brief goes to a file and the previous round's findings are removed, so a reviewer that writes
|
|
144
|
+
// nothing reads as unfinished rather than as the last round's verdict.
|
|
145
|
+
async function launch_reviewer(
|
|
146
|
+
brief: string,
|
|
147
|
+
prompt_of: PromptOf,
|
|
148
|
+
issue: string,
|
|
149
|
+
round: Round,
|
|
150
|
+
): Promise<JoshResult> {
|
|
151
|
+
const target = paths()
|
|
152
|
+
|
|
153
|
+
stamp_file.write_text_stamp(target.brief, brief)
|
|
154
|
+
stamp_file.remove_stamp(target.findings)
|
|
155
|
+
|
|
156
|
+
return await run_session(
|
|
157
|
+
prompt_of(target.brief, target.findings, issue),
|
|
158
|
+
target.log,
|
|
159
|
+
issue,
|
|
160
|
+
round,
|
|
161
|
+
)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// A refused attestation — the issue changed after the brief, an update left unread, no attestation —
|
|
165
|
+
// is no finding: the round read what it was briefed on.
|
|
166
|
+
async function attest_phase(): Promise<StepResult> {
|
|
167
|
+
return tagged(CAUSE.ATTEST, await josh(ATTEST_CHECK))
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// A brief-minting command, then a reviewer handed what it printed.
|
|
171
|
+
function reviewed(
|
|
172
|
+
open: ReadonlyArray<string>,
|
|
173
|
+
prompt_of: PromptOf,
|
|
174
|
+
issue: string,
|
|
175
|
+
round: Round,
|
|
176
|
+
): ReadonlyArray<Phase> {
|
|
177
|
+
const opened = { brief: '' }
|
|
178
|
+
|
|
179
|
+
return [
|
|
180
|
+
async () => {
|
|
181
|
+
const result = await josh(open)
|
|
182
|
+
|
|
183
|
+
opened.brief = result.out
|
|
184
|
+
|
|
185
|
+
return tagged(CAUSE.CHECK, result)
|
|
186
|
+
},
|
|
187
|
+
async () => await launch_reviewer(opened.brief, prompt_of, issue, round),
|
|
188
|
+
]
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const run_ship_reviewer = {
|
|
192
|
+
attest_phase,
|
|
193
|
+
current_verdict,
|
|
194
|
+
failure,
|
|
195
|
+
josh,
|
|
196
|
+
note,
|
|
197
|
+
paths,
|
|
198
|
+
reviewed,
|
|
199
|
+
ROUND_ONE,
|
|
200
|
+
ROUND_TWO,
|
|
201
|
+
SUCCESS_EXIT_CODE,
|
|
202
|
+
tagged,
|
|
203
|
+
tagged_phase,
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export type { Round }
|
|
207
|
+
export { run_ship_reviewer }
|
|
@@ -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 (args) => await run_ship_sync.sync_stage(args.number),
|
|
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 }
|