@joshuafolkken/kit 1.1784.0 → 1.2114.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 +59 -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 +415 -389
- 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 +15 -8
- 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,7 @@
|
|
|
1
1
|
// The pure decisions `josh run:review` makes, kept apart from the side effects the same way
|
|
2
2
|
// `run-merge.ts` is kept apart from `run-merge-steps.ts`.
|
|
3
3
|
//
|
|
4
|
-
// `run:review` starts the gate in the background and
|
|
4
|
+
// `run:review` starts the gate in the background and writes the `/code-review` brief in one call, so a
|
|
5
5
|
// lane child launches both from a single command and the two overlap rather than running one after the
|
|
6
6
|
// other. Two facts have to be decided from what the stamps say, and both are decided here so a test can
|
|
7
7
|
// pin them without a gate ever running:
|
|
@@ -29,21 +29,37 @@ function adopt_verdict(is_gate_green: boolean): AdoptVerdict {
|
|
|
29
29
|
const GATE_GREEN = 'green'
|
|
30
30
|
const GATE_RUNNING = 'running'
|
|
31
31
|
const GATE_RED = 'red'
|
|
32
|
+
const GATE_MOVED = 'moved'
|
|
32
33
|
|
|
33
|
-
type GateState = typeof GATE_GREEN | typeof GATE_RUNNING | typeof GATE_RED
|
|
34
|
+
type GateState = typeof GATE_GREEN | typeof GATE_RUNNING | typeof GATE_RED | typeof GATE_MOVED
|
|
34
35
|
|
|
35
|
-
// The
|
|
36
|
-
// `josh gate` writes: a green stamp covering this tree,
|
|
36
|
+
// The four states the join waits on, decided from three readings the steps take of the stamps a real
|
|
37
|
+
// `josh gate` writes: a green stamp covering this tree, the in-flight marker's writer still alive, and
|
|
38
|
+
// a green stamp covering the tree this pair's gate started on.
|
|
37
39
|
// Green wins over running, because a gate that has already recorded green is done however the marker
|
|
38
40
|
// reads; a marker whose writer is gone with no green stamp is a gate that finished red or died, which
|
|
39
41
|
// is the safe direction — the join reports red and the verdict is blocked.
|
|
40
|
-
|
|
42
|
+
//
|
|
43
|
+
// **A gate that finished green on a tree that has since moved is not red** (joshuafolkken/kit#4774): a
|
|
44
|
+
// round-1 reviewer fixing in place moves the tree after the gate recorded green, so the stamp no longer
|
|
45
|
+
// covers it. That is `moved` — still not adoptable, but the gate never failed, and the gate that
|
|
46
|
+
// follows re-runs on the moved tree.
|
|
47
|
+
function gate_state(is_green: boolean, is_running: boolean, is_moved = false): GateState {
|
|
41
48
|
if (is_green) return GATE_GREEN
|
|
42
49
|
if (is_running) return GATE_RUNNING
|
|
50
|
+
if (is_moved) return GATE_MOVED
|
|
43
51
|
|
|
44
52
|
return GATE_RED
|
|
45
53
|
}
|
|
46
54
|
|
|
55
|
+
// The `--join` exit code of a `moved` gate, read by `josh ship` (`run-ship-review-steps.ts`).
|
|
56
|
+
const MOVED_EXIT_CODE = 2
|
|
57
|
+
// The `--join` exit code of an unpinned change the background `test:pinned` found
|
|
58
|
+
// (joshuafolkken/kit#4770). `josh ship` never drains it, whatever the reviewer fixed.
|
|
59
|
+
const UNPINNED_EXIT_CODE = 3
|
|
60
|
+
// `josh ship` opens the interaction brief itself, so its `run:review` opens code's alone.
|
|
61
|
+
const CODE_ONLY_FLAG = '--code-only'
|
|
62
|
+
|
|
47
63
|
function is_gate_settled(state: GateState): boolean {
|
|
48
64
|
return state !== GATE_RUNNING
|
|
49
65
|
}
|
|
@@ -100,9 +116,13 @@ function format_timing(timing: ReviewTiming): string {
|
|
|
100
116
|
const run_review = {
|
|
101
117
|
ADOPT,
|
|
102
118
|
BLOCKED,
|
|
119
|
+
CODE_ONLY_FLAG,
|
|
103
120
|
GATE_GREEN,
|
|
121
|
+
GATE_MOVED,
|
|
104
122
|
GATE_RED,
|
|
105
123
|
GATE_RUNNING,
|
|
124
|
+
MOVED_EXIT_CODE,
|
|
125
|
+
UNPINNED_EXIT_CODE,
|
|
106
126
|
adopt_verdict,
|
|
107
127
|
format_timing,
|
|
108
128
|
gate_state,
|
|
@@ -115,4 +135,4 @@ export type { AdoptVerdict, GateState, ReviewTiming, TimingStart }
|
|
|
115
135
|
// object their literal types widen to `string`, so a test passing `run_review.GATE_RED` to a
|
|
116
136
|
// `GateState` parameter would not type-check — the same reason `run-liveness.ts` exports its verdicts
|
|
117
137
|
// by name.
|
|
118
|
-
export { GATE_GREEN, GATE_RED, GATE_RUNNING, run_review }
|
|
138
|
+
export { GATE_GREEN, GATE_MOVED, GATE_RED, GATE_RUNNING, run_review }
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import { CONTEXT_CUT_THRESHOLD } from '#scripts/cost-runtime/context-cut-threshold'
|
|
2
1
|
import { cost_cli, type CostVerdict } from '#scripts/cost-runtime/cost-cli'
|
|
3
2
|
import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
|
|
4
3
|
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
5
4
|
import { error_text } from '#scripts/lib/error-message'
|
|
6
|
-
import { figure_format } from '#scripts/lib/figure-format'
|
|
7
5
|
import { implementation_cut_verdict } from '#scripts/rules/implementation-cut-verdict'
|
|
8
6
|
import type { RunCarry } from '#scripts/run/carry/run-carry'
|
|
9
7
|
import { run_headless } from './run-headless'
|
|
@@ -50,10 +48,11 @@ function current_state(): ParentCutState {
|
|
|
50
48
|
}
|
|
51
49
|
}
|
|
52
50
|
|
|
53
|
-
|
|
51
|
+
// Named by its command, never spelled: the threshold is priced at the session's own model.
|
|
52
|
+
const THRESHOLD_TEXT = '`pnpm josh cost --cut`'
|
|
54
53
|
|
|
55
54
|
const PARENT_CUT_REASON =
|
|
56
|
-
'⛔ backlogrun parent hand-off: this session drives a `backlogrun` and its recent
|
|
55
|
+
'⛔ backlogrun parent hand-off: this session drives a `backlogrun` and its recent context ' +
|
|
57
56
|
`crossed the ${THRESHOLD_TEXT} threshold between merges. Take the hand-off now: open no new lane, ` +
|
|
58
57
|
'follow `backlogrun-progress.md` → "The hand-off" (`pnpm josh run:carry --cut --owner "$PPID"`, then ' +
|
|
59
58
|
'`pnpm josh run:wake` unless `capped`) and end the turn. Reissue this call once done or if it ' +
|
package/scripts/run/run-prep.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { issue_state } from '#scripts/issue/issue-state'
|
|
2
2
|
import { issue_state_cli, type StateRead } from '#scripts/issue/issue-state-cli'
|
|
3
3
|
import { run_halfrun_resume } from './run-halfrun-resume'
|
|
4
4
|
import { run_prrun_resume, type PrrunToken } from './run-prrun-resume'
|
|
@@ -23,10 +23,6 @@ function is_closed(read: StateRead): boolean {
|
|
|
23
23
|
return read.kind === 'state' && read.state.state === CLOSED
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
function is_planned(read: StateRead): boolean {
|
|
27
|
-
return read.kind === 'state' && has_label_name(read.state.labels, PLANNED_LABEL)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
26
|
// The two stops are one hold record, so at most one is present; the `prrun` one is asked only when the
|
|
31
27
|
// `halfrun` one is not, which spares its pull-request read.
|
|
32
28
|
async function read_stop(
|
|
@@ -50,7 +46,7 @@ async function read_stage(issue: string): Promise<StageRead> {
|
|
|
50
46
|
is_closed: is_closed(issue_read),
|
|
51
47
|
is_prrun_stopped: stop.prrun_token !== undefined,
|
|
52
48
|
is_halfrun_stopped: stop.is_halfrun_stopped,
|
|
53
|
-
is_planned: is_planned(issue_read),
|
|
49
|
+
is_planned: issue_state.is_planned(issue_read),
|
|
54
50
|
})
|
|
55
51
|
|
|
56
52
|
return { state, prrun_token: stop.prrun_token }
|
|
@@ -14,6 +14,7 @@ import { run_prep, type PrepParts } from './run-prep'
|
|
|
14
14
|
import { run_prep_cli } from './run-prep-cli'
|
|
15
15
|
import { run_retrospective } from './run-retrospective'
|
|
16
16
|
import { run_step, type ParentInput, type StepInput } from './run-step'
|
|
17
|
+
import { run_step_lane_plan } from './run-step-lane-plan'
|
|
17
18
|
import { run_step_section } from './run-step-section'
|
|
18
19
|
|
|
19
20
|
// `josh run:step [<N>]` — print the run's next single action, followed by the section that governs it
|
|
@@ -165,11 +166,22 @@ async function run_parent(): Promise<number> {
|
|
|
165
166
|
return FAILURE_EXIT_CODE
|
|
166
167
|
}
|
|
167
168
|
|
|
168
|
-
|
|
169
|
+
// The action line, then — under `implement` — the `lane:plan` a lane child runs before its first edit.
|
|
170
|
+
// Only `implement` reads it, so no other step pays for the plan comment's request.
|
|
171
|
+
async function action_lines(input: StepInput, line: string): Promise<ReadonlyArray<string>> {
|
|
172
|
+
if (line !== run_step.IMPLEMENT) return [line]
|
|
173
|
+
const next = await run_step_lane_plan.line_for(input.issue_number, input.is_lane_child)
|
|
174
|
+
|
|
175
|
+
return next === undefined ? [line] : [line, next]
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
async function report({ input, ship_problems }: Gathered): Promise<number> {
|
|
169
179
|
const action = run_step.next_action(input)
|
|
170
180
|
|
|
171
|
-
|
|
172
|
-
|
|
181
|
+
const lines = await action_lines(input, action.line)
|
|
182
|
+
|
|
183
|
+
for (const line of lines) console.info(line)
|
|
184
|
+
// On stderr, so stdout stays the action lines and their rule: what `josh ship` would
|
|
173
185
|
// refuse on is said at every step, while it is still cheap to meet.
|
|
174
186
|
if (ship_problems.length > 0) console.error(run_prep.ship_body(ship_problems))
|
|
175
187
|
|
|
@@ -177,7 +189,7 @@ function report({ input, ship_problems }: Gathered): number {
|
|
|
177
189
|
// same failure, so a position missing its issue state is never read as a confident next step.
|
|
178
190
|
if (input.state === undefined) return FAILURE_EXIT_CODE
|
|
179
191
|
|
|
180
|
-
return run_step_section.print_for(action)
|
|
192
|
+
return run_step_section.print_for(action, input.is_lane_child)
|
|
181
193
|
}
|
|
182
194
|
|
|
183
195
|
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
@@ -191,7 +203,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
191
203
|
return FAILURE_EXIT_CODE
|
|
192
204
|
}
|
|
193
205
|
|
|
194
|
-
return report(await gather(issue_number))
|
|
206
|
+
return await report(await gather(issue_number))
|
|
195
207
|
}
|
|
196
208
|
|
|
197
209
|
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { backlog_plan_comment } from '#scripts/backlog/backlog-plan-comment'
|
|
2
|
+
import { lane_plan } from '#scripts/lane/lane-plan'
|
|
3
|
+
import { shell_quote } from '#scripts/lib/shell-quote'
|
|
4
|
+
|
|
5
|
+
// The `lane:plan` command a lane child runs before its first edit — `lane-plan-guard.ts` refuses that
|
|
6
|
+
// edit until the plan is cleared. joshuafolkken/kit#4910's child retried a refused Edit eight times
|
|
7
|
+
// before it ran `lane:plan`, since nothing it read named the step first (joshuafolkken/kit#4923).
|
|
8
|
+
// The paths are its plan comment's; with none, the child names its own.
|
|
9
|
+
|
|
10
|
+
const PATH_PLACEHOLDER = '<path>...'
|
|
11
|
+
|
|
12
|
+
// The command to print under `implement`, or `undefined` when not a lane child or its plan is cleared.
|
|
13
|
+
async function line_for(issue_number: string, is_lane_child: boolean): Promise<string | undefined> {
|
|
14
|
+
const issue = Number(issue_number)
|
|
15
|
+
|
|
16
|
+
if (!is_lane_child || !lane_plan.is_uncleared(issue, process.cwd())) return undefined
|
|
17
|
+
|
|
18
|
+
const paths = await backlog_plan_comment.plan_paths(issue)
|
|
19
|
+
const named =
|
|
20
|
+
paths.length === 0 ? PATH_PLACEHOLDER : paths.map((path) => shell_quote.word(path)).join(' ')
|
|
21
|
+
|
|
22
|
+
return `pnpm josh lane:plan ${issue_number} ${named}`
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const run_step_lane_plan = { line_for }
|
|
26
|
+
|
|
27
|
+
export { run_step_lane_plan }
|
|
@@ -27,7 +27,8 @@ function reference(document: string, heading: string): SectionReference {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
// The gate's chain governs both the implementation it follows and a stopped ship's report.
|
|
30
|
-
const
|
|
30
|
+
const CHAIN_RULE = 'chain-rule.md'
|
|
31
|
+
const CHAIN = reference(CHAIN_RULE, 'Run the review-to-merge chain')
|
|
31
32
|
const PROGRESS = 'backlogrun-progress.md'
|
|
32
33
|
|
|
33
34
|
// Keyed on a verdict token, or on the josh subcommand a command action runs. An action with no row —
|
|
@@ -47,6 +48,17 @@ const GOVERNING_SECTIONS: ReadonlyMap<string, SectionReference> = new Map([
|
|
|
47
48
|
['run:carry', reference(PROGRESS, 'The hand-off')],
|
|
48
49
|
])
|
|
49
50
|
|
|
51
|
+
// **A lane child reads its own step of the chain, never the whole of it** (joshuafolkken/kit#5016):
|
|
52
|
+
// the chain's step 1 opens with `josh main:merge`, which a lane child leaves to ship's sync, and a
|
|
53
|
+
// child handed the whole section ran it, moving the tree its scoped pair was green on. The step is
|
|
54
|
+
// the chain's labelled step 0, cited where it stands, so it is written once; it ends at the sibling
|
|
55
|
+
// item `1.`, so a blank line inside it would cut it short. A stopped ship's report reads it too.
|
|
56
|
+
const LANE_CHILD_STEP = reference(CHAIN_RULE, 'A lane child')
|
|
57
|
+
const LANE_CHILD_SECTIONS: ReadonlyMap<string, SectionReference> = new Map([
|
|
58
|
+
[run_step.IMPLEMENT, LANE_CHILD_STEP],
|
|
59
|
+
['ship', LANE_CHILD_STEP],
|
|
60
|
+
])
|
|
61
|
+
|
|
50
62
|
function key_of(action: StepAction): string {
|
|
51
63
|
if (action.kind !== 'command') return action.line
|
|
52
64
|
|
|
@@ -55,27 +67,34 @@ function key_of(action: StepAction): string {
|
|
|
55
67
|
return subcommand
|
|
56
68
|
}
|
|
57
69
|
|
|
58
|
-
function section_for(key: string): SectionReference | undefined {
|
|
59
|
-
|
|
70
|
+
function section_for(key: string, is_lane_child: boolean): SectionReference | undefined {
|
|
71
|
+
const lane_child_section = is_lane_child ? LANE_CHILD_SECTIONS.get(key) : undefined
|
|
72
|
+
|
|
73
|
+
return lane_child_section ?? GOVERNING_SECTIONS.get(key)
|
|
60
74
|
}
|
|
61
75
|
|
|
62
76
|
// Printed through `doc:section` itself, so the extent, the Bash-cap split and the refusal of an
|
|
63
77
|
// unresolved heading are that command's, never a second copy of them.
|
|
64
|
-
function print_section(key: string, root: string = process.cwd()): number {
|
|
65
|
-
const found = section_for(key)
|
|
78
|
+
function print_section(key: string, root: string = process.cwd(), is_lane_child = false): number {
|
|
79
|
+
const found = section_for(key, is_lane_child)
|
|
66
80
|
|
|
67
81
|
if (found === undefined) return SUCCESS_EXIT_CODE
|
|
68
82
|
|
|
69
83
|
return document_section_cli.run([found.document, found.heading], root)
|
|
70
84
|
}
|
|
71
85
|
|
|
72
|
-
function print_for(
|
|
73
|
-
|
|
86
|
+
function print_for(
|
|
87
|
+
action: StepAction,
|
|
88
|
+
is_lane_child = false,
|
|
89
|
+
root: string = process.cwd(),
|
|
90
|
+
): number {
|
|
91
|
+
return print_section(key_of(action), root, is_lane_child)
|
|
74
92
|
}
|
|
75
93
|
|
|
76
94
|
const run_step_section = {
|
|
77
95
|
ENTRY,
|
|
78
96
|
GOVERNING_SECTIONS,
|
|
97
|
+
LANE_CHILD_SECTIONS,
|
|
79
98
|
key_of,
|
|
80
99
|
print_for,
|
|
81
100
|
print_section,
|
package/scripts/run/run-step.ts
CHANGED
|
@@ -156,10 +156,13 @@ const KIND = run_event_stream.EVENT_KIND
|
|
|
156
156
|
const OFFER_BACKLOG = 'pnpm josh backlog:next'
|
|
157
157
|
const EVENT_ACTIONS: Record<string, (issue_number: string) => StepAction> = {
|
|
158
158
|
[KIND.PR_OPENED]: () => command('pnpm josh followup'),
|
|
159
|
-
[KIND.REVIEW_ROUND]: () =>
|
|
159
|
+
[KIND.REVIEW_ROUND]: (issue_number) =>
|
|
160
|
+
command(`pnpm josh review:round2 --record ${issue_number}`),
|
|
160
161
|
[KIND.MERGE]: merge_command,
|
|
161
162
|
[KIND.OUTAGE]: merge_command,
|
|
162
163
|
[KIND.PARK]: () => command(OFFER_BACKLOG),
|
|
164
|
+
// The child was released; `backlog:drive` holds the next launch until the limit resets.
|
|
165
|
+
[KIND.USAGE_LIMIT]: () => command(OFFER_BACKLOG),
|
|
163
166
|
[KIND.CUT]: (issue_number) => command(`pnpm josh run:cut --resume ${issue_number}`),
|
|
164
167
|
// A stall is undispatched ready work with a free lane, so its next step is exactly a park's: offer
|
|
165
168
|
// the backlog. The detector only reports the stall; reading it here as a dispatch is what turns the
|
|
@@ -177,7 +180,7 @@ const EVENT_ACTIONS: Record<string, (issue_number: string) => StepAction> = {
|
|
|
177
180
|
// budget command — a child that ran it would read the `busy` it got back as a competing session and
|
|
178
181
|
// park its Issue unimplemented. A merge or an outage is the parent's to classify, so a child at one
|
|
179
182
|
// has nothing to run and stops rather than being handed `run:merge`.
|
|
180
|
-
const PARENT_ONLY_EVENTS: ReadonlySet<string> = new Set([KIND.MERGE, KIND.OUTAGE])
|
|
183
|
+
const PARENT_ONLY_EVENTS: ReadonlySet<string> = new Set([KIND.MERGE, KIND.OUTAGE, KIND.USAGE_LIMIT])
|
|
181
184
|
|
|
182
185
|
// A stopped run's last owed step is the end-of-run retrospective. When it is not owed the position stops
|
|
183
186
|
// with no command to run.
|
|
@@ -21,6 +21,7 @@ const TRAILING_ISSUE_PATTERN = /#([1-9]\d*)\s*$/u
|
|
|
21
21
|
// shell-body-safe `--notify-message-file` a body naming a command or path must use (`followup.md`).
|
|
22
22
|
const NOTIFY_OPTIONS = ['notify-message', 'notify-message-file'] as const
|
|
23
23
|
const { BODY_FILE_OPTION, body_arguments } = run_ship_body_draft
|
|
24
|
+
const UNPINNED_OK_OPTION = 'unpinned-ok'
|
|
24
25
|
|
|
25
26
|
type NotifyValues = Partial<Record<(typeof NOTIFY_OPTIONS)[number], string>>
|
|
26
27
|
|
|
@@ -35,6 +36,8 @@ const OPTIONS = {
|
|
|
35
36
|
detach: { type: 'boolean' },
|
|
36
37
|
log: { type: 'string' },
|
|
37
38
|
cite: { type: 'string', multiple: true },
|
|
39
|
+
// Forwarded to round 1's `run:review`, the only way past a change no test can pin under `--review`.
|
|
40
|
+
[UNPINNED_OK_OPTION]: { type: 'string' },
|
|
38
41
|
} as const
|
|
39
42
|
|
|
40
43
|
type ShipCommand = { kind: 'ship'; args: ShipArguments } | { kind: 'log'; number: string }
|
|
@@ -59,6 +62,20 @@ interface ParsedValues extends NotifyValues {
|
|
|
59
62
|
detach?: boolean
|
|
60
63
|
log?: string
|
|
61
64
|
cite?: Array<string>
|
|
65
|
+
[UNPINNED_OK_OPTION]?: string
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function unpinned_arguments(reason: string | undefined): ReadonlyArray<string> {
|
|
69
|
+
return reason === undefined ? [] : [`--${UNPINNED_OK_OPTION}`, reason]
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// `--unpinned-ok` answers round 1's `run:review` alone, so without `--review` or with a blank reason it
|
|
73
|
+
// would reach nothing that reads it — refused here rather than after the earlier stages have run.
|
|
74
|
+
function is_stray_unpinned_ok(values: ParsedValues): boolean {
|
|
75
|
+
const reason = values[UNPINNED_OK_OPTION]
|
|
76
|
+
if (reason === undefined) return false
|
|
77
|
+
|
|
78
|
+
return values.review !== true || reason.trim() === ''
|
|
62
79
|
}
|
|
63
80
|
|
|
64
81
|
// A follow-up citation passed as a trailing positional is a bare issue number, so a stray flag is
|
|
@@ -84,6 +101,7 @@ function ship_args(
|
|
|
84
101
|
cites,
|
|
85
102
|
is_review: values.review === true,
|
|
86
103
|
is_detach: values.detach === true,
|
|
104
|
+
unpinned_ok: unpinned_arguments(values[UNPINNED_OK_OPTION]),
|
|
87
105
|
}
|
|
88
106
|
}
|
|
89
107
|
|
|
@@ -99,6 +117,7 @@ function command_of(
|
|
|
99
117
|
positionals: ReadonlyArray<string>,
|
|
100
118
|
): ShipCommand | undefined {
|
|
101
119
|
if (values.log !== undefined) return log_command(values.log, positionals)
|
|
120
|
+
if (is_stray_unpinned_ok(values)) return undefined
|
|
102
121
|
|
|
103
122
|
const title = positionals[FIRST]
|
|
104
123
|
const args =
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
2
|
+
import {
|
|
3
|
+
lane_session_action,
|
|
4
|
+
type BrokerAnswer,
|
|
5
|
+
type ReviewRound,
|
|
6
|
+
} from '#scripts/lane/lane-session-action'
|
|
7
|
+
import { lane_session_broker } from '#scripts/lane/lane-session-broker'
|
|
8
|
+
import { review_attest, type ReviewSlot } from '#scripts/review/review-attest'
|
|
9
|
+
|
|
10
|
+
// A lane child's reviewers started by the lane's broker (`run-ship-reviewer.ts`). `/code-review` alone
|
|
11
|
+
// omits `slots`, so a broker still on the code before them reads the request.
|
|
12
|
+
//
|
|
13
|
+
// **A broker that cannot read `slots` still reviews every slot**: the supervisor reloads on new code
|
|
14
|
+
// only at its next pass boundary (`run-wake-code.ts`), so the ship that first runs both reviews together
|
|
15
|
+
// meets a broker that never learned them (joshuafolkken/kit#4672). Each slot then goes in turn as a
|
|
16
|
+
// `/code-review` request — its brief staged at the code slot's file, its findings moved to its own — and
|
|
17
|
+
// the code slot goes last, with its own brief put back.
|
|
18
|
+
|
|
19
|
+
const { CODE } = review_attest.REVIEW_SLOT
|
|
20
|
+
|
|
21
|
+
function copy_stamp(source: string, target: string): void {
|
|
22
|
+
const text = stamp_file.read_stamp_text(source)
|
|
23
|
+
|
|
24
|
+
if (text !== undefined) stamp_file.write_text_stamp(target, text)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function code_request(
|
|
28
|
+
directory: string,
|
|
29
|
+
issue: string,
|
|
30
|
+
round: ReviewRound,
|
|
31
|
+
): Promise<BrokerAnswer> {
|
|
32
|
+
return await lane_session_broker.request(directory, issue, { kind: 'review', round })
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async function staged_review(
|
|
36
|
+
directory: string,
|
|
37
|
+
issue: string,
|
|
38
|
+
round: ReviewRound,
|
|
39
|
+
slot: ReviewSlot,
|
|
40
|
+
): Promise<BrokerAnswer> {
|
|
41
|
+
const code = lane_session_broker.review_paths(directory)
|
|
42
|
+
const own = lane_session_broker.review_paths(directory, slot)
|
|
43
|
+
|
|
44
|
+
copy_stamp(own.brief, code.brief)
|
|
45
|
+
const answer = await code_request(directory, issue, round)
|
|
46
|
+
|
|
47
|
+
copy_stamp(code.findings, own.findings)
|
|
48
|
+
stamp_file.remove_stamp(code.findings)
|
|
49
|
+
|
|
50
|
+
return answer
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// One after another, since every slot shares the code slot's files.
|
|
54
|
+
async function staged_reviews(
|
|
55
|
+
directory: string,
|
|
56
|
+
issue: string,
|
|
57
|
+
round: ReviewRound,
|
|
58
|
+
slots: ReadonlyArray<ReviewSlot>,
|
|
59
|
+
): Promise<ReadonlyArray<BrokerAnswer>> {
|
|
60
|
+
const [slot, ...rest] = slots
|
|
61
|
+
if (slot === undefined) return []
|
|
62
|
+
|
|
63
|
+
const answer = await staged_review(directory, issue, round, slot)
|
|
64
|
+
|
|
65
|
+
return [answer, ...(await staged_reviews(directory, issue, round, rest))]
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async function in_turn(
|
|
69
|
+
directory: string,
|
|
70
|
+
issue: string,
|
|
71
|
+
round: ReviewRound,
|
|
72
|
+
slots: ReadonlyArray<ReviewSlot>,
|
|
73
|
+
): Promise<BrokerAnswer> {
|
|
74
|
+
const code_brief = lane_session_broker.review_paths(directory).brief
|
|
75
|
+
const kept = stamp_file.read_stamp_text(code_brief)
|
|
76
|
+
const others = slots.filter((slot) => slot !== CODE)
|
|
77
|
+
const answers = [...(await staged_reviews(directory, issue, round, others))]
|
|
78
|
+
|
|
79
|
+
if (kept !== undefined) stamp_file.write_text_stamp(code_brief, kept)
|
|
80
|
+
if (slots.includes(CODE)) answers.push(await code_request(directory, issue, round))
|
|
81
|
+
|
|
82
|
+
return answers.find((answer) => !answer.is_success) ?? lane_session_action.SUCCESS
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async function request(
|
|
86
|
+
directory: string,
|
|
87
|
+
issue: string,
|
|
88
|
+
round: ReviewRound,
|
|
89
|
+
slots: ReadonlyArray<ReviewSlot>,
|
|
90
|
+
): Promise<BrokerAnswer> {
|
|
91
|
+
if (slots.length === 1 && slots[0] === CODE) return await code_request(directory, issue, round)
|
|
92
|
+
|
|
93
|
+
const answer = await lane_session_broker.request(directory, issue, {
|
|
94
|
+
kind: 'review',
|
|
95
|
+
round,
|
|
96
|
+
slots,
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
if (!lane_session_broker.is_unreadable(answer)) return answer
|
|
100
|
+
|
|
101
|
+
return await in_turn(directory, issue, round, slots)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const run_ship_brokered_review = { request }
|
|
105
|
+
|
|
106
|
+
export { run_ship_brokered_review }
|