@joshuafolkken/kit 1.1514.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 +5 -5
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- 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-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- 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 +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- 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 +2 -3
- 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 +53 -6
- 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 +30 -7
- 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 +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +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 +112 -30
- 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 +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- 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 +8 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +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 +19 -66
- 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 +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- 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 +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- 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 +27 -24
- 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-write.ts +67 -29
- 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/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 +2 -2
- package/scripts/git/main-merge.ts +25 -9
- 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 +0 -8
- 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 +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/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 +1 -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 +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- 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 +2 -10
- 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 +0 -11
- 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/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 +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +157 -158
- 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 +25 -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 +103 -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 +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- 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 +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- 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 +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- 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 +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- 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-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 +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- 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 +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- 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 +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- 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 +11 -2
- 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 +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -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 +2 -6
- 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 +2 -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.ts +1 -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 +81 -15
- 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 +8 -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 +80 -2
- 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 +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -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 +9 -1
- 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/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- 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 +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- 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 -32
- 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 +118 -38
- package/scripts/run/board/run-board-header.ts +82 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +116 -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 +239 -60
- 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 +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- 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 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +207 -265
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- 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-handoff.ts +2 -2
- 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 +6 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +34 -8
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- 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 +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- 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 +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- 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.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 +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- 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 +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- 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 +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- 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-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- 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 +25 -1
- 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 +42 -24
- 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 +61 -149
- 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 +97 -10
- 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 +4 -1
- 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-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,28 +1,37 @@
|
|
|
1
1
|
import { styleText } from 'node:util'
|
|
2
|
-
import {
|
|
2
|
+
import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
|
|
3
3
|
import type { PrChecks } from '#scripts/run/event/run-event-checks'
|
|
4
|
+
import { run_board_earlier } from './run-board-earlier'
|
|
4
5
|
import { run_board_header, type BoardHeader } from './run-board-header'
|
|
5
6
|
import { run_board_labels, type TextColor } from './run-board-labels'
|
|
6
|
-
import type
|
|
7
|
+
import { run_board_layout, type BoardRow } from './run-board-layout'
|
|
7
8
|
import { run_board_now, type TimedLine } from './run-board-now'
|
|
8
9
|
import type { Phase } from './run-board-phase'
|
|
9
10
|
import { run_board_render_checks } from './run-board-render-checks'
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
import { run_board_render_waits } from './run-board-render-waits'
|
|
12
|
+
|
|
13
|
+
// The end of a running row (joshuafolkken/kit#3769, #4043, #4292): the kind and the age of the newest
|
|
14
|
+
// thing the child did, the board's own length (`1°01′05″`), right-aligned to the widest any running
|
|
15
|
+
// row draws, so a `2°05′30″` and a `40″` end in one column. The phase's icon and how long the child has
|
|
16
|
+
// stood at it lead the row (`run-board-render-lead.ts`), so the event that entered the phase is not
|
|
17
|
+
// drawn again here. A settled or a waiting row draws none. A lane held in the core budget draws the
|
|
18
|
+
// check it holds in the newest activity's place (#4052), its reason and time leading the row.
|
|
19
|
+
|
|
20
|
+
const { PHASE_ICONS, span_of } = run_board_labels
|
|
21
|
+
const { is_live } = run_board_earlier
|
|
22
|
+
const { check_of, held_of } = run_board_render_waits
|
|
19
23
|
// A phase past twice its usual time is drawn as long, past three times as alarming.
|
|
20
24
|
const LONG_FACTOR = 2
|
|
21
25
|
const ALARM_FACTOR = 3
|
|
22
26
|
// The least a usual time counts as: the ledger's median for a stage of seconds (preflight, sync,
|
|
23
27
|
// report) is near zero, and scaled as it is it would draw a healthy few-second stage as alarming.
|
|
24
28
|
const USUAL_FLOOR_MINUTES = 2
|
|
25
|
-
const USUAL_FLOOR_MS = USUAL_FLOOR_MINUTES *
|
|
29
|
+
const USUAL_FLOOR_MS = USUAL_FLOOR_MINUTES * MS_PER_MINUTE
|
|
30
|
+
|
|
31
|
+
interface TimedActivity {
|
|
32
|
+
icon: string
|
|
33
|
+
since_ms: number
|
|
34
|
+
}
|
|
26
35
|
|
|
27
36
|
function phase_color(elapsed_ms: number, usual_ms: number | undefined): TextColor | undefined {
|
|
28
37
|
if (usual_ms === undefined) return undefined
|
|
@@ -45,32 +54,40 @@ function current_of(row: BoardRow): { phase: Phase; since_ms: number } | undefin
|
|
|
45
54
|
return phase === undefined || phase_ms === undefined ? undefined : { phase, since_ms: phase_ms }
|
|
46
55
|
}
|
|
47
56
|
|
|
48
|
-
//
|
|
49
|
-
// at the least, so a row with none still blanks a column's width.
|
|
50
|
-
function
|
|
51
|
-
const
|
|
52
|
-
|
|
57
|
+
// A column's width: the widest span `age_of` gives any running row or earlier run's lane in this
|
|
58
|
+
// frame, and `0″`'s at the least, so a row with none still blanks a column's width.
|
|
59
|
+
function column_width(header: BoardHeader, age_of: (row: BoardRow) => number | undefined): number {
|
|
60
|
+
const rows = run_board_layout.lane_rows(header.layout ?? run_board_layout.EMPTY_LAYOUT, [])
|
|
61
|
+
const spans = rows.map((row) => {
|
|
62
|
+
const age = is_live(row) ? age_of(row) : undefined
|
|
53
63
|
|
|
54
|
-
return
|
|
64
|
+
return age === undefined ? 0 : span_of(age).length
|
|
55
65
|
})
|
|
56
66
|
|
|
57
|
-
return Math.max(
|
|
67
|
+
return Math.max(span_of(0).length, ...spans)
|
|
58
68
|
}
|
|
59
69
|
|
|
60
|
-
// How long the child has stood at its phase, colored against the phase's
|
|
61
|
-
// event said when it got there, so
|
|
62
|
-
function
|
|
63
|
-
const current = current_of(row)
|
|
64
|
-
const width = phase_width(header)
|
|
70
|
+
// How long the child has stood at its phase, right-aligned to `width` and colored against the phase's
|
|
71
|
+
// usual time; blanks where no event said when it got there, so what follows still starts in its column.
|
|
72
|
+
function phase_time(row: BoardRow, header: BoardHeader, width: number): string {
|
|
73
|
+
const current = is_live(row) ? current_of(row) : undefined
|
|
65
74
|
|
|
66
75
|
if (current === undefined) return ' '.repeat(width)
|
|
67
76
|
|
|
68
77
|
const elapsed = header.now_ms - current.since_ms
|
|
69
|
-
const text =
|
|
78
|
+
const text = span_of(elapsed).padStart(width)
|
|
70
79
|
|
|
71
80
|
return tinted(text, phase_color(elapsed, header.usual?.get(current.phase)))
|
|
72
81
|
}
|
|
73
82
|
|
|
83
|
+
// The icon of the phase a running row's end draws, `undefined` where it draws blanks — named by the
|
|
84
|
+
// legend, since a held row leads with 🚧 instead.
|
|
85
|
+
function phase_icon(row: BoardRow): string | undefined {
|
|
86
|
+
const current = is_live(row) ? current_of(row) : undefined
|
|
87
|
+
|
|
88
|
+
return current === undefined ? undefined : PHASE_ICONS[current.phase]
|
|
89
|
+
}
|
|
90
|
+
|
|
74
91
|
// The newer of the child's newest operation and its newest event, read as the header's third line
|
|
75
92
|
// reads it, so the two never disagree on what is newest.
|
|
76
93
|
function newest_of(row: BoardRow, header: BoardHeader): TimedLine | undefined {
|
|
@@ -81,48 +98,98 @@ function newest_of(row: BoardRow, header: BoardHeader): TimedLine | undefined {
|
|
|
81
98
|
})
|
|
82
99
|
}
|
|
83
100
|
|
|
84
|
-
// The newest activity
|
|
85
|
-
function
|
|
101
|
+
// The newest activity with when it happened, `undefined` where nothing said when.
|
|
102
|
+
function newest_timed(row: BoardRow, header: BoardHeader): TimedActivity | undefined {
|
|
86
103
|
const newest = newest_of(row, header)
|
|
104
|
+
const since_ms = newest?.since_ms
|
|
87
105
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
106
|
+
return newest === undefined || since_ms === undefined
|
|
107
|
+
? undefined
|
|
108
|
+
: { icon: newest.icon, since_ms }
|
|
109
|
+
}
|
|
91
110
|
|
|
92
|
-
|
|
111
|
+
// A running row whose lane no core-budget wait holds.
|
|
112
|
+
function is_free(row: BoardRow, header: BoardHeader): boolean {
|
|
113
|
+
return is_live(row) && held_of(row, header) === undefined
|
|
93
114
|
}
|
|
94
115
|
|
|
95
116
|
// A row in followup with its pull request's checks on the stream (joshuafolkken/kit#3770), whose end
|
|
96
|
-
// draws them in place of its newest activity.
|
|
117
|
+
// draws them in place of its newest activity — unless its lane is held, whose wait is drawn instead.
|
|
97
118
|
function checks_of(row: BoardRow, header: BoardHeader): PrChecks | undefined {
|
|
98
|
-
if (row
|
|
119
|
+
if (!is_free(row, header) || current_of(row)?.phase !== 'followup') return undefined
|
|
99
120
|
|
|
100
121
|
return header.activity.pr_checks?.get(row.number)
|
|
101
122
|
}
|
|
102
123
|
|
|
103
|
-
//
|
|
104
|
-
function
|
|
105
|
-
|
|
124
|
+
// The event that entered the row's phase, whose time the phase part already draws.
|
|
125
|
+
function is_phase_event(newest: TimedActivity, row: BoardRow): boolean {
|
|
126
|
+
return newest.since_ms === current_of(row)?.since_ms
|
|
127
|
+
}
|
|
106
128
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
129
|
+
// The newest activity a running row's end draws: none where the row draws its checks or its wait in
|
|
130
|
+
// its place, nor where it is the event that entered the phase.
|
|
131
|
+
function drawn_activity(row: BoardRow, header: BoardHeader): TimedActivity | undefined {
|
|
132
|
+
if (!is_free(row, header) || checks_of(row, header) !== undefined) return undefined
|
|
110
133
|
|
|
111
|
-
|
|
134
|
+
const newest = newest_timed(row, header)
|
|
135
|
+
|
|
136
|
+
if (newest === undefined || is_phase_event(newest, row)) return undefined
|
|
137
|
+
|
|
138
|
+
return newest
|
|
112
139
|
}
|
|
113
140
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
141
|
+
function activity_age(row: BoardRow, header: BoardHeader): number | undefined {
|
|
142
|
+
const newest = drawn_activity(row, header)
|
|
143
|
+
|
|
144
|
+
return newest === undefined ? undefined : header.now_ms - newest.since_ms
|
|
117
145
|
}
|
|
118
146
|
|
|
119
|
-
//
|
|
120
|
-
|
|
121
|
-
|
|
147
|
+
// The newest activity as its kind's icon and its age, aged as the `💓` is; nothing where the row draws
|
|
148
|
+
// none.
|
|
149
|
+
function activity_part(row: BoardRow, header: BoardHeader): string {
|
|
150
|
+
const newest = drawn_activity(row, header)
|
|
151
|
+
|
|
152
|
+
if (newest === undefined) return ''
|
|
122
153
|
|
|
123
|
-
|
|
154
|
+
const width = column_width(header, (other) => activity_age(other, header))
|
|
155
|
+
const age = header.now_ms - newest.since_ms
|
|
156
|
+
|
|
157
|
+
return run_board_header.aged(`${newest.icon} ${span_of(age).padStart(width)}`, age)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Whether a row ends on a tail: a running row and an earlier run's lane only.
|
|
161
|
+
function is_tailed(row: BoardRow): boolean {
|
|
162
|
+
return is_live(row)
|
|
124
163
|
}
|
|
125
164
|
|
|
126
|
-
|
|
165
|
+
// A running row's end — the check its held lane waits to run, its pull request's checks in followup,
|
|
166
|
+
// or its newest activity — and nothing for any other row.
|
|
167
|
+
function tail_of(row: BoardRow, header: BoardHeader): Array<string> {
|
|
168
|
+
if (!is_tailed(row)) return []
|
|
169
|
+
|
|
170
|
+
const held = held_of(row, header)
|
|
171
|
+
|
|
172
|
+
if (held !== undefined) return [check_of(held)]
|
|
173
|
+
|
|
174
|
+
const checks = checks_of(row, header)
|
|
175
|
+
|
|
176
|
+
if (checks !== undefined) return [run_board_render_checks.checks_part(checks)]
|
|
177
|
+
|
|
178
|
+
return [activity_part(row, header)]
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// The icon a row's end draws for its newest activity, so the legend names it — none where the row
|
|
182
|
+
// draws its checks, its wait or the phase's own event in its place.
|
|
183
|
+
function activity_icon(row: BoardRow, header: BoardHeader): string | undefined {
|
|
184
|
+
return drawn_activity(row, header)?.icon
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const run_board_render_tail = {
|
|
188
|
+
activity_icon,
|
|
189
|
+
checks_of,
|
|
190
|
+
phase_icon,
|
|
191
|
+
phase_time,
|
|
192
|
+
tail_of,
|
|
193
|
+
}
|
|
127
194
|
|
|
128
195
|
export { run_board_render_tail }
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { run_board_earlier } from './run-board-earlier'
|
|
2
|
+
import type { BoardHeader } from './run-board-header'
|
|
3
|
+
import { run_board_labels } from './run-board-labels'
|
|
4
|
+
import { run_board_lane_time } from './run-board-lane-time'
|
|
5
|
+
import { run_board_layout, type BoardRow } from './run-board-layout'
|
|
6
|
+
import type { ItemStatus } from './run-board-status'
|
|
7
|
+
|
|
8
|
+
// A row's time column on `run:board`: how long it has run, and how wide the column is drawn.
|
|
9
|
+
|
|
10
|
+
const { span_of } = run_board_labels
|
|
11
|
+
|
|
12
|
+
// A running row — an earlier run's lane too — runs until now; a settled one until its recorded end. A
|
|
13
|
+
// child settled from the open listing has none, so it draws no time rather than one that keeps counting.
|
|
14
|
+
function end_of(row: BoardRow, now_ms: number): number | undefined {
|
|
15
|
+
return run_board_earlier.is_live(row) ? now_ms : row.status?.ended_ms
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// The time the event that settled the row recorded (joshuafolkken/kit#4481): a settled row draws it
|
|
19
|
+
// rather than counting again, so it keeps its time when its launch lies outside the run's span.
|
|
20
|
+
function recorded_ms(row: BoardRow): number | undefined {
|
|
21
|
+
return run_board_earlier.is_live(row) ? undefined : row.status?.elapsed_ms
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// How long a row has run on a lane, up to its end. A row whose launch rolled off the stream has no
|
|
25
|
+
// span, so it runs from its lane record's launch.
|
|
26
|
+
function counted_ms(status: ItemStatus | undefined, ended: number | undefined): number | undefined {
|
|
27
|
+
if (ended === undefined || status?.started_ms === undefined) return undefined
|
|
28
|
+
|
|
29
|
+
return run_board_lane_time.elapsed_of(status.spans ?? [], status.started_ms, ended)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// How long a row has run: a running one until now, a settled one until its end.
|
|
33
|
+
function elapsed_ms(row: BoardRow, now_ms: number): number | undefined {
|
|
34
|
+
return recorded_ms(row) ?? counted_ms(row.status, end_of(row, now_ms))
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function time_of(row: BoardRow, now_ms: number): string | undefined {
|
|
38
|
+
const elapsed = elapsed_ms(row, now_ms)
|
|
39
|
+
|
|
40
|
+
return elapsed === undefined ? undefined : span_of(elapsed)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// The time column's width: the widest time any active row or earlier run's lane draws in this frame.
|
|
44
|
+
function time_width(header: BoardHeader): number {
|
|
45
|
+
const rows = run_board_layout.lane_rows(header.layout ?? run_board_layout.EMPTY_LAYOUT, [])
|
|
46
|
+
const times = rows.map((row) => time_of(row, header.now_ms) ?? '')
|
|
47
|
+
|
|
48
|
+
return Math.max(0, ...times.map((time) => time.length))
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const run_board_render_time = {
|
|
52
|
+
time_of,
|
|
53
|
+
time_width,
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export { run_board_render_time }
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { run_board_fit } from './run-board-fit'
|
|
2
|
-
import { run_board_labels } from './run-board-labels'
|
|
3
2
|
import type { BoardRow } from './run-board-layout'
|
|
4
3
|
|
|
5
4
|
// A row's title and the reason it makes room for — pure. A title is cut to the title column; a row
|
|
6
|
-
// that says why it waits keeps
|
|
7
|
-
// runs over
|
|
5
|
+
// that says why it waits, or draws a tail, keeps its line on a narrow pane, its title giving up the
|
|
6
|
+
// columns the line runs over down to a floor and its reason the rest; past the floor it wraps.
|
|
8
7
|
|
|
9
8
|
// The columns a terminal row gives its title: a longer one is cut to an ellipsis.
|
|
10
9
|
const TITLE_LIMIT = 48
|
|
@@ -12,47 +11,141 @@ const TITLE_LIMIT = 48
|
|
|
12
11
|
const TITLE_FLOOR = 8
|
|
13
12
|
const ELLIPSIS = '…'
|
|
14
13
|
|
|
14
|
+
// What a row gives up to stay on one line: the columns its title is cut to, and the columns cut off
|
|
15
|
+
// its reason's end.
|
|
16
|
+
interface RowCut {
|
|
17
|
+
title_limit: number
|
|
18
|
+
reason_cut: number
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const WHOLE: RowCut = { title_limit: TITLE_LIMIT, reason_cut: 0 }
|
|
22
|
+
|
|
15
23
|
// A title cut to the title column, so every time after it starts in one column.
|
|
16
24
|
function title_of(title = '', limit = TITLE_LIMIT): string {
|
|
17
25
|
return title.length > limit ? `${title.slice(0, limit - 1)}${ELLIPSIS}` : title
|
|
18
26
|
}
|
|
19
27
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
28
|
+
const GRAPHEMES = new Intl.Segmenter()
|
|
29
|
+
|
|
30
|
+
// The text cut to `columns` terminal columns — a wide character takes two — ending on an ellipsis.
|
|
31
|
+
function columns_cut(text: string, columns: number): string {
|
|
32
|
+
let kept = ''
|
|
33
|
+
|
|
34
|
+
for (const { segment } of GRAPHEMES.segment(text)) {
|
|
35
|
+
if (run_board_fit.width_of(`${kept}${segment}${ELLIPSIS}`) > columns) break
|
|
36
|
+
kept += segment
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return `${kept}${ELLIPSIS}`
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// The row's reason as it follows the title — what a waiting row waits on there, or why a parked or
|
|
43
|
+
// withdrawn row ended — with `cut` columns given up at its end, which then ends on an ellipsis; at
|
|
44
|
+
// least the ellipsis is left.
|
|
45
|
+
function reason_text(row: BoardRow, cut = 0): string | undefined {
|
|
46
|
+
const text = row.reason?.tail
|
|
23
47
|
|
|
24
|
-
if (
|
|
48
|
+
if (text === undefined || cut === 0) return text
|
|
25
49
|
|
|
26
|
-
return
|
|
50
|
+
return columns_cut(text, Math.max(1, run_board_fit.width_of(text) - cut))
|
|
27
51
|
}
|
|
28
52
|
|
|
29
|
-
// The columns a line runs past the pane, for a row
|
|
30
|
-
//
|
|
31
|
-
function overrun_of(text: string,
|
|
32
|
-
if (columns === undefined ||
|
|
53
|
+
// The columns a line runs past the pane, for a row whose end it keeps; none for any other row, and none
|
|
54
|
+
// for a frame that is not kept within a pane.
|
|
55
|
+
function overrun_of(text: string, is_kept: boolean, columns: number | undefined): number {
|
|
56
|
+
if (columns === undefined || !is_kept) return 0
|
|
33
57
|
|
|
34
58
|
return Math.max(0, run_board_fit.width_of(text) - columns)
|
|
35
59
|
}
|
|
36
60
|
|
|
37
|
-
//
|
|
38
|
-
// title
|
|
39
|
-
|
|
40
|
-
|
|
61
|
+
// How a row is fitted: whether it keeps its whole line — a row that draws a tail, a held check among
|
|
62
|
+
// it (joshuafolkken/kit#4052) — the columns its title cell leads its title with, a ✚ on a row the run
|
|
63
|
+
// filed, its head as drawn, kept on one line where the row's head is too wide to assume it fits — a
|
|
64
|
+
// lane row's, with its cells (joshuafolkken/kit#3769) — and the columns its section's rows give up
|
|
65
|
+
// together, so their titles end in one column.
|
|
66
|
+
interface RowFit {
|
|
67
|
+
is_line_kept?: boolean
|
|
68
|
+
lead?: number
|
|
69
|
+
head?: (cut: RowCut) => string
|
|
70
|
+
is_head_kept?: boolean
|
|
71
|
+
shared?: number | undefined
|
|
41
72
|
}
|
|
42
73
|
|
|
43
|
-
//
|
|
44
|
-
|
|
74
|
+
// The columns a row's head runs past the pane at its whole title; none where it is not kept.
|
|
75
|
+
function head_overrun(fit: RowFit, columns: number | undefined): number {
|
|
76
|
+
if (fit.head === undefined || fit.is_head_kept !== true) return 0
|
|
77
|
+
|
|
78
|
+
return overrun_of(fit.head(WHOLE), true, columns)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// The columns the row's title cell takes as drawn: a waiting row's title is not padded, every other
|
|
82
|
+
// row's is padded to the title column.
|
|
83
|
+
function drawn_width(row: BoardRow, lead: number): number {
|
|
84
|
+
const title = (row.title?.length ?? 0) + lead
|
|
85
|
+
|
|
86
|
+
return row.state === 'waiting' ? Math.min(TITLE_LIMIT, title) : TITLE_LIMIT
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// The row's title once it has given up `overrun` columns, never under the floor.
|
|
90
|
+
function narrowed_limit(row: BoardRow, overrun: number, lead: number): number {
|
|
91
|
+
return Math.max(TITLE_FLOOR, drawn_width(row, lead) - overrun)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// A row's line at a narrowed title with its whole reason, or with the reason's end cut by the columns
|
|
95
|
+
// that line still runs past the pane.
|
|
96
|
+
function reason_fitted(
|
|
97
|
+
row: BoardRow,
|
|
98
|
+
columns: number | undefined,
|
|
99
|
+
title_limit: number,
|
|
100
|
+
draw: (cut: RowCut) => string,
|
|
101
|
+
): string {
|
|
102
|
+
const text = draw({ title_limit, reason_cut: 0 })
|
|
103
|
+
const reason_cut = overrun_of(text, row.reason !== undefined, columns)
|
|
104
|
+
|
|
105
|
+
return reason_cut === 0 ? text : draw({ title_limit, reason_cut })
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// The columns a row's line runs past the pane at its whole title, where the row has a reason or a
|
|
109
|
+
// whole line to keep, or its kept head does.
|
|
110
|
+
function row_overrun(
|
|
111
|
+
row: BoardRow,
|
|
112
|
+
columns: number | undefined,
|
|
113
|
+
draw: (cut: RowCut) => string,
|
|
114
|
+
fit: RowFit = {},
|
|
115
|
+
): number {
|
|
116
|
+
const line = overrun_of(
|
|
117
|
+
draw(WHOLE),
|
|
118
|
+
fit.is_line_kept === true || row.reason !== undefined,
|
|
119
|
+
columns,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
return Math.max(line, head_overrun(fit, columns))
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// A row's line as `draw` draws it: whole, or — where it or its section runs past the pane — with its
|
|
126
|
+
// title narrowed first and its reason cut after.
|
|
45
127
|
function fitted(
|
|
46
128
|
row: BoardRow,
|
|
47
129
|
columns: number | undefined,
|
|
48
|
-
draw: (
|
|
130
|
+
draw: (cut: RowCut) => string,
|
|
131
|
+
fit: RowFit = {},
|
|
49
132
|
): string {
|
|
50
|
-
const
|
|
51
|
-
|
|
133
|
+
const overrun = Math.max(row_overrun(row, columns, draw, fit), fit.shared ?? 0)
|
|
134
|
+
|
|
135
|
+
if (overrun === 0) return draw(WHOLE)
|
|
52
136
|
|
|
53
|
-
return
|
|
137
|
+
return reason_fitted(row, columns, narrowed_limit(row, overrun, fit.lead ?? 0), draw)
|
|
54
138
|
}
|
|
55
139
|
|
|
56
|
-
const run_board_render_title = {
|
|
140
|
+
const run_board_render_title = {
|
|
141
|
+
ELLIPSIS,
|
|
142
|
+
TITLE_LIMIT,
|
|
143
|
+
WHOLE,
|
|
144
|
+
columns_cut,
|
|
145
|
+
fitted,
|
|
146
|
+
reason_text,
|
|
147
|
+
row_overrun,
|
|
148
|
+
title_of,
|
|
149
|
+
}
|
|
57
150
|
|
|
58
|
-
export { run_board_render_title }
|
|
151
|
+
export { run_board_render_title, type RowCut, type RowFit }
|
|
@@ -1,16 +1,74 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { BudgetWait, WaitReason } from '#scripts/gate/core-wait'
|
|
2
|
+
import { run_board_fit } from './run-board-fit'
|
|
3
|
+
import type { BoardHeader } from './run-board-header'
|
|
4
|
+
import { run_board_labels } from './run-board-labels'
|
|
5
|
+
import { run_board_layout, type BoardRow } from './run-board-layout'
|
|
2
6
|
|
|
3
|
-
// The claims waiting in the machine-wide core budget
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
+
// The claims waiting in the machine-wide core budget (joshuafolkken/kit#3943, #4052): a lane held back
|
|
8
|
+
// by memory pressure otherwise reads the same as one that is stuck. A lane's wait is drawn on its own
|
|
9
|
+
// row — 🚧 in place of its phase icon, and why, how long and which check in place of its newest
|
|
10
|
+
// activity — so a wait coming and going moves no line. A wait no running row owns — the main
|
|
11
|
+
// checkout's, another repository's — is one line right before the legend, which gives way with it,
|
|
12
|
+
// so nothing is added under the header.
|
|
7
13
|
|
|
8
|
-
const
|
|
14
|
+
const { HEADER_ICONS, WORDS, minute_span_of, span_of } = run_board_labels
|
|
9
15
|
// 🚧 rather than ⏳, which a waiting row already draws, or 🚦, the gate stage's; an emoji a terminal
|
|
10
16
|
// draws two columns wide.
|
|
11
17
|
const BUDGET_ICON = '🚧'
|
|
12
|
-
const
|
|
18
|
+
const INDENT = ' '
|
|
13
19
|
const MAIN_CHECKOUT = 'main'
|
|
20
|
+
const UNNAMED_CHECK = 'step'
|
|
21
|
+
const RELATED_SUFFIX = ':related'
|
|
22
|
+
// Why a claim waits, as the header draws the gauge it waits on.
|
|
23
|
+
const REASON_ICONS: Readonly<Record<WaitReason, string>> = {
|
|
24
|
+
cores: HEADER_ICONS.cpu,
|
|
25
|
+
cpu: HEADER_ICONS.cpu,
|
|
26
|
+
memory: HEADER_ICONS.memory,
|
|
27
|
+
pressure: HEADER_ICONS.memory,
|
|
28
|
+
}
|
|
29
|
+
const REASON_WORDS: ReadonlyArray<readonly [string, string]> = [
|
|
30
|
+
[HEADER_ICONS.memory, WORDS.memory],
|
|
31
|
+
[HEADER_ICONS.cpu, WORDS.cores],
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
// The check's short name: the command's last word without `:related` (`gate lint` → `lint`).
|
|
35
|
+
function check_of(wait: BudgetWait): string {
|
|
36
|
+
const word = wait.command?.split(' ').at(-1)
|
|
37
|
+
|
|
38
|
+
return word === undefined || word === '' ? UNNAMED_CHECK : word.replace(RELATED_SUFFIX, '')
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// How long, to the minute where the seconds would not fit `room` (`10′05″` → `11′`).
|
|
42
|
+
function held_span(wait: BudgetWait, room: number): string {
|
|
43
|
+
const span = span_of(wait.waited_ms)
|
|
44
|
+
|
|
45
|
+
return run_board_fit.width_of(span) <= room ? span : minute_span_of(wait.waited_ms)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Why and how long, the two filling `width` columns with the time right-aligned (joshuafolkken/kit#4292).
|
|
49
|
+
function held_time(wait: BudgetWait, width: number): string {
|
|
50
|
+
const lead = `${REASON_ICONS[wait.reason]} `
|
|
51
|
+
const room = width - run_board_fit.width_of(lead)
|
|
52
|
+
|
|
53
|
+
return `${lead}${held_span(wait, room).padStart(room)}`
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Why, how long and which check.
|
|
57
|
+
function held_text(wait: BudgetWait): string {
|
|
58
|
+
return `${REASON_ICONS[wait.reason]} ${span_of(wait.waited_ms)} ${check_of(wait)}`
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function is_lane_row(row: BoardRow, wait: BudgetWait): boolean {
|
|
62
|
+
return row.state === 'running' && String(row.number) === wait.lane
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// The longest wait a running row's lane is held in, if any: a row draws one, the others of its lane
|
|
66
|
+
// none.
|
|
67
|
+
function held_of(row: BoardRow, header: BoardHeader): BudgetWait | undefined {
|
|
68
|
+
const waits = (header.budget_waits ?? []).filter((wait) => is_lane_row(row, wait))
|
|
69
|
+
|
|
70
|
+
return waits.toSorted((left, right) => right.waited_ms - left.waited_ms).at(0)
|
|
71
|
+
}
|
|
14
72
|
|
|
15
73
|
function place_text(wait: BudgetWait, link: (reference: string) => string): string {
|
|
16
74
|
if (wait.elsewhere !== undefined) return wait.elsewhere
|
|
@@ -18,24 +76,50 @@ function place_text(wait: BudgetWait, link: (reference: string) => string): stri
|
|
|
18
76
|
return wait.lane === undefined ? MAIN_CHECKOUT : link(wait.lane)
|
|
19
77
|
}
|
|
20
78
|
|
|
21
|
-
function
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const parts = [wait.command ?? 'a step', lane, seconds, core_wait.REASON_TEXT[wait.reason]]
|
|
79
|
+
function rows_of(header: BoardHeader): Array<BoardRow> {
|
|
80
|
+
return header.layout === undefined ? [] : run_board_layout.rows_of(header.layout)
|
|
81
|
+
}
|
|
25
82
|
|
|
26
|
-
|
|
83
|
+
// The waits no running row owns.
|
|
84
|
+
function stray_of(header: BoardHeader): Array<BudgetWait> {
|
|
85
|
+
const rows = rows_of(header)
|
|
86
|
+
|
|
87
|
+
return (header.budget_waits ?? []).filter((wait) => rows.every((row) => !is_lane_row(row, wait)))
|
|
27
88
|
}
|
|
28
89
|
|
|
29
|
-
//
|
|
30
|
-
function
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
90
|
+
// The waits the frame draws: each held row's and every one no row owns.
|
|
91
|
+
function drawn_of(header: BoardHeader): Array<BudgetWait> {
|
|
92
|
+
const held = rows_of(header).flatMap((row) => held_of(row, header) ?? [])
|
|
93
|
+
|
|
94
|
+
return [...held, ...stray_of(header)]
|
|
95
|
+
}
|
|
35
96
|
|
|
36
|
-
|
|
97
|
+
// One line for each wait no running row draws, nothing while none waits.
|
|
98
|
+
function stray_lines(header: BoardHeader): Array<string> {
|
|
99
|
+
return stray_of(header).map(
|
|
100
|
+
(wait) => `${INDENT}${BUDGET_ICON} ${held_text(wait)} ${place_text(wait, header.link)}`,
|
|
101
|
+
)
|
|
37
102
|
}
|
|
38
103
|
|
|
39
|
-
|
|
104
|
+
// 🚧 and the reasons the frame draws, nothing while it draws no wait.
|
|
105
|
+
function legend_of(header: BoardHeader): Array<string> {
|
|
106
|
+
const waits = drawn_of(header)
|
|
107
|
+
|
|
108
|
+
if (waits.length === 0) return []
|
|
109
|
+
|
|
110
|
+
const icons = new Set(waits.map((wait) => REASON_ICONS[wait.reason]))
|
|
111
|
+
const reasons = REASON_WORDS.filter(([icon]) => icons.has(icon))
|
|
112
|
+
|
|
113
|
+
return [`${BUDGET_ICON} ${WORDS.held_check}`, ...reasons.map(([icon, word]) => `${icon} ${word}`)]
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const run_board_render_waits = {
|
|
117
|
+
BUDGET_ICON,
|
|
118
|
+
check_of,
|
|
119
|
+
held_of,
|
|
120
|
+
held_time,
|
|
121
|
+
legend_of,
|
|
122
|
+
stray_lines,
|
|
123
|
+
}
|
|
40
124
|
|
|
41
125
|
export { run_board_render_waits }
|