@joshuafolkken/kit 1.1784.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/workflow-commands/SKILL.md +6 -6
- package/.claude/skills/workflow-commands/background-commands.md +8 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +3 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-park.md +5 -2
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -3
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +41 -32
- package/.claude/skills/workflow-commands/delegation.md +6 -6
- package/.claude/skills/workflow-commands/entry-sequence.md +2 -2
- package/.claude/skills/workflow-commands/followup.md +7 -5
- package/.claude/skills/workflow-commands/fullrun-steps.md +6 -6
- package/.claude/skills/workflow-commands/fullrun.md +1 -1
- package/.claude/skills/workflow-commands/issue-comments.md +9 -4
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/kickoff.md +2 -2
- package/.claude/skills/workflow-commands/observation-filing.md +1 -1
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -7
- package/.claude/skills/workflow-commands/prerequisite.md +3 -2
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +7 -5
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-pnpm/action.yml +9 -16
- package/.github/dependabot.yml +16 -0
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +155 -15
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +59 -45
- package/.vscode/settings.json +19 -0
- package/CLAUDE.md +5 -12
- package/SECURITY.md +2 -2
- package/dist/CLAUDE.md +5 -12
- package/dist/commands/document-read-cli.js +2 -1
- package/dist/commands/document-section-main.js +2 -1
- package/dist/commands/read-set-cli.js +194 -134
- package/dist/commands/run-prep-main.js +9694 -10173
- package/dist/commands/run-step-cli.js +22138 -18285
- package/dist/hooks/audit-provision.js +23 -5
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/{chunk-CWMBGKYW.js → chunk-5PM2JRGV.js} +2153 -856
- package/dist/hooks/{chunk-WR2KQAYZ.js → chunk-7SIUNQXK.js} +1207 -1470
- package/dist/hooks/{chunk-O2YBIDSI.js → chunk-CQD4LJE6.js} +1682 -1130
- package/dist/hooks/{chunk-VWWCFGWK.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/{chunk-XGBNSWEI.js → chunk-UJ3FPMMM.js} +132 -49
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +8 -8
- package/dist/hooks/format-edited.js +4 -5
- package/dist/hooks/inputs.json +415 -389
- package/dist/hooks/pretool-guard.js +7 -6
- package/dist/hooks/session-lang.js +101 -258
- package/dist/hooks/stop-guard.js +1744 -2576
- package/dist/josh.js +7133 -6368
- package/dist/version/index.js +161 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/package.json +15 -8
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +14 -11
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +40 -21
- package/prompts/collaboration-workflow/lane-instructions.md +3 -1
- package/prompts/collaboration-workflow/measurement.md +8 -1
- package/prompts/collaboration-workflow/operating-rules.md +11 -2
- package/prompts/collaboration-workflow/output-bounds.md +6 -2
- package/prompts/collaboration-workflow/plan-comment.md +1 -1
- package/prompts/collaboration-workflow/principles.md +9 -0
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
- package/prompts/collaboration-workflow/wip-cap.md +3 -1
- package/prompts/review-rubric.md +8 -0
- package/prompts/review.md +31 -22
- package/prompts/testing-guide.md +1 -0
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +20 -9
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-cli.ts +6 -1
- package/scripts/backlog/backlog-drive-hold.ts +3 -3
- package/scripts/backlog/backlog-drive-idle.ts +10 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -30
- package/scripts/backlog/backlog-drive-named.ts +28 -7
- package/scripts/backlog/backlog-drive-paused.ts +5 -4
- package/scripts/backlog/backlog-drive-restore.ts +11 -3
- package/scripts/backlog/backlog-drive.ts +21 -60
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next.ts +39 -49
- package/scripts/backlog/backlog-occupied.ts +2 -2
- package/scripts/backlog/backlog-overlap.ts +42 -8
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +19 -6
- package/scripts/backlog/backlog-pool.ts +50 -12
- package/scripts/backlog/backlog-rank.ts +60 -13
- package/scripts/backlog/backlog-stalled-detect.ts +2 -1
- package/scripts/backlog/backlog-waves.ts +17 -2
- package/scripts/backlog/backlogrun-launch.ts +7 -4
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-cli.ts +37 -16
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +2 -2
- package/scripts/delegation/duplicate-read-guard.ts +1 -0
- package/scripts/delegation/investigation-guard.ts +14 -2
- package/scripts/delegation/investigation-reads.ts +45 -23
- package/scripts/dependabot/dependabot-cooldown.ts +3 -2
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +17 -7
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-cli-argv.ts +2 -2
- package/scripts/epic/epic-fetch.ts +4 -2
- package/scripts/epic/epic-graph.ts +7 -2
- package/scripts/epic/epic-issue.ts +3 -1
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +13 -10
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +41 -11
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
- package/scripts/followup/git-pr-followup.ts +62 -27
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +2 -2
- package/scripts/gate/busy-average.ts +34 -2
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/command-memory.ts +1 -1
- package/scripts/gate/core-admission.ts +24 -6
- package/scripts/gate/core-budget-timing.ts +20 -6
- package/scripts/gate/core-budget.ts +40 -11
- package/scripts/gate/core-wait-record.ts +3 -2
- package/scripts/gate/core-wait.ts +25 -2
- package/scripts/gate/core-weights.ts +15 -7
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +14 -6
- package/scripts/gate/gate-plan.ts +103 -58
- package/scripts/gate/gate-report.ts +9 -7
- package/scripts/gate/gate-run-steps.ts +26 -3
- package/scripts/gate/gate-skip.ts +45 -6
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +2 -1
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/scoped-green.ts +68 -15
- package/scripts/gate/since-green.ts +14 -6
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/verification-gate.ts +51 -16
- package/scripts/gate/verification-inputs.ts +21 -6
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +23 -2
- package/scripts/gh/git-ai-review-scan.ts +1 -1
- package/scripts/gh/git-gh-api-path.ts +12 -3
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +4 -2
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +8 -2
- package/scripts/gh/git-gh-issue.ts +12 -5
- package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +3 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +21 -7
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +3 -0
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/git/base-tree.ts +30 -0
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +16 -1
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +66 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-schemas.ts +13 -0
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +53 -5
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +11 -2
- package/scripts/git/stash/stash-push-cli.ts +10 -0
- package/scripts/hooks/batch-guard.ts +40 -21
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +22 -2
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +14 -1
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +76 -10
- package/scripts/hooks/pretool-guard.ts +2 -0
- package/scripts/hooks/reserved-run.ts +14 -1
- package/scripts/hooks/run-hook.sh +23 -8
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +3 -15
- package/scripts/hooks/stop-guard.ts +7 -6
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +5 -1
- package/scripts/init/hook-launch.ts +4 -2
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-line.ts +19 -1
- package/scripts/issue/defect-rate-cli.ts +5 -102
- package/scripts/issue/defect-report.ts +4 -4
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +64 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-body-or-comment.ts +38 -4
- package/scripts/issue/issue-cite-cli.ts +1 -3
- package/scripts/issue/issue-classification.ts +1 -0
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-evidence-exit.ts +4 -2
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +111 -38
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +43 -6
- package/scripts/issue/issue-labels.ts +19 -2
- package/scripts/issue/issue-lint-cli.ts +27 -2
- package/scripts/issue/issue-measured-cli.ts +13 -35
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-not-before-label.ts +2 -2
- package/scripts/issue/issue-not-before.ts +4 -1
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +174 -43
- package/scripts/issue/issue-rank.ts +21 -4
- package/scripts/issue/issue-read-cli.ts +32 -6
- package/scripts/issue/issue-read.ts +37 -12
- package/scripts/issue/issue-sample-gate.ts +95 -74
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +12 -11
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +31 -1
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -12
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -70
- package/scripts/issue/plan-consumers-section.ts +22 -1
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/command-usage.ts +3 -2
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -82
- package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
- package/scripts/josh/josh-commands-ai.ts +5 -5
- package/scripts/josh/josh-commands-development.ts +59 -58
- package/scripts/josh/josh-commands-issue-write.ts +23 -4
- package/scripts/josh/josh-commands-issue.ts +32 -0
- package/scripts/josh/josh-commands-lane.ts +87 -4
- package/scripts/josh/josh-commands-lint.ts +16 -3
- package/scripts/josh/josh-commands-maintenance.ts +15 -0
- package/scripts/josh/josh-commands-review.ts +41 -6
- package/scripts/josh/josh-commands-ship.ts +56 -8
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-workflow.ts +1 -1
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +5 -3
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/stamp-file.ts +11 -2
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +5 -8
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-check-stats.ts +29 -8
- package/scripts/lane/lane-child-invocation.ts +9 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-close.ts +8 -3
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +2 -2
- package/scripts/lane/lane-gap-stats.ts +7 -6
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +119 -36
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +31 -177
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +176 -59
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +16 -7
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +4 -1
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-registry.ts +14 -1
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-sampler.ts +23 -4
- package/scripts/lane/lane-session-action.ts +93 -18
- package/scripts/lane/lane-session-broker.ts +49 -21
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-spent.ts +1 -1
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +13 -1
- package/scripts/lane/lane-state.ts +41 -9
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +21 -5
- package/scripts/lane/lane-stop-stats.ts +51 -19
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-transcript-calls.ts +67 -10
- package/scripts/lane/lane-transcript-stats.ts +44 -12
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +108 -31
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +45 -6
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/import-graph.ts +141 -11
- package/scripts/lint/lint-gate-scope.ts +2 -2
- package/scripts/lint/lint-parallel.ts +54 -6
- package/scripts/lint/lint-related.ts +154 -33
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/telegram-notify.ts +12 -3
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush.ts +32 -9
- package/scripts/overrides/overrides-check.ts +9 -1
- package/scripts/release/release-approval-prune.ts +7 -1
- package/scripts/repo/required-checks-logic.ts +4 -1
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +15 -1
- package/scripts/report/report-labels.ts +12 -1
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +26 -7
- package/scripts/report/report-lint.ts +2 -20
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +68 -19
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +14 -7
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +85 -22
- package/scripts/review/review-finding-ledger.ts +109 -7
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +11 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +4 -2
- package/scripts/review/review-record-cli.ts +177 -54
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +91 -29
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +24 -8
- package/scripts/review/review-stamps.ts +7 -3
- package/scripts/review/review-stop-log.ts +20 -6
- package/scripts/review/review-stops-cli.ts +2 -1
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/rules/agent-model.ts +1 -1
- package/scripts/rules/bash-triggers.ts +3 -3
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle.ts +1 -1
- package/scripts/rules/delivered-rules.ts +36 -17
- package/scripts/rules/destructive-command.ts +3 -11
- package/scripts/rules/direct-issue-comment.ts +34 -12
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +4 -24
- package/scripts/rules/early-heartbeat.ts +2 -0
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/guard-remedy.ts +14 -5
- package/scripts/rules/implementation-cut.ts +61 -28
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +9 -4
- package/scripts/rules/josh-git-bare.ts +1 -1
- package/scripts/rules/lane-background.ts +41 -13
- package/scripts/rules/lane-direct-tool.ts +107 -9
- package/scripts/rules/lane-interactive-ask.ts +4 -1
- package/scripts/rules/lane-park.ts +4 -2
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +1 -1
- package/scripts/rules/lane-switch-main.ts +4 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/permission-guards.ts +5 -1
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +67 -17
- package/scripts/rules/poll-loop.ts +72 -9
- package/scripts/rules/pr-merge.ts +5 -5
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +88 -24
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +5 -15
- package/scripts/rules/rule-value-cache.ts +53 -5
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +59 -11
- package/scripts/rules/rule-value.ts +17 -4
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +10 -2
- package/scripts/rules/stop-rule-rows.ts +1 -13
- package/scripts/rules/stop-rules.ts +33 -58
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +110 -23
- package/scripts/rules/timed-rerun.ts +1 -1
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +22 -7
- package/scripts/run/board/run-board-ending-reason.ts +6 -2
- package/scripts/run/board/run-board-fit.ts +24 -1
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-header.ts +8 -0
- package/scripts/run/board/run-board-labels.ts +11 -1
- package/scripts/run/board/run-board-lane-time.ts +1 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-notes.ts +7 -1
- package/scripts/run/board/run-board-operation.ts +4 -2
- package/scripts/run/board/run-board-phase.ts +2 -5
- package/scripts/run/board/run-board-plan.ts +1 -1
- package/scripts/run/board/run-board-read.ts +46 -1
- package/scripts/run/board/run-board-reason.ts +20 -8
- package/scripts/run/board/run-board-render-checks.ts +3 -2
- package/scripts/run/board/run-board-render-drawn.ts +11 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-lead.ts +9 -0
- package/scripts/run/board/run-board-render-legend.ts +19 -0
- package/scripts/run/board/run-board-render-tail.ts +1 -1
- package/scripts/run/board/run-board-render.ts +82 -18
- package/scripts/run/board/run-board-spin.ts +1 -3
- package/scripts/run/board/run-board-status.ts +2 -0
- package/scripts/run/board/run-board-tick.ts +39 -10
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +3 -2
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +52 -8
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-filed.ts +9 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +4 -0
- package/scripts/run/event/run-event-stream.ts +25 -3
- package/scripts/run/hold/run-stop-notify.ts +3 -8
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +66 -23
- package/scripts/run/merge/run-merge-outcome.ts +2 -0
- package/scripts/run/merge/run-merge-ship.ts +13 -3
- package/scripts/run/merge/run-merge-signals.ts +40 -23
- package/scripts/run/merge/run-merge-steps.ts +56 -36
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +41 -14
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +26 -6
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-prep.ts +1 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +5 -2
- package/scripts/run/ship/run-ship-args.ts +19 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +131 -39
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +10 -4
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +27 -26
- package/scripts/run/ship/run-ship-overlap.ts +8 -3
- package/scripts/run/ship/run-ship-place.ts +9 -2
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
- package/scripts/run/ship/run-ship-preflight.ts +16 -4
- package/scripts/run/ship/run-ship-probe.ts +23 -9
- package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-return.ts +103 -29
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +230 -59
- package/scripts/run/ship/run-ship-review.ts +171 -51
- package/scripts/run/ship/run-ship-reviewer.ts +138 -42
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +49 -13
- package/scripts/run/ship/run-ship-steps.ts +24 -4
- package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-sync.ts +171 -30
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +16 -2
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +6 -113
- package/scripts/run/wake/run-wake-code.ts +53 -11
- package/scripts/run/wake/run-wake-driver.ts +5 -3
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +5 -3
- package/scripts/run/wake/run-wake-ports.ts +11 -3
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake.ts +3 -2
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/project-config.ts +3 -2
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-provision-main.ts +9 -1
- package/scripts/security/security-audit-provision.ts +1 -1
- package/scripts/security/security-audit.ts +21 -1
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/split/split-assess.ts +12 -3
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +20 -2
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +208 -20
- package/scripts/test/test-pinned-main.ts +84 -18
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +258 -47
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +35 -11
- package/scripts/test/test-read-recording.ts +17 -5
- package/scripts/test/test-read-trace.ts +26 -8
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red.ts +34 -14
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +4 -1
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +43 -23
- package/scripts/test/test-related-scope.ts +99 -34
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +167 -83
- package/scripts/test/test-unit-guard.ts +28 -5
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-worker-share.ts +5 -4
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +12 -1
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +36 -5
- package/scripts/time-runtime/time-markers.ts +2 -2
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +17 -5
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/latest-corepack.ts +2 -0
- package/templates/gitignore +2 -0
- package/templates/workflows/ci.yml +41 -0
- package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
- package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
- package/dist/hooks/chunk-TUIFS5E7.js +0 -72
- package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/rules/filing-cap.ts +0 -139
|
@@ -1,170 +1,15 @@
|
|
|
1
|
-
import { closeSync, constants, openSync, writeSync } from 'node:fs'
|
|
2
1
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
3
2
|
import { json_value } from '#scripts/lib/json-value'
|
|
4
3
|
import { stamped_memo } from '#scripts/lib/stamped-memo'
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
lane_ledger_schema,
|
|
8
|
-
type CoreWaitRecord,
|
|
9
|
-
type GateRecord,
|
|
10
|
-
type HeldRecord,
|
|
11
|
-
type LedgerEntry,
|
|
12
|
-
type OverlapRecord,
|
|
13
|
-
type RoundTwoRecord,
|
|
14
|
-
type StageRecord,
|
|
15
|
-
type StopRecord,
|
|
16
|
-
type TestRelatedRecord,
|
|
17
|
-
type UnitFileRecord,
|
|
18
|
-
} from './lane-ledger-schema'
|
|
19
|
-
|
|
20
|
-
// The measurement ledger the lane limit is tuned against: one JSON line per
|
|
21
|
-
// lane merge, per finished `josh gate`, per machine-load sample, per lane dispatch, per finished
|
|
22
|
-
// `josh ship` stage, per stopped `josh ship`, per round-2 decision, per core-budget wait and per
|
|
23
|
-
// `josh test:related` run, read back by `josh lane:stats`. Each line's shape is `lane-ledger-schema.ts`.
|
|
24
|
-
//
|
|
25
|
-
// **Its own file rather than the run's event stream.** The stream is capped at 500 events and is
|
|
26
|
-
// rewritten whole on every append, which is right for "where is the run" and wrong for a measurement
|
|
27
|
-
// that spans days of one-a-minute load samples. This file is only ever appended to, so concurrent lanes
|
|
28
|
-
// never lose each other's lines to a read-modify-write race.
|
|
29
|
-
//
|
|
30
|
-
// **Keyed on the common git directory, the event stream's key**, so a lane child's gate, the parent's
|
|
31
|
-
// merge and the sampler all land in one ledger per repository. It sits in the temp root beside every
|
|
32
|
-
// other josh record; a reboot clears it, which is why `docs/maintainers/lane-limit-measurement.md`
|
|
33
|
-
// closes a period with `josh lane:stats` before one.
|
|
34
|
-
|
|
35
|
-
const LEDGER_PREFIX = 'josh-lane-ledger-'
|
|
36
|
-
const LEDGER_SUFFIX = '.jsonl'
|
|
37
|
-
const LINE_SEPARATOR = '\n'
|
|
38
|
-
// `followup`'s wait for CI — a stage of a lane's run that no `josh ship` stage is the whole of.
|
|
39
|
-
const CI_WAIT_STAGE = 'ci-wait'
|
|
40
|
-
// The part of `followup`'s waits CodeRabbit spent running or rate-limited, and the rate-limited part
|
|
41
|
-
// alone (joshuafolkken/kit#4574).
|
|
42
|
-
const CODERABBIT_WAIT_STAGE = 'coderabbit-wait'
|
|
43
|
-
const CODERABBIT_RATE_LIMIT_STAGE = 'coderabbit-rate-limit'
|
|
44
|
-
// A detached `josh ship`'s fast checks in the agent's own turn — not a resumable ship stage, since the
|
|
45
|
-
// supervised gate runs them again (joshuafolkken/kit#4382).
|
|
46
|
-
const PRE_DETACH_STAGE = 'pre-detach'
|
|
47
|
-
const LEDGER_FILE_MODE = 0o600
|
|
48
|
-
// The flags `detached-launch.ts` appends its log with, for the same deterministic shared-temp path.
|
|
49
|
-
const { O_APPEND, O_CREAT, O_NOFOLLOW, O_WRONLY } = constants
|
|
50
|
-
// eslint-disable-next-line no-bitwise -- POSIX open flags are a bit field; `||` here would be a bug
|
|
51
|
-
const APPEND_FLAGS = O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW
|
|
52
|
-
|
|
53
|
-
const { KIND, entry_schema } = lane_ledger_schema
|
|
54
|
-
|
|
55
|
-
function target_of(repository: string): string {
|
|
56
|
-
return stamp_file.stamp_path(LEDGER_PREFIX, repository, LEDGER_SUFFIX)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// The ledger of the repository this checkout belongs to, or `undefined` outside one. `git rev-parse`
|
|
60
|
-
// rejects outside a repository, and `josh gate` resolves this before it runs a check, so the rejection
|
|
61
|
-
// is read as "no ledger" rather than allowed to fail the gate it would only have measured.
|
|
62
|
-
//
|
|
63
|
-
// **A test run has no ledger either.** The writers sit on paths dozens of suites exercise — a ship
|
|
64
|
-
// stage, a dispatch, a `followup` — and one suite that forgot to mock this module would append its
|
|
65
|
-
// fixture durations to the real measurement; a test that writes passes its own path instead.
|
|
66
|
-
async function target(): Promise<string | undefined> {
|
|
67
|
-
if (process.env['VITEST'] !== undefined) return undefined
|
|
68
|
-
|
|
69
|
-
try {
|
|
70
|
-
const repository = await run_carry.repository_directory()
|
|
71
|
-
|
|
72
|
-
return repository === undefined ? undefined : target_of(repository)
|
|
73
|
-
} catch {
|
|
74
|
-
return undefined
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// **Append, never rewrite** — `O_APPEND` keeps each short line whole across concurrent writers, and
|
|
79
|
-
// `O_NOFOLLOW` plus `stamp_file`'s ownership test keep a planted link or another account's file from
|
|
80
|
-
// receiving it. Any JSON-lines log takes it — the durable review stop log too (joshuafolkken/kit#4519).
|
|
81
|
-
function append(path: string, entry: object): void {
|
|
82
|
-
const descriptor = openSync(path, APPEND_FLAGS, LEDGER_FILE_MODE)
|
|
83
|
-
|
|
84
|
-
try {
|
|
85
|
-
if (stamp_file.is_own_regular_file(path)) {
|
|
86
|
-
writeSync(descriptor, `${JSON.stringify(entry)}${LINE_SEPARATOR}`)
|
|
87
|
-
}
|
|
88
|
-
} finally {
|
|
89
|
-
closeSync(descriptor)
|
|
90
|
-
}
|
|
91
|
-
}
|
|
4
|
+
import { lane_ledger_schema, type LedgerEntry } from './lane-ledger-schema'
|
|
5
|
+
import { lane_ledger_write } from './lane-ledger-write'
|
|
92
6
|
|
|
93
|
-
//
|
|
94
|
-
//
|
|
95
|
-
|
|
96
|
-
try {
|
|
97
|
-
const destination = path ?? (await target())
|
|
7
|
+
// The measurement ledger read back: every line `lane-ledger-write.ts` appended, for `josh lane:stats`,
|
|
8
|
+
// `lane:breakdown`, `run:board` and the other measurements. The writers import that leaf, never this
|
|
9
|
+
// module, so a change to the reading reaches only the suites that read (joshuafolkken/kit#5202).
|
|
98
10
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
// Reporting is best-effort: a failed append is dropped rather than raised into the caller's work.
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function now_iso(): string {
|
|
106
|
-
return new Date().toISOString()
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// One finished `josh gate`, whether it passed or not — a failing gate cost the lane its time as well.
|
|
110
|
-
async function record_gate(path: string, gate: GateRecord): Promise<void> {
|
|
111
|
-
await record({ kind: KIND.GATE, at: now_iso(), ...gate }, path)
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
async function record_merge(issue: number): Promise<void> {
|
|
115
|
-
await record({ kind: KIND.MERGE, at: now_iso(), issue })
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
async function record_dispatch(issue: number, path?: string): Promise<void> {
|
|
119
|
-
await record({ kind: KIND.DISPATCH, at: now_iso(), issue }, path)
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
async function record_stage(stage: StageRecord, path?: string): Promise<void> {
|
|
123
|
-
await record({ kind: KIND.STAGE, at: now_iso(), ...stage }, path)
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
async function record_stop(stop: StopRecord, path?: string): Promise<void> {
|
|
127
|
-
await record({ kind: KIND.STOP, at: now_iso(), ...stop }, path)
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
async function record_overlap(overlap: OverlapRecord, path?: string): Promise<void> {
|
|
131
|
-
await record({ kind: KIND.OVERLAP, at: now_iso(), ...overlap }, path)
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// `waiting` is written only when the offer named issues, so a hold that waited on none stays one short line.
|
|
135
|
-
async function record_held(held: HeldRecord, path?: string): Promise<void> {
|
|
136
|
-
const waiting = held.waiting ?? []
|
|
137
|
-
const named = waiting.length > 0 ? { waiting: [...waiting] } : {}
|
|
138
|
-
|
|
139
|
-
await record({ kind: KIND.HELD, at: now_iso(), reason: held.reason, ...named }, path)
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
async function record_released(path?: string): Promise<void> {
|
|
143
|
-
await record({ kind: KIND.RELEASED, at: now_iso() }, path)
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
async function record_offerable(is_offerable: boolean, path?: string): Promise<void> {
|
|
147
|
-
await record({ kind: KIND.OFFERABLE, at: now_iso(), is_offerable }, path)
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
async function record_round_two(round_two: RoundTwoRecord, path?: string): Promise<void> {
|
|
151
|
-
await record({ kind: KIND.ROUND_TWO, at: now_iso(), ...round_two }, path)
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
async function record_core_wait(wait: CoreWaitRecord, path?: string): Promise<void> {
|
|
155
|
-
await record({ kind: KIND.CORE_WAIT, at: now_iso(), ...wait }, path)
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
async function record_unit_files(
|
|
159
|
-
files: ReadonlyArray<UnitFileRecord>,
|
|
160
|
-
path?: string,
|
|
161
|
-
): Promise<void> {
|
|
162
|
-
await record({ kind: KIND.UNIT_FILES, at: now_iso(), files: [...files] }, path)
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
async function record_test_related(run: TestRelatedRecord, path?: string): Promise<void> {
|
|
166
|
-
await record({ kind: KIND.TEST_RELATED, at: now_iso(), ...run }, path)
|
|
167
|
-
}
|
|
11
|
+
const { entry_schema } = lane_ledger_schema
|
|
12
|
+
const { LINE_SEPARATOR } = lane_ledger_write
|
|
168
13
|
|
|
169
14
|
function parse_line(line: string): LedgerEntry | undefined {
|
|
170
15
|
return entry_schema.safeParse(json_value.parse_or_undefined(line)).data
|
|
@@ -194,28 +39,28 @@ function read_entries(path: string): ReadonlyArray<LedgerEntry> {
|
|
|
194
39
|
return parsed_ledgers.of(path, stamped_memo.file_stamp(path), () => parse_entries(path))
|
|
195
40
|
}
|
|
196
41
|
|
|
42
|
+
// The names a reader looks entries up by and the ledger it reads, the writer's own.
|
|
43
|
+
const {
|
|
44
|
+
CI_WAIT_STAGE,
|
|
45
|
+
CODERABBIT_RATE_LIMIT_STAGE,
|
|
46
|
+
CODERABBIT_RETRIGGER_STAGE,
|
|
47
|
+
CODERABBIT_WAIT_STAGE,
|
|
48
|
+
KIND,
|
|
49
|
+
PRE_DETACH_STAGE,
|
|
50
|
+
ROUND_ONE_REUSED,
|
|
51
|
+
target,
|
|
52
|
+
target_of,
|
|
53
|
+
} = lane_ledger_write
|
|
54
|
+
|
|
197
55
|
const lane_ledger = {
|
|
198
56
|
CI_WAIT_STAGE,
|
|
199
57
|
CODERABBIT_RATE_LIMIT_STAGE,
|
|
58
|
+
CODERABBIT_RETRIGGER_STAGE,
|
|
200
59
|
CODERABBIT_WAIT_STAGE,
|
|
201
60
|
KIND,
|
|
202
61
|
PRE_DETACH_STAGE,
|
|
203
|
-
|
|
62
|
+
ROUND_ONE_REUSED,
|
|
204
63
|
read_entries,
|
|
205
|
-
record,
|
|
206
|
-
record_core_wait,
|
|
207
|
-
record_dispatch,
|
|
208
|
-
record_gate,
|
|
209
|
-
record_held,
|
|
210
|
-
record_released,
|
|
211
|
-
record_merge,
|
|
212
|
-
record_overlap,
|
|
213
|
-
record_offerable,
|
|
214
|
-
record_round_two,
|
|
215
|
-
record_stage,
|
|
216
|
-
record_stop,
|
|
217
|
-
record_test_related,
|
|
218
|
-
record_unit_files,
|
|
219
64
|
target,
|
|
220
65
|
target_of,
|
|
221
66
|
}
|
|
@@ -227,19 +72,28 @@ export type {
|
|
|
227
72
|
GateCheckRecord,
|
|
228
73
|
GateEntry,
|
|
229
74
|
HeldEntry,
|
|
75
|
+
LaneStateChangeEntry,
|
|
230
76
|
LedgerEntry,
|
|
231
77
|
LoadEntry,
|
|
232
78
|
MergeEntry,
|
|
233
79
|
OfferableEntry,
|
|
234
80
|
OverlapEntry,
|
|
235
81
|
OverlapRecord,
|
|
82
|
+
PushMissEntry,
|
|
83
|
+
RoundOneEntry,
|
|
236
84
|
RoundTwoEntry,
|
|
85
|
+
ShipLapEntry,
|
|
86
|
+
SplitFiledEntry,
|
|
87
|
+
SplitNoticeEntry,
|
|
237
88
|
StageEntry,
|
|
238
89
|
StopEntry,
|
|
239
90
|
StopRecord,
|
|
91
|
+
TestPinnedEntry,
|
|
92
|
+
TestPinnedRecord,
|
|
240
93
|
TestRelatedEntry,
|
|
241
94
|
TestRelatedRecord,
|
|
242
95
|
UnitFileRecord,
|
|
243
96
|
UnitFilesEntry,
|
|
97
|
+
UnplannedNoticeEntry,
|
|
244
98
|
} from './lane-ledger-schema'
|
|
245
99
|
export { lane_ledger }
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { loadavg } from 'node:os'
|
|
2
2
|
import { machine_capacity } from '#scripts/gate/machine-capacity'
|
|
3
3
|
import { lane_await } from './lane-await'
|
|
4
|
-
import type { LoadEntry } from './lane-ledger'
|
|
4
|
+
import type { LoadEntry } from './lane-ledger-schema'
|
|
5
5
|
import { lane_process_load } from './lane-process-load'
|
|
6
6
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
7
7
|
|
|
@@ -2,27 +2,21 @@
|
|
|
2
2
|
import { setInterval as every } from 'node:timers/promises'
|
|
3
3
|
import { fileURLToPath } from 'node:url'
|
|
4
4
|
import { cost_transcript } from '#scripts/cost-runtime/cost-transcript'
|
|
5
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
6
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
5
7
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
6
8
|
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
7
|
-
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
8
|
-
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
9
9
|
import { lane_capacity } from './lane-capacity'
|
|
10
|
-
import {
|
|
11
|
-
import { lane_core_wait_stats } from './lane-core-wait-stats'
|
|
12
|
-
import { lane_gap_stats } from './lane-gap-stats'
|
|
13
|
-
import { lane_held_stats } from './lane-held-stats'
|
|
14
|
-
import { lane_ledger } from './lane-ledger'
|
|
15
|
-
import { lane_process_stats } from './lane-process-stats'
|
|
16
|
-
import { lane_round_two_stats } from './lane-round-two-stats'
|
|
10
|
+
import { lane_net_read } from './lane-net-read'
|
|
17
11
|
import { lane_sampler, type MeasureContext } from './lane-sampler'
|
|
18
|
-
import { lane_stage_stats } from './lane-stage-stats'
|
|
19
12
|
import { lane_stats, type StatsWindow } from './lane-stats'
|
|
20
|
-
import {
|
|
21
|
-
import { lane_test_related_stats } from './lane-test-related-stats'
|
|
22
|
-
import type { ToolCall } from './lane-transcript-calls'
|
|
13
|
+
import { lane_stats_tables, type PeriodRecords } from './lane-stats-tables'
|
|
23
14
|
import { lane_transcript_stats } from './lane-transcript-stats'
|
|
15
|
+
import { lane_value } from './lane-value'
|
|
16
|
+
import { lane_value_cell, type CellAddress } from './lane-value-cell'
|
|
24
17
|
|
|
25
|
-
// `josh lane:sample` / `josh lane:stats` — the lane-limit measurement
|
|
18
|
+
// `josh lane:sample` / `josh lane:stats` — the lane-limit measurement; `josh lane:value` and
|
|
19
|
+
// `josh lane:net` print one measurement each.
|
|
26
20
|
//
|
|
27
21
|
// `lane:sample` appends one machine-load sample to the ledger, or one every `--every <seconds>` until it
|
|
28
22
|
// is stopped; `lane:stats` reduces a period of the ledger to the one table row #3347 records per lane
|
|
@@ -36,13 +30,28 @@ const ARGV_OFFSET = 2
|
|
|
36
30
|
const FAILURE_EXIT_CODE = 1
|
|
37
31
|
const SAMPLE_VERB = 'sample'
|
|
38
32
|
const STATS_VERB = 'stats'
|
|
33
|
+
const VALUE_VERB = 'value'
|
|
34
|
+
const NET_VERB = 'net'
|
|
35
|
+
// `lane:value cell` reads one `lane:stats` table cell rather than a named metric (joshuafolkken/kit#5144).
|
|
36
|
+
const CELL_METRIC = 'cell'
|
|
37
|
+
// A value keeps two decimals: seconds, minutes and per-lane counts read at that grain.
|
|
38
|
+
const VALUE_DIGITS = 2
|
|
39
39
|
const USAGE = [
|
|
40
40
|
'Usage: josh lane:sample [--every <seconds>]',
|
|
41
41
|
' josh lane:stats --period <days> [--limit <lane-limit>]',
|
|
42
|
+
` josh lane:value <${lane_value.NAMES.join('|')}> --since <instant>`,
|
|
43
|
+
` josh lane:value ${CELL_METRIC} --table <title> --row <label> --column <header> --since <instant>`,
|
|
44
|
+
' josh lane:net <issue>',
|
|
42
45
|
].join('\n')
|
|
43
46
|
|
|
44
47
|
const SAMPLE_OPTIONS = { every: { type: 'string' } } as const
|
|
45
48
|
const STATS_OPTIONS = { period: { type: 'string' }, limit: { type: 'string' } } as const
|
|
49
|
+
const VALUE_OPTIONS = {
|
|
50
|
+
since: { type: 'string' },
|
|
51
|
+
table: { type: 'string' },
|
|
52
|
+
row: { type: 'string' },
|
|
53
|
+
column: { type: 'string' },
|
|
54
|
+
} as const
|
|
46
55
|
|
|
47
56
|
function refuse(): number {
|
|
48
57
|
console.error(USAGE)
|
|
@@ -104,21 +113,6 @@ async function limit_label(given: string | undefined): Promise<string> {
|
|
|
104
113
|
return choice.kind === 'limit' ? String(choice.limit) : lane_stats.MISSING
|
|
105
114
|
}
|
|
106
115
|
|
|
107
|
-
async function read_ledger(
|
|
108
|
-
context: MeasureContext,
|
|
109
|
-
): Promise<ReturnType<typeof lane_ledger.read_entries>> {
|
|
110
|
-
const path = context.ledger_path ?? (await lane_ledger.target())
|
|
111
|
-
|
|
112
|
-
return path === undefined ? [] : lane_ledger.read_entries(path)
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// The run's event stream, read for the parks that end a stop's wait.
|
|
116
|
-
async function read_events(context: MeasureContext): Promise<ReadonlyArray<RunEvent>> {
|
|
117
|
-
if (context.events_path !== undefined) return run_event_stream.read_events(context.events_path)
|
|
118
|
-
|
|
119
|
-
return await run_event_stream_emit.all_events()
|
|
120
|
-
}
|
|
121
|
-
|
|
122
116
|
// Every lane's transcript directory under this checkout's lane root, read from a lane or the main checkout.
|
|
123
117
|
function transcript_directories(context: MeasureContext): ReadonlyArray<string> {
|
|
124
118
|
if (context.transcript_directories !== undefined) return context.transcript_directories
|
|
@@ -128,27 +122,16 @@ function transcript_directories(context: MeasureContext): ReadonlyArray<string>
|
|
|
128
122
|
return cost_transcript.lane_transcript_directories(main_cwd, cost_transcript.home_directory())
|
|
129
123
|
}
|
|
130
124
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
lane_stop_stats.table(entries, window, events),
|
|
142
|
-
lane_gap_stats.table(entries, window, events),
|
|
143
|
-
lane_round_two_stats.table(entries, window),
|
|
144
|
-
lane_held_stats.table(entries, window),
|
|
145
|
-
lane_core_wait_stats.table(entries, window),
|
|
146
|
-
lane_process_stats.table(entries, window),
|
|
147
|
-
lane_check_stats.table(entries, window),
|
|
148
|
-
lane_test_related_stats.table(entries, window),
|
|
149
|
-
lane_test_related_stats.trigger_table(entries, window),
|
|
150
|
-
lane_transcript_stats.table(calls, window),
|
|
151
|
-
]
|
|
125
|
+
// The whole ledger, every run event and the window's lane calls — what the `lane:stats` tables read.
|
|
126
|
+
async function period_records(
|
|
127
|
+
context: MeasureContext,
|
|
128
|
+
window: StatsWindow,
|
|
129
|
+
): Promise<PeriodRecords> {
|
|
130
|
+
return {
|
|
131
|
+
entries: await lane_net_read.read_ledger(context),
|
|
132
|
+
events: await lane_net_read.read_events(context),
|
|
133
|
+
calls: lane_transcript_stats.read_calls(transcript_directories(context), window),
|
|
134
|
+
}
|
|
152
135
|
}
|
|
153
136
|
|
|
154
137
|
async function stats_command(
|
|
@@ -162,25 +145,159 @@ async function stats_command(
|
|
|
162
145
|
|
|
163
146
|
const window = lane_stats.window_of(period_days, context.now_ms ?? Date.now())
|
|
164
147
|
const label = { limit: await limit_label(values.limit), period_days }
|
|
165
|
-
const
|
|
166
|
-
const row = lane_stats.row(entries, window, label)
|
|
148
|
+
const records = await period_records(context, window)
|
|
149
|
+
const row = lane_stats.row(records.entries, window, label)
|
|
150
|
+
const tables = lane_stats_tables.tables_of(records, window)
|
|
151
|
+
|
|
152
|
+
console.info([`${lane_stats.header()}\n${row}`, ...tables].join('\n\n'))
|
|
153
|
+
|
|
154
|
+
return 0
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
interface ValueRequest {
|
|
158
|
+
metric: string
|
|
159
|
+
since_ms: number
|
|
160
|
+
address?: CellAddress
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
interface AddressFlags {
|
|
164
|
+
table?: string | undefined
|
|
165
|
+
row?: string | undefined
|
|
166
|
+
column?: string | undefined
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function since_of(text = ''): number | undefined {
|
|
170
|
+
const since_ms = Date.parse(text)
|
|
171
|
+
|
|
172
|
+
return Number.isNaN(since_ms) ? undefined : since_ms
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function is_known(name: string): boolean {
|
|
176
|
+
return name === CELL_METRIC || lane_value.is_metric(name)
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function metric_of(positionals: ReadonlyArray<string>): string | undefined {
|
|
180
|
+
const [name] = positionals
|
|
181
|
+
|
|
182
|
+
return name !== undefined && positionals.length === 1 && is_known(name) ? name : undefined
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function address_of({ table, row, column }: AddressFlags): CellAddress | undefined {
|
|
186
|
+
return table === undefined || row === undefined || column === undefined
|
|
187
|
+
? undefined
|
|
188
|
+
: { table, row, column }
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function request_of(
|
|
192
|
+
metric: string | undefined,
|
|
193
|
+
since_ms: number | undefined,
|
|
194
|
+
): ValueRequest | undefined {
|
|
195
|
+
return metric === undefined || since_ms === undefined ? undefined : { metric, since_ms }
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// One known metric and a readable `--since` instant — `cell` with its whole address — or `undefined`
|
|
199
|
+
// for a refusal.
|
|
200
|
+
function value_request(rest: ReadonlyArray<string>): ValueRequest | undefined {
|
|
201
|
+
const parsed = cli_flags.arguments_of(rest, VALUE_OPTIONS)
|
|
202
|
+
|
|
203
|
+
if (parsed === undefined) return undefined
|
|
204
|
+
|
|
205
|
+
const request = request_of(metric_of(parsed.positionals), since_of(parsed.values.since))
|
|
206
|
+
|
|
207
|
+
if (request?.metric !== CELL_METRIC) return request
|
|
208
|
+
|
|
209
|
+
const address = address_of(parsed.values)
|
|
210
|
+
|
|
211
|
+
return address === undefined ? undefined : { ...request, address }
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// The value alone on its line, so a measurement declaration reads it as the output's last line; a
|
|
215
|
+
// period with no sample prints nothing there and fails, which the drive reads as unreadable.
|
|
216
|
+
function print_value(request: ValueRequest, measured: number | undefined): number {
|
|
217
|
+
if (measured === undefined) {
|
|
218
|
+
const since = new Date(request.since_ms).toISOString()
|
|
219
|
+
|
|
220
|
+
const missing = request.address === undefined ? 'no sample' : 'no single numeric cell'
|
|
221
|
+
|
|
222
|
+
console.error(`josh lane:value ${request.metric}: ${missing} since ${since}`)
|
|
223
|
+
|
|
224
|
+
return FAILURE_EXIT_CODE
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
console.info(measured.toFixed(VALUE_DIGITS))
|
|
228
|
+
|
|
229
|
+
return 0
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// The addressed cell of the tables `lane:stats` would print for `window`.
|
|
233
|
+
async function cell_value(
|
|
234
|
+
address: CellAddress,
|
|
235
|
+
window: StatsWindow,
|
|
236
|
+
context: MeasureContext,
|
|
237
|
+
): Promise<number | undefined> {
|
|
238
|
+
const tables = lane_stats_tables.tables_of(await period_records(context, window), window)
|
|
239
|
+
|
|
240
|
+
return lane_value_cell.value(tables, address)
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
async function value_command(
|
|
244
|
+
rest: ReadonlyArray<string>,
|
|
245
|
+
context: MeasureContext,
|
|
246
|
+
): Promise<number> {
|
|
247
|
+
const request = value_request(rest)
|
|
248
|
+
|
|
249
|
+
if (request === undefined) return refuse()
|
|
250
|
+
|
|
251
|
+
const window = { since_ms: request.since_ms, until_ms: context.now_ms ?? Date.now() }
|
|
252
|
+
|
|
253
|
+
if (request.address !== undefined) {
|
|
254
|
+
return print_value(request, await cell_value(request.address, window, context))
|
|
255
|
+
}
|
|
256
|
+
|
|
167
257
|
const records = {
|
|
168
|
-
entries,
|
|
169
|
-
events: await read_events(context),
|
|
258
|
+
entries: await lane_net_read.read_ledger(context),
|
|
170
259
|
calls: lane_transcript_stats.read_calls(transcript_directories(context), window),
|
|
171
260
|
}
|
|
172
261
|
|
|
173
|
-
|
|
262
|
+
return print_value(request, lane_value.value(request.metric, records, window))
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// The lane's net minutes, whole, alone on the line a causing-lane declaration copies
|
|
266
|
+
// (`lane-net-time.ts`); a lane the ledger holds no dispatch and merge of fails.
|
|
267
|
+
async function net_command(rest: ReadonlyArray<string>, context: MeasureContext): Promise<number> {
|
|
268
|
+
const [issue = ''] = rest
|
|
269
|
+
|
|
270
|
+
if (rest.length !== 1 || !issue_number_shape.is_issue_number(issue)) return refuse()
|
|
271
|
+
|
|
272
|
+
const net = await lane_net_read.net_minutes_of(Number(issue), context)
|
|
273
|
+
|
|
274
|
+
if (net === undefined) {
|
|
275
|
+
console.error(
|
|
276
|
+
`josh lane:net ${issue}: the ledger holds no dispatch and merge of ${session_cite.issue(issue)}`,
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
return FAILURE_EXIT_CODE
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
console.info(String(net))
|
|
174
283
|
|
|
175
284
|
return 0
|
|
176
285
|
}
|
|
177
286
|
|
|
178
|
-
|
|
179
|
-
|
|
287
|
+
type VerbCommand = (rest: ReadonlyArray<string>, context: MeasureContext) => Promise<number>
|
|
288
|
+
|
|
289
|
+
const VERBS: Readonly<Record<string, VerbCommand>> = {
|
|
290
|
+
[SAMPLE_VERB]: sample_command,
|
|
291
|
+
[STATS_VERB]: stats_command,
|
|
292
|
+
[VALUE_VERB]: value_command,
|
|
293
|
+
[NET_VERB]: net_command,
|
|
294
|
+
}
|
|
180
295
|
|
|
181
|
-
|
|
296
|
+
async function run(argv: ReadonlyArray<string>, context: MeasureContext = {}): Promise<number> {
|
|
297
|
+
const [verb = '', ...rest] = argv
|
|
298
|
+
const command = Object.hasOwn(VERBS, verb) ? VERBS[verb] : undefined
|
|
182
299
|
|
|
183
|
-
return
|
|
300
|
+
return command === undefined ? refuse() : await command(rest, context)
|
|
184
301
|
}
|
|
185
302
|
|
|
186
303
|
async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
2
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
3
|
+
import { lane_ledger } from './lane-ledger'
|
|
4
|
+
import { lane_net_time } from './lane-net-time'
|
|
5
|
+
import type { MeasureContext } from './lane-sampler'
|
|
6
|
+
|
|
7
|
+
// The ledger and the event stream the lane measurements read, and the one lane's net minutes read from
|
|
8
|
+
// them — `josh lane:net` and the causing-lane line `josh issue:file --found-during` prints
|
|
9
|
+
// (joshuafolkken/kit#5225) share it.
|
|
10
|
+
|
|
11
|
+
type ReadContext = Pick<MeasureContext, 'ledger_path' | 'events_path'>
|
|
12
|
+
|
|
13
|
+
async function read_ledger(
|
|
14
|
+
context: ReadContext,
|
|
15
|
+
): Promise<ReturnType<typeof lane_ledger.read_entries>> {
|
|
16
|
+
const path = context.ledger_path ?? (await lane_ledger.target())
|
|
17
|
+
|
|
18
|
+
return path === undefined ? [] : lane_ledger.read_entries(path)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// The run's event stream, read for the parks that end a stop's wait.
|
|
22
|
+
async function read_events(context: ReadContext): Promise<ReadonlyArray<RunEvent>> {
|
|
23
|
+
if (context.events_path !== undefined) return run_event_stream.read_events(context.events_path)
|
|
24
|
+
|
|
25
|
+
return await run_event_stream_emit.all_events()
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// The lane's net minutes, whole; `undefined` when the ledger holds no dispatch and merge of it.
|
|
29
|
+
async function net_minutes_of(
|
|
30
|
+
issue: number,
|
|
31
|
+
context: ReadContext = {},
|
|
32
|
+
): Promise<number | undefined> {
|
|
33
|
+
const events = await read_events(context)
|
|
34
|
+
|
|
35
|
+
return lane_net_time.net_minutes(await read_ledger(context), events, issue)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const lane_net_read = {
|
|
39
|
+
net_minutes_of,
|
|
40
|
+
read_events,
|
|
41
|
+
read_ledger,
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export { lane_net_read }
|