@joshuafolkken/kit 1.1784.0 → 1.2116.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/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/workflow-commands/SKILL.md +6 -6
- package/.claude/skills/workflow-commands/background-commands.md +8 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +3 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-park.md +5 -2
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -3
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +41 -32
- package/.claude/skills/workflow-commands/delegation.md +6 -6
- package/.claude/skills/workflow-commands/entry-sequence.md +2 -2
- package/.claude/skills/workflow-commands/followup.md +7 -5
- package/.claude/skills/workflow-commands/fullrun-steps.md +6 -6
- package/.claude/skills/workflow-commands/fullrun.md +1 -1
- package/.claude/skills/workflow-commands/issue-comments.md +9 -4
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/kickoff.md +2 -2
- package/.claude/skills/workflow-commands/observation-filing.md +1 -1
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -7
- package/.claude/skills/workflow-commands/prerequisite.md +3 -2
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +7 -5
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-pnpm/action.yml +9 -16
- package/.github/dependabot.yml +16 -0
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +155 -15
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +60 -45
- package/.vscode/settings.json +19 -0
- package/CLAUDE.md +5 -12
- package/SECURITY.md +2 -2
- package/dist/CLAUDE.md +5 -12
- package/dist/commands/document-read-cli.js +2 -1
- package/dist/commands/document-section-main.js +2 -1
- package/dist/commands/read-set-cli.js +194 -134
- package/dist/commands/run-prep-main.js +9694 -10173
- package/dist/commands/run-step-cli.js +22138 -18285
- package/dist/hooks/audit-provision.js +23 -5
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/{chunk-CWMBGKYW.js → chunk-5PM2JRGV.js} +2153 -856
- package/dist/hooks/{chunk-WR2KQAYZ.js → chunk-7SIUNQXK.js} +1207 -1470
- package/dist/hooks/{chunk-O2YBIDSI.js → chunk-CQD4LJE6.js} +1682 -1130
- package/dist/hooks/{chunk-VWWCFGWK.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/{chunk-XGBNSWEI.js → chunk-UJ3FPMMM.js} +132 -49
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +8 -8
- package/dist/hooks/format-edited.js +4 -5
- package/dist/hooks/inputs.json +386 -360
- package/dist/hooks/pretool-guard.js +7 -6
- package/dist/hooks/session-lang.js +101 -258
- package/dist/hooks/stop-guard.js +1744 -2576
- package/dist/josh.js +7133 -6368
- package/dist/version/index.js +161 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/package.json +16 -9
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +14 -11
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +40 -21
- package/prompts/collaboration-workflow/lane-instructions.md +3 -1
- package/prompts/collaboration-workflow/measurement.md +8 -1
- package/prompts/collaboration-workflow/operating-rules.md +11 -2
- package/prompts/collaboration-workflow/output-bounds.md +6 -2
- package/prompts/collaboration-workflow/plan-comment.md +1 -1
- package/prompts/collaboration-workflow/principles.md +9 -0
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
- package/prompts/collaboration-workflow/wip-cap.md +3 -1
- package/prompts/review-rubric.md +8 -0
- package/prompts/review.md +31 -22
- package/prompts/testing-guide.md +1 -0
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +20 -9
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-cli.ts +6 -1
- package/scripts/backlog/backlog-drive-hold.ts +3 -3
- package/scripts/backlog/backlog-drive-idle.ts +10 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -30
- package/scripts/backlog/backlog-drive-named.ts +28 -7
- package/scripts/backlog/backlog-drive-paused.ts +5 -4
- package/scripts/backlog/backlog-drive-restore.ts +11 -3
- package/scripts/backlog/backlog-drive.ts +21 -60
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next.ts +39 -49
- package/scripts/backlog/backlog-occupied.ts +2 -2
- package/scripts/backlog/backlog-overlap.ts +42 -8
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +19 -6
- package/scripts/backlog/backlog-pool.ts +50 -12
- package/scripts/backlog/backlog-rank.ts +60 -13
- package/scripts/backlog/backlog-stalled-detect.ts +2 -1
- package/scripts/backlog/backlog-waves.ts +17 -2
- package/scripts/backlog/backlogrun-launch.ts +7 -4
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-cli.ts +37 -16
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +2 -2
- package/scripts/delegation/duplicate-read-guard.ts +1 -0
- package/scripts/delegation/investigation-guard.ts +14 -2
- package/scripts/delegation/investigation-reads.ts +45 -23
- package/scripts/dependabot/dependabot-cooldown.ts +3 -2
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +17 -7
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-cli-argv.ts +2 -2
- package/scripts/epic/epic-fetch.ts +4 -2
- package/scripts/epic/epic-graph.ts +7 -2
- package/scripts/epic/epic-issue.ts +3 -1
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +13 -10
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +41 -11
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
- package/scripts/followup/git-pr-followup.ts +62 -27
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +2 -2
- package/scripts/gate/busy-average.ts +34 -2
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/command-memory.ts +1 -1
- package/scripts/gate/core-admission.ts +24 -6
- package/scripts/gate/core-budget-timing.ts +20 -6
- package/scripts/gate/core-budget.ts +40 -11
- package/scripts/gate/core-wait-record.ts +3 -2
- package/scripts/gate/core-wait.ts +25 -2
- package/scripts/gate/core-weights.ts +15 -7
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +14 -6
- package/scripts/gate/gate-plan.ts +103 -58
- package/scripts/gate/gate-report.ts +9 -7
- package/scripts/gate/gate-run-steps.ts +26 -3
- package/scripts/gate/gate-skip.ts +45 -6
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +2 -1
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/scoped-green.ts +68 -15
- package/scripts/gate/since-green.ts +14 -6
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/verification-gate.ts +51 -16
- package/scripts/gate/verification-inputs.ts +21 -6
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +23 -2
- package/scripts/gh/git-ai-review-scan.ts +1 -1
- package/scripts/gh/git-gh-api-path.ts +12 -3
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +4 -2
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +8 -2
- package/scripts/gh/git-gh-issue.ts +12 -5
- package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +3 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +21 -7
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +3 -0
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/git/base-tree.ts +30 -0
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +16 -1
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +66 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-schemas.ts +13 -0
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +53 -5
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +11 -2
- package/scripts/git/stash/stash-push-cli.ts +10 -0
- package/scripts/hooks/batch-guard.ts +40 -21
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +22 -2
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +14 -1
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +76 -10
- package/scripts/hooks/pretool-guard.ts +2 -0
- package/scripts/hooks/reserved-run.ts +14 -1
- package/scripts/hooks/run-hook.sh +23 -8
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +3 -15
- package/scripts/hooks/stop-guard.ts +7 -6
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +5 -1
- package/scripts/init/hook-launch.ts +4 -2
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-line.ts +19 -1
- package/scripts/issue/defect-rate-cli.ts +5 -102
- package/scripts/issue/defect-report.ts +4 -4
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +64 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-body-or-comment.ts +38 -4
- package/scripts/issue/issue-cite-cli.ts +1 -3
- package/scripts/issue/issue-classification.ts +1 -0
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-evidence-exit.ts +4 -2
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +111 -38
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +43 -6
- package/scripts/issue/issue-labels.ts +19 -2
- package/scripts/issue/issue-lint-cli.ts +27 -2
- package/scripts/issue/issue-measured-cli.ts +13 -35
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-not-before-label.ts +2 -2
- package/scripts/issue/issue-not-before.ts +4 -1
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +174 -43
- package/scripts/issue/issue-rank.ts +21 -4
- package/scripts/issue/issue-read-cli.ts +32 -6
- package/scripts/issue/issue-read.ts +37 -12
- package/scripts/issue/issue-sample-gate.ts +95 -74
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +12 -11
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +31 -1
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -12
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -70
- package/scripts/issue/plan-consumers-section.ts +22 -1
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/command-usage.ts +3 -2
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -82
- package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
- package/scripts/josh/josh-commands-ai.ts +5 -5
- package/scripts/josh/josh-commands-development.ts +59 -58
- package/scripts/josh/josh-commands-issue-write.ts +23 -4
- package/scripts/josh/josh-commands-issue.ts +32 -0
- package/scripts/josh/josh-commands-lane.ts +87 -4
- package/scripts/josh/josh-commands-lint.ts +16 -3
- package/scripts/josh/josh-commands-maintenance.ts +15 -0
- package/scripts/josh/josh-commands-review.ts +41 -6
- package/scripts/josh/josh-commands-ship.ts +56 -8
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-workflow.ts +1 -1
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +5 -3
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/stamp-file.ts +11 -2
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +5 -8
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-check-stats.ts +29 -8
- package/scripts/lane/lane-child-invocation.ts +9 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-close.ts +8 -3
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +2 -2
- package/scripts/lane/lane-gap-stats.ts +7 -6
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +119 -36
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +31 -177
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +176 -59
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +16 -7
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +4 -1
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-registry.ts +14 -1
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-sampler.ts +23 -4
- package/scripts/lane/lane-session-action.ts +93 -18
- package/scripts/lane/lane-session-broker.ts +49 -21
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-spent.ts +1 -1
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +13 -1
- package/scripts/lane/lane-state.ts +41 -9
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +21 -5
- package/scripts/lane/lane-stop-stats.ts +51 -19
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-transcript-calls.ts +67 -10
- package/scripts/lane/lane-transcript-stats.ts +44 -12
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +108 -31
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +45 -6
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/import-graph.ts +141 -11
- package/scripts/lint/lint-gate-scope.ts +2 -2
- package/scripts/lint/lint-parallel.ts +54 -6
- package/scripts/lint/lint-related.ts +154 -33
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/telegram-notify.ts +12 -3
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush.ts +32 -9
- package/scripts/overrides/overrides-check.ts +9 -1
- package/scripts/release/release-approval-prune.ts +7 -1
- package/scripts/repo/required-checks-logic.ts +4 -1
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +15 -1
- package/scripts/report/report-labels.ts +12 -1
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +26 -7
- package/scripts/report/report-lint.ts +2 -20
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +68 -19
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +14 -7
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +85 -22
- package/scripts/review/review-finding-ledger.ts +109 -7
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +11 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +4 -2
- package/scripts/review/review-record-cli.ts +177 -54
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +91 -29
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +24 -8
- package/scripts/review/review-stamps.ts +7 -3
- package/scripts/review/review-stop-log.ts +20 -6
- package/scripts/review/review-stops-cli.ts +2 -1
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/rules/agent-model.ts +1 -1
- package/scripts/rules/bash-triggers.ts +3 -3
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle.ts +1 -1
- package/scripts/rules/delivered-rules.ts +36 -17
- package/scripts/rules/destructive-command.ts +3 -11
- package/scripts/rules/direct-issue-comment.ts +34 -12
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +4 -24
- package/scripts/rules/early-heartbeat.ts +2 -0
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/guard-remedy.ts +14 -5
- package/scripts/rules/implementation-cut.ts +61 -28
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +9 -4
- package/scripts/rules/josh-git-bare.ts +1 -1
- package/scripts/rules/lane-background.ts +41 -13
- package/scripts/rules/lane-direct-tool.ts +107 -9
- package/scripts/rules/lane-interactive-ask.ts +4 -1
- package/scripts/rules/lane-park.ts +4 -2
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +1 -1
- package/scripts/rules/lane-switch-main.ts +4 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/permission-guards.ts +5 -1
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +67 -17
- package/scripts/rules/poll-loop.ts +72 -9
- package/scripts/rules/pr-merge.ts +5 -5
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +88 -24
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +5 -15
- package/scripts/rules/rule-value-cache.ts +53 -5
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +59 -11
- package/scripts/rules/rule-value.ts +17 -4
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +10 -2
- package/scripts/rules/stop-rule-rows.ts +1 -13
- package/scripts/rules/stop-rules.ts +33 -58
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +110 -23
- package/scripts/rules/timed-rerun.ts +1 -1
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +22 -7
- package/scripts/run/board/run-board-ending-reason.ts +6 -2
- package/scripts/run/board/run-board-fit.ts +24 -1
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-header.ts +8 -0
- package/scripts/run/board/run-board-labels.ts +11 -1
- package/scripts/run/board/run-board-lane-time.ts +1 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-notes.ts +7 -1
- package/scripts/run/board/run-board-operation.ts +4 -2
- package/scripts/run/board/run-board-phase.ts +2 -5
- package/scripts/run/board/run-board-plan.ts +1 -1
- package/scripts/run/board/run-board-read.ts +46 -1
- package/scripts/run/board/run-board-reason.ts +20 -8
- package/scripts/run/board/run-board-render-checks.ts +3 -2
- package/scripts/run/board/run-board-render-drawn.ts +11 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-lead.ts +9 -0
- package/scripts/run/board/run-board-render-legend.ts +19 -0
- package/scripts/run/board/run-board-render-tail.ts +1 -1
- package/scripts/run/board/run-board-render.ts +82 -18
- package/scripts/run/board/run-board-spin.ts +1 -3
- package/scripts/run/board/run-board-status.ts +2 -0
- package/scripts/run/board/run-board-tick.ts +39 -10
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +3 -2
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +52 -8
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-filed.ts +9 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +4 -0
- package/scripts/run/event/run-event-stream.ts +25 -3
- package/scripts/run/hold/run-stop-notify.ts +3 -8
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +66 -23
- package/scripts/run/merge/run-merge-outcome.ts +2 -0
- package/scripts/run/merge/run-merge-ship.ts +13 -3
- package/scripts/run/merge/run-merge-signals.ts +40 -23
- package/scripts/run/merge/run-merge-steps.ts +56 -36
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +41 -14
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +26 -6
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-prep.ts +1 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +5 -2
- package/scripts/run/ship/run-ship-args.ts +19 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +131 -39
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +10 -4
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +27 -26
- package/scripts/run/ship/run-ship-overlap.ts +8 -3
- package/scripts/run/ship/run-ship-place.ts +9 -2
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
- package/scripts/run/ship/run-ship-preflight.ts +16 -4
- package/scripts/run/ship/run-ship-probe.ts +23 -9
- package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-return.ts +103 -29
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +230 -59
- package/scripts/run/ship/run-ship-review.ts +171 -51
- package/scripts/run/ship/run-ship-reviewer.ts +138 -42
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +49 -13
- package/scripts/run/ship/run-ship-steps.ts +24 -4
- package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-sync.ts +171 -30
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +16 -2
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +6 -113
- package/scripts/run/wake/run-wake-code.ts +53 -11
- package/scripts/run/wake/run-wake-driver.ts +5 -3
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +5 -3
- package/scripts/run/wake/run-wake-ports.ts +11 -3
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake.ts +3 -2
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/project-config.ts +3 -2
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-provision-main.ts +9 -1
- package/scripts/security/security-audit-provision.ts +1 -1
- package/scripts/security/security-audit.ts +21 -1
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/split/split-assess.ts +12 -3
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +20 -2
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +208 -20
- package/scripts/test/test-pinned-main.ts +84 -18
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +258 -47
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +35 -11
- package/scripts/test/test-read-recording.ts +17 -5
- package/scripts/test/test-read-trace.ts +26 -8
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red.ts +34 -14
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +4 -1
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +43 -23
- package/scripts/test/test-related-scope.ts +99 -34
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +167 -83
- package/scripts/test/test-unit-guard.ts +28 -5
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-worker-share.ts +5 -4
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +12 -1
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +36 -5
- package/scripts/time-runtime/time-markers.ts +2 -2
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +17 -5
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/latest-corepack.ts +2 -0
- package/templates/gitignore +2 -0
- package/templates/workflows/ci.yml +41 -0
- package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
- package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
- package/dist/hooks/chunk-TUIFS5E7.js +0 -72
- package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/rules/filing-cap.ts +0 -139
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { gate_skip } from '#scripts/gate/gate-skip'
|
|
2
|
-
import { gate_tree } from '#scripts/gate/gate-tree'
|
|
2
|
+
import { gate_tree, type GateTree } from '#scripts/gate/gate-tree'
|
|
3
|
+
import { metrics_totals } from '#scripts/gate/metrics-totals'
|
|
3
4
|
import { scoped_green } from '#scripts/gate/scoped-green'
|
|
4
5
|
import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
6
|
+
import { run_ship_lap } from './run-ship-lap'
|
|
7
|
+
import { run_ship_synced_scope } from './run-ship-synced-scope'
|
|
5
8
|
|
|
6
9
|
// The scoped pair `josh ship` meets itself rather than stops on, shared by every stage that needs a
|
|
7
10
|
// green record for this tree: the preflight stage at the start, the review rounds, and the gate
|
|
@@ -25,13 +28,30 @@ async function run_phases(phases: ReadonlyArray<Phase>): Promise<JoshResult> {
|
|
|
25
28
|
return last
|
|
26
29
|
}
|
|
27
30
|
|
|
31
|
+
// The tree after the branch's metrics approval is re-recorded (`metrics-totals.ts`): every review fix
|
|
32
|
+
// and the gate stage meet the pair here, so a rewrite lands before any record is written for the tree.
|
|
33
|
+
async function rerecorded_tree(): Promise<GateTree> {
|
|
34
|
+
const tree = await gate_tree.read_gate_tree()
|
|
35
|
+
const is_rerecorded = await metrics_totals.rerecord(process.cwd(), tree.files)
|
|
36
|
+
|
|
37
|
+
return is_rerecorded ? await gate_tree.read_gate_tree() : tree
|
|
38
|
+
}
|
|
39
|
+
|
|
28
40
|
// Only the checks with no green record for this tree run — the same question `review:brief` and the
|
|
29
41
|
// local gate refuse on — so a fresh record costs nothing and a stale or absent one costs a scoped run
|
|
30
42
|
// instead of a stop and a relaunched session. A check that genuinely fails still stops the ship, its
|
|
31
|
-
// output forwarded to the ship log.
|
|
32
|
-
|
|
33
|
-
|
|
43
|
+
// output forwarded to the ship log. A pair stale only because a merge with the default branch moved the
|
|
44
|
+
// base runs nothing when the merge shares nothing with the branch (`run-ship-synced-scope.ts`).
|
|
45
|
+
async function settled_pair(): Promise<JoshResult> {
|
|
46
|
+
const tree = await rerecorded_tree()
|
|
34
47
|
const scripts = scoped_green.missing_scripts(tree.files, tree.base)
|
|
48
|
+
const settled = await run_ship_synced_scope.settle(tree, scripts)
|
|
49
|
+
|
|
50
|
+
if (settled !== undefined) {
|
|
51
|
+
process.stdout.write(`${settled}\n`)
|
|
52
|
+
|
|
53
|
+
return { code: SUCCESS_EXIT_CODE, out: settled }
|
|
54
|
+
}
|
|
35
55
|
|
|
36
56
|
return await run_phases(
|
|
37
57
|
scripts.map(
|
|
@@ -40,13 +60,22 @@ async function scoped_pair(): Promise<JoshResult> {
|
|
|
40
60
|
)
|
|
41
61
|
}
|
|
42
62
|
|
|
43
|
-
//
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
63
|
+
// Timed as one lap in whichever ship stage asked for it (`run-ship-lap.ts`).
|
|
64
|
+
async function scoped_pair(): Promise<JoshResult> {
|
|
65
|
+
return await run_ship_lap.timed(run_ship_lap.STEP.SCOPED_PAIR, settled_pair)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async function gate(): Promise<JoshResult> {
|
|
69
|
+
return await run_ship_lap.timed(
|
|
70
|
+
run_ship_lap.STEP.GATE,
|
|
48
71
|
async () => await josh_command.josh_run(['gate'], should_forward_stderr),
|
|
49
|
-
|
|
72
|
+
)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// The scoped pair and then `josh gate` — the gate stage, and the commit stage's and the followup's gate
|
|
76
|
+
// over a merged tree before their push, so each leaves the record the pre-push hook reuses.
|
|
77
|
+
async function scoped_gate(): Promise<JoshResult> {
|
|
78
|
+
return await run_phases([scoped_pair, gate])
|
|
50
79
|
}
|
|
51
80
|
|
|
52
81
|
// Whether `josh gate` would only reuse this tree's green record: the gate's own reuse test rather than
|
|
@@ -14,7 +14,7 @@ import { z } from 'zod'
|
|
|
14
14
|
// the state, and a stale one is overruled by it. Neither can produce a second commit, push or merge.
|
|
15
15
|
//
|
|
16
16
|
// **The gate is never skipped on the record's word.** It is passed over only once its output — a
|
|
17
|
-
// commit — exists; otherwise it runs, and `josh gate`'s own tree-keyed green record is what makes a
|
|
17
|
+
// pushed commit — exists; otherwise it runs, and `josh gate`'s own tree-keyed green record is what makes a
|
|
18
18
|
// re-run on an unchanged tree a reuse rather than a second execution. No quality gate is folded away.
|
|
19
19
|
|
|
20
20
|
const STAGE = {
|
|
@@ -47,6 +47,8 @@ interface ShipState {
|
|
|
47
47
|
// The issue changed after the recorded review's brief (`issue-watch-gate.ts`), so the review re-runs
|
|
48
48
|
// even on a committed tree (joshuafolkken/kit#4221).
|
|
49
49
|
is_review_stale?: boolean
|
|
50
|
+
// The tree holds uncommitted work, which the sync stage commits locally before it merges.
|
|
51
|
+
is_dirty?: boolean
|
|
50
52
|
}
|
|
51
53
|
|
|
52
54
|
const RECORD_PREFIX = 'josh-ship-stages-'
|
|
@@ -57,6 +59,9 @@ const WORD_SEPARATOR = ' '
|
|
|
57
59
|
const STARTED_SEPARATOR = ','
|
|
58
60
|
const STARTED_INDEX = 3
|
|
59
61
|
const WORD_COUNT = STARTED_INDEX + 1
|
|
62
|
+
// The reason a stage ran or was skipped follows the words, behind a separator no word holds, so the
|
|
63
|
+
// word readers below read the line as before.
|
|
64
|
+
const REASON_SEPARATOR = ' | '
|
|
60
65
|
|
|
61
66
|
// `started` lists the stages the current attempt started, kept across a supervisor that ended without a
|
|
62
67
|
// stop so its successor's lines still carry them. `is_merge_waiting` is set only while `josh followup`
|
|
@@ -164,19 +169,23 @@ function is_shipped(state: ShipState): boolean {
|
|
|
164
169
|
return state.is_committed && state.is_pushed
|
|
165
170
|
}
|
|
166
171
|
|
|
172
|
+
// A lane child's `run:review` commits and pushes before the ship runs (joshuafolkken/kit#4907), so a
|
|
173
|
+
// commit or a push is a stage's output only beside the ship's own record of that stage.
|
|
167
174
|
const DONE_BY: Record<Stage, (done: ReadonlySet<string>, state: ShipState) => boolean> = {
|
|
168
175
|
// The preflight asks what the commit stage would refuse on, so a commit is
|
|
169
|
-
// its output
|
|
170
|
-
[STAGE.PREFLIGHT]: (
|
|
171
|
-
|
|
172
|
-
//
|
|
173
|
-
//
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
176
|
+
// its output; a resumed commit stage still asks `git -y`'s own preflight.
|
|
177
|
+
[STAGE.PREFLIGHT]: (done, state) =>
|
|
178
|
+
state.is_merged || (done.has(STAGE.PREFLIGHT) && state.is_committed),
|
|
179
|
+
// The sync stage commits locally before the review round and the gate, without pushing
|
|
180
|
+
// (`run-ship-sync.ts`), so a commit is neither's output: a pushed one on a clean tree is, as only the
|
|
181
|
+
// commit stage after the gate pushes — unless the issue changed since.
|
|
182
|
+
[STAGE.REVIEW]: (done, state) =>
|
|
183
|
+
state.is_merged ||
|
|
184
|
+
(done.has(STAGE.REVIEW) && is_shipped(state) && state.is_review_stale !== true),
|
|
185
|
+
[STAGE.GATE]: (done, state) => state.is_merged || (done.has(STAGE.GATE) && is_shipped(state)),
|
|
186
|
+
// The merge of the default branch before the gate: once pushed, a default branch that
|
|
187
|
+
// moved is the followup's to merge again.
|
|
188
|
+
[STAGE.SYNC]: (done, state) => state.is_merged || (done.has(STAGE.SYNC) && is_shipped(state)),
|
|
180
189
|
[STAGE.COMMIT]: (done, state) => state.is_merged || (done.has(STAGE.COMMIT) && is_shipped(state)),
|
|
181
190
|
// The round-2 pass reads the pushed fix delta, so its record is honored only
|
|
182
191
|
// while that push still stands — new work pushed on top reruns it.
|
|
@@ -231,9 +240,32 @@ function event_text(
|
|
|
231
240
|
return full.join(WORD_SEPARATOR)
|
|
232
241
|
}
|
|
233
242
|
|
|
243
|
+
// A line `event_text` wrote, with why its stage ran or was skipped after it (joshuafolkken/kit#5296).
|
|
244
|
+
function with_reason(text: string, reason: string | undefined): string {
|
|
245
|
+
return reason === undefined ? text : `${text}${REASON_SEPARATOR}${reason}`
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function words_part(text: string): string {
|
|
249
|
+
return text.split(REASON_SEPARATOR, 1)[0] ?? ''
|
|
250
|
+
}
|
|
251
|
+
|
|
234
252
|
// The stages a line says its attempt has started, `undefined` for a three-word line.
|
|
235
253
|
function started_of(text: string): ReadonlyArray<string> | undefined {
|
|
236
|
-
return text.split(WORD_SEPARATOR, WORD_COUNT)[STARTED_INDEX]?.split(STARTED_SEPARATOR)
|
|
254
|
+
return words_part(text).split(WORD_SEPARATOR, WORD_COUNT)[STARTED_INDEX]?.split(STARTED_SEPARATOR)
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// The stage word and the phase word of a line `event_text` wrote, `''` where the line has none.
|
|
258
|
+
function words_of(text: string): { stage: string; phase: string } {
|
|
259
|
+
const [, stage = '', phase = ''] = words_part(text).split(WORD_SEPARATOR, WORD_COUNT)
|
|
260
|
+
|
|
261
|
+
return { stage, phase }
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// Why the stage ran or was skipped, `undefined` for a line that carries no reason.
|
|
265
|
+
function reason_of(text: string): string | undefined {
|
|
266
|
+
const at = text.indexOf(REASON_SEPARATOR)
|
|
267
|
+
|
|
268
|
+
return at === -1 ? undefined : text.slice(at + REASON_SEPARATOR.length)
|
|
237
269
|
}
|
|
238
270
|
|
|
239
271
|
// A stop on a merge git could not finish is named `conflict` rather than by the stage it happened in,
|
|
@@ -254,6 +286,7 @@ const run_ship_stage = {
|
|
|
254
286
|
end_attempt,
|
|
255
287
|
event_text,
|
|
256
288
|
is_done,
|
|
289
|
+
is_shipped,
|
|
257
290
|
mark_done,
|
|
258
291
|
mark_merge_waiting,
|
|
259
292
|
mark_place_waiting,
|
|
@@ -262,8 +295,11 @@ const run_ship_stage = {
|
|
|
262
295
|
read_merge_waiting,
|
|
263
296
|
read_place_waiting,
|
|
264
297
|
read_started,
|
|
298
|
+
reason_of,
|
|
265
299
|
record_path,
|
|
266
300
|
started_of,
|
|
301
|
+
with_reason,
|
|
302
|
+
words_of,
|
|
267
303
|
stop_reason,
|
|
268
304
|
}
|
|
269
305
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
2
2
|
import { run_ship } from './run-ship'
|
|
3
3
|
import { run_ship_body_draft } from './run-ship-body-draft'
|
|
4
|
+
import { run_ship_lap } from './run-ship-lap'
|
|
4
5
|
import { run_ship_preflight } from './run-ship-preflight'
|
|
5
6
|
import { run_ship_probe } from './run-ship-probe'
|
|
6
7
|
import { run_ship_review_steps } from './run-ship-review-steps'
|
|
@@ -23,6 +24,8 @@ interface ShipArguments {
|
|
|
23
24
|
cites: ReadonlyArray<string>
|
|
24
25
|
is_review: boolean
|
|
25
26
|
is_detach: boolean
|
|
27
|
+
// `--unpinned-ok "<reason>"` as given, forwarded to round 1's `run:review` alone; empty when absent.
|
|
28
|
+
unpinned_ok: ReadonlyArray<string>
|
|
26
29
|
}
|
|
27
30
|
|
|
28
31
|
interface Step {
|
|
@@ -65,7 +68,21 @@ async function gate_stage(): Promise<StepResult> {
|
|
|
65
68
|
const SYNC_STEP: Step = {
|
|
66
69
|
stage: STAGE.SYNC,
|
|
67
70
|
header: run_ship.SYNC_HEADER,
|
|
68
|
-
run: async (args) =>
|
|
71
|
+
run: async (args, state) =>
|
|
72
|
+
await run_ship_sync.sync_stage(args.number, args.title, state.is_dirty === true),
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// A default branch that moved since the sync stage is merged and gated again before the push
|
|
76
|
+
// (`run_ship_sync.catch_up`, joshuafolkken/kit#4825). A resumed ship with nothing left to push leaves
|
|
77
|
+
// that to the followup, which pushes what it merges; a pushed branch with new work still catches up.
|
|
78
|
+
async function commit_stage(args: ShipArguments, state: ShipState): Promise<StepResult> {
|
|
79
|
+
const stop = run_ship_stage.is_shipped(state) ? undefined : await run_ship_sync.catch_up()
|
|
80
|
+
|
|
81
|
+
if (stop !== undefined) return stop
|
|
82
|
+
|
|
83
|
+
const argv = ['git', '-y', ...run_ship_stage.commit_flags(state), ...args.body, args.title]
|
|
84
|
+
|
|
85
|
+
return await run_ship_lap.timed(run_ship_lap.STEP.COMMIT, async () => await josh(argv))
|
|
69
86
|
}
|
|
70
87
|
|
|
71
88
|
// The gate before the commit, the commit/push/PR before the merge. The gate meets the scoped pair
|
|
@@ -81,8 +98,7 @@ const COMMIT_STEPS: ReadonlyArray<Step> = [
|
|
|
81
98
|
{
|
|
82
99
|
stage: STAGE.COMMIT,
|
|
83
100
|
header: run_ship.COMMIT_HEADER,
|
|
84
|
-
run: async (args, state) =>
|
|
85
|
-
await josh(['git', '-y', ...run_ship_stage.commit_flags(state), ...args.body, args.title]),
|
|
101
|
+
run: async (args, state) => await commit_stage(args, state),
|
|
86
102
|
},
|
|
87
103
|
]
|
|
88
104
|
|
|
@@ -133,7 +149,11 @@ const REVIEW_STEP: Step = {
|
|
|
133
149
|
stage: STAGE.REVIEW,
|
|
134
150
|
header: run_ship.REVIEW_HEADER,
|
|
135
151
|
run: async (args, state) =>
|
|
136
|
-
await run_ship_review_steps.review_stage(
|
|
152
|
+
await run_ship_review_steps.review_stage(
|
|
153
|
+
args.number,
|
|
154
|
+
state.is_review_stale === true,
|
|
155
|
+
args.unpinned_ok,
|
|
156
|
+
),
|
|
137
157
|
}
|
|
138
158
|
const ROUND_TWO_STEP: Step = {
|
|
139
159
|
stage: STAGE.ROUND_TWO,
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { api_auth } from '#scripts/agent/api-auth'
|
|
2
|
+
import { UNREADABLE_COMMENTS_STOP } from '#scripts/gh/git-gh-comments-unreadable'
|
|
3
|
+
import { gh_retry } from '#scripts/gh/git-gh-retry'
|
|
2
4
|
import { NO_CHECKS_MESSAGE } from '#scripts/gh/git-pr-checks-watch'
|
|
3
|
-
import
|
|
5
|
+
import { git_error } from '#scripts/git/git-error'
|
|
6
|
+
import type { StopRecord } from '#scripts/lane/lane-ledger-schema'
|
|
4
7
|
import { run_ship_review, type StopFinding } from './run-ship-review'
|
|
5
8
|
import { run_ship_stage, type Stage } from './run-ship-stage'
|
|
6
9
|
|
|
@@ -39,6 +42,7 @@ const INFRA_STAGES: ReadonlySet<Stage> = new Set([
|
|
|
39
42
|
const INFRA_PATTERNS: ReadonlyArray<RegExp> = [
|
|
40
43
|
/rate limit/iu,
|
|
41
44
|
new RegExp(NO_CHECKS_MESSAGE, 'u'),
|
|
45
|
+
new RegExp(UNREADABLE_COMMENTS_STOP, 'u'),
|
|
42
46
|
/\b(?:ECONNRESET|ECONNREFUSED|ETIMEDOUT|EAI_AGAIN|ENOTFOUND)\b/u,
|
|
43
47
|
/socket hang up/iu,
|
|
44
48
|
/could not resolve host/iu,
|
|
@@ -84,6 +88,43 @@ function infra_text({ body, out = body }: StoppedOutput): string {
|
|
|
84
88
|
return out
|
|
85
89
|
}
|
|
86
90
|
|
|
91
|
+
const FAILURE_LINE = new RegExp(`^${git_error.FAILURE_PREFIX} `, 'gmu')
|
|
92
|
+
const REPORTED_LINE = new RegExp(
|
|
93
|
+
`^(?:${git_error.FAILURE_PREFIX}|${git_error.DETAILS_PREFIX}) (?<message>.*)$`,
|
|
94
|
+
'gmu',
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
// The failure the stage ended on — the last `❌ Error:` line — and the cause logged under it: a caller
|
|
98
|
+
// that wraps a spent request (a merge whose read-back failed too, a timed-out exec) ends on its own
|
|
99
|
+
// message, with the request's beneath.
|
|
100
|
+
function final_failures(body: string): ReadonlyArray<string> {
|
|
101
|
+
const last = [...body.matchAll(FAILURE_LINE)].at(-1)
|
|
102
|
+
if (last === undefined) return []
|
|
103
|
+
|
|
104
|
+
return [...body.slice(last.index).matchAll(REPORTED_LINE)].map(
|
|
105
|
+
({ groups }) => groups?.['message'] ?? '',
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// A gh request transient to its last attempt notes so on stderr — gh's own transient verdict, never a
|
|
110
|
+
// second list of its errors (joshuafolkken/kit#5052). A caller may catch it and stop later on a red
|
|
111
|
+
// check, so the note counts only when it names the failure the stage ended on, or that failure's cause.
|
|
112
|
+
function is_spent_stop(body: string): boolean {
|
|
113
|
+
return final_failures(body).some((message) => body.includes(gh_retry.spent_note(message)))
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function is_infra_stop(failed: StoppedOutput): boolean {
|
|
117
|
+
return is_infra(infra_text(failed)) || is_spent_stop(failed.body)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// A gate an infrastructure stage ran itself tags its red as a check: its output is test output, where
|
|
121
|
+
// a title naming a rate limit is no outage (joshuafolkken/kit#4825).
|
|
122
|
+
function stage_cause(stage: Stage, failed: StoppedOutput): Cause {
|
|
123
|
+
if (failed.cause === CAUSE.CHECK || !INFRA_STAGES.has(stage)) return CAUSE.CHECK
|
|
124
|
+
|
|
125
|
+
return is_infra_stop(failed) ? CAUSE.INFRA : CAUSE.CHECK
|
|
126
|
+
}
|
|
127
|
+
|
|
87
128
|
function cause_of(stage: Stage, failed: StoppedOutput): Cause {
|
|
88
129
|
const { body, conflicts, cause } = failed
|
|
89
130
|
const reason = run_ship_stage.stop_reason(stage, conflicts)
|
|
@@ -91,7 +132,7 @@ function cause_of(stage: Stage, failed: StoppedOutput): Cause {
|
|
|
91
132
|
if (reason === run_ship_stage.CONFLICT) return CAUSE.CONFLICT
|
|
92
133
|
if (is_review(stage)) return review_cause(body, cause)
|
|
93
134
|
|
|
94
|
-
return
|
|
135
|
+
return stage_cause(stage, failed)
|
|
95
136
|
}
|
|
96
137
|
|
|
97
138
|
// Whether a finding decided the stop — false on any other stop, and on a review stop no finding decided
|
|
@@ -2,9 +2,11 @@ import { stripVTControlCharacters } from 'node:util'
|
|
|
2
2
|
import { agent_role_profile } from '#scripts/agent/agent-role-profile'
|
|
3
3
|
import { changed_paths } from '#scripts/git/changed-paths'
|
|
4
4
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
5
|
+
import { review_prior_findings } from '#scripts/review/review-prior-findings'
|
|
5
6
|
import { z } from 'zod'
|
|
6
7
|
import { run_ship_next } from './run-ship-next'
|
|
7
8
|
import { run_ship_probe } from './run-ship-probe'
|
|
9
|
+
import type { StopFinding } from './run-ship-review'
|
|
8
10
|
|
|
9
11
|
// What a relaunched lane child needs in front of it to fix a stopped ship: the tail of the failed
|
|
10
12
|
// stage's output — a red check, or the High/Medium findings a review stage reports — and the branch's
|
|
@@ -14,6 +16,9 @@ import { run_ship_probe } from './run-ship-probe'
|
|
|
14
16
|
// **Both are bounded**, so a long gate log never becomes the whole prompt. The tail is kept because a
|
|
15
17
|
// check reports its verdict last; the lines left out go to a file whose path and line range the prompt
|
|
16
18
|
// names, so nothing is lost and the session reads only the range it needs.
|
|
19
|
+
//
|
|
20
|
+
// **A review stop also carries the lane's earlier findings on the files it cites** (joshuafolkken/kit#4780),
|
|
21
|
+
// so the fix meets the constraint an earlier round set on the same line rather than breaking it.
|
|
17
22
|
|
|
18
23
|
const EXCERPT_LINE_LIMIT = 40
|
|
19
24
|
const EXCERPT_LINE_WIDTH = 240
|
|
@@ -33,6 +38,7 @@ const stop_context_schema = z
|
|
|
33
38
|
omitted: omitted_schema.optional(),
|
|
34
39
|
changed: z.array(z.string()).readonly().optional(),
|
|
35
40
|
more_changed: z.number().int(),
|
|
41
|
+
prior: z.array(z.string()).readonly().optional(),
|
|
36
42
|
})
|
|
37
43
|
.strict()
|
|
38
44
|
|
|
@@ -121,8 +127,18 @@ async function changed_of(): Promise<Pick<StopContext, 'changed' | 'more_changed
|
|
|
121
127
|
}
|
|
122
128
|
}
|
|
123
129
|
|
|
124
|
-
async function build(
|
|
125
|
-
|
|
130
|
+
async function build(
|
|
131
|
+
issue: string,
|
|
132
|
+
output: string,
|
|
133
|
+
findings: ReadonlyArray<StopFinding> = [],
|
|
134
|
+
): Promise<StopContext> {
|
|
135
|
+
const prior = review_prior_findings.on_files(issue, findings)
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
...(await excerpt_of(issue, output)),
|
|
139
|
+
...(await changed_of()),
|
|
140
|
+
...(prior.length > 0 && { prior }),
|
|
141
|
+
}
|
|
126
142
|
}
|
|
127
143
|
|
|
128
144
|
function has_excerpt(context: StopContext | undefined): boolean {
|
|
@@ -168,17 +184,12 @@ function changed_text(context: StopContext): string {
|
|
|
168
184
|
return `Changed files on the branch: ${context.changed.join(', ')}${more}.`
|
|
169
185
|
}
|
|
170
186
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
issue: string,
|
|
178
|
-
context: StopContext,
|
|
179
|
-
budget: number = agent_role_profile.MAX_VALUE_LENGTH,
|
|
180
|
-
): string {
|
|
181
|
-
const changed = changed_text(context)
|
|
187
|
+
function trailer_text(context: StopContext): string {
|
|
188
|
+
return [changed_text(context), ...review_prior_findings.fix_lines(context.prior)].join(LINE_BREAK)
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function fitted_block(issue: string, context: StopContext, budget: number): string {
|
|
192
|
+
const changed = trailer_text(context)
|
|
182
193
|
|
|
183
194
|
if (!has_excerpt(context)) return changed
|
|
184
195
|
|
|
@@ -193,6 +204,32 @@ function describe(
|
|
|
193
204
|
return block
|
|
194
205
|
}
|
|
195
206
|
|
|
207
|
+
function has_prior(context: StopContext): boolean {
|
|
208
|
+
return context.prior !== undefined && context.prior.length > 0
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// The block the ship-stop prompt carries between the next command and the closing invocation.
|
|
212
|
+
//
|
|
213
|
+
// **It fits the `budget` the prompt leaves it** — the prompt is one argv element, kept within
|
|
214
|
+
// `MAX_VALUE_LENGTH` (joshuafolkken/kit#3964), well under the launch gate's prompt cap — by dropping
|
|
215
|
+
// the excerpt's head first, since a check
|
|
216
|
+
// reports its verdict last; the tail line always stays. Past that, the earlier findings go oldest first.
|
|
217
|
+
function describe(
|
|
218
|
+
issue: string,
|
|
219
|
+
context: StopContext,
|
|
220
|
+
budget: number = agent_role_profile.MAX_VALUE_LENGTH,
|
|
221
|
+
): string {
|
|
222
|
+
let fitted = context
|
|
223
|
+
let block = fitted_block(issue, fitted, budget)
|
|
224
|
+
|
|
225
|
+
while (block.length > budget && has_prior(fitted)) {
|
|
226
|
+
fitted = { ...fitted, prior: fitted.prior?.slice(1) }
|
|
227
|
+
block = fitted_block(issue, fitted, budget)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return block
|
|
231
|
+
}
|
|
232
|
+
|
|
196
233
|
const run_ship_stop_context = {
|
|
197
234
|
CHANGED_PATH_LIMIT,
|
|
198
235
|
EXCERPT_LINE_LIMIT,
|