@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
|
@@ -4,15 +4,24 @@ import type { WavePlan } from '#scripts/backlog/backlog-waves'
|
|
|
4
4
|
import type { EpicChild } from '#scripts/epic/epic-graph'
|
|
5
5
|
import type { IssueReference } from '#scripts/epic/epic-reference'
|
|
6
6
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
has_label_name,
|
|
9
|
+
NEEDS_DECISION_LABEL,
|
|
10
|
+
RUN_SOLO_LABEL,
|
|
11
|
+
RUN_STALLED_LABEL,
|
|
12
|
+
} from '#scripts/issue/issue-labels'
|
|
8
13
|
import type { FiledKind } from '#scripts/run/event/run-event-filed'
|
|
9
|
-
import {
|
|
14
|
+
import { run_stalled } from '#scripts/run/park/run-stalled'
|
|
15
|
+
import { run_board_earlier, type EarlierLanes } from './run-board-earlier'
|
|
16
|
+
import { run_board_kind, type BoardPriority } from './run-board-kind'
|
|
10
17
|
import type { ItemState, ItemStatus } from './run-board-status'
|
|
11
18
|
|
|
12
19
|
// The plan with each issue's status laid over it — pure, so the order the board
|
|
13
|
-
// draws is tested apart from the screen. **The order is the plan's**: the
|
|
14
|
-
// the same play-forward `backlog:plan --waves` prints, so a merge, a park or
|
|
15
|
-
// plan changes the board with it. The
|
|
20
|
+
// draws is tested apart from the screen. **The order is the plan's**: the queued rows run in
|
|
21
|
+
// `backlog_waves.build`'s order, the same play-forward `backlog:plan --waves` prints, so a merge, a park or
|
|
22
|
+
// a new arrival that changes the plan changes the board with it. The board draws them as one queue, not
|
|
23
|
+
// as waves: a running batch dispatches each row once a lane is free and its paths are, never wave by
|
|
24
|
+
// wave (joshuafolkken/kit#4137). The plan leaves out what a run already holds or has closed, so those
|
|
16
25
|
// rows come from the stream instead, in the leading active section.
|
|
17
26
|
//
|
|
18
27
|
// **An epic and its children are a tree; every other dependency is not.** A child an opted-in epic
|
|
@@ -29,41 +38,64 @@ interface BoardPlan {
|
|
|
29
38
|
// The paths each issue's body declares (`Plan.scope.declared`), which a waiting row is checked
|
|
30
39
|
// against a running one by; a plan read without them checks none.
|
|
31
40
|
declared?: Declared | undefined
|
|
41
|
+
// The issues the classifier withholds for a person (`EpicNextResult.blocked_on_people`) — a blocker
|
|
42
|
+
// this run will not finish among them — whose waiting row leads with 🙋.
|
|
43
|
+
withheld?: ReadonlySet<number> | undefined
|
|
32
44
|
}
|
|
33
45
|
|
|
34
|
-
// Why a waiting row waits, or the stage its lane's launch is at,
|
|
46
|
+
// Why a waiting row waits, or the stage its lane's launch is at, as one value its row only draws
|
|
47
|
+
// (joshuafolkken/kit#4288): the icon it leads with in place of ⏳, the condition column's value, and
|
|
48
|
+
// what follows its title. A parked, withdrawn or stalled row draws its tail alone.
|
|
35
49
|
interface RowReason {
|
|
36
|
-
|
|
37
|
-
//
|
|
38
|
-
|
|
50
|
+
icon?: string | undefined
|
|
51
|
+
// The condition column's figure — a lane count, a memory reading, a start time.
|
|
52
|
+
value?: string | undefined
|
|
53
|
+
// The issues the wait names, in place of a figure: the first in the condition column, with
|
|
54
|
+
// `+<rest>` where the rest follow its title.
|
|
55
|
+
issues?: ReadonlyArray<string> | undefined
|
|
56
|
+
tail?: string | undefined
|
|
57
|
+
// When the row entered a stage, where the reason is one — the condition column counts how long it
|
|
58
|
+
// has stood there from it.
|
|
39
59
|
since_ms?: number | undefined
|
|
60
|
+
// The start time its body declares and the row waits on, which orders the 📅 rows.
|
|
61
|
+
not_before_ms?: number | undefined
|
|
40
62
|
}
|
|
41
63
|
|
|
42
|
-
// What a waiting child's row says
|
|
43
|
-
type ReasonOf = (child: EpicChild) => RowReason | undefined
|
|
64
|
+
// What a waiting child's row says, given the blockers still standing for it; `undefined` says nothing.
|
|
65
|
+
type ReasonOf = (child: EpicChild, waits: ReadonlyArray<string>) => RowReason | undefined
|
|
44
66
|
|
|
45
67
|
interface BoardRow {
|
|
46
68
|
number: number
|
|
47
69
|
title: string | undefined
|
|
48
70
|
// The release category its labels place it in (joshuafolkken/kit#3577), none for an Other Change.
|
|
49
71
|
kind: FiledKind | undefined
|
|
72
|
+
// The priority label it carries (joshuafolkken/kit#4383), none for a normal one.
|
|
73
|
+
priority?: BoardPriority | undefined
|
|
50
74
|
state: ItemState
|
|
51
75
|
status: ItemStatus | undefined
|
|
52
76
|
// The standing blockers this row still waits on, as the plan names them.
|
|
53
77
|
waits: ReadonlyArray<string>
|
|
54
|
-
// Why the row waits beyond its blockers (`run-board-reason.ts`)
|
|
78
|
+
// Why the row waits beyond its blockers (`run-board-reason.ts`), or why a parked or withdrawn row
|
|
79
|
+
// ended; any other row the run has touched has none.
|
|
55
80
|
reason?: RowReason | undefined
|
|
81
|
+
// An earlier run's lane (`run-board-earlier.ts`): drawn as its status says, marked 🧳.
|
|
82
|
+
is_earlier?: boolean | undefined
|
|
83
|
+
// A touched child carrying `run:solo`, which nothing else starts beside while it runs.
|
|
84
|
+
is_solo?: boolean | undefined
|
|
56
85
|
}
|
|
57
86
|
|
|
58
|
-
type
|
|
87
|
+
type QueuedEntry =
|
|
59
88
|
| { kind: 'row'; row: BoardRow }
|
|
60
89
|
| { kind: 'epic'; epic: number; title: string | undefined; rows: Array<BoardRow> }
|
|
61
90
|
|
|
62
91
|
interface BoardLayout {
|
|
63
92
|
active: ReadonlyArray<BoardRow>
|
|
64
|
-
|
|
93
|
+
queued: ReadonlyArray<QueuedEntry>
|
|
65
94
|
people: ReadonlyArray<BoardRow>
|
|
66
95
|
unreached: ReadonlyArray<BoardRow>
|
|
96
|
+
// The earlier run's lanes that still hold a place under the limit, and the lanes with no record —
|
|
97
|
+
// drawn after the run's own lanes, and no row the header counts.
|
|
98
|
+
earlier?: ReadonlyArray<BoardRow> | undefined
|
|
67
99
|
}
|
|
68
100
|
|
|
69
101
|
// What an active row is named and classified by — each issue's title and labels.
|
|
@@ -72,6 +104,8 @@ interface RowRead {
|
|
|
72
104
|
labels: ReadonlyMap<number, ReadonlyArray<string>>
|
|
73
105
|
}
|
|
74
106
|
|
|
107
|
+
const NO_READ: RowRead = { titles: new Map(), labels: new Map() }
|
|
108
|
+
|
|
75
109
|
interface Overlay {
|
|
76
110
|
plan: BoardPlan
|
|
77
111
|
statuses: ReadonlyMap<number, ItemStatus>
|
|
@@ -82,7 +116,7 @@ interface Drawn extends Overlay {
|
|
|
82
116
|
reason_of: ReasonOf | undefined
|
|
83
117
|
}
|
|
84
118
|
|
|
85
|
-
const SETTLED_STATES: ReadonlySet<ItemState> = new Set(['merged', 'parked', 'done'])
|
|
119
|
+
const SETTLED_STATES: ReadonlySet<ItemState> = new Set(['merged', 'parked', 'done', 'withdrawn'])
|
|
86
120
|
|
|
87
121
|
function is_settled(state: ItemState): boolean {
|
|
88
122
|
return SETTLED_STATES.has(state)
|
|
@@ -107,46 +141,137 @@ function is_blocked(child: EpicChild, overlay: Overlay): boolean {
|
|
|
107
141
|
return child.blocked_by.some((edge) => is_waiting_on(edge, overlay))
|
|
108
142
|
}
|
|
109
143
|
|
|
144
|
+
// A stalled row's right end names the action that resumes it (`run-stalled.ts`), with no event to
|
|
145
|
+
// name its cause.
|
|
146
|
+
function stalled_reason(number: number): RowReason {
|
|
147
|
+
return { tail: run_stalled.row_text(number) }
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Why a waiting row waits, or what resumes a stalled one.
|
|
151
|
+
function plan_reason(
|
|
152
|
+
child: EpicChild,
|
|
153
|
+
state: ItemState,
|
|
154
|
+
overlay: Drawn,
|
|
155
|
+
waits: ReadonlyArray<string>,
|
|
156
|
+
): RowReason | undefined {
|
|
157
|
+
if (state === 'stopped') return stalled_reason(child.number)
|
|
158
|
+
|
|
159
|
+
return state === 'waiting' ? overlay.reason_of?.(child, waits) : undefined
|
|
160
|
+
}
|
|
161
|
+
|
|
110
162
|
function plan_row(child: EpicChild, state: ItemState, overlay: Drawn): BoardRow {
|
|
111
163
|
const { context } = overlay.plan
|
|
112
164
|
const waits = child.blocked_by
|
|
113
165
|
.filter((edge) => is_waiting_on(edge, overlay))
|
|
114
166
|
.map((edge) => reference_of(edge, context.repo))
|
|
115
|
-
const reason = state
|
|
167
|
+
const reason = plan_reason(child, state, overlay, waits)
|
|
116
168
|
|
|
117
169
|
return {
|
|
118
170
|
...(reason !== undefined && { reason }),
|
|
119
171
|
number: child.number,
|
|
120
172
|
title: context.titles.get(child.number),
|
|
121
173
|
kind: run_board_kind.kind_of(child.labels),
|
|
174
|
+
priority: run_board_kind.priority_of(child.labels),
|
|
122
175
|
state,
|
|
123
176
|
status: undefined,
|
|
124
177
|
waits,
|
|
125
178
|
}
|
|
126
179
|
}
|
|
127
180
|
|
|
128
|
-
|
|
129
|
-
|
|
181
|
+
// A child that has ended for good — drawn in the done section rather than the leading one.
|
|
182
|
+
const FINISHED_STATES: ReadonlySet<ItemState> = new Set(['merged', 'done', 'withdrawn'])
|
|
183
|
+
|
|
184
|
+
function is_finished(state: ItemState): boolean {
|
|
185
|
+
return FINISHED_STATES.has(state)
|
|
130
186
|
}
|
|
131
187
|
|
|
132
|
-
//
|
|
133
|
-
|
|
134
|
-
|
|
188
|
+
// Running rows first, then the parked and stopped ones, then the finished ones. A row parked on a
|
|
189
|
+
// decision ranks among the parked, though the render draws it in its own 🙋 section.
|
|
190
|
+
function rank_of(row: BoardRow): number {
|
|
191
|
+
if (row.state === 'running') return 0
|
|
192
|
+
|
|
193
|
+
return is_finished(row.state) ? Infinity : 1
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// A finished row sorts by its end, the newest first and one with none last; any other by its start.
|
|
197
|
+
function key_of(row: BoardRow): number {
|
|
198
|
+
const { started_ms = Infinity, ended_ms = -Infinity } = row.status ?? {}
|
|
199
|
+
|
|
200
|
+
return is_finished(row.state) ? -ended_ms : started_ms
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function compared(left: number, right: number): number {
|
|
204
|
+
if (left === right) return 0
|
|
205
|
+
|
|
206
|
+
return left < right ? -1 : 1
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function active_order(left: BoardRow, right: BoardRow): number {
|
|
210
|
+
return compared(rank_of(left), rank_of(right)) || compared(key_of(left), key_of(right))
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// The states a row its labels say stalled can be drawn in: 🛑, and 💤 where its last park event was
|
|
214
|
+
// bare — `run:merge`'s park of a child already labelled (`on_parked`) after the ship-stop cap's.
|
|
215
|
+
const STALLED_STATES: ReadonlySet<ItemState> = new Set(['stopped', 'parked'])
|
|
216
|
+
|
|
217
|
+
// A row its labels say stalled, which no ending event explains.
|
|
218
|
+
function is_stalled(status: ItemStatus, labels: ReadonlyArray<string> = []): boolean {
|
|
219
|
+
return STALLED_STATES.has(status.state) && has_label_name(labels, RUN_STALLED_LABEL)
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// The reason a parked or withdrawn row draws where ⏳ draws why it waits — its ending event's own —
|
|
223
|
+
// and a stalled row the action that resumes it.
|
|
224
|
+
function ending_reason(
|
|
225
|
+
number: number,
|
|
226
|
+
status: ItemStatus,
|
|
227
|
+
labels: ReadonlyArray<string> | undefined,
|
|
228
|
+
): Pick<BoardRow, 'reason'> {
|
|
229
|
+
if (status.reason !== undefined) return { reason: { tail: status.reason } }
|
|
230
|
+
|
|
231
|
+
return is_stalled(status, labels) ? { reason: stalled_reason(number) } : {}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// A park waiting on a person's decision (joshuafolkken/kit#4099) — the one answer the 🙋 decision
|
|
235
|
+
// section and the findings section read a park reason by.
|
|
236
|
+
function is_decision(reason: string | undefined): boolean {
|
|
237
|
+
return reason?.includes(NEEDS_DECISION_LABEL) === true
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function solo_flag(labels: ReadonlyArray<string> = []): Pick<BoardRow, 'is_solo'> {
|
|
241
|
+
return has_label_name(labels, RUN_SOLO_LABEL) ? { is_solo: true } : {}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// A child parked on a decision is a 🙋 row: it waits on a person, as an untouched `needs-decision`
|
|
245
|
+
// child does, and the section it is drawn in already says why, so its row draws no reason.
|
|
246
|
+
function touched_row(number: number, status: ItemStatus, read: RowRead): BoardRow {
|
|
247
|
+
const is_asked = status.state === 'parked' && is_decision(status.reason)
|
|
248
|
+
const labels = read.labels.get(number)
|
|
249
|
+
|
|
250
|
+
return {
|
|
251
|
+
...(!is_asked && ending_reason(number, status, labels)),
|
|
252
|
+
...solo_flag(labels),
|
|
135
253
|
number,
|
|
136
254
|
title: read.titles.get(number),
|
|
137
|
-
kind: run_board_kind.kind_of(
|
|
138
|
-
|
|
255
|
+
kind: run_board_kind.kind_of(labels),
|
|
256
|
+
priority: run_board_kind.priority_of(labels),
|
|
257
|
+
state: is_asked ? 'human' : status.state,
|
|
139
258
|
status,
|
|
140
259
|
waits: [],
|
|
141
|
-
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
142
262
|
|
|
143
|
-
|
|
263
|
+
// Every child the run has touched: the running ones and then the parked ones in the order each
|
|
264
|
+
// started, then the finished ones from the newest end.
|
|
265
|
+
function active_rows(statuses: ReadonlyMap<number, ItemStatus>, read: RowRead): Array<BoardRow> {
|
|
266
|
+
const rows = [...statuses].map(([number, status]) => touched_row(number, status, read))
|
|
267
|
+
|
|
268
|
+
return rows.toSorted(active_order)
|
|
144
269
|
}
|
|
145
270
|
|
|
146
271
|
// The epic row carries its own title, read from the same open listing as its children's — an opted-in
|
|
147
272
|
// epic is an open issue.
|
|
148
273
|
function place_in_epic(
|
|
149
|
-
entries: Array<
|
|
274
|
+
entries: Array<QueuedEntry>,
|
|
150
275
|
epic: number,
|
|
151
276
|
overlay: Drawn,
|
|
152
277
|
row: BoardRow,
|
|
@@ -162,22 +287,21 @@ function is_untouched(child: EpicChild, overlay: Overlay): boolean {
|
|
|
162
287
|
return !overlay.statuses.has(child.number)
|
|
163
288
|
}
|
|
164
289
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
290
|
+
// A plan row waits, unless it waits on a person's decision — the one wait the board marks — or the run
|
|
291
|
+
// stalled on it mechanically (`run:stalled`), which is drawn as the stop it is, never as a decision.
|
|
292
|
+
function plan_state(child: EpicChild): ItemState {
|
|
293
|
+
if (has_label_name(child.labels, NEEDS_DECISION_LABEL)) return 'human'
|
|
168
294
|
|
|
169
|
-
|
|
170
|
-
function wave_state(child: EpicChild): ItemState {
|
|
171
|
-
return is_human(child) ? 'human' : 'waiting'
|
|
295
|
+
return has_label_name(child.labels, RUN_STALLED_LABEL) ? 'stopped' : 'waiting'
|
|
172
296
|
}
|
|
173
297
|
|
|
174
|
-
//
|
|
298
|
+
// The queue, its rows in the plan's order, an epic's children gathered under the epic where the first
|
|
175
299
|
// of them falls.
|
|
176
|
-
function
|
|
177
|
-
const entries: Array<
|
|
300
|
+
function queued_entries(queue: ReadonlyArray<EpicChild>, overlay: Drawn): Array<QueuedEntry> {
|
|
301
|
+
const entries: Array<QueuedEntry> = []
|
|
178
302
|
|
|
179
|
-
for (const child of
|
|
180
|
-
const row = plan_row(child,
|
|
303
|
+
for (const child of queue) {
|
|
304
|
+
const row = plan_row(child, plan_state(child), overlay)
|
|
181
305
|
const epic = overlay.plan.tracked.get(child.number)
|
|
182
306
|
|
|
183
307
|
if (epic === undefined) entries.push({ kind: 'row', row })
|
|
@@ -187,12 +311,21 @@ function wave_entries(wave: ReadonlyArray<EpicChild>, overlay: Drawn): Array<Wav
|
|
|
187
311
|
return entries
|
|
188
312
|
}
|
|
189
313
|
|
|
190
|
-
|
|
191
|
-
|
|
314
|
+
// A row waiting on no start time keeps its plan place ahead of every 📅 row, which follow from the
|
|
315
|
+
// earliest start (joshuafolkken/kit#4104).
|
|
316
|
+
function start_order(left: BoardRow, right: BoardRow): number {
|
|
317
|
+
const { not_before_ms: left_ms = -Infinity } = left.reason ?? {}
|
|
318
|
+
const { not_before_ms: right_ms = -Infinity } = right.reason ?? {}
|
|
192
319
|
|
|
320
|
+
return compared(left_ms, right_ms)
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
function unreached_rows(overlay: Drawn, is_people: boolean): Array<BoardRow> {
|
|
193
324
|
return overlay.plan.waves.unreached
|
|
194
|
-
.filter((child) => is_untouched(child, overlay)
|
|
195
|
-
.map((child) => plan_row(child,
|
|
325
|
+
.filter((child) => is_untouched(child, overlay))
|
|
326
|
+
.map((child) => plan_row(child, plan_state(child), overlay))
|
|
327
|
+
.filter((row) => (row.state === 'human') === is_people)
|
|
328
|
+
.toSorted(start_order)
|
|
196
329
|
}
|
|
197
330
|
|
|
198
331
|
// Every issue the plan holds, wave or unreached.
|
|
@@ -201,10 +334,10 @@ function children_of(plan: BoardPlan): Array<EpicChild> {
|
|
|
201
334
|
}
|
|
202
335
|
|
|
203
336
|
// The children whose rows wait on the run rather than on a person: the run has not touched them, and
|
|
204
|
-
//
|
|
337
|
+
// it is neither parked for a decision nor stalled.
|
|
205
338
|
function waiting_children(overlay: Overlay): Array<EpicChild> {
|
|
206
339
|
return children_of(overlay.plan).filter(
|
|
207
|
-
(child) => is_untouched(child, overlay) &&
|
|
340
|
+
(child) => is_untouched(child, overlay) && plan_state(child) === 'waiting',
|
|
208
341
|
)
|
|
209
342
|
}
|
|
210
343
|
|
|
@@ -212,59 +345,105 @@ function layout_of(
|
|
|
212
345
|
plan: BoardPlan,
|
|
213
346
|
statuses: ReadonlyMap<number, ItemStatus>,
|
|
214
347
|
reason_of?: ReasonOf,
|
|
348
|
+
earlier: EarlierLanes = run_board_earlier.NO_EARLIER,
|
|
215
349
|
): BoardLayout {
|
|
216
350
|
const overlay = { plan, statuses, reason_of }
|
|
217
|
-
const
|
|
218
|
-
|
|
219
|
-
wave.filter((child) => is_untouched(child, overlay)),
|
|
220
|
-
overlay,
|
|
221
|
-
),
|
|
222
|
-
)
|
|
351
|
+
const queue = plan.waves.waves.flat().filter((child) => is_untouched(child, overlay))
|
|
352
|
+
const read = { titles: plan.context.titles, labels: plan.labels }
|
|
223
353
|
|
|
224
354
|
return {
|
|
225
|
-
active: active_rows(statuses,
|
|
226
|
-
|
|
355
|
+
active: active_rows(statuses, read),
|
|
356
|
+
queued: queued_entries(queue, overlay),
|
|
227
357
|
people: unreached_rows(overlay, true),
|
|
228
358
|
unreached: unreached_rows(overlay, false),
|
|
359
|
+
earlier: run_board_earlier.rows_of(earlier, statuses, read),
|
|
229
360
|
}
|
|
230
361
|
}
|
|
231
362
|
|
|
232
|
-
const EMPTY_LAYOUT: BoardLayout = { active: [],
|
|
363
|
+
const EMPTY_LAYOUT: BoardLayout = { active: [], queued: [], people: [], unreached: [] }
|
|
233
364
|
|
|
234
365
|
// The run's own children before the plan is read: the stream and the lanes are local and read at
|
|
235
366
|
// once, so the rows, their states and how long each has run are drawn while GitHub answers; the titles
|
|
236
367
|
// and every issue the run has not touched wait for the plan.
|
|
237
|
-
function local_layout_of(
|
|
368
|
+
function local_layout_of(
|
|
369
|
+
statuses: ReadonlyMap<number, ItemStatus>,
|
|
370
|
+
earlier: EarlierLanes = run_board_earlier.NO_EARLIER,
|
|
371
|
+
read: RowRead = NO_READ,
|
|
372
|
+
): BoardLayout {
|
|
238
373
|
return {
|
|
239
374
|
...EMPTY_LAYOUT,
|
|
240
|
-
active: active_rows(statuses,
|
|
375
|
+
active: active_rows(statuses, read),
|
|
376
|
+
earlier: run_board_earlier.rows_of(earlier, statuses, read),
|
|
241
377
|
}
|
|
242
378
|
}
|
|
243
379
|
|
|
244
|
-
// The run's scope a lane is checked against.
|
|
380
|
+
// The run's scope a lane is checked against — its running issues too, which no wave holds.
|
|
245
381
|
function numbers_of(plan: BoardPlan): ReadonlySet<number> {
|
|
246
|
-
|
|
382
|
+
const running = plan.waves.running ?? []
|
|
383
|
+
|
|
384
|
+
return new Set([...children_of(plan), ...running].map((child) => child.number))
|
|
247
385
|
}
|
|
248
386
|
|
|
249
387
|
// Every row the layout draws, an epic's children among them — what the header counts and the legend reads.
|
|
250
388
|
function rows_of(layout: BoardLayout): Array<BoardRow> {
|
|
251
|
-
const
|
|
252
|
-
|
|
253
|
-
|
|
389
|
+
const queued = layout.queued.flatMap((entry) => (entry.kind === 'row' ? [entry.row] : entry.rows))
|
|
390
|
+
|
|
391
|
+
return [...layout.active, ...queued, ...layout.people, ...layout.unreached]
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// Every row the frame draws — the counted ones and the earlier run's lanes — what the legend reads.
|
|
395
|
+
function drawn_rows(layout: BoardLayout): Array<BoardRow> {
|
|
396
|
+
return [...rows_of(layout), ...(layout.earlier ?? [])]
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// Every row waiting on a person's decision: the touched children parked on one, then the untouched
|
|
400
|
+
// `needs-decision` children — what the 🙋 section draws and the header counts as a person's.
|
|
401
|
+
function people_of(layout: BoardLayout): Array<BoardRow> {
|
|
402
|
+
const asked = layout.active.filter((row) => row.state === 'human')
|
|
403
|
+
|
|
404
|
+
return [...asked, ...layout.people]
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// The run's own rows `apart` does not name, then the earlier run's lanes still holding a place.
|
|
408
|
+
function lane_rows(layout: BoardLayout, apart: ReadonlyArray<BoardRow>): Array<BoardRow> {
|
|
409
|
+
const own = layout.active.filter((row) => !apart.includes(row))
|
|
410
|
+
|
|
411
|
+
return [...own, ...(layout.earlier ?? [])]
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// The lanes section's rows: those neither finished nor waiting on a person's decision.
|
|
415
|
+
function lanes_drawn(layout: BoardLayout): Array<BoardRow> {
|
|
416
|
+
const finished = layout.active.filter((row) => is_finished(row.state))
|
|
417
|
+
|
|
418
|
+
return lane_rows(layout, [...finished, ...people_of(layout)])
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// The parked children the findings section says the park of: still parked on the board, their rows
|
|
422
|
+
// drawing no park reason of their own. A child a person released or closed is no row of this
|
|
423
|
+
// (joshuafolkken/kit#4127), and a reason its row draws is not said twice.
|
|
424
|
+
function listed_parks(layout: BoardLayout): ReadonlySet<number> {
|
|
425
|
+
const parks = layout.active.filter((row) => row.state === 'parked' && row.reason === undefined)
|
|
254
426
|
|
|
255
|
-
return
|
|
427
|
+
return new Set(parks.map((row) => row.number))
|
|
256
428
|
}
|
|
257
429
|
|
|
258
430
|
const run_board_layout = {
|
|
259
431
|
EMPTY_LAYOUT,
|
|
432
|
+
drawn_rows,
|
|
260
433
|
is_blocked,
|
|
434
|
+
is_decision,
|
|
435
|
+
is_finished,
|
|
261
436
|
is_settled,
|
|
437
|
+
lane_rows,
|
|
438
|
+
lanes_drawn,
|
|
262
439
|
layout_of,
|
|
440
|
+
listed_parks,
|
|
263
441
|
local_layout_of,
|
|
442
|
+
people_of,
|
|
264
443
|
numbers_of,
|
|
265
444
|
rows_of,
|
|
266
445
|
waiting_children,
|
|
267
446
|
}
|
|
268
447
|
|
|
269
448
|
export { run_board_layout }
|
|
270
|
-
export type { BoardLayout, BoardPlan, BoardRow, Overlay, ReasonOf,
|
|
449
|
+
export type { BoardLayout, BoardPlan, BoardRow, Overlay, QueuedEntry, ReasonOf, RowRead, RowReason }
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { figure_format } from '#scripts/lib/figure-format'
|
|
2
|
+
import { MS_PER_MINUTE, MS_PER_SECOND, SECONDS_PER_MINUTE } from '#scripts/lib/timeouts'
|
|
3
|
+
|
|
4
|
+
// Every length `run:board` draws — how long the run, a row, a phase or the heartbeat has run — in
|
|
5
|
+
// degree-minute-second style (`1°15′57″`), so a length never shares the clock's `:`. Re-exported by
|
|
6
|
+
// `run-board-labels.ts`, where the board's words and clock are read from.
|
|
7
|
+
|
|
8
|
+
const MINUTES_PER_HOUR = 60
|
|
9
|
+
// A length's units — hours, minutes and seconds — so a length never shares the clock's `:`.
|
|
10
|
+
const SPAN_UNITS = { hours: '°', minutes: '′', seconds: '″' } as const
|
|
11
|
+
// The seconds a length rounded to its minute draws, which `minute_span_of` leaves off.
|
|
12
|
+
const ZERO_SECONDS = `00${SPAN_UNITS.seconds}`
|
|
13
|
+
|
|
14
|
+
const { two_digits } = figure_format
|
|
15
|
+
|
|
16
|
+
// A length as its hours, and its minutes and seconds within the hour, each its count with the mark it
|
|
17
|
+
// is drawn with; a negative span reads as zero.
|
|
18
|
+
function span_fields(ms: number): Array<{ value: number; unit: string }> {
|
|
19
|
+
const seconds = Math.floor(Math.max(0, ms) / MS_PER_SECOND)
|
|
20
|
+
const minutes = Math.floor(seconds / SECONDS_PER_MINUTE)
|
|
21
|
+
const hours = Math.floor(minutes / MINUTES_PER_HOUR)
|
|
22
|
+
|
|
23
|
+
return [
|
|
24
|
+
{ value: hours, unit: SPAN_UNITS.hours },
|
|
25
|
+
{ value: minutes % MINUTES_PER_HOUR, unit: SPAN_UNITS.minutes },
|
|
26
|
+
{ value: seconds % SECONDS_PER_MINUTE, unit: SPAN_UNITS.seconds },
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// **Every length the board draws**, in degree-minute-second style (`26″`, `3′27″`, `1°15′57″`): the
|
|
31
|
+
// leading unit not padded and a zero one dropped down to the seconds, the units after it two digits;
|
|
32
|
+
// a negative span reads as zero.
|
|
33
|
+
function span_of(ms: number): string {
|
|
34
|
+
const fields = span_fields(ms)
|
|
35
|
+
const lead = fields.findIndex((field, index) => field.value > 0 || index === fields.length - 1)
|
|
36
|
+
const [first, ...rest] = fields.slice(lead)
|
|
37
|
+
const head = first === undefined ? '' : `${String(first.value)}${first.unit}`
|
|
38
|
+
|
|
39
|
+
return head + rest.map((field) => `${two_digits(field.value)}${field.unit}`).join('')
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// A length rounded up to its minute, in `span_of`'s style without the seconds (`25′`, `1°05′`), never
|
|
43
|
+
// under a minute: an estimate drawn to the second would claim a precision it does not have.
|
|
44
|
+
function minute_span_of(ms: number): string {
|
|
45
|
+
const minutes = Math.max(1, Math.ceil(ms / MS_PER_MINUTE))
|
|
46
|
+
|
|
47
|
+
return span_of(minutes * MS_PER_MINUTE).slice(0, -ZERO_SECONDS.length)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const run_board_length = { minute_span_of, span_of }
|
|
51
|
+
|
|
52
|
+
export { run_board_length }
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { machine_capacity, type MachineSample } from '#scripts/gate/machine-capacity'
|
|
2
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
2
3
|
import { run_board_labels, type Paint } from './run-board-labels'
|
|
3
4
|
|
|
4
5
|
// The machine line of `run:board`: whether a quiet run is stuck or only slow on a machine that has
|
|
5
6
|
// run out of room.
|
|
6
7
|
//
|
|
7
8
|
// **The reading is the gate's own** (`machine-capacity.ts`), so the board shows what the core budget
|
|
8
|
-
// admits against.
|
|
9
|
+
// admits against. 💪 is the busy share of the CPU between two samples; 🧠 the kernel's memory pressure,
|
|
9
10
|
// never a GB figure that would disagree with Activity Monitor's "memory used"; 💾 how fast pages are
|
|
10
11
|
// swapped, never how much swap is held — macOS grows its swap files, so a usage share reads near 100%
|
|
11
12
|
// and the amount itself does no harm. A figure that needs two samples is not drawn on the first, and a
|
|
@@ -18,7 +19,6 @@ import { run_board_labels, type Paint } from './run-board-labels'
|
|
|
18
19
|
|
|
19
20
|
const { GAUGE_SHADES, HEADER_ICONS, bar_of, painted } = run_board_labels
|
|
20
21
|
const PERCENT = 100
|
|
21
|
-
const MS_PER_SECOND = 1000
|
|
22
22
|
const PERCENT_WIDTH = '100%'.length
|
|
23
23
|
const RATE_WIDTH = '3.1M/s'.length
|
|
24
24
|
// Below this a rate keeps one decimal, so `0.4M/s` is not drawn as `0M/s`.
|
|
@@ -33,6 +33,7 @@ const CPU_RED = 90
|
|
|
33
33
|
const MEMORY_YELLOW = 70
|
|
34
34
|
const MEMORY_RED = 85
|
|
35
35
|
const SWAP_FULL_MB_PER_S = 20
|
|
36
|
+
const SWAP_YELLOW_MB_PER_S = 1
|
|
36
37
|
const SWAP_RED_MB_PER_S = 10
|
|
37
38
|
|
|
38
39
|
type Alert = 'normal' | 'yellow' | 'red'
|
|
@@ -101,7 +102,7 @@ const SPECS = {
|
|
|
101
102
|
icon: HEADER_ICONS.swap,
|
|
102
103
|
normal: undefined,
|
|
103
104
|
full: SWAP_FULL_MB_PER_S,
|
|
104
|
-
yellow:
|
|
105
|
+
yellow: SWAP_YELLOW_MB_PER_S,
|
|
105
106
|
red: SWAP_RED_MB_PER_S,
|
|
106
107
|
format: rate_text,
|
|
107
108
|
},
|
|
@@ -199,12 +200,15 @@ function line_of(gauges: MachineGauges | undefined, width = 0): string | undefin
|
|
|
199
200
|
const run_board_machine = {
|
|
200
201
|
CPU_YELLOW,
|
|
201
202
|
GAP,
|
|
203
|
+
MEMORY_RED,
|
|
202
204
|
MEMORY_YELLOW,
|
|
203
205
|
PERCENT_WIDTH,
|
|
206
|
+
SWAP_RED_MB_PER_S,
|
|
207
|
+
SWAP_YELLOW_MB_PER_S,
|
|
204
208
|
gauges_of,
|
|
205
209
|
line_of,
|
|
206
210
|
percent_text,
|
|
207
|
-
|
|
211
|
+
rate_text,
|
|
208
212
|
}
|
|
209
213
|
|
|
210
214
|
export { run_board_machine }
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { run_board_cli } from './run-board-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh run:board` entry, kept apart from `run-board-cli.ts` because other modules import that
|
|
6
|
+
// one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186).
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
9
|
+
const ARGV_OFFSET = 2
|
|
10
|
+
|
|
11
|
+
process.exitCode = await run_board_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
12
|
+
}
|