@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
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
|
|
2
|
+
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
3
|
+
import type { LedgerEntry } from './lane-ledger'
|
|
4
|
+
import { lane_sleep } from './lane-sleep'
|
|
5
|
+
import { lane_spans, type IssueAt, type Span } from './lane-spans'
|
|
6
|
+
import { lane_stage_stats } from './lane-stage-stats'
|
|
7
|
+
import { lane_stop_stats } from './lane-stop-stats'
|
|
8
|
+
import { lane_yield } from './lane-yield'
|
|
9
|
+
|
|
10
|
+
// A lane's net time (joshuafolkken/kit#4749): from its issue's first dispatch to its merge, less the
|
|
11
|
+
// waits no fix in the lane shortens — a park (the issue waits on a person's decision), an outage and a
|
|
12
|
+
// usage-limit stop (joshuafolkken/kit#4745), each until the issue's next ship stage, re-dispatch or
|
|
13
|
+
// another of the two, the wait `josh lane:stats` derives for a stop (`lane-stop-stats.ts`) — and the
|
|
14
|
+
// host's sleeps (joshuafolkken/kit#5032), whatever the issue (`lane-sleep.ts`), and a yield's wait for
|
|
15
|
+
// the issue's next dispatch (joshuafolkken/kit#5216), no lane seat held while the holder runs. A ship
|
|
16
|
+
// stop is not taken out: a relaunched child works through its wait. `josh lane:net` prints it, and a
|
|
17
|
+
// causing-lane line declares it (`issue-priority.ts`).
|
|
18
|
+
|
|
19
|
+
const { EVENT_KIND } = run_event_stream
|
|
20
|
+
|
|
21
|
+
interface LaneSpan {
|
|
22
|
+
from_ms: number
|
|
23
|
+
to_ms: number
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function entries_of(entries: ReadonlyArray<LedgerEntry>, issue: number): Array<LedgerEntry> {
|
|
27
|
+
return entries.filter((entry) => 'issue' in entry && entry.issue === issue)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// The first dispatch of `issue` to its merge, or `undefined` while either is missing or the merge comes
|
|
31
|
+
// first.
|
|
32
|
+
function span_of(entries: ReadonlyArray<LedgerEntry>, issue: number): LaneSpan | undefined {
|
|
33
|
+
const of_issue = entries_of(entries, issue)
|
|
34
|
+
const from = of_issue.find((entry) => lane_stage_stats.is_dispatch(entry))
|
|
35
|
+
const to = of_issue.findLast((entry) => lane_stage_stats.is_merge(entry))
|
|
36
|
+
|
|
37
|
+
if (from === undefined || to === undefined) return undefined
|
|
38
|
+
|
|
39
|
+
const span = { from_ms: Date.parse(from.at), to_ms: Date.parse(to.at) }
|
|
40
|
+
|
|
41
|
+
return span.to_ms < span.from_ms ? undefined : span
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function holds_of(events: ReadonlyArray<RunEvent>): Array<IssueAt> {
|
|
45
|
+
return [
|
|
46
|
+
...lane_stop_stats.events_of(events, EVENT_KIND.PARK),
|
|
47
|
+
...lane_stop_stats.events_of(events, EVENT_KIND.OUTAGE),
|
|
48
|
+
...lane_stop_stats.events_of(events, EVENT_KIND.USAGE_LIMIT),
|
|
49
|
+
]
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// One hold's wait, cut at the merge: a hold nothing ended before it waited until the merge.
|
|
53
|
+
function held_ms(hold: IssueAt, ends: ReadonlyArray<IssueAt>, to_ms: number): number {
|
|
54
|
+
const left_ms = to_ms - hold.at_ms
|
|
55
|
+
|
|
56
|
+
return Math.min(lane_stop_stats.wait_ms(hold, ends) ?? left_ms, left_ms)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function hold_waits(
|
|
60
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
61
|
+
events: ReadonlyArray<RunEvent>,
|
|
62
|
+
issue: number,
|
|
63
|
+
span: LaneSpan,
|
|
64
|
+
): Array<LaneSpan> {
|
|
65
|
+
const holds = holds_of(events)
|
|
66
|
+
const inside = holds.filter(
|
|
67
|
+
(hold) => hold.issue === issue && hold.at_ms >= span.from_ms && hold.at_ms < span.to_ms,
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
return inside.map((hold) => {
|
|
71
|
+
const ends = lane_stop_stats.ends_of(
|
|
72
|
+
entries,
|
|
73
|
+
holds.filter((other) => other.at_ms > hold.at_ms),
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
return { from_ms: hold.at_ms, to_ms: hold.at_ms + held_ms(hold, ends, span.to_ms) }
|
|
77
|
+
})
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// `spans` oldest first with every overlap joined, so a park the host slept through is taken out once.
|
|
81
|
+
function joined(spans: ReadonlyArray<LaneSpan>): Array<LaneSpan> {
|
|
82
|
+
const sorted = spans.toSorted((left, right) => left.from_ms - right.from_ms)
|
|
83
|
+
|
|
84
|
+
const kept: Array<LaneSpan> = []
|
|
85
|
+
|
|
86
|
+
for (const next of sorted) {
|
|
87
|
+
const last = kept.at(-1)
|
|
88
|
+
|
|
89
|
+
if (last === undefined || next.from_ms > last.to_ms) kept.push({ ...next })
|
|
90
|
+
else last.to_ms = Math.max(last.to_ms, next.to_ms)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return kept
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// The host's sleeps (joshuafolkken/kit#5032) cut to `span` and joined: a sleep stops every lane,
|
|
97
|
+
// whatever its issue.
|
|
98
|
+
function slept(events: ReadonlyArray<RunEvent>, span: LaneSpan): Array<LaneSpan> {
|
|
99
|
+
const cut = lane_sleep.spans(events).map((sleep) => ({
|
|
100
|
+
from_ms: Math.max(sleep.from_ms, span.from_ms),
|
|
101
|
+
to_ms: Math.min(sleep.to_ms, span.to_ms),
|
|
102
|
+
}))
|
|
103
|
+
|
|
104
|
+
return joined(cut.filter((sleep) => sleep.to_ms > sleep.from_ms))
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Each yield (`lane:plan` gave the seat back) until its issue's next dispatch, every issue's — the
|
|
108
|
+
// `yield → redispatch` gap `josh lane:stats` prints (`lane-gap-stats.ts`).
|
|
109
|
+
function yield_spans(
|
|
110
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
111
|
+
events: ReadonlyArray<RunEvent>,
|
|
112
|
+
): Array<Span> {
|
|
113
|
+
const yields = lane_stop_stats.events_of(
|
|
114
|
+
events.filter((event) => lane_yield.is_yield(event)),
|
|
115
|
+
EVENT_KIND.WITHDRAW,
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
return lane_spans.issue_spans({
|
|
119
|
+
starts: yields,
|
|
120
|
+
bounds: yields,
|
|
121
|
+
ends: lane_stop_stats.dispatches_of(entries),
|
|
122
|
+
})
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// `issue`'s yields inside `span`, each until its redispatch, cut at the merge.
|
|
126
|
+
function yielded(
|
|
127
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
128
|
+
events: ReadonlyArray<RunEvent>,
|
|
129
|
+
issue: number,
|
|
130
|
+
span: LaneSpan,
|
|
131
|
+
): Array<LaneSpan> {
|
|
132
|
+
const of_issue = events.filter((event) => lane_stop_stats.issue_of(event) === issue)
|
|
133
|
+
const inside = yield_spans(entries, of_issue).filter(
|
|
134
|
+
(wait) => wait.from_ms >= span.from_ms && wait.from_ms < span.to_ms,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
return inside.map((wait) => ({
|
|
138
|
+
from_ms: wait.from_ms,
|
|
139
|
+
to_ms: Math.min(wait.end_ms ?? span.to_ms, span.to_ms),
|
|
140
|
+
}))
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// The waits `net_ms` takes out of `span` — each hold from itself to its end, cut at the merge, each
|
|
144
|
+
// yield until its redispatch, and each sleep of the host — the intervals `josh lane:breakdown` counts
|
|
145
|
+
// as excluded (`lane-breakdown.ts`).
|
|
146
|
+
function waits(
|
|
147
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
148
|
+
events: ReadonlyArray<RunEvent>,
|
|
149
|
+
issue: number,
|
|
150
|
+
span: LaneSpan,
|
|
151
|
+
): Array<LaneSpan> {
|
|
152
|
+
return joined([
|
|
153
|
+
...hold_waits(entries, events, issue, span),
|
|
154
|
+
...yielded(entries, events, issue, span),
|
|
155
|
+
...slept(events, span),
|
|
156
|
+
])
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* The net milliseconds of `issue`'s lane, or `undefined` when the ledger holds no dispatch and merge of
|
|
161
|
+
* it. `events` is the run's event stream, read for the parks and outages.
|
|
162
|
+
*/
|
|
163
|
+
function net_ms(
|
|
164
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
165
|
+
events: ReadonlyArray<RunEvent>,
|
|
166
|
+
issue: number,
|
|
167
|
+
): number | undefined {
|
|
168
|
+
const span = span_of(entries, issue)
|
|
169
|
+
|
|
170
|
+
if (span === undefined) return undefined
|
|
171
|
+
|
|
172
|
+
return waits(entries, events, issue, span).reduce(
|
|
173
|
+
(left, wait) => left - (wait.to_ms - wait.from_ms),
|
|
174
|
+
span.to_ms - span.from_ms,
|
|
175
|
+
)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// The net time in whole minutes, rounded up — the number a causing-lane line declares.
|
|
179
|
+
function net_minutes(
|
|
180
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
181
|
+
events: ReadonlyArray<RunEvent>,
|
|
182
|
+
issue: number,
|
|
183
|
+
): number | undefined {
|
|
184
|
+
const net = net_ms(entries, events, issue)
|
|
185
|
+
|
|
186
|
+
return net === undefined ? undefined : Math.ceil(net / MS_PER_MINUTE)
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Why `net_ms` has no answer for `issue` (joshuafolkken/kit#4818): the ledger lacks its dispatch or its
|
|
190
|
+
// merge, or holds both with the merge first.
|
|
191
|
+
function missing_reason(entries: ReadonlyArray<LedgerEntry>, issue: number): string {
|
|
192
|
+
const of_issue = entries_of(entries, issue)
|
|
193
|
+
|
|
194
|
+
if (of_issue.every((entry) => !lane_stage_stats.is_dispatch(entry))) return 'no dispatch'
|
|
195
|
+
if (of_issue.every((entry) => !lane_stage_stats.is_merge(entry))) return 'no merge'
|
|
196
|
+
|
|
197
|
+
return 'cause unknown'
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const lane_net_time = {
|
|
201
|
+
missing_reason,
|
|
202
|
+
net_minutes,
|
|
203
|
+
net_ms,
|
|
204
|
+
slept,
|
|
205
|
+
span_of,
|
|
206
|
+
waits,
|
|
207
|
+
yield_spans,
|
|
208
|
+
yielded,
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export { lane_net_time }
|
|
212
|
+
export type { LaneSpan }
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { mkdirSync, readdirSync, rmSync
|
|
1
|
+
import { mkdirSync, readdirSync, rmSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { ENV_FILE_NAME } from '#ports'
|
|
4
4
|
import { git_worktree } from '#scripts/git/git-worktree'
|
|
5
5
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
6
6
|
import { file_reader } from '#scripts/lib/read-file'
|
|
7
|
+
import { eslint_warm } from '#scripts/lint/eslint-warm'
|
|
7
8
|
import { run_event_setup } from '#scripts/run/event/run-event-setup'
|
|
8
9
|
import { lane_cache } from './lane-cache'
|
|
9
10
|
import { lane_environment } from './lane-environment'
|
|
@@ -176,9 +177,12 @@ function guard_install(lane: LaneInfo, result: InstallResult): void {
|
|
|
176
177
|
|
|
177
178
|
// **The install is said on the run's stream as it starts**: it is the long part of opening a lane, and
|
|
178
179
|
// `run:board` draws it apart from the work tree being made. Best-effort, as every stage is.
|
|
180
|
+
// **The eslint daemon is warmed once the install lands, unawaited**, so the child's first edit hook
|
|
181
|
+
// lints warm rather than paying the daemon's start (joshuafolkken/kit#4720).
|
|
179
182
|
async function fill(lane: LaneInfo): Promise<void> {
|
|
180
183
|
await run_event_setup.emit(run_event_setup.installing(lane.issue))
|
|
181
184
|
guard_install(lane, await lane_install.install_dependencies(lane.directory))
|
|
185
|
+
eslint_warm.start(lane.directory)
|
|
182
186
|
}
|
|
183
187
|
|
|
184
188
|
function build_plan(
|
|
@@ -202,6 +206,15 @@ function build_plan(
|
|
|
202
206
|
}
|
|
203
207
|
}
|
|
204
208
|
|
|
209
|
+
async function add_worktree(lane: LaneInfo): Promise<void> {
|
|
210
|
+
mkdirSync(path.dirname(lane.directory), { recursive: true })
|
|
211
|
+
|
|
212
|
+
const start_point = await lane_start_point.resolve_for_branch(lane.branch)
|
|
213
|
+
|
|
214
|
+
await git_worktree.worktree_add(lane.directory, lane.branch, start_point)
|
|
215
|
+
await git_worktree.set_upstream(lane.branch)
|
|
216
|
+
}
|
|
217
|
+
|
|
205
218
|
// The `.env` is written straight after the work tree exists, because the seed is the reason the
|
|
206
219
|
// lane is being opened. Nothing else is recorded anywhere: that file *is* the record.
|
|
207
220
|
//
|
|
@@ -231,12 +244,8 @@ async function materialize(plan: LanePlan, source_root: string): Promise<void> {
|
|
|
231
244
|
// genuinely broken lane. The `finally` covers a failure before the `.env`
|
|
232
245
|
// is written, where nothing was created that should hold it.
|
|
233
246
|
try {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
const start_point = await lane_start_point.resolve_for_branch(plan.lane.branch)
|
|
237
|
-
|
|
238
|
-
await git_worktree.worktree_add(plan.lane.directory, plan.lane.branch, start_point)
|
|
239
|
-
writeFileSync(path.join(plan.lane.directory, ENV_FILE_NAME), plan.environment_content)
|
|
247
|
+
await add_worktree(plan.lane)
|
|
248
|
+
lane_registry.write_environment(plan.lane.directory, plan.environment_content)
|
|
240
249
|
release_seat_lock(plan.seat_lock)
|
|
241
250
|
lane_cache.seed_caches(source_root, plan.lane.directory)
|
|
242
251
|
lane_cache.seed_hook_bundles(source_root, plan.lane.directory)
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { writeFileSync } from 'node:fs'
|
|
2
|
-
import path from 'node:path'
|
|
3
1
|
import { ENV_FILE_NAME } from '#ports'
|
|
4
2
|
import type { AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
5
3
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
@@ -75,8 +73,8 @@ async function record_output(
|
|
|
75
73
|
|
|
76
74
|
if (content === undefined) return { kind: 'unreadable', lane }
|
|
77
75
|
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
lane_registry.write_environment(
|
|
77
|
+
lane.directory,
|
|
80
78
|
lane_environment.with_lane_output(content, output, profile),
|
|
81
79
|
)
|
|
82
80
|
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
2
|
+
import { issue_priority } from '#scripts/issue/issue-priority'
|
|
3
|
+
import { run_event_overrun } from '#scripts/run/event/run-event-overrun'
|
|
4
|
+
|
|
5
|
+
// What an overrun investigation's session does with the causes it found (joshuafolkken/kit#4751) —
|
|
6
|
+
// pick, group, fold or file each, and record the result — the part of its prompt that reads no record.
|
|
7
|
+
// `lane-overrun.ts` puts what the session reads ahead of it.
|
|
8
|
+
|
|
9
|
+
// The most causes one investigation files, and the fewest minutes one must cut to be filed
|
|
10
|
+
// (joshuafolkken/kit#4928).
|
|
11
|
+
const MAX_FILINGS = 5
|
|
12
|
+
const MIN_MINUTES = 1
|
|
13
|
+
const PRIORITY_COMMAND = 'pnpm josh issue:priority <N>'
|
|
14
|
+
|
|
15
|
+
// What a duplicate refusal leads to. A recurrence appends its own cause-loss line to the open issue's
|
|
16
|
+
// body, because the backlog ranking reads them only there and sums them (joshuafolkken/kit#4859,
|
|
17
|
+
// joshuafolkken/kit#4928); the sum can then reach the high floor, which a body edit does not label
|
|
18
|
+
// (joshuafolkken/kit#4960).
|
|
19
|
+
function duplicate_lines(loss_lines: string): ReadonlyArray<string> {
|
|
20
|
+
return [
|
|
21
|
+
'On a duplicate refusal, read each candidate with `pnpm josh issue:read <N>`: one that only fixes',
|
|
22
|
+
'another mechanism, or is only cited, is distinct — reissue with `--distinct <N,…>`; an open one that',
|
|
23
|
+
'fixes the same mechanism is not filed again but gets a comment recording the recurrence with those four',
|
|
24
|
+
`and ${loss_lines}, and gets those lines added under its background heading too, the cause-loss line`,
|
|
25
|
+
`appended beside the ones already there, since ranking sums every \`${issue_priority.CAUSE_PREFIX}\` line`,
|
|
26
|
+
'and reads only the body (`gh api -X PATCH repos/{owner}/{repo}/issues/<N> -F body=@<file>`). Then',
|
|
27
|
+
`run \`${PRIORITY_COMMAND}\`, which labels it once the sum reaches the high floor. One`,
|
|
28
|
+
'closed before this lane yet recurring here is filed anew as a recurrence, its number in `--distinct`.',
|
|
29
|
+
'A cap refusal is final: stop filing.',
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// The filing command: an overrun's filings name the lane they were found during; the baseline's name none.
|
|
34
|
+
function file_command(origin: number | undefined): string {
|
|
35
|
+
if (origin === undefined) return 'pnpm josh issue:file'
|
|
36
|
+
|
|
37
|
+
return `pnpm josh issue:file --found-during ${String(origin)}`
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Each lane pays a fixed review-to-merge cost, so causes one fix place shares are one issue. A fold
|
|
41
|
+
// skips `issue:file`, so it carries the ranked lines; the lane's minutes give it no label, and the
|
|
42
|
+
// fold applies the cause-loss floor with `issue:priority` (`issue-fold-existing.md`).
|
|
43
|
+
function grouping(origin: number | undefined, loss_lines: string): string {
|
|
44
|
+
return [
|
|
45
|
+
'Causes whose fixes touch the same file or mechanism are one issue, an acceptance criterion per',
|
|
46
|
+
'cause; causes fixed in different places are separate issues. Before filing one, look for an open',
|
|
47
|
+
'issue that touches the same files (`pnpm josh issue:scout "<title>" --body-file <draft.md>`, each',
|
|
48
|
+
'candidate read with `pnpm josh issue:read <N>`): when one does, fold its causes into it by',
|
|
49
|
+
'`.claude/skills/workflow-commands/issue-fold-existing.md` instead of filing, the appended part',
|
|
50
|
+
`carrying ${loss_lines}; on a verdict other than \`fold\`, file as below.`,
|
|
51
|
+
'File each other issue with',
|
|
52
|
+
`\`${file_command(origin)}\`, its body carrying those four per cause, and`,
|
|
53
|
+
`${loss_lines} under its background heading, the cause-loss minutes being what that issue's own`,
|
|
54
|
+
"causes would cut — backlog ranking orders one priority by them, else by the lane's minutes, which every",
|
|
55
|
+
'cause of the lane shares, so a filing without either falls behind every declared one.',
|
|
56
|
+
].join(' ')
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// A share over every merge thins a new mechanism's cost below any line (joshuafolkken/kit#4928), so the
|
|
60
|
+
// causes are picked by the minutes a fix would cut from what was read, largest first. `scope` names
|
|
61
|
+
// that span: one lane, or the baseline's merge.
|
|
62
|
+
function selection_lines(scope: string): ReadonlyArray<string> {
|
|
63
|
+
const limit = `${String(MAX_FILINGS)} causes`
|
|
64
|
+
|
|
65
|
+
return [
|
|
66
|
+
`Estimate each cause's reducible minutes: what its fix would cut from ${scope}. Time the work`,
|
|
67
|
+
'inherently takes (a CI wait the pipeline requires, a review) counts only for the part a fix removes,',
|
|
68
|
+
'and not at all when no fix removes any.',
|
|
69
|
+
`Take at most the ${limit} with the most reducible minutes, largest first, each cutting`,
|
|
70
|
+
`${String(MIN_MINUTES)} minute or more, and drop the rest: file or fold only those.`,
|
|
71
|
+
'File a defect — a tool did something unneeded or wrong (a rerun on an unchanged tree, a lost scope)',
|
|
72
|
+
'— as `- 種別: 不具合`, any other cause as `- 目的: 時間短縮`.',
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// A reach count measured by a hand-written probe, and a before / after criterion beside the fix, cost
|
|
77
|
+
// #5202's lane its implement time (joshuafolkken/kit#5238).
|
|
78
|
+
const MEASUREMENT_LINES = [
|
|
79
|
+
'Measure a reach test count — the test files `pnpm josh test:related` runs for a changed file — with',
|
|
80
|
+
'`pnpm josh test:reach <file…>`.',
|
|
81
|
+
'Put a measurement criterion (a before / after recorded as an Issue comment) in a prior `--route split`',
|
|
82
|
+
'issue, never in the issue that carries the fix.',
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
// The result's vocabulary, recorded as the note `template` names with `<result>` in it.
|
|
86
|
+
function result_lines(template: string): ReadonlyArray<string> {
|
|
87
|
+
return [
|
|
88
|
+
`Then record the result: \`pnpm josh run:event --append note "${template}"\`,`,
|
|
89
|
+
`the result being \`${run_event_overrun.folded_result(['<A>', '<B>'])}\` naming every issue you folded into`,
|
|
90
|
+
`when you folded any, else \`${run_event_overrun.FILED_RESULT}\` when you filed any, \`${run_event_overrun.recurred_result('<N>')}\``,
|
|
91
|
+
`when you only commented a recurrence on #<N>, else \`${run_event_overrun.none_result('<why, in about 15 characters>')}\`.`,
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// How an investigation's causes are handled: the lane its filings were found during, if any, the ranked
|
|
96
|
+
// lines each filing carries, the note its result is recorded as, and the span a cause's reducible
|
|
97
|
+
// minutes are cut from.
|
|
98
|
+
interface CauseHandling {
|
|
99
|
+
origin: number | undefined
|
|
100
|
+
loss_lines: string
|
|
101
|
+
template: string
|
|
102
|
+
scope: string
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// The filing rules an investigation's causes follow, shared by the overrun and the baseline
|
|
106
|
+
// investigation (joshuafolkken/kit#4887).
|
|
107
|
+
function cause_handling(rules: CauseHandling): string {
|
|
108
|
+
return [
|
|
109
|
+
...selection_lines(rules.scope),
|
|
110
|
+
grouping(rules.origin, rules.loss_lines),
|
|
111
|
+
...MEASUREMENT_LINES,
|
|
112
|
+
...duplicate_lines(rules.loss_lines),
|
|
113
|
+
...result_lines(rules.template),
|
|
114
|
+
].join(' ')
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// The lines backlog ranking reads (joshuafolkken/kit#4861): the cause's own minutes, else the lane's
|
|
118
|
+
// `minutes`, cited to lane `issue`.
|
|
119
|
+
function loss_lines_of(issue: number, minutes: string): string {
|
|
120
|
+
const cite = issue_cite.plain(issue)
|
|
121
|
+
|
|
122
|
+
return `\`- 原因のレーン: ${minutes} 分(${cite})\` and \`${issue_priority.CAUSE_PREFIX} <分> 分\``
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// The breakdown the overrun's prompt leads with orders the search (joshuafolkken/kit#4995); a stage no
|
|
126
|
+
// fix shortens is named in the result, so the time no filing covers is still accounted for. Only the
|
|
127
|
+
// overrun has a breakdown: the baseline shares `cause_handling`, not this.
|
|
128
|
+
const STAGE_ORDER = [
|
|
129
|
+
'Search for causes stage by stage, in the order of the net time by stage above, longest first.',
|
|
130
|
+
`For each stage you judge not reducible, end the result with \`${run_event_overrun.NOT_REDUCIBLE_LEAD}<stage> (<why>)\`.`,
|
|
131
|
+
].join(' ')
|
|
132
|
+
|
|
133
|
+
// The handling of lane `issue`'s causes, its `minutes` of net time on each filing's ranked lines.
|
|
134
|
+
function handling(issue: number, minutes: number): string {
|
|
135
|
+
const rules = cause_handling({
|
|
136
|
+
origin: issue,
|
|
137
|
+
loss_lines: loss_lines_of(issue, String(minutes)),
|
|
138
|
+
template: run_event_overrun.ended_text(issue, '<result>'),
|
|
139
|
+
scope: 'this lane alone, judged from its own record',
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
return `${STAGE_ORDER} ${rules}`
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const lane_overrun_prompt = { cause_handling, handling, loss_lines_of }
|
|
146
|
+
|
|
147
|
+
export { lane_overrun_prompt }
|