@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
|
@@ -17,12 +17,22 @@ import { shell_segments } from './shell-segments'
|
|
|
17
17
|
// that stash findable and poppable by `pnpm josh stash:pop`, which is the whole of `operating-rules.md`'s
|
|
18
18
|
// safety argument; the forms it warns against are the *positional/bare* ones. So `git stash push -m`
|
|
19
19
|
// (with or without `-u`) and the read-only `git stash list` / `show` pass, and everything else — bare
|
|
20
|
-
// `git stash`, a message-less push, `pop` / `apply` / `drop` / `save` / `clear` — is refused.
|
|
20
|
+
// `git stash`, a message-less push, `pop` / `apply` / `drop` / `save` / `clear` — is refused. Those
|
|
21
|
+
// flows now push with `pnpm josh stash:push` (joshuafolkken/kit#4131), invisible here; the raw message
|
|
22
|
+
// form still passes for a procedure written before it.
|
|
21
23
|
//
|
|
22
24
|
// **The refusal names the way on for a handed-over stash.** joshuafolkken/kit#3630's plan restored a
|
|
23
25
|
// stash with `git stash apply`, and the lane parked on how to apply it instead of popping by message;
|
|
24
26
|
// the reason now says the substitution is the run's own to make (joshuafolkken/kit#3648).
|
|
25
27
|
//
|
|
28
|
+
// **The refusal names the way back for a single file.** A lane that refused `git checkout -- <file>`
|
|
29
|
+
// reverted its own edit by hand with `Edit` and left a line behind, so a green record landed on the
|
|
30
|
+
// wrong tree (joshuafolkken/kit#4988). The named restore writes HEAD's bytes over that one file, carries
|
|
31
|
+
// no body inline (`file-edits.md`), and no row refuses it. It reverses the file's unstaged diff, so a
|
|
32
|
+
// staged change (the user's) stays, `<path>` is read from the shell's directory like any pathspec,
|
|
33
|
+
// nothing is emptied before git runs (a `git show HEAD:<path> > <path>` redirect is), and an untracked
|
|
34
|
+
// path has no diff to reverse.
|
|
35
|
+
//
|
|
26
36
|
// **It fires on every occurrence**, for the reason `git-force.ts` does: discarding the working tree is
|
|
27
37
|
// destructive each time it is issued.
|
|
28
38
|
|
|
@@ -117,28 +127,43 @@ function is_unauthorized_segment(segment: string): boolean {
|
|
|
117
127
|
}
|
|
118
128
|
|
|
119
129
|
function is_unauthorized_worktree_change(command: string): boolean {
|
|
120
|
-
return shell_segments.
|
|
130
|
+
return shell_segments.commands_of(command).some((segment) => is_unauthorized_segment(segment))
|
|
121
131
|
}
|
|
122
132
|
|
|
123
|
-
// The instruction in the shape a refusal can carry:
|
|
124
|
-
//
|
|
125
|
-
//
|
|
133
|
+
// The instruction in the shape a refusal can carry: the authorized route — for one file, the restore,
|
|
134
|
+
// limited to this run's own edit (another's uncommitted change is never discarded); for a stash, the
|
|
135
|
+
// message form that is allowed. The refused command is the caller's own, so it is not listed back.
|
|
136
|
+
// The `headline:` opening is what `time-transcript-line.ts` names the guard by. `pnpm josh git` and
|
|
137
|
+
// `pnpm josh stash:pop` are invisible to this trigger, so a run that uses them is never refused.
|
|
138
|
+
const SINGLE_FILE_RESTORE = 'git diff -- <path> | git apply -R'
|
|
126
139
|
const WORKTREE_MUTATION_REASON =
|
|
127
|
-
|
|
128
|
-
|
|
140
|
+
"⛔ unauthorized working-tree change: undo only this run's edit: " +
|
|
141
|
+
`\`${SINGLE_FILE_RESTORE}\`. A documented flow stashes with ` +
|
|
142
|
+
'`pnpm josh stash:push "<message>"`; a handed-over ' +
|
|
129
143
|
'stash is `pnpm josh stash:pop "<message>"`; record the substitution on the Issue (Tier A) unless ' +
|
|
130
144
|
'the plan says why the owner keeps the stash: then stop and confirm. It fires on every occurrence ' +
|
|
131
145
|
'(`operating-rules.md`).'
|
|
146
|
+
// The opening before joshuafolkken/kit#4988, so `rule-value.ts` still credits a refusal it delivered.
|
|
147
|
+
const FORMER_OPENING = '⛔ unauthorized working-tree change: `git checkout --`, `git restore`'
|
|
132
148
|
|
|
133
149
|
const ROW = {
|
|
134
150
|
id: 'worktree-mutation',
|
|
135
151
|
is_trigger: bash_triggers.on_bash_command(is_unauthorized_worktree_change),
|
|
136
152
|
reason: WORKTREE_MUTATION_REASON,
|
|
153
|
+
former_reasons: [FORMER_OPENING],
|
|
137
154
|
decide: (): boolean => true,
|
|
155
|
+
about: {
|
|
156
|
+
title: 'Unauthorized work-tree mutation',
|
|
157
|
+
topic: '`operating-rules.md`',
|
|
158
|
+
fires:
|
|
159
|
+
'`git checkout -- <path>` / `git restore <path>` / forced `git clean -f` / an unauthorized `git stash` (bare, push without a message, positional pop). Every occurrence',
|
|
160
|
+
quiet: `\`git stash push -m\`, \`git stash list\`, \`pnpm josh git\`, \`pnpm josh stash:push\`, \`pnpm josh stash:pop\`, \`${SINGLE_FILE_RESTORE}\``,
|
|
161
|
+
},
|
|
138
162
|
}
|
|
139
163
|
|
|
140
164
|
const worktree_guard = {
|
|
141
165
|
ROW,
|
|
166
|
+
SINGLE_FILE_RESTORE,
|
|
142
167
|
WORKTREE_MUTATION_REASON,
|
|
143
168
|
is_unauthorized_worktree_change,
|
|
144
169
|
touches_worktree,
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
|
|
3
|
+
// The name an app is drawn under on `run:board`'s 💻 processes section, computed from its command.
|
|
4
|
+
// `run-board-process-groups.ts` remembers each command's answer, so a redraw names only the processes
|
|
5
|
+
// new since the last one (joshuafolkken/kit#4263).
|
|
6
|
+
|
|
7
|
+
const APP_SUFFIX = '.app'
|
|
8
|
+
const COMMAND_SEPARATOR = ' '
|
|
9
|
+
|
|
10
|
+
// An app's name: the outermost `.app` bundle its executable sits in, else its command's own name.
|
|
11
|
+
function app_of(command: string): string {
|
|
12
|
+
const bundle = command.split(path.sep).find((part) => part.endsWith(APP_SUFFIX))
|
|
13
|
+
|
|
14
|
+
if (bundle !== undefined) return bundle.slice(0, -APP_SUFFIX.length)
|
|
15
|
+
|
|
16
|
+
const executable = command.startsWith(path.sep) ? command : command.split(COMMAND_SEPARATOR)[0]
|
|
17
|
+
|
|
18
|
+
return path.basename(executable ?? command)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const run_board_app_name = { app_of }
|
|
22
|
+
|
|
23
|
+
export { run_board_app_name }
|
|
@@ -1,24 +1,25 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
1
|
import { setTimeout as sleep } from 'node:timers/promises'
|
|
3
|
-
import { fileURLToPath } from 'node:url'
|
|
4
2
|
import { styleText } from 'node:util'
|
|
5
|
-
import {
|
|
6
|
-
import { machine_capacity } from '#scripts/gate/machine-capacity'
|
|
3
|
+
import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
|
|
7
4
|
import { telegram_notify } from '#scripts/notify/telegram-notify'
|
|
8
5
|
import { run_progress } from '#scripts/run/progress/run-progress'
|
|
9
6
|
import { run_progress_read } from '#scripts/run/progress/run-progress-read'
|
|
10
7
|
import terminalLink from 'terminal-link'
|
|
11
8
|
import { run_board_closed } from './run-board-closed'
|
|
12
9
|
import { run_board_every } from './run-board-every'
|
|
10
|
+
import { run_board_fold } from './run-board-fold'
|
|
11
|
+
import { run_board_gather } from './run-board-gather'
|
|
12
|
+
import { run_board_gather_live } from './run-board-gather-live'
|
|
13
|
+
import { run_board_gather_thread } from './run-board-gather-thread'
|
|
14
|
+
import { run_board_keys, type KeyReading } from './run-board-keys'
|
|
13
15
|
import { run_board_labels } from './run-board-labels'
|
|
14
|
-
import {
|
|
15
|
-
import { run_board_read } from './run-board-read'
|
|
16
|
+
import { run_board_plan_shared } from './run-board-plan-shared'
|
|
16
17
|
import { run_board_screen, type Screen } from './run-board-screen'
|
|
18
|
+
import { run_board_snapshot } from './run-board-snapshot'
|
|
17
19
|
import { run_board_spin } from './run-board-spin'
|
|
18
20
|
import type { BoardPorts } from './run-board-state'
|
|
19
21
|
import { run_board_thanks_read } from './run-board-thanks-read'
|
|
20
22
|
import { run_board_tick } from './run-board-tick'
|
|
21
|
-
import { run_board_usage_read } from './run-board-usage-read'
|
|
22
23
|
|
|
23
24
|
// `josh run:board` — a full-screen board of the running `backlogrun`, redrawn once a second, its
|
|
24
25
|
// spinners turned between redraws, for a person to keep open beside the run. What one redraw reads,
|
|
@@ -26,7 +27,6 @@ import { run_board_usage_read } from './run-board-usage-read'
|
|
|
26
27
|
// terminal around it. A run that ended stays on screen until the next one starts; with no run in this
|
|
27
28
|
// checkout it reads nothing from GitHub and waits.
|
|
28
29
|
|
|
29
|
-
const ARGV_OFFSET = 2
|
|
30
30
|
const SUCCESS_EXIT_CODE = 0
|
|
31
31
|
const FAILURE_EXIT_CODE = 1
|
|
32
32
|
const ONCE_FLAG = '--once'
|
|
@@ -48,13 +48,10 @@ function on_exit(leave: () => void): void {
|
|
|
48
48
|
process.once('SIGTERM', () => process.exit(SIGTERM_EXIT_CODE))
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
const LIVE_PORTS: BoardPorts = {
|
|
52
|
-
read_plan: async (scope) => await
|
|
53
|
-
read_local: run_board_read.read_local,
|
|
54
|
-
read_machine: machine_capacity.read_sample,
|
|
55
|
-
read_waits: () => core_budget.budget_waits(),
|
|
56
|
-
read_usage: run_board_usage_read.usage_reader(),
|
|
51
|
+
const LIVE_PORTS: Omit<BoardPorts, 'gather'> = {
|
|
52
|
+
read_plan: async (scope) => await run_board_plan_shared.read(scope),
|
|
57
53
|
read_closed: async (issues) => await run_board_closed.read_all(issues),
|
|
54
|
+
snapshot: run_board_snapshot.file_store(),
|
|
58
55
|
read_thanks: async () => await run_board_thanks_read.read_thanks(),
|
|
59
56
|
now: () => Date.now(),
|
|
60
57
|
write: (frame) => process.stdout.write(frame),
|
|
@@ -64,6 +61,20 @@ const LIVE_PORTS: BoardPorts = {
|
|
|
64
61
|
// Read on every redraw, so a resized pane is fitted on the next one.
|
|
65
62
|
size: () => ({ rows: process.stdout.rows, columns: process.stdout.columns }),
|
|
66
63
|
form: 'screen',
|
|
64
|
+
keys: {
|
|
65
|
+
is_tty: process.stdin.isTTY,
|
|
66
|
+
raw: (is_raw) => {
|
|
67
|
+
process.stdin.setRawMode(is_raw)
|
|
68
|
+
},
|
|
69
|
+
listen: (on_data) => {
|
|
70
|
+
process.stdin.setEncoding('utf8').on('data', on_data).resume()
|
|
71
|
+
},
|
|
72
|
+
// Stops reading, so stdin no longer holds the process open.
|
|
73
|
+
close: () => {
|
|
74
|
+
process.stdin.pause()
|
|
75
|
+
},
|
|
76
|
+
interrupt: () => process.exit(SIGINT_EXIT_CODE),
|
|
77
|
+
},
|
|
67
78
|
mark: async () => {
|
|
68
79
|
run_progress_read.mark(await run_progress_read.stamp_target(), Date.now())
|
|
69
80
|
},
|
|
@@ -76,14 +87,27 @@ const LIVE_PORTS: BoardPorts = {
|
|
|
76
87
|
},
|
|
77
88
|
}
|
|
78
89
|
|
|
90
|
+
// A live board reads on its worker thread, so no read stops its spinner; a single frame has no spinner
|
|
91
|
+
// to stop, and reads where it draws.
|
|
92
|
+
function live_ports(is_live: boolean): BoardPorts {
|
|
93
|
+
const gather = is_live
|
|
94
|
+
? run_board_gather_thread.worker_gatherer()
|
|
95
|
+
: run_board_gather.frame_gatherer(run_board_gather_live.ports_of(false))
|
|
96
|
+
|
|
97
|
+
return { ...LIVE_PORTS, gather }
|
|
98
|
+
}
|
|
99
|
+
|
|
79
100
|
// Every frame starts from the top of the alternate screen, erasing what the last one left below it, and
|
|
80
101
|
// ends on the line that says closing the screen leaves the run going — only a screen a person can
|
|
81
102
|
// close says it, and it is the first line to give way to a short pane. Nothing follows the last line,
|
|
82
103
|
// so a frame that fills the pane never scrolls the header off the top.
|
|
104
|
+
// The keys are named under it where a person can type them.
|
|
83
105
|
function framed(ports: BoardPorts, screen: Screen): BoardPorts {
|
|
106
|
+
const keys = ports.folded === undefined ? [] : [run_board_fold.KEYS_LINE]
|
|
107
|
+
|
|
84
108
|
return {
|
|
85
109
|
...ports,
|
|
86
|
-
footer: ['', styleText('dim',
|
|
110
|
+
footer: ['', ...[WORDS.keeps_running, ...keys].map((line) => styleText('dim', line))],
|
|
87
111
|
write: (frame) => {
|
|
88
112
|
ports.write(`${screen.frame}${frame.replace(TRAILING_NEWLINE, '')}`)
|
|
89
113
|
},
|
|
@@ -91,13 +115,15 @@ function framed(ports: BoardPorts, screen: Screen): BoardPorts {
|
|
|
91
115
|
}
|
|
92
116
|
|
|
93
117
|
// Leaves the alternate screen once, whichever path gets there first: a second leave would restore the
|
|
94
|
-
// cursor saved on entering and draw over whatever was printed after the first.
|
|
95
|
-
|
|
118
|
+
// cursor saved on entering and draw over whatever was printed after the first. The terminal leaves raw
|
|
119
|
+
// mode with it.
|
|
120
|
+
function leaver(ports: BoardPorts, screen: Screen, keys: KeyReading): () => void {
|
|
96
121
|
let has_left = false
|
|
97
122
|
|
|
98
123
|
return () => {
|
|
99
124
|
if (has_left) return
|
|
100
125
|
has_left = true
|
|
126
|
+
keys.stop?.()
|
|
101
127
|
ports.write(screen.leave)
|
|
102
128
|
}
|
|
103
129
|
}
|
|
@@ -121,13 +147,14 @@ async function redraw_forever(ports: BoardPorts, screen: Screen): Promise<void>
|
|
|
121
147
|
// lands on the normal screen rather than vanishing with the alternate one.
|
|
122
148
|
async function watch(ports: BoardPorts): Promise<void> {
|
|
123
149
|
const screen = run_board_screen.screen_of('live')
|
|
124
|
-
const
|
|
150
|
+
const keys = run_board_keys.read_keys(ports.keys)
|
|
151
|
+
const leave = leaver(ports, screen, keys)
|
|
125
152
|
|
|
126
153
|
ports.write(screen.enter)
|
|
127
154
|
ports.on_exit(leave)
|
|
128
155
|
|
|
129
156
|
try {
|
|
130
|
-
await redraw_forever(ports, screen)
|
|
157
|
+
await redraw_forever({ ...ports, folded: keys.folded }, screen)
|
|
131
158
|
} finally {
|
|
132
159
|
leave()
|
|
133
160
|
}
|
|
@@ -162,25 +189,35 @@ async function push_every(minutes: string | undefined, ports: BoardPorts): Promi
|
|
|
162
189
|
return SUCCESS_EXIT_CODE
|
|
163
190
|
}
|
|
164
191
|
|
|
165
|
-
await run_board_every.push_until_ended(ports, interval *
|
|
192
|
+
await run_board_every.push_until_ended(ports, interval * MS_PER_MINUTE)
|
|
166
193
|
|
|
167
194
|
return SUCCESS_EXIT_CODE
|
|
168
195
|
}
|
|
169
196
|
|
|
170
|
-
|
|
197
|
+
// The ports a test hands in, else the live ones.
|
|
198
|
+
function ports_for(ports: BoardPorts | undefined, is_live: boolean): BoardPorts {
|
|
199
|
+
return ports ?? live_ports(is_live)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
async function draw(flag: string, ports: BoardPorts | undefined): Promise<void> {
|
|
171
203
|
if (flag === CHAT_FLAG) {
|
|
172
|
-
await answer(ports)
|
|
204
|
+
await answer(ports_for(ports, false))
|
|
173
205
|
|
|
174
206
|
return
|
|
175
207
|
}
|
|
176
208
|
|
|
177
|
-
const
|
|
209
|
+
const { is_tty } = ports ?? LIVE_PORTS
|
|
210
|
+
const mode = run_board_screen.mode_of({ is_tty, is_once: flag === ONCE_FLAG })
|
|
211
|
+
|
|
212
|
+
if (mode === 'live') {
|
|
213
|
+
await watch(ports_for(ports, true))
|
|
214
|
+
|
|
215
|
+
return
|
|
216
|
+
}
|
|
178
217
|
|
|
179
218
|
// One plain frame stays on the terminal after the command, so it draws the still icons rather than a
|
|
180
219
|
// spinner frame frozen mid-turn.
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
await (mode === 'live' ? watch(ports) : tick(FRESH_STATE, once_ports))
|
|
220
|
+
await tick(FRESH_STATE, { ...ports_for(ports, false), is_tty: false, size: undefined })
|
|
184
221
|
}
|
|
185
222
|
|
|
186
223
|
function is_every(flag: string, rest: ReadonlyArray<string>): boolean {
|
|
@@ -191,10 +228,10 @@ function is_refused(flag: string, rest: ReadonlyArray<string>): boolean {
|
|
|
191
228
|
return rest.length > 0 || !FLAGS.has(flag)
|
|
192
229
|
}
|
|
193
230
|
|
|
194
|
-
async function run(argv: ReadonlyArray<string>, ports
|
|
231
|
+
async function run(argv: ReadonlyArray<string>, ports?: BoardPorts): Promise<number> {
|
|
195
232
|
const [flag = '', ...rest] = argv
|
|
196
233
|
|
|
197
|
-
if (is_every(flag, rest)) return await push_every(rest[0], ports)
|
|
234
|
+
if (is_every(flag, rest)) return await push_every(rest[0], ports_for(ports, false))
|
|
198
235
|
if (is_refused(flag, rest)) return refuse()
|
|
199
236
|
|
|
200
237
|
await draw(flag, ports)
|
|
@@ -204,8 +241,4 @@ async function run(argv: ReadonlyArray<string>, ports: BoardPorts = LIVE_PORTS):
|
|
|
204
241
|
|
|
205
242
|
const run_board_cli = { DISABLED_NOTICE, USAGE, run }
|
|
206
243
|
|
|
207
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
208
|
-
process.exitCode = await run(process.argv.slice(ARGV_OFFSET))
|
|
209
|
-
}
|
|
210
|
-
|
|
211
244
|
export { run_board_cli }
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { lane_state } from '#scripts/lane/lane-state'
|
|
2
|
+
import { run_board_kind } from './run-board-kind'
|
|
3
|
+
import type { BoardRow, RowRead } from './run-board-layout'
|
|
4
|
+
import type { ItemStatus } from './run-board-status'
|
|
5
|
+
|
|
6
|
+
// The lanes on `run:board` that are not this run's (joshuafolkken/kit#4200, #4260, #4269): an earlier
|
|
7
|
+
// run's lane that still holds a place under the limit, drawn after the run's own lanes with what its
|
|
8
|
+
// record and the stream say it is doing — its phase, its time, its usage and its newest activity, as a
|
|
9
|
+
// row of this run's is — and a lane with no lane state record, drawn unknown. Neither is ever counted
|
|
10
|
+
// as this run's.
|
|
11
|
+
|
|
12
|
+
// The earlier run's lanes still holding a place, what each is doing, and the open lanes with no record.
|
|
13
|
+
interface EarlierLanes {
|
|
14
|
+
lanes: ReadonlyArray<string>
|
|
15
|
+
statuses?: ReadonlyMap<number, ItemStatus> | undefined
|
|
16
|
+
unknown?: ReadonlyArray<string> | undefined
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const NO_EARLIER: EarlierLanes = { lanes: [] }
|
|
20
|
+
|
|
21
|
+
// What an unknown lane's row says after its title: it has no record, and keeps its place.
|
|
22
|
+
const UNKNOWN_TAIL = lane_state.NO_STATE_HINT
|
|
23
|
+
|
|
24
|
+
// The mark an earlier run's running lane leads with in place of its phase (joshuafolkken/kit#4269),
|
|
25
|
+
// two columns wide as every row icon is (`run-board-labels.ts`, kept out of it by its size).
|
|
26
|
+
const EARLIER_ICON = '🧳'
|
|
27
|
+
|
|
28
|
+
// A child working now — this run's, or an earlier run's lane holding a place.
|
|
29
|
+
function is_live(row: BoardRow): boolean {
|
|
30
|
+
return row.state === 'running'
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function base_row(
|
|
34
|
+
number: number,
|
|
35
|
+
read: RowRead,
|
|
36
|
+
): Pick<BoardRow, 'number' | 'title' | 'kind' | 'priority'> {
|
|
37
|
+
const labels = read.labels.get(number)
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
number,
|
|
41
|
+
title: read.titles.get(number),
|
|
42
|
+
kind: run_board_kind.kind_of(labels),
|
|
43
|
+
priority: run_board_kind.priority_of(labels),
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// The row is drawn as its status says, marked as an earlier run's (`is_earlier`).
|
|
48
|
+
function earlier_row(number: number, status: ItemStatus | undefined, read: RowRead): BoardRow {
|
|
49
|
+
return {
|
|
50
|
+
...base_row(number, read),
|
|
51
|
+
state: status?.state ?? 'running',
|
|
52
|
+
status,
|
|
53
|
+
waits: [],
|
|
54
|
+
is_earlier: true,
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function unknown_row(number: number, read: RowRead): BoardRow {
|
|
59
|
+
return {
|
|
60
|
+
...base_row(number, read),
|
|
61
|
+
state: 'unknown',
|
|
62
|
+
status: undefined,
|
|
63
|
+
waits: [],
|
|
64
|
+
reason: { tail: UNKNOWN_TAIL },
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function apart_of(
|
|
69
|
+
lanes: ReadonlyArray<string>,
|
|
70
|
+
statuses: ReadonlyMap<number, ItemStatus>,
|
|
71
|
+
): Array<number> {
|
|
72
|
+
return lanes.map(Number).filter((number) => !statuses.has(number))
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// An earlier run's lane holding a place, then a lane with no record, unless this run has touched its
|
|
76
|
+
// issue since.
|
|
77
|
+
function rows_of(
|
|
78
|
+
earlier: EarlierLanes,
|
|
79
|
+
statuses: ReadonlyMap<number, ItemStatus>,
|
|
80
|
+
read: RowRead,
|
|
81
|
+
): Array<BoardRow> {
|
|
82
|
+
const lanes = apart_of(earlier.lanes, statuses)
|
|
83
|
+
const unknown = apart_of(earlier.unknown ?? [], statuses)
|
|
84
|
+
|
|
85
|
+
return [
|
|
86
|
+
...lanes.map((number) => earlier_row(number, earlier.statuses?.get(number), read)),
|
|
87
|
+
...unknown.map((number) => unknown_row(number, read)),
|
|
88
|
+
]
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const run_board_earlier = { EARLIER_ICON, NO_EARLIER, UNKNOWN_TAIL, is_live, rows_of }
|
|
92
|
+
|
|
93
|
+
export { run_board_earlier }
|
|
94
|
+
export type { EarlierLanes }
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { lane_withdraw } from '#scripts/lane/lane-withdraw'
|
|
2
|
+
import { run_event_scope } from '#scripts/run/event/run-event-scope'
|
|
3
|
+
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
4
|
+
import { run_stalled } from '#scripts/run/park/run-stalled'
|
|
5
|
+
|
|
6
|
+
// Why a child's park or withdraw ended it, in the ending event's own words — the reason its board row
|
|
7
|
+
// draws and its park note carries.
|
|
8
|
+
|
|
9
|
+
const KIND = run_event_stream.EVENT_KIND
|
|
10
|
+
// `#<N> parked`, `#<N> parked (<reason>)` and `#<N> waiting on #<M>` lose their leading number, so a
|
|
11
|
+
// waiting park does not name its issue twice.
|
|
12
|
+
const PARK_PREFIX = /^#\d+ (?:parked\s*)?/u
|
|
13
|
+
const PARENTHESES = /^\((?<inner>.*)\)$/u
|
|
14
|
+
// `#<N> withdrawn by <who>: <reason>` — every withdrawer `lane-withdraw.ts` names.
|
|
15
|
+
const WITHDRAW_PREFIX = new RegExp(
|
|
16
|
+
String.raw`^#\d+ withdrawn by (?:${lane_withdraw.WITHDRAWER_NAMES.join('|')}):\s*`,
|
|
17
|
+
'u',
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
// `#<N> parked (needs-decision)` reads as the reason `needs-decision`; a bare park has none.
|
|
21
|
+
function park_reason(event: RunEvent): string {
|
|
22
|
+
const rest = event.text.replace(PARK_PREFIX, '')
|
|
23
|
+
|
|
24
|
+
return PARENTHESES.exec(rest)?.groups?.['inner'] ?? rest
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// A withdraw's reason after its prefix; a text in any other shape carries none.
|
|
28
|
+
function withdraw_reason(event: RunEvent): string {
|
|
29
|
+
const rest = event.text.replace(WITHDRAW_PREFIX, '')
|
|
30
|
+
|
|
31
|
+
return rest === event.text ? '' : rest.trim()
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// A `run:stalled` park reads as its cause and the action that resumes it (`run-stalled.ts`); any other
|
|
35
|
+
// park as its reason.
|
|
36
|
+
function park_row_reason(event: RunEvent): string {
|
|
37
|
+
const reason = park_reason(event)
|
|
38
|
+
const cause = run_stalled.cause_of(reason)
|
|
39
|
+
const issue = run_event_scope.issue_named(event)
|
|
40
|
+
|
|
41
|
+
return cause === undefined || issue === undefined ? reason : run_stalled.row_text(issue, cause)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// The reason an ending event gives, `undefined` for an event that is neither a park nor a withdraw or
|
|
45
|
+
// that gives none.
|
|
46
|
+
function reason_of(event: RunEvent): string | undefined {
|
|
47
|
+
if (event.kind === KIND.PARK) return park_row_reason(event) || undefined
|
|
48
|
+
|
|
49
|
+
return event.kind === KIND.WITHDRAW ? withdraw_reason(event) || undefined : undefined
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
interface EndingRecord {
|
|
53
|
+
reason?: string
|
|
54
|
+
elapsed_ms?: number
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// What an ending event records for its row: the reason it gives and the lane time its writer recorded
|
|
58
|
+
// (joshuafolkken/kit#4481), each only where the event carries it.
|
|
59
|
+
function recorded_of(event: RunEvent): EndingRecord {
|
|
60
|
+
const reason = reason_of(event)
|
|
61
|
+
const { elapsed_ms } = event
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
...(reason !== undefined && { reason }),
|
|
65
|
+
...(elapsed_ms !== undefined && { elapsed_ms }),
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const run_board_ending_reason = { park_reason, reason_of, recorded_of }
|
|
70
|
+
|
|
71
|
+
export { run_board_ending_reason }
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { run_board_labels } from './run-board-labels'
|
|
2
|
+
import type { BoardRow } from './run-board-layout'
|
|
3
|
+
|
|
4
|
+
// Where each waiting child lands on the lanes (joshuafolkken/kit#4319): onto the lane that frees
|
|
5
|
+
// first, but never before what it waits on ends — a 🔗 blocker, the 📂 child holding its path, the
|
|
6
|
+
// running lanes a 🧍 `run:solo` child waits out, the 🙅 solo child ahead of it, the 📋 issue a named run
|
|
7
|
+
// starts it after — nor before a `run:solo` child ends: a running one, or a 🧍 one placed ahead, which
|
|
8
|
+
// itself starts once every lane placed before it has freed. A child waiting on an issue the board does
|
|
9
|
+
// not carry waits past this run, so it is left out.
|
|
10
|
+
|
|
11
|
+
const { WAIT_ICONS } = run_board_labels
|
|
12
|
+
const AFTER_ICONS: ReadonlySet<string> = new Set([
|
|
13
|
+
WAIT_ICONS.path,
|
|
14
|
+
WAIT_ICONS.solo,
|
|
15
|
+
WAIT_ICONS.solo_ahead,
|
|
16
|
+
WAIT_ICONS.named,
|
|
17
|
+
])
|
|
18
|
+
|
|
19
|
+
interface Lanes {
|
|
20
|
+
// When each lane frees, from now.
|
|
21
|
+
free: Array<number>
|
|
22
|
+
// When each child on the board ends, from now.
|
|
23
|
+
ends: Map<number, number>
|
|
24
|
+
// No waiting child starts before this — the end of a `run:solo` child running or placed.
|
|
25
|
+
floor: number
|
|
26
|
+
per_child: number
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface Pending {
|
|
30
|
+
number: number
|
|
31
|
+
after: ReadonlyArray<number>
|
|
32
|
+
// A 🧍 `run:solo` child: it starts once every lane is free and lets none start beside it.
|
|
33
|
+
is_solo: boolean
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// The issues a row's reason says it starts after, none for a wait no child's end lifts.
|
|
37
|
+
function named_of(reason: BoardRow['reason']): ReadonlyArray<string> {
|
|
38
|
+
if (reason?.icon === undefined || !AFTER_ICONS.has(reason.icon)) return []
|
|
39
|
+
|
|
40
|
+
return reason.issues ?? []
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// The issues a waiting row starts after: its standing blockers, and those its reason names.
|
|
44
|
+
function pending_of(row: BoardRow): Pending {
|
|
45
|
+
const after = new Set([...row.waits, ...named_of(row.reason)])
|
|
46
|
+
|
|
47
|
+
const is_solo = row.reason?.icon === WAIT_ICONS.solo
|
|
48
|
+
|
|
49
|
+
return { number: row.number, after: [...after].map(Number), is_solo }
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function is_ready(pending: Pending, lanes: Lanes): boolean {
|
|
53
|
+
return pending.after.every((issue) => lanes.ends.has(issue))
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// The lane freeing latest by the time the child can start, so a child waiting on an end leaves the
|
|
57
|
+
// lane free sooner to a child ready before it; the lane free first where none has freed by then.
|
|
58
|
+
function lane_for(free: ReadonlyArray<number>, ready: number): number {
|
|
59
|
+
const fits = free.filter((at) => at <= ready)
|
|
60
|
+
|
|
61
|
+
return free.indexOf(fits.length > 0 ? Math.max(...fits) : Math.min(...free))
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function place(pending: Pending, lanes: Lanes): void {
|
|
65
|
+
const waited = pending.after.map((issue) => lanes.ends.get(issue) ?? 0)
|
|
66
|
+
const busy = pending.is_solo ? lanes.free : []
|
|
67
|
+
const ready = Math.max(lanes.floor, ...waited, ...busy)
|
|
68
|
+
const lane = lane_for(lanes.free, ready)
|
|
69
|
+
const end = Math.max(lanes.free[lane] ?? 0, ready) + lanes.per_child
|
|
70
|
+
|
|
71
|
+
lanes.free[lane] = end
|
|
72
|
+
lanes.ends.set(pending.number, end)
|
|
73
|
+
if (pending.is_solo) lanes.floor = end
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// One pass over the children not yet placed, placing each whose waits have ended; the rest are left.
|
|
77
|
+
function pass(pending: ReadonlyArray<Pending>, lanes: Lanes): Array<Pending> {
|
|
78
|
+
const ready = pending.filter((entry) => is_ready(entry, lanes))
|
|
79
|
+
|
|
80
|
+
for (const entry of ready) place(entry, lanes)
|
|
81
|
+
|
|
82
|
+
return pending.filter((entry) => !lanes.ends.has(entry.number))
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// The time the last lane ends, the waiting rows placed pass after pass until a pass places none.
|
|
86
|
+
function end_of(waiting: ReadonlyArray<BoardRow>, lanes: Lanes): number {
|
|
87
|
+
let left = waiting.map((row) => pending_of(row))
|
|
88
|
+
let placed = Infinity
|
|
89
|
+
|
|
90
|
+
while (left.length > 0 && placed > 0) {
|
|
91
|
+
const next = pass(left, lanes)
|
|
92
|
+
|
|
93
|
+
placed = left.length - next.length
|
|
94
|
+
left = next
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return Math.max(...lanes.free)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const run_board_estimate_schedule = { end_of }
|
|
101
|
+
|
|
102
|
+
export { run_board_estimate_schedule }
|
|
103
|
+
export type { Lanes }
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { run_board_estimate_schedule, type Lanes } from './run-board-estimate-schedule'
|
|
2
|
+
import { run_board_labels } from './run-board-labels'
|
|
3
|
+
import { run_board_layout, type BoardLayout, type BoardRow } from './run-board-layout'
|
|
4
|
+
import { run_board_phase, type Phase } from './run-board-phase'
|
|
5
|
+
import type { ItemStatus } from './run-board-status'
|
|
6
|
+
import type { UsualTimes } from './run-board-usual'
|
|
7
|
+
|
|
8
|
+
// How long the run has left, from how long each phase usually takes (`run-board-usual.ts`,
|
|
9
|
+
// joshuafolkken/kit#4044). A running child has left what remains of its phase and every phase it has
|
|
10
|
+
// not reached; a waiting child the plan's waves hold takes one child's usual time, stacked onto the
|
|
11
|
+
// lane that frees first once what it waits on has ended (`run-board-estimate-schedule.ts`). A parked
|
|
12
|
+
// child, and one the plan has not reached — a start date or a blocker ahead of it — wait on something
|
|
13
|
+
// no usual time measures, so they are left out. Without a usual time nothing is estimated.
|
|
14
|
+
|
|
15
|
+
const { HEADER_ICONS, WORDS, minute_span_of } = run_board_labels
|
|
16
|
+
const LEGEND = `${HEADER_ICONS.estimate} ${WORDS.estimate}`
|
|
17
|
+
const ESTIMATE_MARK = '~'
|
|
18
|
+
// A failed ship sends its child back to implement, so it has that phase and every later one left.
|
|
19
|
+
const FAILED_PHASE: Phase = 'failed'
|
|
20
|
+
const RESUMED_PHASE: Phase = 'implement'
|
|
21
|
+
// The phases a child passes in order, a failed ship aside.
|
|
22
|
+
const PATH: ReadonlyArray<Phase> = run_board_phase.PHASES.filter((phase) => phase !== FAILED_PHASE)
|
|
23
|
+
const MIN_LANES = 1
|
|
24
|
+
|
|
25
|
+
interface EstimateRead {
|
|
26
|
+
now_ms: number
|
|
27
|
+
ended_ms: number | undefined
|
|
28
|
+
layout: BoardLayout | undefined
|
|
29
|
+
usual?: UsualTimes | undefined
|
|
30
|
+
lane_limit?: number | undefined
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function usual_sum(phases: ReadonlyArray<Phase>, usual: UsualTimes): number {
|
|
34
|
+
return phases.reduce((sum, phase) => sum + (usual.get(phase) ?? 0), 0)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// The phase a child stands at, as the path counts it.
|
|
38
|
+
function phase_of(status: ItemStatus | undefined): Phase {
|
|
39
|
+
const phase = status?.track?.at(-1) ?? run_board_phase.LAUNCHED_PHASE
|
|
40
|
+
|
|
41
|
+
return phase === FAILED_PHASE ? RESUMED_PHASE : phase
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// What a running child has left: its phase's usual time less what it has spent there, then every
|
|
45
|
+
// phase after it.
|
|
46
|
+
function running_left(row: BoardRow, read: EstimateRead, usual: UsualTimes): number {
|
|
47
|
+
const phase = phase_of(row.status)
|
|
48
|
+
const spent = read.now_ms - (row.status?.phase_ms ?? read.now_ms)
|
|
49
|
+
const current = Math.max(0, (usual.get(phase) ?? 0) - spent)
|
|
50
|
+
|
|
51
|
+
return current + usual_sum(PATH.slice(PATH.indexOf(phase) + 1), usual)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// The queued rows a lane will take, a decision a person owes left out.
|
|
55
|
+
function waiting_rows(layout: BoardLayout): Array<BoardRow> {
|
|
56
|
+
const queued: BoardLayout = { ...run_board_layout.EMPTY_LAYOUT, queued: layout.queued }
|
|
57
|
+
|
|
58
|
+
return run_board_layout.rows_of(queued).filter((row) => row.state === 'waiting')
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// The lanes as the running children leave them: each running child's end, the free lanes at zero, and
|
|
62
|
+
// a running `run:solo` child's end as the floor no waiting child starts before.
|
|
63
|
+
function lanes_of(running: ReadonlyArray<BoardRow>, read: EstimateRead, usual: UsualTimes): Lanes {
|
|
64
|
+
const ends = new Map(running.map((row) => [row.number, running_left(row, read, usual)]))
|
|
65
|
+
const count = Math.max(read.lane_limit ?? running.length, running.length, MIN_LANES)
|
|
66
|
+
const free = [...ends.values(), ...Array.from({ length: count - ends.size }, () => 0)]
|
|
67
|
+
const solo = running.filter((row) => row.is_solo === true).map((row) => ends.get(row.number) ?? 0)
|
|
68
|
+
|
|
69
|
+
return { free, ends, floor: Math.max(0, ...solo), per_child: usual_sum(PATH, usual) }
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// How long the run has left, `undefined` where nothing is left to run or no usual time is known.
|
|
73
|
+
function left_ms(read: EstimateRead): number | undefined {
|
|
74
|
+
const { layout, usual } = read
|
|
75
|
+
|
|
76
|
+
if (layout === undefined || usual === undefined || usual.size === 0) return undefined
|
|
77
|
+
|
|
78
|
+
const running = layout.active.filter((row) => row.state === 'running')
|
|
79
|
+
const waiting = waiting_rows(layout)
|
|
80
|
+
|
|
81
|
+
if (running.length + waiting.length === 0) return undefined
|
|
82
|
+
|
|
83
|
+
return run_board_estimate_schedule.end_of(waiting, lanes_of(running, read, usual))
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// `🎯 ~25′`, `undefined` for an ended run or one with nothing to estimate.
|
|
87
|
+
function part_of(read: EstimateRead): string | undefined {
|
|
88
|
+
const left = read.ended_ms === undefined ? left_ms(read) : undefined
|
|
89
|
+
|
|
90
|
+
return left === undefined
|
|
91
|
+
? undefined
|
|
92
|
+
: `${HEADER_ICONS.estimate} ${ESTIMATE_MARK}${minute_span_of(left)}`
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const run_board_estimate = { LEGEND, left_ms, part_of }
|
|
96
|
+
|
|
97
|
+
export { run_board_estimate }
|
|
98
|
+
export type { EstimateRead }
|