@joshuafolkken/kit 1.1514.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/investigator.md +1 -1
- 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/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- 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-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- 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 +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -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-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- 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 +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- 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 +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -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-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- 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 +85 -0
- 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/followup-review-gates.ts +81 -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 +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- 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 +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- 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/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- 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 +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- 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 +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- 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-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- 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 +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- 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 +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- 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 +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -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 +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- 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/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- 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-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -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-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -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 +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- 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-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- 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-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- 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-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- 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/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- 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/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -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 +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- 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-main.ts +12 -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-blobs.ts +221 -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 +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -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-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- 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 +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- 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 +54 -10
- 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-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- 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 +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- 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 +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -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 +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- 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 +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- 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 +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- 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-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -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 +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- 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 +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- 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 +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- 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 +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { isDeepStrictEqual } from 'node:util'
|
|
2
|
+
import { Worker } from 'node:worker_threads'
|
|
3
|
+
import {
|
|
4
|
+
run_board_gather,
|
|
5
|
+
type Gatherer,
|
|
6
|
+
type GatherPorts,
|
|
7
|
+
type GatherRead,
|
|
8
|
+
type GatherState,
|
|
9
|
+
} from './run-board-gather'
|
|
10
|
+
import type { LocalRead } from './run-board-read'
|
|
11
|
+
|
|
12
|
+
// The live board's side of its worker thread (`run-board-gather-worker.ts`): the worker takes the
|
|
13
|
+
// reads off this machine and hands each round over; a redraw draws the last one it handed, so no read
|
|
14
|
+
// stops the board's spinner. A round that throws is handed over as failed, and the worker reads again
|
|
15
|
+
// next round; a worker that dies is said on the board, and started again on the next redraw — there is
|
|
16
|
+
// no other place the reads are taken.
|
|
17
|
+
|
|
18
|
+
const WORKER_URL = new URL('run-board-gather-worker.ts', import.meta.url)
|
|
19
|
+
const EMPTY_READ = run_board_gather.read_of(run_board_gather.FRESH_GATHER)
|
|
20
|
+
|
|
21
|
+
// The run's read as the worker hands it over. A stream read again unchanged is not handed over — the
|
|
22
|
+
// board keeps its own array, so the folds it keyed on that array are not folded again.
|
|
23
|
+
interface LocalPost {
|
|
24
|
+
value: LocalRead | undefined
|
|
25
|
+
is_same_events?: boolean | undefined
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// One round as the worker hands it over: the run's read only when it was read again, so the board
|
|
29
|
+
// does not copy the whole stream every second.
|
|
30
|
+
interface GatherPost {
|
|
31
|
+
read: Omit<GatherRead, 'local'>
|
|
32
|
+
local?: LocalPost | undefined
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// A round whose reads threw, handed over with why; the worker reads again next round.
|
|
36
|
+
interface FailedPost {
|
|
37
|
+
failed: string
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// The part of a worker the board listens to.
|
|
41
|
+
interface GatherWorker {
|
|
42
|
+
on: (event: 'message' | 'error' | 'exit', listener: (value: unknown) => void) => unknown
|
|
43
|
+
unref: () => void
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
type Spawn = () => GatherWorker
|
|
47
|
+
|
|
48
|
+
interface Thread {
|
|
49
|
+
worker: GatherWorker | undefined
|
|
50
|
+
latest: GatherRead | undefined
|
|
51
|
+
waiting: Array<(read: GatherRead) => void>
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function local_post(before: LocalRead | undefined, after: LocalRead | undefined): LocalPost {
|
|
55
|
+
if (before === undefined || after === undefined) return { value: after }
|
|
56
|
+
if (!isDeepStrictEqual(before.events, after.events)) return { value: after }
|
|
57
|
+
|
|
58
|
+
return { value: { ...after, events: [] }, is_same_events: true }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function post_of(before: GatherState, after: GatherState): GatherPost {
|
|
62
|
+
const { local, ...read } = run_board_gather.read_of(after)
|
|
63
|
+
const is_reread = after.read_ms !== before.read_ms
|
|
64
|
+
|
|
65
|
+
return { read, local: is_reread ? local_post(before.local, local) : undefined }
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function is_post(value: unknown): value is GatherPost {
|
|
69
|
+
return typeof value === 'object' && value !== null && 'read' in value
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// What a failure is said as: the first line of its message.
|
|
73
|
+
function reason_of(error: unknown): string {
|
|
74
|
+
const message = error instanceof Error ? error.message : String(error)
|
|
75
|
+
|
|
76
|
+
return message.split('\n', 1)[0] ?? ''
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function failed_of(error: unknown): FailedPost {
|
|
80
|
+
return { failed: reason_of(error) }
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// One round on the worker: the reads handed over, or why they threw — the state kept for the next.
|
|
84
|
+
async function gather_round(
|
|
85
|
+
state: GatherState,
|
|
86
|
+
ports: GatherPorts,
|
|
87
|
+
post: (value: GatherPost | FailedPost) => void,
|
|
88
|
+
): Promise<GatherState> {
|
|
89
|
+
try {
|
|
90
|
+
const next = await run_board_gather.gather(state, ports, 'background')
|
|
91
|
+
|
|
92
|
+
post(post_of(state, next))
|
|
93
|
+
|
|
94
|
+
return next
|
|
95
|
+
} catch (error) {
|
|
96
|
+
post(failed_of(error))
|
|
97
|
+
|
|
98
|
+
return state
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function is_failed(value: unknown): value is FailedPost {
|
|
103
|
+
return typeof value === 'object' && value !== null && 'failed' in value
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function settle(thread: Thread, read: GatherRead): void {
|
|
107
|
+
thread.latest = read
|
|
108
|
+
|
|
109
|
+
for (const resolve of thread.waiting.splice(0)) resolve(read)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function local_of(thread: Thread, post: LocalPost): LocalRead | undefined {
|
|
113
|
+
const { value, is_same_events } = post
|
|
114
|
+
const kept = thread.latest?.local
|
|
115
|
+
|
|
116
|
+
if (is_same_events !== true || value === undefined || kept === undefined) return value
|
|
117
|
+
|
|
118
|
+
return { ...value, events: kept.events }
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function receive(thread: Thread, post: GatherPost): void {
|
|
122
|
+
const local = post.local === undefined ? thread.latest?.local : local_of(thread, post.local)
|
|
123
|
+
|
|
124
|
+
settle(thread, { ...post.read, local, read_failed_ms: undefined, read_error: undefined })
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// A failed read keeps the last round on screen, said failed and why until the next answers.
|
|
128
|
+
function said_failed(thread: Thread, reason: string, now: () => number): void {
|
|
129
|
+
settle(thread, { ...(thread.latest ?? EMPTY_READ), read_failed_ms: now(), read_error: reason })
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// A worker that threw or exited is started again on the next redraw.
|
|
133
|
+
function fail(thread: Thread, worker: GatherWorker, reason: string, now: () => number): void {
|
|
134
|
+
if (thread.worker !== worker) return
|
|
135
|
+
|
|
136
|
+
thread.worker = undefined
|
|
137
|
+
said_failed(thread, reason, now)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function listen(thread: Thread, worker: GatherWorker, now: () => number): void {
|
|
141
|
+
worker.on('message', (value) => {
|
|
142
|
+
if (is_post(value)) receive(thread, value)
|
|
143
|
+
else if (is_failed(value)) said_failed(thread, value.failed, now)
|
|
144
|
+
})
|
|
145
|
+
worker.on('error', (error) => {
|
|
146
|
+
fail(thread, worker, reason_of(error), now)
|
|
147
|
+
})
|
|
148
|
+
worker.on('exit', (code) => {
|
|
149
|
+
fail(thread, worker, `exit ${String(code)}`, now)
|
|
150
|
+
})
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function start(thread: Thread, spawn: Spawn, now: () => number): GatherWorker {
|
|
154
|
+
const worker = spawn()
|
|
155
|
+
|
|
156
|
+
listen(thread, worker, now)
|
|
157
|
+
// The board's own loop keeps the process; the worker never holds it open past the board.
|
|
158
|
+
worker.unref()
|
|
159
|
+
|
|
160
|
+
return worker
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
async function latest_of(thread: Thread): Promise<GatherRead> {
|
|
164
|
+
if (thread.latest !== undefined) return thread.latest
|
|
165
|
+
|
|
166
|
+
return await new Promise((resolve) => {
|
|
167
|
+
thread.waiting.push(resolve)
|
|
168
|
+
})
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function spawn_worker(): GatherWorker {
|
|
172
|
+
return new Worker(WORKER_URL)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// The first redraw waits for the worker's first round; every later one draws the last round handed.
|
|
176
|
+
function worker_gatherer(spawn: Spawn = spawn_worker, now: () => number = Date.now): Gatherer {
|
|
177
|
+
const thread: Thread = { worker: undefined, latest: undefined, waiting: [] }
|
|
178
|
+
|
|
179
|
+
return async () => {
|
|
180
|
+
thread.worker ??= start(thread, spawn, now)
|
|
181
|
+
|
|
182
|
+
return await latest_of(thread)
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const run_board_gather_thread = { WORKER_URL, gather_round, post_of, worker_gatherer }
|
|
187
|
+
|
|
188
|
+
export { run_board_gather_thread }
|
|
189
|
+
export type { FailedPost, GatherPost, GatherWorker }
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { setTimeout as sleep } from 'node:timers/promises'
|
|
2
|
+
import { parentPort, type MessagePort } from 'node:worker_threads'
|
|
3
|
+
import { run_board_gather } from './run-board-gather'
|
|
4
|
+
import { run_board_gather_live } from './run-board-gather-live'
|
|
5
|
+
import { run_board_gather_thread } from './run-board-gather-thread'
|
|
6
|
+
import { run_board_spin } from './run-board-spin'
|
|
7
|
+
|
|
8
|
+
// The live board's worker thread: one round of the reads off this machine a redraw apart, each handed
|
|
9
|
+
// to the board as it lands (`run-board-gather-thread.ts`). A round that throws is handed over as
|
|
10
|
+
// failed, and the next round reads again.
|
|
11
|
+
|
|
12
|
+
const { FRESH_GATHER } = run_board_gather
|
|
13
|
+
const { gather_round } = run_board_gather_thread
|
|
14
|
+
|
|
15
|
+
async function gather_forever(port: MessagePort): Promise<void> {
|
|
16
|
+
const ports = run_board_gather_live.ports_of(true)
|
|
17
|
+
let state = FRESH_GATHER
|
|
18
|
+
|
|
19
|
+
for (;;) {
|
|
20
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each round folds the state the last one left
|
|
21
|
+
state = await gather_round(state, ports, (value) => {
|
|
22
|
+
port.postMessage(value)
|
|
23
|
+
})
|
|
24
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each round waits a redraw
|
|
25
|
+
await sleep(run_board_spin.REDRAW_MS)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (parentPort !== null) await gather_forever(parentPort)
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import type { BudgetWait } from '#scripts/gate/core-wait'
|
|
2
|
+
import type { MachineSample } from '#scripts/gate/machine-capacity'
|
|
3
|
+
import { lane_await } from '#scripts/lane/lane-await'
|
|
4
|
+
import { lane_process_table, type TableRead } from '#scripts/lane/lane-process-table'
|
|
5
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
6
|
+
import type { BoardUsage } from './run-board-header'
|
|
7
|
+
import { run_board_idle, type IdleSince } from './run-board-idle'
|
|
8
|
+
import { run_board_machine, type MachineGauges, type MachineMark } from './run-board-machine'
|
|
9
|
+
import type { LocalRead } from './run-board-read'
|
|
10
|
+
import { run_board_state, type Pace } from './run-board-state'
|
|
11
|
+
import type { UsageMark } from './run-board-usage'
|
|
12
|
+
import { run_board_usage_board } from './run-board-usage-board'
|
|
13
|
+
|
|
14
|
+
// What `run:board` reads off this machine: the run's own stream and lanes, the process table and the
|
|
15
|
+
// machine's gauges. A live board reads them on a worker thread (`run-board-gather-worker.ts`), so no
|
|
16
|
+
// read stops the spinner; a single frame has no spinner to stop and reads them where it draws. **Two
|
|
17
|
+
// speeds**: the run's own stream and lanes are re-read no more often than `LOCAL_READ_MS`, because each
|
|
18
|
+
// read parses the whole stream and asks git twice, and a board left open all night would otherwise grow
|
|
19
|
+
// heavier as the run grew longer; the machine is sampled once a second — one `sysctl` takes a few
|
|
20
|
+
// milliseconds, and its gauges are the differences between consecutive samples.
|
|
21
|
+
|
|
22
|
+
const MACHINE_SAMPLE_MS = MS_PER_SECOND
|
|
23
|
+
const LOCAL_READ_SECONDS = 5
|
|
24
|
+
const LOCAL_READ_MS = LOCAL_READ_SECONDS * MS_PER_SECOND
|
|
25
|
+
const { is_due } = run_board_state
|
|
26
|
+
|
|
27
|
+
interface GatherPorts {
|
|
28
|
+
// Every process on the machine, one `ps` (`lane-process-table.ts`); a read takes it at most once
|
|
29
|
+
// and hands it to both readers below, so the lane count and the usage columns read one instant.
|
|
30
|
+
read_table: TableRead
|
|
31
|
+
// `undefined` when no run has started here.
|
|
32
|
+
read_local: (table: TableRead) => Promise<LocalRead | undefined>
|
|
33
|
+
read_machine: () => Promise<MachineSample>
|
|
34
|
+
// The claims waiting in the core budget, read on the machine's second; none where it is not given.
|
|
35
|
+
read_waits?: (() => Array<BudgetWait>) | undefined
|
|
36
|
+
// Every process and its lane, the last reading's lanes reused (`run-board-usage-read.ts`).
|
|
37
|
+
read_usage: (before: UsageMark | undefined, table: TableRead) => Promise<UsageMark | undefined>
|
|
38
|
+
// Whether the reads go on — a live board — so a usage reading has the last one to compare against.
|
|
39
|
+
is_live: boolean
|
|
40
|
+
now: () => number
|
|
41
|
+
sleep: (ms: number) => Promise<void>
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// What a frame draws from the reads, as a worker hands it over.
|
|
45
|
+
interface GatherRead {
|
|
46
|
+
// The last local read, drawn until the next is due; `undefined` when no run had started.
|
|
47
|
+
local: LocalRead | undefined
|
|
48
|
+
read_ms: number | undefined
|
|
49
|
+
// When each lane the reads found idle was first read so (`run-board-idle.ts`).
|
|
50
|
+
idle_since: IdleSince
|
|
51
|
+
gauges: MachineGauges | undefined
|
|
52
|
+
// Each lane's and each process group's usage, `undefined` where none could be read.
|
|
53
|
+
usages: BoardUsage | undefined
|
|
54
|
+
budget_waits: ReadonlyArray<BudgetWait>
|
|
55
|
+
// When the reads last failed; `undefined` once a read has answered since.
|
|
56
|
+
read_failed_ms?: number | undefined
|
|
57
|
+
// Why they failed, the first line of the error; cleared with `read_failed_ms`.
|
|
58
|
+
read_error?: string | undefined
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
interface GatherState extends GatherRead {
|
|
62
|
+
// The last machine sample, which the next one is compared against.
|
|
63
|
+
machine: MachineMark | undefined
|
|
64
|
+
// The read the last sample was taken on, which the next sample is due a second after.
|
|
65
|
+
sampled_ms: number | undefined
|
|
66
|
+
// The last process reading, which the next one is compared against.
|
|
67
|
+
usage: UsageMark | undefined
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// The reads a frame draws from, taken as it asks.
|
|
71
|
+
type Gatherer = (pace: Pace) => Promise<GatherRead>
|
|
72
|
+
|
|
73
|
+
const FRESH_GATHER: GatherState = {
|
|
74
|
+
local: undefined,
|
|
75
|
+
read_ms: undefined,
|
|
76
|
+
idle_since: run_board_idle.NO_IDLE,
|
|
77
|
+
gauges: undefined,
|
|
78
|
+
usages: undefined,
|
|
79
|
+
budget_waits: [],
|
|
80
|
+
machine: undefined,
|
|
81
|
+
sampled_ms: undefined,
|
|
82
|
+
usage: undefined,
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// The process snapshot and the pace the reads are taken at, shared by the reads.
|
|
86
|
+
interface Snapshot {
|
|
87
|
+
pace: Pace
|
|
88
|
+
table: TableRead
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
interface SnapshotAt extends Snapshot {
|
|
92
|
+
now_ms: number
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async function read_at(
|
|
96
|
+
state: GatherState,
|
|
97
|
+
ports: GatherPorts,
|
|
98
|
+
at: SnapshotAt,
|
|
99
|
+
): Promise<GatherState> {
|
|
100
|
+
const local = await ports.read_local(at.table)
|
|
101
|
+
const idle_since = run_board_idle.since_of(state.idle_since, local?.idle_lanes ?? [], at.now_ms)
|
|
102
|
+
|
|
103
|
+
return { ...state, local, read_ms: at.now_ms, idle_since }
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// A single frame has no earlier read to confirm an idle lane against (`run-board-idle.ts`).
|
|
107
|
+
function is_unconfirmed(before: GatherState, read: GatherState, pace: Pace): boolean {
|
|
108
|
+
return pace === 'settled' && before.read_ms === undefined && read.idle_since.size > 0
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// The reads over a snapshot taken now.
|
|
112
|
+
function fresh_snapshot(ports: GatherPorts, pace: Pace): Snapshot {
|
|
113
|
+
return { pace, table: lane_process_table.shared(ports.read_table) }
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// The lane read and the reads after it share one snapshot; a confirmation taken after the wait reads
|
|
117
|
+
// a snapshot of its own and hands it on, so no lane is counted from the state before the wait.
|
|
118
|
+
async function reread(
|
|
119
|
+
state: GatherState,
|
|
120
|
+
ports: GatherPorts,
|
|
121
|
+
snapshot: Snapshot,
|
|
122
|
+
): Promise<{ read: GatherState; snapshot: Snapshot }> {
|
|
123
|
+
const now_ms = ports.now()
|
|
124
|
+
|
|
125
|
+
if (!is_due(state.read_ms, LOCAL_READ_MS, now_ms)) return { read: state, snapshot }
|
|
126
|
+
|
|
127
|
+
const read = await read_at(state, ports, { now_ms, ...snapshot })
|
|
128
|
+
|
|
129
|
+
if (!is_unconfirmed(state, read, snapshot.pace)) return { read, snapshot }
|
|
130
|
+
|
|
131
|
+
await ports.sleep(lane_await.RECONFIRM_MS)
|
|
132
|
+
|
|
133
|
+
const later = fresh_snapshot(ports, snapshot.pace)
|
|
134
|
+
|
|
135
|
+
return { read: await read_at(read, ports, { now_ms: ports.now(), ...later }), snapshot: later }
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// The sample is timed when it is taken, not when the reads began: it is due by the reads' clock, so a
|
|
139
|
+
// sample taken a few milliseconds in does not slip to the read after the second.
|
|
140
|
+
async function resample(
|
|
141
|
+
state: GatherState,
|
|
142
|
+
ports: GatherPorts,
|
|
143
|
+
at: SnapshotAt,
|
|
144
|
+
): Promise<GatherState> {
|
|
145
|
+
if (!is_due(state.sampled_ms, MACHINE_SAMPLE_MS, at.now_ms)) return state
|
|
146
|
+
|
|
147
|
+
const at_ms = ports.now()
|
|
148
|
+
const machine = { sample: await ports.read_machine(), at_ms }
|
|
149
|
+
const gauges = run_board_machine.gauges_of(state.machine, machine)
|
|
150
|
+
const budget_waits = ports.read_waits?.() ?? []
|
|
151
|
+
const usages = await run_board_usage_board.read_usages(state, ports, at.table)
|
|
152
|
+
|
|
153
|
+
return { ...state, ...usages, machine, gauges, budget_waits, sampled_ms: at.now_ms }
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// One round of the reads. The process snapshot is read once, by whichever of the lane read and the
|
|
157
|
+
// sample asks first.
|
|
158
|
+
async function gather(state: GatherState, ports: GatherPorts, pace: Pace): Promise<GatherState> {
|
|
159
|
+
const { read, snapshot } = await reread(state, ports, fresh_snapshot(ports, pace))
|
|
160
|
+
|
|
161
|
+
return await resample(read, ports, { now_ms: ports.now(), ...snapshot })
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// What a frame draws, without the marks the next reads compare against.
|
|
165
|
+
function read_of(state: GatherState): GatherRead {
|
|
166
|
+
const { local, read_ms, idle_since, gauges, usages, budget_waits } = state
|
|
167
|
+
const { read_failed_ms, read_error } = state
|
|
168
|
+
|
|
169
|
+
return { local, read_ms, idle_since, gauges, usages, budget_waits, read_failed_ms, read_error }
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// A single frame's reads, taken afresh each time it is drawn.
|
|
173
|
+
function frame_gatherer(ports: GatherPorts): Gatherer {
|
|
174
|
+
return async (pace) => read_of(await gather(FRESH_GATHER, ports, pace))
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const run_board_gather = {
|
|
178
|
+
FRESH_GATHER,
|
|
179
|
+
LOCAL_READ_MS,
|
|
180
|
+
MACHINE_SAMPLE_MS,
|
|
181
|
+
frame_gatherer,
|
|
182
|
+
gather,
|
|
183
|
+
read_of,
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export { run_board_gather }
|
|
187
|
+
export type { GatherPorts, GatherRead, GatherState, Gatherer }
|
|
@@ -1,24 +1,32 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
2
2
|
import { run_progress_cli } from '#scripts/run/progress/run-progress-cli'
|
|
3
3
|
import type { ClosedAnswer } from './run-board-closed'
|
|
4
4
|
import { run_board_fetch, type Fetch } from './run-board-fetch'
|
|
5
5
|
import { run_board_idle } from './run-board-idle'
|
|
6
|
-
import {
|
|
6
|
+
import type { BoardPlan } from './run-board-layout'
|
|
7
7
|
import type { LocalRead } from './run-board-read'
|
|
8
|
+
import type { Known } from './run-board-snapshot'
|
|
8
9
|
import { run_board_state, type BoardPorts, type BoardState, type Pace } from './run-board-state'
|
|
9
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
run_board_status,
|
|
12
|
+
type ItemState,
|
|
13
|
+
type ItemStatus,
|
|
14
|
+
type OpenRead,
|
|
15
|
+
} from './run-board-status'
|
|
10
16
|
|
|
11
17
|
// The GitHub reads a `run:board` redraw draws over: the plan, and the run's children that left the
|
|
12
|
-
// open listing. Each is taken no more often than `run:progress` re-reads after a decline. **A live
|
|
18
|
+
// open listing or are drawn stopped. Each is taken no more often than `run:progress` re-reads after a decline. **A live
|
|
13
19
|
// board never waits on them**: each read is launched and folded in on the redraw after it lands, so
|
|
14
20
|
// the clock keeps moving while GitHub answers; one plain frame waits for them. A failed plan read
|
|
15
21
|
// keeps the previous plan on screen and says when it failed. A run that ended keeps its plan as it
|
|
16
22
|
// last read.
|
|
17
23
|
|
|
18
|
-
const PLAN_RETRY_MS = run_progress_cli.DECLINE_RETRY_SECONDS *
|
|
24
|
+
const PLAN_RETRY_MS = run_progress_cli.DECLINE_RETRY_SECONDS * MS_PER_SECOND
|
|
19
25
|
// A rejected closed read answers nothing closed and not whole, so it is asked again.
|
|
20
26
|
const UNANSWERED: ClosedAnswer = { closed: new Map(), is_whole: false }
|
|
21
27
|
const { is_due } = run_board_state
|
|
28
|
+
const STOPPED_STATE: ItemState = 'stopped'
|
|
29
|
+
const RUNNING_STATE: ItemState = 'running'
|
|
22
30
|
|
|
23
31
|
// What a step of the GitHub reads works against.
|
|
24
32
|
interface Gather {
|
|
@@ -28,19 +36,39 @@ interface Gather {
|
|
|
28
36
|
pace: Pace
|
|
29
37
|
}
|
|
30
38
|
|
|
31
|
-
// A title the board once knew stays known, so an issue that left the open listing keeps its name
|
|
32
|
-
|
|
33
|
-
|
|
39
|
+
// A title the board once knew stays known, so an issue that left the open listing keeps its name —
|
|
40
|
+
// one the last board's snapshot named among them.
|
|
41
|
+
function titles_of(state: BoardState): ReadonlyMap<number, string> {
|
|
42
|
+
return state.plan?.context.titles ?? state.known.titles
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function with_titles(plan: BoardPlan, state: BoardState): BoardPlan {
|
|
46
|
+
const titles = new Map([...titles_of(state), ...plan.context.titles])
|
|
34
47
|
|
|
35
48
|
return { ...plan, context: { ...plan.context, titles } }
|
|
36
49
|
}
|
|
37
50
|
|
|
51
|
+
// A lane this run started after the last plan read was asked, on an issue the plan has no title for
|
|
52
|
+
// (joshuafolkken/kit#4577). The read it launches is asked after the lane started, so a title still
|
|
53
|
+
// missing after it — past the listing's cap, or a failed read — waits the usual interval.
|
|
54
|
+
function has_untitled_lane(state: BoardState, gather: Gather): boolean {
|
|
55
|
+
const asked_ms = state.attempted_ms ?? Infinity
|
|
56
|
+
const titles = titles_of(state)
|
|
57
|
+
|
|
58
|
+
return [...gather.local.lane_states.own].some(
|
|
59
|
+
([issue, status]) => !titles.has(issue) && (status.started_ms ?? -Infinity) > asked_ms,
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
|
|
38
63
|
// An ended run's plan is read until it lands once, then held; a read in flight is not launched again.
|
|
64
|
+
// A lane with no title is read for at once rather than after the interval.
|
|
39
65
|
function is_plan_due(state: BoardState, gather: Gather): boolean {
|
|
40
66
|
if (state.plan_fetch !== undefined) return false
|
|
41
67
|
if (gather.local.ended_ms !== undefined && state.fetched_ms !== undefined) return false
|
|
42
68
|
|
|
43
|
-
return
|
|
69
|
+
return (
|
|
70
|
+
is_due(state.attempted_ms, PLAN_RETRY_MS, gather.now_ms) || has_untitled_lane(state, gather)
|
|
71
|
+
)
|
|
44
72
|
}
|
|
45
73
|
|
|
46
74
|
function launch_plan(state: BoardState, gather: Gather): BoardState {
|
|
@@ -67,41 +95,61 @@ function fold_plan(state: BoardState): BoardState {
|
|
|
67
95
|
|
|
68
96
|
return {
|
|
69
97
|
...settled,
|
|
70
|
-
plan: with_titles(answer.value, state
|
|
98
|
+
plan: with_titles(answer.value, state),
|
|
71
99
|
fetched_ms: state.attempted_ms,
|
|
72
100
|
failed_ms: undefined,
|
|
73
101
|
}
|
|
74
102
|
}
|
|
75
103
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
function lanes_in_run(plan: BoardPlan, local: LocalRead): ReadonlySet<number> {
|
|
79
|
-
const earlier = new Set(local.earlier_lanes?.map(Number))
|
|
104
|
+
function statuses_for(state: BoardState, local: LocalRead): ReadonlyMap<number, ItemStatus> {
|
|
105
|
+
const stopped = run_board_idle.stopped_of(state.idle_since, state.read_ms)
|
|
80
106
|
|
|
81
|
-
return
|
|
107
|
+
return run_board_status.statuses_of(local.events, local.lane_states, stopped)
|
|
82
108
|
}
|
|
83
109
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return run_board_status.statuses_of(local.events, local.lanes, in_run, stopped)
|
|
110
|
+
// The open listing the statuses are settled against — none before a plan has landed.
|
|
111
|
+
function open_read_of(state: BoardState, plan: BoardPlan | undefined): OpenRead {
|
|
112
|
+
return {
|
|
113
|
+
open_numbers: plan?.context.open_numbers,
|
|
114
|
+
read_ms: state.fetched_ms,
|
|
115
|
+
closed: state.closed,
|
|
116
|
+
labels: plan?.labels ?? new Map(),
|
|
117
|
+
}
|
|
93
118
|
}
|
|
94
119
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
function unread_closed(state: BoardState, local: LocalRead): Array<number> {
|
|
98
|
-
const open = state.plan?.context.open_numbers
|
|
120
|
+
function is_unlisted(issue: number, read: OpenRead): boolean {
|
|
121
|
+
const open = read.open_numbers
|
|
99
122
|
|
|
100
|
-
|
|
123
|
+
return open !== undefined && !open.has(issue)
|
|
124
|
+
}
|
|
101
125
|
|
|
102
|
-
|
|
126
|
+
// A child still drawn stopped or running holds no closed read of this launch — any it holds closed
|
|
127
|
+
// before it relaunched — so it is asked again. A running child is asked too while the plan read fails:
|
|
128
|
+
// the kept plan still lists it, and an empty listing — failed, or a repository whose last open issue
|
|
129
|
+
// was this child — would otherwise leave it running forever (joshuafolkken/kit#4537).
|
|
130
|
+
function is_closed_candidate(
|
|
131
|
+
issue: number,
|
|
132
|
+
status: ItemStatus,
|
|
133
|
+
read: OpenRead,
|
|
134
|
+
is_plan_failed: boolean,
|
|
135
|
+
): boolean {
|
|
136
|
+
if (status.state === STOPPED_STATE) return true
|
|
137
|
+
if (status.state === RUNNING_STATE) return is_plan_failed || is_unlisted(issue, read)
|
|
138
|
+
|
|
139
|
+
return is_unlisted(issue, read) && !read.closed.has(issue)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// The children the board has not read closed yet that the open listing no longer holds, or that it
|
|
143
|
+
// draws stopped: a child that merged itself and left its lane is drawn stopped until GitHub says it
|
|
144
|
+
// merged (joshuafolkken/kit#4401), and a listing cut short proves nothing missing.
|
|
145
|
+
function unread_closed(state: BoardState, local: LocalRead): Array<number> {
|
|
146
|
+
const read = open_read_of(state, state.plan)
|
|
147
|
+
const drawn = run_board_status.settle_closed(statuses_for(state, local), read)
|
|
148
|
+
const is_plan_failed = state.failed_ms !== undefined
|
|
103
149
|
|
|
104
|
-
return
|
|
150
|
+
return [...drawn]
|
|
151
|
+
.filter(([issue, status]) => is_closed_candidate(issue, status, read, is_plan_failed))
|
|
152
|
+
.map(([issue]) => issue)
|
|
105
153
|
}
|
|
106
154
|
|
|
107
155
|
// An ended run asks until one ask after it ended has answered whole, then holds what it has, as its
|
|
@@ -114,18 +162,25 @@ function has_asked_since_end(state: BoardState, local: LocalRead): boolean {
|
|
|
114
162
|
return closed_answered_ms >= local.ended_ms
|
|
115
163
|
}
|
|
116
164
|
|
|
117
|
-
function
|
|
165
|
+
function has_new_child(state: BoardState, unread: ReadonlyArray<number>): boolean {
|
|
166
|
+
return unread.some((issue) => !state.closed_asked.has(issue))
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function is_closed_due(state: BoardState, gather: Gather, unread: ReadonlyArray<number>): boolean {
|
|
118
170
|
if (state.closed_fetch !== undefined || has_asked_since_end(state, gather.local)) return false
|
|
119
171
|
|
|
120
|
-
return
|
|
172
|
+
return (
|
|
173
|
+
has_new_child(state, unread) || is_due(state.closed_attempted_ms, PLAN_RETRY_MS, gather.now_ms)
|
|
174
|
+
)
|
|
121
175
|
}
|
|
122
176
|
|
|
123
177
|
// A closed child is read once and its answer kept; one that has not answered closed is asked again no
|
|
124
|
-
// sooner than the plan is
|
|
178
|
+
// sooner than the plan is — unless a child the last ask did not hold has joined it — and an ended
|
|
179
|
+
// run's not again once an ask after the end has answered whole.
|
|
125
180
|
function launch_closed(state: BoardState, gather: Gather): BoardState {
|
|
126
181
|
const unread = unread_closed(state, gather.local)
|
|
127
182
|
|
|
128
|
-
if (unread.length === 0 || !is_closed_due(state, gather)) return state
|
|
183
|
+
if (unread.length === 0 || !is_closed_due(state, gather, unread)) return state
|
|
129
184
|
|
|
130
185
|
async function read(): Promise<ClosedAnswer> {
|
|
131
186
|
return await gather.ports.read_closed(unread)
|
|
@@ -133,7 +188,12 @@ function launch_closed(state: BoardState, gather: Gather): BoardState {
|
|
|
133
188
|
|
|
134
189
|
const closed_fetch = run_board_fetch.launch(read, UNANSWERED)
|
|
135
190
|
|
|
136
|
-
return {
|
|
191
|
+
return {
|
|
192
|
+
...state,
|
|
193
|
+
closed_fetch,
|
|
194
|
+
closed_attempted_ms: gather.now_ms,
|
|
195
|
+
closed_asked: new Set(unread),
|
|
196
|
+
}
|
|
137
197
|
}
|
|
138
198
|
|
|
139
199
|
// A whole answer counts as of the moment it was asked.
|
|
@@ -158,6 +218,22 @@ async function settle(pending: Fetch<unknown> | undefined, pace: Pace): Promise<
|
|
|
158
218
|
if (pending !== undefined && pace === 'settled') await pending.landed
|
|
159
219
|
}
|
|
160
220
|
|
|
221
|
+
// The titles and labels the board names its rows by: the plan's once it has landed, the snapshot's before.
|
|
222
|
+
function known_of(state: BoardState): Known {
|
|
223
|
+
if (state.plan === undefined) return state.known
|
|
224
|
+
|
|
225
|
+
return { titles: state.plan.context.titles, labels: state.plan.labels }
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// Each read that landed rewrites the snapshot whole, for the board opened next on this run.
|
|
229
|
+
function keep_snapshot(before: BoardState, after: BoardState, gather: Gather): void {
|
|
230
|
+
if (after.plan === before.plan && after.closed === before.closed) return
|
|
231
|
+
|
|
232
|
+
const run_started_ms = gather.local.started_ms
|
|
233
|
+
|
|
234
|
+
gather.ports.snapshot?.save({ run_started_ms, ...known_of(after), closed: after.closed })
|
|
235
|
+
}
|
|
236
|
+
|
|
161
237
|
// Folds what landed and launches what is due — the plan first, since the closed children are read off
|
|
162
238
|
// the plan's listing.
|
|
163
239
|
async function gather_github(state: BoardState, gather: Gather): Promise<BoardState> {
|
|
@@ -169,10 +245,14 @@ async function gather_github(state: BoardState, gather: Gather): Promise<BoardSt
|
|
|
169
245
|
|
|
170
246
|
await settle(closing.closed_fetch, gather.pace)
|
|
171
247
|
|
|
172
|
-
|
|
248
|
+
const gathered = fold_closed(closing)
|
|
249
|
+
|
|
250
|
+
keep_snapshot(state, gathered, gather)
|
|
251
|
+
|
|
252
|
+
return gathered
|
|
173
253
|
}
|
|
174
254
|
|
|
175
|
-
const run_board_github = { PLAN_RETRY_MS, gather_github, statuses_for }
|
|
255
|
+
const run_board_github = { PLAN_RETRY_MS, gather_github, known_of, open_read_of, statuses_for }
|
|
176
256
|
|
|
177
257
|
export { run_board_github }
|
|
178
258
|
export type { Gather }
|