@joshuafolkken/kit 1.1471.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,19 +1,62 @@
|
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
2
|
+
import { run_board_fit, type NotesPart } from './run-board-fit'
|
|
1
3
|
import { run_board_kind } from './run-board-kind'
|
|
2
4
|
import { run_board_labels, type Words } from './run-board-labels'
|
|
5
|
+
import { run_board_layout, type BoardLayout, type BoardRow } from './run-board-layout'
|
|
3
6
|
import type { BoardNote } from './run-board-notes'
|
|
7
|
+
import { run_board_render_section } from './run-board-render-section'
|
|
8
|
+
import { run_board_render_title } from './run-board-render-title'
|
|
4
9
|
|
|
5
|
-
// The findings section
|
|
6
|
-
// A finding is read to the minute, and the legend names only the kinds the section
|
|
7
|
-
// legend's rule — so a section of filed Issues alone is not explained with 💬 and 💤.
|
|
10
|
+
// The findings section of `run:board`, under the 🙋 decision rows, and the part of the legend that
|
|
11
|
+
// names its symbols. A finding is read to the minute, and the legend names only the kinds the section
|
|
12
|
+
// draws — the rows' legend's rule — so a section of filed Issues alone is not explained with 💬 and 💤.
|
|
8
13
|
|
|
9
|
-
const { FILED_KIND_ICONS, KIND_WORDS, NOTES_ICON, NOTE_ICONS,
|
|
10
|
-
run_board_labels
|
|
14
|
+
const { FILED_KIND_ICONS, KIND_WORDS, NOTES_ICON, NOTE_ICONS, WORDS, minute_of } = run_board_labels
|
|
11
15
|
const NOTE_LIMIT = 6
|
|
16
|
+
const { ROW_INDENT } = run_board_render_section
|
|
17
|
+
const { columns_cut } = run_board_render_title
|
|
18
|
+
const { width_of } = run_board_fit
|
|
12
19
|
const GAP = ' '
|
|
13
|
-
const INDENT = ' '
|
|
14
20
|
const NUMBER_PLACEHOLDER = '{n}'
|
|
21
|
+
// An `owner/repo#N` reference written out in a text.
|
|
22
|
+
const QUALIFIED_REFERENCE = /(?<![\w./-])(?<repo>[\w.-]+\/[\w.-]+)#(?<number>\d+)/gu
|
|
23
|
+
// The order a full section keeps its lines in, the line a person has to act on first
|
|
24
|
+
// (joshuafolkken/kit#4097).
|
|
25
|
+
const RANK_ORDER = ['park', 'filed', 'note'] as const
|
|
15
26
|
|
|
16
27
|
type Link = (reference: string) => string
|
|
28
|
+
type Rank = (typeof RANK_ORDER)[number]
|
|
29
|
+
|
|
30
|
+
// The plan the section is drawn under — none before it is read, where no legend is drawn either —, the
|
|
31
|
+
// link its numbers go through, the repository the plan was read for and the pane's width where the
|
|
32
|
+
// frame is kept within one.
|
|
33
|
+
interface NotesView {
|
|
34
|
+
layout: BoardLayout | undefined
|
|
35
|
+
link: Link
|
|
36
|
+
repo?: string | undefined
|
|
37
|
+
columns?: number | undefined
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
interface NotesBody {
|
|
41
|
+
lines: Array<string>
|
|
42
|
+
hidden: number
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// One line the section can draw, with what it is kept by and the icon it leads with.
|
|
46
|
+
interface NoteItem {
|
|
47
|
+
rank: number
|
|
48
|
+
at_ms: number
|
|
49
|
+
line: string
|
|
50
|
+
icon: string
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
interface ItemsView {
|
|
54
|
+
listed: ReadonlySet<number>
|
|
55
|
+
has_legend: boolean
|
|
56
|
+
link: Link
|
|
57
|
+
repo: string | undefined
|
|
58
|
+
columns?: number | undefined
|
|
59
|
+
}
|
|
17
60
|
|
|
18
61
|
// The icons the legend can name, in its order, each with its word — a filed kind's the rows' own
|
|
19
62
|
// (joshuafolkken/kit#3577), so one icon is never named with two words.
|
|
@@ -25,8 +68,6 @@ const NOTE_LEGEND: ReadonlyArray<readonly [string, keyof Words]> = [
|
|
|
25
68
|
]
|
|
26
69
|
|
|
27
70
|
function note_icon(note: BoardNote): string {
|
|
28
|
-
if (note.is_decision) return STATE_ICONS.human
|
|
29
|
-
|
|
30
71
|
return note.filed_kind === undefined ? NOTE_ICONS[note.kind] : FILED_KIND_ICONS[note.filed_kind]
|
|
31
72
|
}
|
|
32
73
|
|
|
@@ -36,42 +77,128 @@ function found_of(note: BoardNote, link: Link): string {
|
|
|
36
77
|
return WORDS.found_during.split(NUMBER_PLACEHOLDER).join(link(note.found_during))
|
|
37
78
|
}
|
|
38
79
|
|
|
80
|
+
// A reference to the board's own repository is drawn as `#N`; another repository's keeps its name.
|
|
81
|
+
function unqualified(text: string, repo: string | undefined): string {
|
|
82
|
+
if (repo === undefined) return text
|
|
83
|
+
|
|
84
|
+
return text.replaceAll(QUALIFIED_REFERENCE, (whole, named: string, number: string) =>
|
|
85
|
+
named === repo ? issue_cite.plain(number) : whole,
|
|
86
|
+
)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function body_of(note: BoardNote, view: ItemsView): string {
|
|
90
|
+
return unqualified(note.text, view.repo)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function same(reference: string): string {
|
|
94
|
+
return reference
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// A line wider than the pane keeps its head whole and ends its text on an ellipsis at the pane's edge
|
|
98
|
+
// (joshuafolkken/kit#4384); the cut text's reference is left unlinked, so no hyperlink escape is cut
|
|
99
|
+
// in two.
|
|
100
|
+
function fitted_line(head: string, note: BoardNote, view: ItemsView): string {
|
|
101
|
+
const { columns } = view
|
|
102
|
+
const line = `${head}${body_of(note, view)}${found_of(note, view.link)}`
|
|
103
|
+
|
|
104
|
+
if (columns === undefined || width_of(line) <= columns) return line
|
|
105
|
+
|
|
106
|
+
const text = `${body_of(note, view)}${found_of(note, same)}`
|
|
107
|
+
|
|
108
|
+
return `${head}${columns_cut(text, Math.max(1, columns - width_of(head)))}`
|
|
109
|
+
}
|
|
110
|
+
|
|
39
111
|
// Where the legend names the symbols a note leads with its icon alone; where no legend is drawn it
|
|
40
|
-
// keeps the kind's word.
|
|
41
|
-
function note_text(note: BoardNote,
|
|
112
|
+
// keeps the kind's word. Its icon stands in the plan rows' icon column.
|
|
113
|
+
function note_text(note: BoardNote, view: ItemsView): string {
|
|
114
|
+
const { has_legend, link } = view
|
|
42
115
|
const kind = has_legend ? undefined : WORDS[note.kind]
|
|
43
116
|
const issue = note.issue === undefined ? undefined : link(note.issue)
|
|
44
117
|
const lead = [note_icon(note), minute_of(note.at_ms), issue, kind]
|
|
45
118
|
.filter((part) => part !== undefined)
|
|
46
119
|
.join(' ')
|
|
47
120
|
|
|
48
|
-
return `${
|
|
121
|
+
return fitted_line(`${ROW_INDENT}${lead}${GAP}`, note, view)
|
|
49
122
|
}
|
|
50
123
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
124
|
+
function rank_index(rank: Rank): number {
|
|
125
|
+
return RANK_ORDER.indexOf(rank)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function note_item(note: BoardNote, view: ItemsView): NoteItem {
|
|
129
|
+
return {
|
|
130
|
+
rank: rank_index(note.kind),
|
|
131
|
+
at_ms: note.at_ms,
|
|
132
|
+
line: note_text(note, view),
|
|
133
|
+
icon: note_icon(note),
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// A filed Issue the plan draws a row for (`listed`, the rows' numbers) would name its title twice, so
|
|
138
|
+
// its row leads the title with ✚ instead (joshuafolkken/kit#4099).
|
|
139
|
+
function is_listed(note: BoardNote, listed: ReadonlySet<number>): boolean {
|
|
140
|
+
return note.kind === 'filed' && listed.has(Number(note.issue))
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function listed_of(rows: ReadonlyArray<BoardRow>): Set<number> {
|
|
144
|
+
return new Set(rows.map((row) => row.number))
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function rest_of(notes: ReadonlyArray<BoardNote>, listed: ReadonlySet<number>): Array<BoardNote> {
|
|
148
|
+
return notes.filter((note) => !is_listed(note, listed))
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function by_rank(left: NoteItem, right: NoteItem): number {
|
|
152
|
+
return left.rank - right.rank || right.at_ms - left.at_ms
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Every line the section can draw, in the order it keeps them: by rank, then newest first.
|
|
156
|
+
function items_of(notes: ReadonlyArray<BoardNote>, view: ItemsView): Array<NoteItem> {
|
|
157
|
+
return rest_of(notes, view.listed)
|
|
158
|
+
.map((note) => note_item(note, view))
|
|
159
|
+
.toSorted(by_rank)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// The first few by rank, so the section never pushes the plan off the screen, and how many more there
|
|
163
|
+
// are; the frame counts the rest together with any it cuts to fit, from the bottom, so the lowest rank
|
|
164
|
+
// gives way first. Their numbers go through the board's
|
|
165
|
+
// `header.link`, so they open their GitHub issue as the plan's rows do.
|
|
166
|
+
function note_lines(notes: ReadonlyArray<BoardNote>, view: NotesView): NotesBody {
|
|
167
|
+
const { layout, link, repo, columns } = view
|
|
168
|
+
const has_legend = layout !== undefined
|
|
169
|
+
const listed = listed_of(has_legend ? run_board_layout.rows_of(layout) : [])
|
|
170
|
+
const items = items_of(notes, { listed, has_legend, link, repo, columns })
|
|
171
|
+
const lines = items.slice(0, NOTE_LIMIT).map((item) => item.line)
|
|
172
|
+
|
|
173
|
+
return { lines, hidden: items.length - lines.length }
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// The findings under a rule, led by 📌 where a legend names it and by its word where none does, and how
|
|
177
|
+
// many more there are, so the section never pushes the plan off the screen.
|
|
178
|
+
function notes_part(notes: ReadonlyArray<BoardNote>, view: NotesView): NotesPart {
|
|
179
|
+
const body = note_lines(notes, view)
|
|
180
|
+
const label = view.layout === undefined ? WORDS.notes : `${NOTES_ICON} ${WORDS.notes}`
|
|
181
|
+
|
|
182
|
+
return { head: run_board_render_section.heading_lines(label), label, ...body }
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Each kind a drawn line leads with — one the rows' legend already names (`named`) is not named twice.
|
|
186
|
+
// 📌 is left to the section's own `📌 findings` heading.
|
|
187
|
+
function notes_legend(
|
|
55
188
|
notes: ReadonlyArray<BoardNote>,
|
|
56
|
-
|
|
57
|
-
|
|
189
|
+
named: ReadonlySet<string>,
|
|
190
|
+
rows: ReadonlyArray<BoardRow>,
|
|
58
191
|
): Array<string> {
|
|
59
|
-
|
|
60
|
-
|
|
192
|
+
const view = { listed: listed_of(rows), has_legend: true, link: same, repo: undefined }
|
|
193
|
+
const shown = items_of(notes, view).slice(0, NOTE_LIMIT)
|
|
61
194
|
|
|
62
|
-
|
|
63
|
-
// one the rows' legend already names (`named`) is not named twice.
|
|
64
|
-
function notes_legend(notes: ReadonlyArray<BoardNote>, named: ReadonlySet<string>): Array<string> {
|
|
65
|
-
if (notes.length === 0) return []
|
|
195
|
+
const drawn = new Set(shown.map((item) => item.icon))
|
|
66
196
|
|
|
67
|
-
|
|
68
|
-
const kinds = NOTE_LEGEND.filter(([icon]) => drawn.has(icon) && !named.has(icon)).map(
|
|
197
|
+
return NOTE_LEGEND.filter(([icon]) => drawn.has(icon) && !named.has(icon)).map(
|
|
69
198
|
([icon, word]) => `${icon} ${WORDS[word]}`,
|
|
70
199
|
)
|
|
71
|
-
|
|
72
|
-
return [`${NOTES_ICON} ${WORDS.notes}`, ...kinds]
|
|
73
200
|
}
|
|
74
201
|
|
|
75
|
-
const run_board_render_notes = { NOTE_LIMIT,
|
|
202
|
+
const run_board_render_notes = { NOTE_LIMIT, notes_legend, notes_part }
|
|
76
203
|
|
|
77
|
-
export { run_board_render_notes }
|
|
204
|
+
export { run_board_render_notes, type NotesView }
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { run_board_fit, type DetailPart } from './run-board-fit'
|
|
2
|
+
import type { BoardHeader, BoardUsage } from './run-board-header'
|
|
3
|
+
import type { NamedFigure, ProcessGroups } from './run-board-process-groups'
|
|
4
|
+
import { run_board_render_lanes } from './run-board-render-lanes'
|
|
5
|
+
import { run_board_render_lead } from './run-board-render-lead'
|
|
6
|
+
import { run_board_render_section } from './run-board-render-section'
|
|
7
|
+
import { run_board_render_title } from './run-board-render-title'
|
|
8
|
+
import type { UsageFigure, UsageScale } from './run-board-usage'
|
|
9
|
+
import { run_board_usage_text } from './run-board-usage-text'
|
|
10
|
+
|
|
11
|
+
// What is loading the machine, by who started it: the backlogrun's own processes — its supervisor, the
|
|
12
|
+
// parent session and the lanes — the apps outside it, and whatever a run left behind. On a terminal
|
|
13
|
+
// one row each with gauges under a rule whose labels stand over them, the parts of each group indented
|
|
14
|
+
// under it so a short pane can drop them first; anywhere else one line of figures. The cells start
|
|
15
|
+
// at `USAGE_START`, as the lane rows' do, whatever the names (joshuafolkken/kit#4292): a part's name is
|
|
16
|
+
// cut to fit before them.
|
|
17
|
+
|
|
18
|
+
const { LANES_LABEL, column_cells, label_columns } = run_board_render_lanes
|
|
19
|
+
const { USAGE_START } = run_board_render_lead
|
|
20
|
+
const { columns_rule, heading_lines } = run_board_render_section
|
|
21
|
+
const { title_of } = run_board_render_title
|
|
22
|
+
const { plain_of } = run_board_usage_text
|
|
23
|
+
const GAUGE = 5
|
|
24
|
+
const CELL_GAP = ' '
|
|
25
|
+
const DETAIL = ' '
|
|
26
|
+
const PLAIN_INDENT = ' '
|
|
27
|
+
// Two levels under the section's rule, whose icon stands in the second column.
|
|
28
|
+
const INDENT = `${PLAIN_INDENT}${DETAIL}`
|
|
29
|
+
// The columns a row's label is padded to, so its cells start at `USAGE_START`.
|
|
30
|
+
const LABEL_WIDTH = USAGE_START - INDENT.length - CELL_GAP.length
|
|
31
|
+
// A part's name with its count, in the label's columns after the part's own indent.
|
|
32
|
+
const DETAIL_ROOM = LABEL_WIDTH - DETAIL.length
|
|
33
|
+
// A part's name on the one-line form, which has no column to fit.
|
|
34
|
+
const PLAIN_LIMIT = 24
|
|
35
|
+
// Icons Unicode draws as emoji by default, which `string-width` counts two columns wide as a terminal
|
|
36
|
+
// draws them: 🖥 and 🎛, text symbols drawn as emoji, overlapped the blank after them.
|
|
37
|
+
const LABEL = '💻 processes'
|
|
38
|
+
const PART_GAP = ' · '
|
|
39
|
+
const SUMMARY_GAP = ' ── '
|
|
40
|
+
const ICONS = { backlogrun: '▶', apps: '🌐', leftover: '👻' }
|
|
41
|
+
const LABELS = {
|
|
42
|
+
backlogrun: `${ICONS.backlogrun} backlogrun`,
|
|
43
|
+
supervisor: '🧭 supervisor',
|
|
44
|
+
parent: '🎬 parent',
|
|
45
|
+
lanes: LANES_LABEL,
|
|
46
|
+
apps: `${ICONS.apps} apps`,
|
|
47
|
+
leftover: `${ICONS.leftover} leftover`,
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
interface Labeled {
|
|
51
|
+
label: string
|
|
52
|
+
figure: UsageFigure
|
|
53
|
+
is_detail: boolean
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function count_of(instances: number): string {
|
|
57
|
+
return instances > 1 ? ` ×${String(instances)}` : ''
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// A part's name, cut so it and its count fit `room` columns.
|
|
61
|
+
function named(entry: NamedFigure, room = DETAIL_ROOM): Labeled {
|
|
62
|
+
const count = count_of(entry.instances)
|
|
63
|
+
const label = `${title_of(entry.name, room - count.length)}${count}`
|
|
64
|
+
|
|
65
|
+
return { label, figure: entry.figure, is_detail: true }
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// A group's line and its parts' lines, the parts only where it has any.
|
|
69
|
+
function group_of(
|
|
70
|
+
label: string,
|
|
71
|
+
figure: UsageFigure,
|
|
72
|
+
parts: ReadonlyArray<Labeled>,
|
|
73
|
+
): Array<Labeled> {
|
|
74
|
+
return [{ label, figure, is_detail: false }, ...parts]
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function named_group(
|
|
78
|
+
label: string,
|
|
79
|
+
figure: UsageFigure,
|
|
80
|
+
entries: ReadonlyArray<NamedFigure>,
|
|
81
|
+
): Array<Labeled> {
|
|
82
|
+
return group_of(
|
|
83
|
+
label,
|
|
84
|
+
figure,
|
|
85
|
+
entries.map((entry) => named(entry)),
|
|
86
|
+
)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function backlogrun_group(backlogrun: ProcessGroups['backlogrun']): Array<Labeled> {
|
|
90
|
+
const lanes = `${LABELS.lanes}${count_of(backlogrun.lanes.count)}`
|
|
91
|
+
const own = [
|
|
92
|
+
{ label: LABELS.supervisor, figure: backlogrun.supervisor, is_detail: true },
|
|
93
|
+
{ label: LABELS.parent, figure: backlogrun.parent, is_detail: true },
|
|
94
|
+
{ label: lanes, figure: backlogrun.lanes.figure, is_detail: true },
|
|
95
|
+
]
|
|
96
|
+
|
|
97
|
+
return group_of(LABELS.backlogrun, backlogrun.total, own)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// The leftover group is drawn only where a run left something behind.
|
|
101
|
+
function labeled_of(usage: BoardUsage): Array<Labeled> {
|
|
102
|
+
const { backlogrun, apps, leftover } = usage.processes
|
|
103
|
+
const left =
|
|
104
|
+
leftover.entries.length === 0
|
|
105
|
+
? []
|
|
106
|
+
: named_group(LABELS.leftover, leftover.total, leftover.entries)
|
|
107
|
+
|
|
108
|
+
return [
|
|
109
|
+
...backlogrun_group(backlogrun),
|
|
110
|
+
...named_group(LABELS.apps, apps.total, apps.top),
|
|
111
|
+
...left,
|
|
112
|
+
]
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function label_text(entry: Labeled): string {
|
|
116
|
+
return entry.is_detail ? `${DETAIL}${entry.label}` : entry.label
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function padded(text: string, width: number): string {
|
|
120
|
+
return `${text}${' '.repeat(Math.max(0, width - run_board_fit.width_of(text)))}`
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function screen_part(usage: BoardUsage): DetailPart {
|
|
124
|
+
const lines = labeled_of(usage).map((entry) => {
|
|
125
|
+
const cells = column_cells(entry.figure, usage.scale, GAUGE)
|
|
126
|
+
|
|
127
|
+
return {
|
|
128
|
+
text: `${INDENT}${padded(label_text(entry), LABEL_WIDTH)}${CELL_GAP}${cells}`,
|
|
129
|
+
is_detail: entry.is_detail,
|
|
130
|
+
}
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
return { head: ['', columns_rule(LABEL, label_columns(USAGE_START, GAUGE))], lines }
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function plain_group(
|
|
137
|
+
scale: UsageScale,
|
|
138
|
+
label: string,
|
|
139
|
+
figure: UsageFigure,
|
|
140
|
+
parts: ReadonlyArray<NamedFigure>,
|
|
141
|
+
): string {
|
|
142
|
+
const group = `${label} ${plain_of(figure, scale)}`
|
|
143
|
+
const named_parts = parts.map(
|
|
144
|
+
(part) => `${named(part, PLAIN_LIMIT).label} ${plain_of(part.figure, scale)}`,
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
return named_parts.length === 0 ? group : `${group}: ${named_parts.join(', ')}`
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// The groups on one line: `▶ backlogrun 44.5%/4.0G/3.3G · 🌐 apps 28.2%/18.8G/12.4G: Chrome …`.
|
|
151
|
+
function plain_part(usage: BoardUsage): DetailPart {
|
|
152
|
+
const { processes, scale } = usage
|
|
153
|
+
const { backlogrun, apps, leftover } = processes
|
|
154
|
+
const groups = [
|
|
155
|
+
plain_group(scale, LABELS.backlogrun, backlogrun.total, []),
|
|
156
|
+
plain_group(scale, LABELS.apps, apps.total, apps.top),
|
|
157
|
+
]
|
|
158
|
+
const left =
|
|
159
|
+
leftover.entries.length === 0
|
|
160
|
+
? []
|
|
161
|
+
: [plain_group(scale, LABELS.leftover, leftover.total, leftover.entries)]
|
|
162
|
+
const text = `${PLAIN_INDENT}${[...groups, ...left].join(PART_GAP)}`
|
|
163
|
+
|
|
164
|
+
return { head: heading_lines(LABEL), lines: [{ text, is_detail: false }] }
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// What the folded section says: each group's totals behind its icon,
|
|
168
|
+
// `▶ 44.5%/4.0G/3.3G ── 🌐 28.2%/18.8G/12.4G`, the leftover only where a run left any.
|
|
169
|
+
function summary_of(usage: BoardUsage): string {
|
|
170
|
+
const { processes, scale } = usage
|
|
171
|
+
const { backlogrun, apps, leftover } = processes
|
|
172
|
+
const left =
|
|
173
|
+
leftover.entries.length === 0 ? [] : [`${ICONS.leftover} ${plain_of(leftover.total, scale)}`]
|
|
174
|
+
const groups = [
|
|
175
|
+
`${ICONS.backlogrun} ${plain_of(backlogrun.total, scale)}`,
|
|
176
|
+
`${ICONS.apps} ${plain_of(apps.total, scale)}`,
|
|
177
|
+
...left,
|
|
178
|
+
]
|
|
179
|
+
|
|
180
|
+
return groups.join(SUMMARY_GAP)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// `undefined` where the frame read no usage.
|
|
184
|
+
function processes_part(header: BoardHeader): DetailPart | undefined {
|
|
185
|
+
const { usages } = header
|
|
186
|
+
|
|
187
|
+
if (usages === undefined) return undefined
|
|
188
|
+
|
|
189
|
+
const part = header.spinner === undefined ? plain_part(usages) : screen_part(usages)
|
|
190
|
+
|
|
191
|
+
return { ...part, label: LABEL, summary: summary_of(usages) }
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const run_board_render_processes = { processes_part }
|
|
195
|
+
|
|
196
|
+
export { run_board_render_processes }
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { run_board_fit, type PlanLine, type PlanSection, type SectionKey } from './run-board-fit'
|
|
2
|
+
import { run_board_labels } from './run-board-labels'
|
|
3
|
+
import type { BoardRow } from './run-board-layout'
|
|
4
|
+
|
|
5
|
+
// A plan section as drawn: a rule rather than a heading, and the done section that folds its oldest
|
|
6
|
+
// rows into one count when the pane is short.
|
|
7
|
+
|
|
8
|
+
const { STATE_ICONS, WORDS } = run_board_labels
|
|
9
|
+
const GAP = ' '
|
|
10
|
+
// A row's indent under a rule whose icon stands in the second column, so the row's icon stands clear of
|
|
11
|
+
// it (joshuafolkken/kit#4292); a lane row leads with its progress column two columns further left.
|
|
12
|
+
const ROW_INDENT = `${GAP}${GAP}`
|
|
13
|
+
const RULE = '─'
|
|
14
|
+
const RULE_LEAD = `${RULE}${RULE}`
|
|
15
|
+
const RULE_WIDTH = 50
|
|
16
|
+
const OPEN_MARK = '▾'
|
|
17
|
+
const FOLDED_MARK = '▸'
|
|
18
|
+
|
|
19
|
+
function rule_of(label: string): string {
|
|
20
|
+
return `${RULE_LEAD} ${label} `.padEnd(RULE_WIDTH, RULE)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// A column's label and the terminal column its cells start at.
|
|
24
|
+
interface RuleColumn {
|
|
25
|
+
label: string
|
|
26
|
+
start: number
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// A rule whose column labels stand over their cells: `── 🧵 lanes ── 💪 CPU ─ 🧠 MEM ───`, each label at
|
|
30
|
+
// its column's start where the rule before it leaves room, and one rule character after the label
|
|
31
|
+
// before it where it does not.
|
|
32
|
+
function columns_rule(label: string, columns: ReadonlyArray<RuleColumn>): string {
|
|
33
|
+
let rule = `${RULE_LEAD} ${label} `
|
|
34
|
+
|
|
35
|
+
for (const column of columns) {
|
|
36
|
+
const fill = Math.max(1, column.start - run_board_fit.width_of(rule) - 1)
|
|
37
|
+
|
|
38
|
+
rule += `${RULE.repeat(fill)} ${column.label} `
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return `${rule}${RULE.repeat(Math.max(RULE_LEAD.length, RULE_WIDTH - run_board_fit.width_of(rule)))}`
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function heading_lines(heading: string | undefined): Array<string> {
|
|
45
|
+
return heading === undefined ? [''] : ['', rule_of(heading)]
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function plan_section(
|
|
49
|
+
heading: string | undefined,
|
|
50
|
+
lines: ReadonlyArray<PlanLine>,
|
|
51
|
+
): Array<PlanSection> {
|
|
52
|
+
if (lines.length === 0) return []
|
|
53
|
+
|
|
54
|
+
return [{ head: heading_lines(heading), lines, label: heading }]
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// The sections a person folds with the key named `key`.
|
|
58
|
+
function keyed(key: SectionKey, sections: ReadonlyArray<PlanSection>): Array<PlanSection> {
|
|
59
|
+
return sections.map((section) => ({ ...section, key }))
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// An unfolded section's rule led by ▾ in place of its first rule characters, so every column label after
|
|
63
|
+
// its own still stands over its cells; a section drawn under a blank line alone gets a rule of its own.
|
|
64
|
+
function open_head(head: ReadonlyArray<string>, label: string): Array<string> {
|
|
65
|
+
const rule = head.at(-1) ?? ''
|
|
66
|
+
const lead = `${RULE_LEAD} ${label} `
|
|
67
|
+
|
|
68
|
+
if (!rule.startsWith(lead)) return ['', `${OPEN_MARK} ${label} `.padEnd(RULE_WIDTH, RULE)]
|
|
69
|
+
|
|
70
|
+
return [...head.slice(0, -1), `${OPEN_MARK} ${label} ${RULE}${rule.slice(lead.length)}`]
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// A folded section's one line: `▸ ⏳ queued ── 3 ───`, ending on a rule however long its summary.
|
|
74
|
+
function folded_head(label: string, summary: string): Array<string> {
|
|
75
|
+
return [
|
|
76
|
+
'',
|
|
77
|
+
`${FOLDED_MARK} ${label} ${RULE_LEAD} ${summary} ${RULE_LEAD}`.padEnd(RULE_WIDTH, RULE),
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// The finished rows' cut ones counted on one line, the withdrawn among them beside it.
|
|
82
|
+
function done_fold(withdrawn: ReadonlySet<PlanLine>): (cut: ReadonlyArray<PlanLine>) => string {
|
|
83
|
+
return (cut) => {
|
|
84
|
+
const gone = cut.filter((line) => withdrawn.has(line)).length
|
|
85
|
+
const count = `${STATE_ICONS.merged} ${String(cut.length)} ${WORDS.more}`
|
|
86
|
+
const marks = gone === 0 ? [] : [`${STATE_ICONS.withdrawn} ${String(gone)}`]
|
|
87
|
+
|
|
88
|
+
return `${ROW_INDENT}${[count, ...marks].join(GAP)}`
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// The finished rows under their own rule, each drawn by `line_of`, folded from the oldest.
|
|
93
|
+
function done_section(
|
|
94
|
+
rows: ReadonlyArray<BoardRow>,
|
|
95
|
+
line_of: (row: BoardRow) => PlanLine,
|
|
96
|
+
): Array<PlanSection> {
|
|
97
|
+
const lines = rows.map((row) => line_of(row))
|
|
98
|
+
const withdrawn = new Set(lines.filter((_, index) => rows[index]?.state === 'withdrawn'))
|
|
99
|
+
const heading = `${STATE_ICONS.merged} ${WORDS.done}`
|
|
100
|
+
|
|
101
|
+
return keyed('done', plan_section(heading, lines)).map((section) => ({
|
|
102
|
+
...section,
|
|
103
|
+
fold: done_fold(withdrawn),
|
|
104
|
+
}))
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const run_board_render_section = {
|
|
108
|
+
ROW_INDENT,
|
|
109
|
+
columns_rule,
|
|
110
|
+
done_section,
|
|
111
|
+
folded_head,
|
|
112
|
+
heading_lines,
|
|
113
|
+
keyed,
|
|
114
|
+
open_head,
|
|
115
|
+
plan_section,
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export { run_board_render_section }
|
|
119
|
+
export type { RuleColumn }
|
|
@@ -1,42 +1,10 @@
|
|
|
1
1
|
import { run_board_fit } from './run-board-fit'
|
|
2
|
-
import type { BoardRow } from './run-board-layout'
|
|
3
|
-
import type { ItemState } from './run-board-status'
|
|
4
|
-
import type { LaneUsages } from './run-board-usage'
|
|
5
|
-
import { run_board_usage_text } from './run-board-usage-text'
|
|
6
2
|
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// blanks on any other row.
|
|
3
|
+
// A column's cell padded to one width on every line it is drawn on, so what follows it starts in one
|
|
4
|
+
// column.
|
|
10
5
|
|
|
11
|
-
const { finish_of, text_of } = run_board_usage_text
|
|
12
|
-
const FINISHED: ReadonlySet<ItemState> = new Set(['merged', 'done'])
|
|
13
6
|
const BLANK = ' '
|
|
14
7
|
|
|
15
|
-
// What one frame's column is drawn from: each lane's usage, and the running rows the frame draws —
|
|
16
|
-
// counted once a frame, the count a lane's share of the machine is divided by.
|
|
17
|
-
interface UsageSlot {
|
|
18
|
-
usages: LaneUsages
|
|
19
|
-
running: number
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function usage_slot(rows: ReadonlyArray<BoardRow>, usages: LaneUsages): UsageSlot {
|
|
23
|
-
return { usages, running: rows.filter((row) => row.state === 'running').length }
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function slot_of(row: BoardRow, slot: UsageSlot, now_ms: number): string | undefined {
|
|
27
|
-
if (row.state === 'running') return text_of(slot.usages.get(row.number), slot.running)
|
|
28
|
-
if (FINISHED.has(row.state)) return finish_of(row.status?.ended_ms, now_ms)
|
|
29
|
-
|
|
30
|
-
return undefined
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// The widest any row of the frame draws, as the terminal counts it — an emoji takes two columns.
|
|
34
|
-
function column_width(rows: ReadonlyArray<BoardRow>, slot: UsageSlot, now_ms: number): number {
|
|
35
|
-
const widths = rows.map((row) => run_board_fit.width_of(slot_of(row, slot, now_ms) ?? ''))
|
|
36
|
-
|
|
37
|
-
return Math.max(0, ...widths)
|
|
38
|
-
}
|
|
39
|
-
|
|
40
8
|
// A row's column padded with blanks to the frame's width.
|
|
41
9
|
function cell_of(text: string | undefined, width: number): string {
|
|
42
10
|
const drawn = text ?? ''
|
|
@@ -44,7 +12,6 @@ function cell_of(text: string | undefined, width: number): string {
|
|
|
44
12
|
return `${drawn}${BLANK.repeat(Math.max(0, width - run_board_fit.width_of(drawn)))}`
|
|
45
13
|
}
|
|
46
14
|
|
|
47
|
-
const run_board_render_slot = { cell_of
|
|
15
|
+
const run_board_render_slot = { cell_of }
|
|
48
16
|
|
|
49
17
|
export { run_board_render_slot }
|
|
50
|
-
export type { UsageSlot }
|