@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
|
@@ -13,6 +13,8 @@ import {
|
|
|
13
13
|
type TelegramTaskType,
|
|
14
14
|
} from '#scripts/notify/telegram-notify'
|
|
15
15
|
import { followup_checks_event } from './followup-checks-event'
|
|
16
|
+
import { followup_ci_path } from './followup-ci-path'
|
|
17
|
+
import { followup_coderabbit_retrigger, type Settled } from './followup-coderabbit-retrigger'
|
|
16
18
|
import { followup_coderabbit_wait } from './followup-coderabbit-wait'
|
|
17
19
|
import { git_followup_merged } from './git-followup-merged'
|
|
18
20
|
import { git_followup_pending } from './git-followup-pending'
|
|
@@ -123,6 +125,13 @@ interface RunContext {
|
|
|
123
125
|
context: TelegramContext
|
|
124
126
|
}
|
|
125
127
|
|
|
128
|
+
type CompletionSend = () => Promise<void>
|
|
129
|
+
|
|
130
|
+
interface PreparedNotify {
|
|
131
|
+
is_recorded: boolean
|
|
132
|
+
send: CompletionSend
|
|
133
|
+
}
|
|
134
|
+
|
|
126
135
|
// **The four reads in front of the check wait are issued together**. Not one
|
|
127
136
|
// of them is a wait on anything: the `closes #N` check reads the pull request body, and the
|
|
128
137
|
// notification needs the repository name, the issue title and the pull request URL — four requests
|
|
@@ -165,31 +174,33 @@ async function read_run_context(input: {
|
|
|
165
174
|
// The pending count replaces the project version line: children no longer
|
|
166
175
|
// bump, so the local `package.json` names the previous release rather than what this run ships.
|
|
167
176
|
// A count that could not be read contributes no line at all, rather than a zero nobody measured.
|
|
168
|
-
|
|
177
|
+
//
|
|
178
|
+
// **The body is read here, the send is returned** (#5080): the send goes out beside the merge, but the
|
|
179
|
+
// pending count is read off `origin`'s default branch, and a fetch that landed after the merge would
|
|
180
|
+
// count this pull request under a line that says it is not counted.
|
|
181
|
+
async function completion_sender(
|
|
169
182
|
context: TelegramContext,
|
|
170
183
|
skip_notes: ReadonlyArray<string>,
|
|
171
184
|
is_merge_pending: boolean,
|
|
172
|
-
): Promise<
|
|
185
|
+
): Promise<CompletionSend> {
|
|
173
186
|
const pending_line = await git_followup_pending.pending_release_line({ is_merge_pending })
|
|
174
187
|
const lines = pending_line === undefined ? skip_notes : [pending_line, ...skip_notes]
|
|
175
|
-
const
|
|
188
|
+
const input = build_telegram_input({ task_type: 'completion', context, body: lines.join('\n') })
|
|
176
189
|
|
|
177
|
-
// **The tolerant send**: this runs
|
|
178
|
-
//
|
|
179
|
-
// under `❗` and the run carries on.
|
|
190
|
+
// **The tolerant send**: this runs beside the merge, so a Telegram gateway timeout must not leave a
|
|
191
|
+
// reviewed, green pull request unmerged. The failure is reported under `❗` and the run carries on.
|
|
180
192
|
//
|
|
181
193
|
// **No recovery line**, deliberately, in the same sense `git_followup_cleanup`'s epic-close step
|
|
182
194
|
// has none: a completion notification is never re-sent by hand — `pnpm josh notify --task-type
|
|
183
195
|
// completion` is prohibited because it populates no PR link — and re-running `followup` after the
|
|
184
196
|
// merge is not a re-send either. Naming either would send the reader somewhere useless.
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
)
|
|
197
|
+
return async function send_completion(): Promise<void> {
|
|
198
|
+
await telegram_notify.send_or_report(input, undefined)
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
async function send_nothing(): Promise<void> {
|
|
203
|
+
// A completion already on record is not sent again.
|
|
193
204
|
}
|
|
194
205
|
|
|
195
206
|
// The two comment scans, marked separately from the check wait because they answer a different
|
|
@@ -248,14 +259,38 @@ function wait_for_green_of(
|
|
|
248
259
|
return await run_checks({
|
|
249
260
|
branch_name: input.branch_name,
|
|
250
261
|
is_skip_watch: input.is_skip_watch,
|
|
251
|
-
observe: followup_coderabbit_wait.
|
|
262
|
+
observe: followup_coderabbit_wait.all(
|
|
252
263
|
followup_checks_event.observer_of(issue_number, context.pr_url),
|
|
253
264
|
followup_coderabbit_wait.observer_of(log.coderabbit),
|
|
265
|
+
followup_ci_path.observer_of(log.ci_path),
|
|
254
266
|
),
|
|
255
267
|
})
|
|
256
268
|
}
|
|
257
269
|
}
|
|
258
270
|
|
|
271
|
+
// **The `checks-wait` lap ends at the first green**, so the `ci-wait` row holds the checks alone; a
|
|
272
|
+
// rate-limited CodeRabbit retriggered after it is a lap of its own (joshuafolkken/kit#5289).
|
|
273
|
+
async function wait_for_review_green(
|
|
274
|
+
input: FollowupInput,
|
|
275
|
+
context: TelegramContext,
|
|
276
|
+
issue_number: string | undefined,
|
|
277
|
+
log: StageLog,
|
|
278
|
+
): Promise<Settled<PrStateSnapshot>> {
|
|
279
|
+
const wait_for_green = wait_for_green_of(input, context, issue_number, log)
|
|
280
|
+
const checked = await wait_for_green()
|
|
281
|
+
|
|
282
|
+
lap(log, STAGE.checks_wait)
|
|
283
|
+
const settled = await followup_coderabbit_retrigger.settle(
|
|
284
|
+
checked,
|
|
285
|
+
wait_for_green,
|
|
286
|
+
input.branch_name,
|
|
287
|
+
log.coderabbit,
|
|
288
|
+
)
|
|
289
|
+
if (settled.is_retriggered) lap(log, STAGE.coderabbit_retrigger)
|
|
290
|
+
|
|
291
|
+
return settled
|
|
292
|
+
}
|
|
293
|
+
|
|
259
294
|
async function run_review_checks(
|
|
260
295
|
input: FollowupInput,
|
|
261
296
|
context: TelegramContext,
|
|
@@ -264,13 +299,12 @@ async function run_review_checks(
|
|
|
264
299
|
): Promise<ReviewChecks> {
|
|
265
300
|
if (input.is_merged === true) return { notes: [], managed: [] }
|
|
266
301
|
|
|
302
|
+
git_followup_stages.hold_issue(log, issue_number)
|
|
267
303
|
const managed = await git_pr_managed_config.handle_managed_config_changes({
|
|
268
304
|
should_merge: input.should_merge,
|
|
269
305
|
})
|
|
270
|
-
const snapshot = await
|
|
271
|
-
|
|
272
|
-
lap(log, STAGE.checks_wait)
|
|
273
|
-
const check_notes = read_coderabbit_skip_notes(snapshot)
|
|
306
|
+
const { snapshot, notes } = await wait_for_review_green(input, context, issue_number, log)
|
|
307
|
+
const check_notes = [...notes, ...read_coderabbit_skip_notes(snapshot)]
|
|
274
308
|
|
|
275
309
|
log_skip_notes(check_notes)
|
|
276
310
|
const scan_notes = await run_comment_scans(input, context, log)
|
|
@@ -280,22 +314,23 @@ async function run_review_checks(
|
|
|
280
314
|
|
|
281
315
|
// **A tail re-run after a merge does not report twice**: where the issue
|
|
282
316
|
// already carries this pull request's completion report, the Telegram is skipped here and the comment
|
|
283
|
-
// in the wrapup. Answers whether it was recorded, so the wrapup skips on the same read
|
|
284
|
-
|
|
317
|
+
// in the wrapup. Answers whether it was recorded, so the wrapup skips on the same read, and the send
|
|
318
|
+
// the wrapup issues beside the merge.
|
|
319
|
+
async function prepare_notify(
|
|
285
320
|
input: FollowupInput,
|
|
286
321
|
issue_number: string | undefined,
|
|
287
322
|
context: TelegramContext,
|
|
288
323
|
checks: { notes: Array<string> },
|
|
289
|
-
): Promise<
|
|
324
|
+
): Promise<PreparedNotify> {
|
|
290
325
|
const is_recorded = await git_followup_merged.is_completion_recorded({
|
|
291
326
|
merged_at: input.is_merged === true ? input.merged_at : undefined,
|
|
292
327
|
issue_number,
|
|
293
328
|
pr_url: context.pr_url,
|
|
294
329
|
})
|
|
295
330
|
|
|
296
|
-
if (
|
|
331
|
+
if (is_recorded) return { is_recorded, send: send_nothing }
|
|
297
332
|
|
|
298
|
-
return is_recorded
|
|
333
|
+
return { is_recorded, send: await completion_sender(context, checks.notes, input.should_merge) }
|
|
299
334
|
}
|
|
300
335
|
|
|
301
336
|
// **Answers with the issue number the run actually used**, which is the one
|
|
@@ -308,9 +343,8 @@ async function run_stages(input: FollowupInput, log: StageLog): Promise<string |
|
|
|
308
343
|
|
|
309
344
|
lap(log, STAGE.closes_and_context)
|
|
310
345
|
const checks = await run_review_checks(input, context, log, issue_number)
|
|
311
|
-
const
|
|
346
|
+
const notify = await prepare_notify(input, issue_number, context, checks)
|
|
312
347
|
|
|
313
|
-
lap(log, STAGE.telegram)
|
|
314
348
|
await git_pr_followup_wrapup.run_wrapup(
|
|
315
349
|
{
|
|
316
350
|
branch_name: input.branch_name,
|
|
@@ -321,7 +355,8 @@ async function run_stages(input: FollowupInput, log: StageLog): Promise<string |
|
|
|
321
355
|
should_merge: input.should_merge,
|
|
322
356
|
managed_notes: checks.managed,
|
|
323
357
|
is_merged: input.is_merged,
|
|
324
|
-
is_completion_recorded,
|
|
358
|
+
is_completion_recorded: notify.is_recorded,
|
|
359
|
+
send_completion: notify.send,
|
|
325
360
|
checked: checks.snapshot,
|
|
326
361
|
wait_for_green: wait_for_green_of(input, context, issue_number, log),
|
|
327
362
|
},
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { shell_quote } from '#scripts/lib/shell-quote'
|
|
1
2
|
import type { Scenario } from './fresh-machine-spec'
|
|
2
3
|
|
|
3
4
|
// The script one container runs. Every command is printed before it runs and its exit status after,
|
|
@@ -8,28 +9,23 @@ const SEED_MOUNT = '/seed'
|
|
|
8
9
|
const PACK_MOUNT = '/pack'
|
|
9
10
|
const COPY_SEED = `cp -R ${SEED_MOUNT}/. .`
|
|
10
11
|
const PROBES_HEADING = '# probes — recorded, never failing the run'
|
|
11
|
-
const ESCAPED_QUOTE = String.raw`'\''`
|
|
12
12
|
const PREAMBLE = [
|
|
13
13
|
String.raw`step() { printf '\n$ %s\n' "$1"; eval "$1"; local code=$?; printf '[exit %s]\n' "$code"; return "$code"; }`,
|
|
14
14
|
'mkdir -p "$HOME/$RUN_NAME" && cd "$HOME/$RUN_NAME" || exit 1',
|
|
15
15
|
]
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
const escaped = command.split("'").join(ESCAPED_QUOTE)
|
|
19
|
-
|
|
20
|
-
return `'${escaped}'`
|
|
21
|
-
}
|
|
17
|
+
const { single_quoted } = shell_quote
|
|
22
18
|
|
|
23
19
|
function required(command: string): string {
|
|
24
|
-
return `step ${
|
|
20
|
+
return `step ${single_quoted(command)} || exit $?`
|
|
25
21
|
}
|
|
26
22
|
|
|
27
23
|
function probe_lines(probes: ReadonlyArray<string>): Array<string> {
|
|
28
24
|
if (probes.length === 0) return []
|
|
29
25
|
|
|
30
26
|
return [
|
|
31
|
-
String.raw`printf '\n%s\n' ${
|
|
32
|
-
...probes.map((probe) => `step ${
|
|
27
|
+
String.raw`printf '\n%s\n' ${single_quoted(PROBES_HEADING)}`,
|
|
28
|
+
...probes.map((probe) => `step ${single_quoted(probe)}`),
|
|
33
29
|
]
|
|
34
30
|
}
|
|
35
31
|
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"tail -n 40 \"$(sed -n 's/^backlogrun: started.*; log //p' \"$HOME/backlogrun.out\")\" | cut -c1-400",
|
|
28
28
|
"grep -c 'requires approval' \"$(sed -n 's/^backlogrun: started.*; log //p' \"$HOME/backlogrun.out\")\"",
|
|
29
29
|
"grep -c 'run:carry --begin' \"$(sed -n 's/^backlogrun: started.*; log //p' \"$HOME/backlogrun.out\")\"",
|
|
30
|
-
"tail -n 40 /
|
|
31
|
-
"cat /
|
|
30
|
+
"tail -n 40 \"$(git rev-parse --path-format=absolute --git-common-dir)\"/josh/run-state/josh-lane-dispatch-*.log | cut -c1-400",
|
|
31
|
+
"cat \"$(git rev-parse --path-format=absolute --git-common-dir)\"/josh/run-state/josh-lane-dispatch-*.log | grep -c 'requires approval'",
|
|
32
32
|
"gh pr list --state all"
|
|
33
33
|
]
|
|
34
34
|
}
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
"probes": [
|
|
25
25
|
"tail -n 40 \"$(sed -n 's/^backlogrun: started.*; log //p' \"$HOME/backlogrun.out\")\" | cut -c1-400",
|
|
26
26
|
"grep -c 'requires approval' \"$(sed -n 's/^backlogrun: started.*; log //p' \"$HOME/backlogrun.out\")\"",
|
|
27
|
-
"tail -n 40 /
|
|
28
|
-
"cat /
|
|
27
|
+
"tail -n 40 \"$(git rev-parse --path-format=absolute --git-common-dir)\"/josh/run-state/josh-lane-dispatch-*.log | cut -c1-400",
|
|
28
|
+
"cat \"$(git rev-parse --path-format=absolute --git-common-dir)\"/josh/run-state/josh-lane-dispatch-*.log | grep -c 'requires approval'",
|
|
29
29
|
"gh pr list --state all"
|
|
30
30
|
]
|
|
31
31
|
}
|
|
@@ -52,7 +52,39 @@ function averaged(
|
|
|
52
52
|
return { ...reading, busy_cores: ledger_cores + total / samples.length }
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
// **A wait that does not ease the load gains nothing by going on** (joshuafolkken/kit#4982). On a
|
|
56
|
+
// saturated machine the load never falls, and a claim that waits out the cap only starts at minimum
|
|
57
|
+
// width two minutes late. A wait keeps the lowest mean busy count it has read and when it last fell; a
|
|
58
|
+
// fall under a whole core is noise, not easing.
|
|
59
|
+
const EASE_CORES = 1
|
|
56
60
|
|
|
57
|
-
|
|
61
|
+
interface LoadEase {
|
|
62
|
+
level: number
|
|
63
|
+
eased_at: number
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// `ease` once the mean `busy_cores` read at `now` is added. An unread machine changes nothing, so a wait
|
|
67
|
+
// that cannot read the load is never judged unrelieved.
|
|
68
|
+
function with_ease(
|
|
69
|
+
ease: LoadEase | undefined,
|
|
70
|
+
busy_cores: number | undefined,
|
|
71
|
+
now: number,
|
|
72
|
+
): LoadEase | undefined {
|
|
73
|
+
if (busy_cores === undefined) return ease
|
|
74
|
+
|
|
75
|
+
if (ease === undefined || busy_cores <= ease.level - EASE_CORES) {
|
|
76
|
+
return { level: busy_cores, eased_at: now }
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return ease
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Whether the load has not eased for `window_ms` of the wait.
|
|
83
|
+
function is_unrelieved(ease: LoadEase | undefined, now: number, window_ms: number): boolean {
|
|
84
|
+
return ease !== undefined && now - ease.eased_at >= window_ms
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const busy_average = { AVERAGE_WINDOW_MS, averaged, is_unrelieved, with_ease, with_reading }
|
|
88
|
+
|
|
89
|
+
export type { BusySample, LoadEase }
|
|
58
90
|
export { busy_average }
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
2
|
+
import { run_review_pinned_accepted } from '#scripts/run/review/run-review-pinned-accepted'
|
|
3
|
+
import { run_review_pinned_join } from '#scripts/run/review/run-review-pinned-join'
|
|
4
|
+
import { test_pinned_logic } from '#scripts/test/test-pinned-logic'
|
|
5
|
+
import type { PinnedSummary } from '#scripts/test/test-pinned-record'
|
|
6
|
+
|
|
7
|
+
// **`check:related` prints the `josh test:pinned` verdict it finds already reached on this tree**
|
|
8
|
+
// (joshuafolkken/kit#4971): read only by the ship's pre-detach, it stopped the first `josh ship` on
|
|
9
|
+
// unpinned places, and the ship ran its preflight and pre-detach again once the reason was added.
|
|
10
|
+
// **A check this run started is waited on** (joshuafolkken/kit#4987): one still probing when the four
|
|
11
|
+
// checks ended printed nothing, and the ship stopped on it again. One it did not start is read as it
|
|
12
|
+
// stands, and one on another tree prints nothing here.
|
|
13
|
+
|
|
14
|
+
const SHIP_HINT =
|
|
15
|
+
'Pin each unpinned place above with a test that turns red without it, or give the first ship its reason: `pnpm josh ship "<title> #<N>" --review … --unpinned-ok "<reason>"`.'
|
|
16
|
+
// The wait's bound keeps the four checks plus it under a foreground Bash call's 600-second cap, so the
|
|
17
|
+
// verdict line is never cut off; a check past it is left running for the ship's pre-detach.
|
|
18
|
+
const WAIT_MS = 240_000
|
|
19
|
+
|
|
20
|
+
async function reached(root: string, is_started: boolean): Promise<PinnedSummary | undefined> {
|
|
21
|
+
if (is_started) return await run_review_pinned_join.settled_on_tree(root, WAIT_MS)
|
|
22
|
+
|
|
23
|
+
return await run_review_pinned_join.finished_on_tree(root)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// The unpinned places the ship's pre-detach would stop on, with the `--unpinned-ok` form;
|
|
27
|
+
// `undefined` when no answer is reached on this tree or it stops nothing.
|
|
28
|
+
async function notice(
|
|
29
|
+
root: string = PROJECT_ROOT,
|
|
30
|
+
is_started = false,
|
|
31
|
+
): Promise<string | undefined> {
|
|
32
|
+
const summary = await reached(root, is_started)
|
|
33
|
+
if (summary === undefined) return undefined
|
|
34
|
+
const verdict = await run_review_pinned_accepted.judge(summary, undefined)
|
|
35
|
+
|
|
36
|
+
if (verdict.kind !== 'stop') return undefined
|
|
37
|
+
|
|
38
|
+
return test_pinned_logic.report_text(summary, `${SHIP_HINT}\n`).trimEnd()
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const check_related_pinned = { SHIP_HINT, WAIT_MS, notice }
|
|
42
|
+
|
|
43
|
+
export { check_related_pinned }
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { CheckResult } from './check-related'
|
|
2
|
+
import { check_reuse, type CheckRecords } from './check-reuse'
|
|
3
|
+
import { gate_labels } from './gate-labels'
|
|
4
|
+
import type { GateStepResult } from './gate-report'
|
|
5
|
+
import { gate_tree, type GateTree } from './gate-tree'
|
|
6
|
+
import { scoped_green } from './scoped-green'
|
|
7
|
+
|
|
8
|
+
// **`check:related` runs only the checks whose green record no longer holds** (joshuafolkken/kit#5156):
|
|
9
|
+
// a re-run after fixing one failure ran the three that had passed over again, minutes of a hub-file
|
|
10
|
+
// `test:related` among them. No record is new here. `lint:related` and `test:related` write their own
|
|
11
|
+
// scoped records (`scoped-green.ts`); the type check and cspell read and write the gate's per-check
|
|
12
|
+
// records under the gate's labels (`check-reuse.ts`), so a green from either end serves the other. A
|
|
13
|
+
// failed check writes no record, so it runs again.
|
|
14
|
+
|
|
15
|
+
const GATE_LABELS: ReadonlyMap<string, string> = new Map([
|
|
16
|
+
[gate_labels.TYPE_CHECK_TARGET, gate_labels.TYPE_CHECK_LABEL],
|
|
17
|
+
[gate_labels.SPELL_CHECK_TARGET, gate_labels.SPELL_CHECK_LABEL],
|
|
18
|
+
])
|
|
19
|
+
|
|
20
|
+
const UNREAD_TREE: GateTree = { files: {}, base: undefined }
|
|
21
|
+
|
|
22
|
+
function gate_label(command: string): string {
|
|
23
|
+
return GATE_LABELS.get(command) ?? ''
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// The commands of `commands` whose green record still describes `tree`.
|
|
27
|
+
async function reusable(
|
|
28
|
+
commands: ReadonlyArray<string>,
|
|
29
|
+
tree: GateTree,
|
|
30
|
+
records: CheckRecords = check_reuse.DEFAULT_RECORDS,
|
|
31
|
+
): Promise<ReadonlySet<string>> {
|
|
32
|
+
const scoped = new Set(scoped_green.green_scripts(tree.files, tree.base))
|
|
33
|
+
const gate = await check_reuse.reusable_checks([...GATE_LABELS.values()], tree, records)
|
|
34
|
+
|
|
35
|
+
return new Set(commands.filter((command) => scoped.has(command) || gate.has(gate_label(command))))
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function gate_results(results: ReadonlyArray<CheckResult>): Array<GateStepResult> {
|
|
39
|
+
return results
|
|
40
|
+
.filter((result) => GATE_LABELS.has(result.command))
|
|
41
|
+
.map((result) => ({ ...result, label: gate_label(result.command), elapsed_ms: 0 }))
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Records the green type check and cspell against `tree`, the tree read before they started.
|
|
45
|
+
async function record(
|
|
46
|
+
results: ReadonlyArray<CheckResult>,
|
|
47
|
+
tree: GateTree,
|
|
48
|
+
records: CheckRecords = check_reuse.DEFAULT_RECORDS,
|
|
49
|
+
): Promise<void> {
|
|
50
|
+
await check_reuse.record_green_checks(gate_results(results), tree, records)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// A tree git could not read is one with no answer, so nothing is reused and every check runs.
|
|
54
|
+
async function read_tree(): Promise<GateTree> {
|
|
55
|
+
try {
|
|
56
|
+
return await gate_tree.read_gate_tree()
|
|
57
|
+
} catch {
|
|
58
|
+
return UNREAD_TREE
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const check_related_reuse = { UNREAD_TREE, read_tree, record, reusable }
|
|
63
|
+
|
|
64
|
+
export { check_related_reuse }
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// **Each check prints only its last lines; its whole output is in the log** (joshuafolkken/kit#5204).
|
|
2
|
+
// A `test:related` over hundreds of files printed past 140 KB, past the tool result's size limit, and
|
|
3
|
+
// the run typed the same `check:related` again behind a `grep` only to read the verdict. The end of a
|
|
4
|
+
// section is where a check's own verdict and its failures land, so a passed check keeps its last 5
|
|
5
|
+
// lines and a failed one its last 40; `--full` prints the whole output as before.
|
|
6
|
+
|
|
7
|
+
const PASSED_TAIL_LINES = 5
|
|
8
|
+
const FAILED_TAIL_LINES = 40
|
|
9
|
+
const FULL_FLAG = '--full'
|
|
10
|
+
|
|
11
|
+
interface CheckResult {
|
|
12
|
+
command: string
|
|
13
|
+
exit_code: number
|
|
14
|
+
output: string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function result_status(result: CheckResult): string {
|
|
18
|
+
return result.exit_code === 0 ? 'passed' : `failed (${String(result.exit_code)})`
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function tail_lines(result: CheckResult): ReadonlyArray<string> {
|
|
22
|
+
const lines = result.output.trimEnd().split('\n')
|
|
23
|
+
const count = result.exit_code === 0 ? PASSED_TAIL_LINES : FAILED_TAIL_LINES
|
|
24
|
+
const dropped = lines.length - count
|
|
25
|
+
|
|
26
|
+
if (dropped <= 0) return lines
|
|
27
|
+
|
|
28
|
+
return [`… ${String(dropped)} earlier line(s) in the log`, ...lines.slice(-count)]
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function section_body(result: CheckResult, is_full: boolean): string {
|
|
32
|
+
if (is_full) return result.output.endsWith('\n') ? result.output : `${result.output}\n`
|
|
33
|
+
|
|
34
|
+
return `${tail_lines(result).join('\n')}\n`
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function format_section(result: CheckResult, is_full = false): string {
|
|
38
|
+
const header = `\n=== ${result.command}: ${result_status(result)} ===\n`
|
|
39
|
+
|
|
40
|
+
if (result.output.length === 0) return header
|
|
41
|
+
|
|
42
|
+
return `${header}${section_body(result, is_full)}`
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function is_full_requested(arguments_: ReadonlyArray<string>): boolean {
|
|
46
|
+
return arguments_.includes(FULL_FLAG)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const check_related_section = {
|
|
50
|
+
FAILED_TAIL_LINES,
|
|
51
|
+
format_section,
|
|
52
|
+
is_full_requested,
|
|
53
|
+
result_status,
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export type { CheckResult }
|
|
57
|
+
export { check_related_section }
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
|
|
2
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
3
|
+
import { run_ship_planned, type Unplanned } from '#scripts/run/ship/run-ship-planned'
|
|
4
|
+
|
|
5
|
+
// **`check:related` prints the ship's `unplanned` answer ahead of the ship** (joshuafolkken/kit#5203):
|
|
6
|
+
// asked only by the ship's preflight, a lane learned of a code file its `lane:plan` record never listed
|
|
7
|
+
// after the review and its fixes, and spent the re-plan and a second ship on it. The judgment is the
|
|
8
|
+
// preflight's own (`run-ship-planned.ts`); this run never stops on it — the preflight still does. Each
|
|
9
|
+
// notice printed is recorded, so `lane:stats` tells a preflight `unplanned` stop that came after one apart.
|
|
10
|
+
|
|
11
|
+
// A git read that fails here prints nothing rather than the run's verdict lost — the preflight still
|
|
12
|
+
// asks it, and reports an unreadable read as its own precondition.
|
|
13
|
+
async function read_unplanned(): Promise<Unplanned | undefined> {
|
|
14
|
+
try {
|
|
15
|
+
return await run_ship_planned.unplanned()
|
|
16
|
+
} catch (error) {
|
|
17
|
+
error_text.trace_swallowed('check_related_unplanned.notice', error)
|
|
18
|
+
|
|
19
|
+
return undefined
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async function notice(): Promise<string | undefined> {
|
|
24
|
+
const found = await read_unplanned()
|
|
25
|
+
|
|
26
|
+
if (found === undefined) return undefined
|
|
27
|
+
await lane_ledger_write.record_unplanned_notice({ issue: found.issue, files: [...found.files] })
|
|
28
|
+
|
|
29
|
+
return found.text
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const check_related_unplanned = { notice }
|
|
33
|
+
|
|
34
|
+
export { check_related_unplanned }
|