@joshuafolkken/kit 1.1471.0 → 1.1784.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/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -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 +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- 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 +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -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 +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- 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 +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- 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/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- 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 +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- 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-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-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -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 +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- 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 +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- 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/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -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 +34 -78
- 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/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- 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 +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -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 +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -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 +111 -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.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- 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 +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- 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 +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- 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 +111 -71
- 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 +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -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 +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- 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 +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- 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 +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- 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/read-file.ts +3 -1
- 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/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.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -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 +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- 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 +18 -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 +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -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 +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -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 +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -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 +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- 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 +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- 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 +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- 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 +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -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 +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- 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 +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -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 +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- 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.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- 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-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- 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 +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- 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.ts +2 -1
- 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 +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- 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 +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- 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 +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -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-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- 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 +3 -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 +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- 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 +15 -0
- package/scripts/split/split-measure.ts +65 -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/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -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 +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- 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 +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- 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/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -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 +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -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-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- 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/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/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,23 +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 {
|
|
3
|
+
import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
|
|
6
4
|
import { telegram_notify } from '#scripts/notify/telegram-notify'
|
|
7
5
|
import { run_progress } from '#scripts/run/progress/run-progress'
|
|
8
6
|
import { run_progress_read } from '#scripts/run/progress/run-progress-read'
|
|
9
7
|
import terminalLink from 'terminal-link'
|
|
10
8
|
import { run_board_closed } from './run-board-closed'
|
|
11
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'
|
|
12
15
|
import { run_board_labels } from './run-board-labels'
|
|
13
|
-
import {
|
|
14
|
-
import { run_board_read } from './run-board-read'
|
|
16
|
+
import { run_board_plan_shared } from './run-board-plan-shared'
|
|
15
17
|
import { run_board_screen, type Screen } from './run-board-screen'
|
|
18
|
+
import { run_board_snapshot } from './run-board-snapshot'
|
|
16
19
|
import { run_board_spin } from './run-board-spin'
|
|
17
20
|
import type { BoardPorts } from './run-board-state'
|
|
18
21
|
import { run_board_thanks_read } from './run-board-thanks-read'
|
|
19
22
|
import { run_board_tick } from './run-board-tick'
|
|
20
|
-
import { run_board_usage_read } from './run-board-usage-read'
|
|
21
23
|
|
|
22
24
|
// `josh run:board` — a full-screen board of the running `backlogrun`, redrawn once a second, its
|
|
23
25
|
// spinners turned between redraws, for a person to keep open beside the run. What one redraw reads,
|
|
@@ -25,7 +27,6 @@ import { run_board_usage_read } from './run-board-usage-read'
|
|
|
25
27
|
// terminal around it. A run that ended stays on screen until the next one starts; with no run in this
|
|
26
28
|
// checkout it reads nothing from GitHub and waits.
|
|
27
29
|
|
|
28
|
-
const ARGV_OFFSET = 2
|
|
29
30
|
const SUCCESS_EXIT_CODE = 0
|
|
30
31
|
const FAILURE_EXIT_CODE = 1
|
|
31
32
|
const ONCE_FLAG = '--once'
|
|
@@ -47,12 +48,10 @@ function on_exit(leave: () => void): void {
|
|
|
47
48
|
process.once('SIGTERM', () => process.exit(SIGTERM_EXIT_CODE))
|
|
48
49
|
}
|
|
49
50
|
|
|
50
|
-
const LIVE_PORTS: BoardPorts = {
|
|
51
|
-
read_plan: async (scope) => await
|
|
52
|
-
read_local: run_board_read.read_local,
|
|
53
|
-
read_machine: machine_capacity.read_sample,
|
|
54
|
-
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),
|
|
55
53
|
read_closed: async (issues) => await run_board_closed.read_all(issues),
|
|
54
|
+
snapshot: run_board_snapshot.file_store(),
|
|
56
55
|
read_thanks: async () => await run_board_thanks_read.read_thanks(),
|
|
57
56
|
now: () => Date.now(),
|
|
58
57
|
write: (frame) => process.stdout.write(frame),
|
|
@@ -62,6 +61,20 @@ const LIVE_PORTS: BoardPorts = {
|
|
|
62
61
|
// Read on every redraw, so a resized pane is fitted on the next one.
|
|
63
62
|
size: () => ({ rows: process.stdout.rows, columns: process.stdout.columns }),
|
|
64
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
|
+
},
|
|
65
78
|
mark: async () => {
|
|
66
79
|
run_progress_read.mark(await run_progress_read.stamp_target(), Date.now())
|
|
67
80
|
},
|
|
@@ -74,14 +87,27 @@ const LIVE_PORTS: BoardPorts = {
|
|
|
74
87
|
},
|
|
75
88
|
}
|
|
76
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
|
+
|
|
77
100
|
// Every frame starts from the top of the alternate screen, erasing what the last one left below it, and
|
|
78
101
|
// ends on the line that says closing the screen leaves the run going — only a screen a person can
|
|
79
102
|
// close says it, and it is the first line to give way to a short pane. Nothing follows the last line,
|
|
80
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.
|
|
81
105
|
function framed(ports: BoardPorts, screen: Screen): BoardPorts {
|
|
106
|
+
const keys = ports.folded === undefined ? [] : [run_board_fold.KEYS_LINE]
|
|
107
|
+
|
|
82
108
|
return {
|
|
83
109
|
...ports,
|
|
84
|
-
footer: ['', styleText('dim',
|
|
110
|
+
footer: ['', ...[WORDS.keeps_running, ...keys].map((line) => styleText('dim', line))],
|
|
85
111
|
write: (frame) => {
|
|
86
112
|
ports.write(`${screen.frame}${frame.replace(TRAILING_NEWLINE, '')}`)
|
|
87
113
|
},
|
|
@@ -89,13 +115,15 @@ function framed(ports: BoardPorts, screen: Screen): BoardPorts {
|
|
|
89
115
|
}
|
|
90
116
|
|
|
91
117
|
// Leaves the alternate screen once, whichever path gets there first: a second leave would restore the
|
|
92
|
-
// cursor saved on entering and draw over whatever was printed after the first.
|
|
93
|
-
|
|
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 {
|
|
94
121
|
let has_left = false
|
|
95
122
|
|
|
96
123
|
return () => {
|
|
97
124
|
if (has_left) return
|
|
98
125
|
has_left = true
|
|
126
|
+
keys.stop?.()
|
|
99
127
|
ports.write(screen.leave)
|
|
100
128
|
}
|
|
101
129
|
}
|
|
@@ -119,13 +147,14 @@ async function redraw_forever(ports: BoardPorts, screen: Screen): Promise<void>
|
|
|
119
147
|
// lands on the normal screen rather than vanishing with the alternate one.
|
|
120
148
|
async function watch(ports: BoardPorts): Promise<void> {
|
|
121
149
|
const screen = run_board_screen.screen_of('live')
|
|
122
|
-
const
|
|
150
|
+
const keys = run_board_keys.read_keys(ports.keys)
|
|
151
|
+
const leave = leaver(ports, screen, keys)
|
|
123
152
|
|
|
124
153
|
ports.write(screen.enter)
|
|
125
154
|
ports.on_exit(leave)
|
|
126
155
|
|
|
127
156
|
try {
|
|
128
|
-
await redraw_forever(ports, screen)
|
|
157
|
+
await redraw_forever({ ...ports, folded: keys.folded }, screen)
|
|
129
158
|
} finally {
|
|
130
159
|
leave()
|
|
131
160
|
}
|
|
@@ -160,25 +189,35 @@ async function push_every(minutes: string | undefined, ports: BoardPorts): Promi
|
|
|
160
189
|
return SUCCESS_EXIT_CODE
|
|
161
190
|
}
|
|
162
191
|
|
|
163
|
-
await run_board_every.push_until_ended(ports, interval *
|
|
192
|
+
await run_board_every.push_until_ended(ports, interval * MS_PER_MINUTE)
|
|
164
193
|
|
|
165
194
|
return SUCCESS_EXIT_CODE
|
|
166
195
|
}
|
|
167
196
|
|
|
168
|
-
|
|
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> {
|
|
169
203
|
if (flag === CHAT_FLAG) {
|
|
170
|
-
await answer(ports)
|
|
204
|
+
await answer(ports_for(ports, false))
|
|
171
205
|
|
|
172
206
|
return
|
|
173
207
|
}
|
|
174
208
|
|
|
175
|
-
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
|
+
}
|
|
176
217
|
|
|
177
218
|
// One plain frame stays on the terminal after the command, so it draws the still icons rather than a
|
|
178
219
|
// spinner frame frozen mid-turn.
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
await (mode === 'live' ? watch(ports) : tick(FRESH_STATE, once_ports))
|
|
220
|
+
await tick(FRESH_STATE, { ...ports_for(ports, false), is_tty: false, size: undefined })
|
|
182
221
|
}
|
|
183
222
|
|
|
184
223
|
function is_every(flag: string, rest: ReadonlyArray<string>): boolean {
|
|
@@ -189,10 +228,10 @@ function is_refused(flag: string, rest: ReadonlyArray<string>): boolean {
|
|
|
189
228
|
return rest.length > 0 || !FLAGS.has(flag)
|
|
190
229
|
}
|
|
191
230
|
|
|
192
|
-
async function run(argv: ReadonlyArray<string>, ports
|
|
231
|
+
async function run(argv: ReadonlyArray<string>, ports?: BoardPorts): Promise<number> {
|
|
193
232
|
const [flag = '', ...rest] = argv
|
|
194
233
|
|
|
195
|
-
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))
|
|
196
235
|
if (is_refused(flag, rest)) return refuse()
|
|
197
236
|
|
|
198
237
|
await draw(flag, ports)
|
|
@@ -202,8 +241,4 @@ async function run(argv: ReadonlyArray<string>, ports: BoardPorts = LIVE_PORTS):
|
|
|
202
241
|
|
|
203
242
|
const run_board_cli = { DISABLED_NOTICE, USAGE, run }
|
|
204
243
|
|
|
205
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
206
|
-
process.exitCode = await run(process.argv.slice(ARGV_OFFSET))
|
|
207
|
-
}
|
|
208
|
-
|
|
209
244
|
export { run_board_cli }
|
|
@@ -18,10 +18,13 @@ interface ClosedIssue {
|
|
|
18
18
|
closed_ms: number | undefined
|
|
19
19
|
// Closed by a merged pull request, rather than closed by hand.
|
|
20
20
|
is_merged: boolean
|
|
21
|
+
// Closed as not planned — withdrawn rather than finished (joshuafolkken/kit#3958).
|
|
22
|
+
is_not_planned: boolean
|
|
21
23
|
}
|
|
22
24
|
|
|
23
|
-
const CLOSED_FIELDS = 'title,state,closedAt,labels'
|
|
25
|
+
const CLOSED_FIELDS = 'title,state,stateReason,closedAt,labels'
|
|
24
26
|
const CLOSED_STATE = 'CLOSED'
|
|
27
|
+
const NOT_PLANNED_REASON = 'not_planned'
|
|
25
28
|
const STILL_OPEN = 'open' as const
|
|
26
29
|
|
|
27
30
|
// What one issue answered: closed, still open, or `undefined` when it could not be read.
|
|
@@ -41,6 +44,7 @@ const READ_CONCURRENCY = 4
|
|
|
41
44
|
const closed_schema = z.looseObject({
|
|
42
45
|
title: z.string(),
|
|
43
46
|
state: z.string(),
|
|
47
|
+
stateReason: z.string().nullish(),
|
|
44
48
|
closedAt: z.string().nullish(),
|
|
45
49
|
labels: z.array(issue_label_schema).default([]),
|
|
46
50
|
})
|
|
@@ -69,7 +73,9 @@ async function read_closed(issue: number): Promise<ClosedRead> {
|
|
|
69
73
|
|
|
70
74
|
const labels = view.labels.map((label) => label.name)
|
|
71
75
|
|
|
72
|
-
|
|
76
|
+
const is_not_planned = view.stateReason === NOT_PLANNED_REASON
|
|
77
|
+
|
|
78
|
+
return { title: view.title, labels, closed_ms: closed_ms_of(view), is_merged, is_not_planned }
|
|
73
79
|
}
|
|
74
80
|
|
|
75
81
|
async function read_all(
|
|
@@ -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,67 @@
|
|
|
1
|
+
import { run_event_scope } from '#scripts/run/event/run-event-scope'
|
|
2
|
+
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
3
|
+
import { run_stalled } from '#scripts/run/park/run-stalled'
|
|
4
|
+
|
|
5
|
+
// Why a child's park or withdraw ended it, in the ending event's own words — the reason its board row
|
|
6
|
+
// draws and its park note carries.
|
|
7
|
+
|
|
8
|
+
const KIND = run_event_stream.EVENT_KIND
|
|
9
|
+
// `#<N> parked`, `#<N> parked (<reason>)` and `#<N> waiting on #<M>` lose their leading number, so a
|
|
10
|
+
// waiting park does not name its issue twice.
|
|
11
|
+
const PARK_PREFIX = /^#\d+ (?:parked\s*)?/u
|
|
12
|
+
const PARENTHESES = /^\((?<inner>.*)\)$/u
|
|
13
|
+
// `#<N> withdrawn by a person: <reason>` (`lane-withdraw.ts`).
|
|
14
|
+
const WITHDRAW_PREFIX = /^#\d+ withdrawn by a person:\s*/u
|
|
15
|
+
|
|
16
|
+
// `#<N> parked (needs-decision)` reads as the reason `needs-decision`; a bare park has none.
|
|
17
|
+
function park_reason(event: RunEvent): string {
|
|
18
|
+
const rest = event.text.replace(PARK_PREFIX, '')
|
|
19
|
+
|
|
20
|
+
return PARENTHESES.exec(rest)?.groups?.['inner'] ?? rest
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// A withdraw's reason after its prefix; a text in any other shape carries none.
|
|
24
|
+
function withdraw_reason(event: RunEvent): string {
|
|
25
|
+
const rest = event.text.replace(WITHDRAW_PREFIX, '')
|
|
26
|
+
|
|
27
|
+
return rest === event.text ? '' : rest.trim()
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// A `run:stalled` park reads as its cause and the action that resumes it (`run-stalled.ts`); any other
|
|
31
|
+
// park as its reason.
|
|
32
|
+
function park_row_reason(event: RunEvent): string {
|
|
33
|
+
const reason = park_reason(event)
|
|
34
|
+
const cause = run_stalled.cause_of(reason)
|
|
35
|
+
const issue = run_event_scope.issue_named(event)
|
|
36
|
+
|
|
37
|
+
return cause === undefined || issue === undefined ? reason : run_stalled.row_text(issue, cause)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// The reason an ending event gives, `undefined` for an event that is neither a park nor a withdraw or
|
|
41
|
+
// that gives none.
|
|
42
|
+
function reason_of(event: RunEvent): string | undefined {
|
|
43
|
+
if (event.kind === KIND.PARK) return park_row_reason(event) || undefined
|
|
44
|
+
|
|
45
|
+
return event.kind === KIND.WITHDRAW ? withdraw_reason(event) || undefined : undefined
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
interface EndingRecord {
|
|
49
|
+
reason?: string
|
|
50
|
+
elapsed_ms?: number
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// What an ending event records for its row: the reason it gives and the lane time its writer recorded
|
|
54
|
+
// (joshuafolkken/kit#4481), each only where the event carries it.
|
|
55
|
+
function recorded_of(event: RunEvent): EndingRecord {
|
|
56
|
+
const reason = reason_of(event)
|
|
57
|
+
const { elapsed_ms } = event
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
...(reason !== undefined && { reason }),
|
|
61
|
+
...(elapsed_ms !== undefined && { elapsed_ms }),
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const run_board_ending_reason = { park_reason, reason_of, recorded_of }
|
|
66
|
+
|
|
67
|
+
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 }
|