@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
|
@@ -4,18 +4,18 @@ import { run_board_labels } from './run-board-labels'
|
|
|
4
4
|
|
|
5
5
|
// A live `run:board` frame kept within the terminal. A frame taller than the pane scrolls the
|
|
6
6
|
// alternate screen as it is written, and the header — the lines that say whether the run moves and
|
|
7
|
-
// how far it is — is what scrolls off. So the parts below it give way instead, least wanted first
|
|
8
|
-
// the
|
|
9
|
-
//
|
|
10
|
-
// the
|
|
11
|
-
//
|
|
7
|
+
// how far it is — is what scrolls off. So the parts below it give way instead, least wanted first and
|
|
8
|
+
// in the order the frame draws them from the bottom (joshuafolkken/kit#4099): the footer, the legend,
|
|
9
|
+
// the rows under the notes — the finished, the 🔗 waiting, the not yet started — the notes from the
|
|
10
|
+
// oldest, the reviewers thanked above the legend, the parked rows and, last, the rows waiting on a person's decision
|
|
11
|
+
// and the running rows — what a person keeps the board open to see. Each stage stops once the
|
|
12
|
+
// frame fits, a cut row is counted on the plan's `more N` line — or on its folding section's own last
|
|
13
|
+
// line while that section keeps a row (joshuafolkken/kit#4042) — and the order a row is drawn in
|
|
12
14
|
// never changes. A line wider than the pane wraps, so every line is counted by the rows it takes on
|
|
13
15
|
// screen, not as one.
|
|
14
16
|
|
|
15
17
|
const { WORDS } = run_board_labels
|
|
16
18
|
const INDENT = ' '
|
|
17
|
-
// The newest notes kept until the finished rows are gone; the older ones give way before them.
|
|
18
|
-
const NOTES_KEPT = 3
|
|
19
19
|
|
|
20
20
|
interface TerminalSize {
|
|
21
21
|
rows: number
|
|
@@ -23,7 +23,7 @@ interface TerminalSize {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
// The stage an issue row gives way in, the earlier first.
|
|
26
|
-
type YieldStage = 'finished' | 'pending' | 'parked' | 'running'
|
|
26
|
+
type YieldStage = 'finished' | 'waiting' | 'pending' | 'parked' | 'decision' | 'running'
|
|
27
27
|
|
|
28
28
|
// When a row's stage gives it way: the oldest first, a row with no time before every timed one.
|
|
29
29
|
interface RowYield {
|
|
@@ -37,42 +37,75 @@ interface PlanLine {
|
|
|
37
37
|
row: RowYield | undefined
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
// A
|
|
41
|
-
|
|
40
|
+
// A section a person folds and unfolds with one key on a live board (`run-board-fold.ts`).
|
|
41
|
+
type SectionKey = 'lanes' | 'processes' | 'findings' | 'queued' | 'waiting' | 'done'
|
|
42
|
+
|
|
43
|
+
// What a foldable part's rule is labeled, and whether a person folded it to its heading alone.
|
|
44
|
+
interface Foldable {
|
|
45
|
+
label?: string | undefined
|
|
46
|
+
is_folded?: boolean | undefined
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// A plan section drops its heading once none of its rows is left — unless it folds: then its cut rows
|
|
50
|
+
// are counted on its own last line, drawn by `fold`, rather than on the plan's `more N`. A folded one
|
|
51
|
+
// is its heading alone.
|
|
52
|
+
interface PlanSection extends Foldable {
|
|
42
53
|
head: ReadonlyArray<string>
|
|
43
54
|
lines: ReadonlyArray<PlanLine>
|
|
55
|
+
fold?: ((cut: ReadonlyArray<PlanLine>) => string) | undefined
|
|
56
|
+
key?: SectionKey | undefined
|
|
44
57
|
}
|
|
45
58
|
|
|
46
59
|
// The newest notes shown, and how many older ones are already past the section's limit.
|
|
47
|
-
interface NotesPart {
|
|
60
|
+
interface NotesPart extends Foldable {
|
|
48
61
|
head: ReadonlyArray<string>
|
|
49
62
|
lines: ReadonlyArray<string>
|
|
50
63
|
hidden: number
|
|
51
64
|
}
|
|
52
65
|
|
|
53
|
-
// A
|
|
66
|
+
// A part drawn after `plan` whose lines a group's parts are, `is_detail`, and give way all at once;
|
|
67
|
+
// `summary` is what its folded heading says.
|
|
68
|
+
interface DetailPart extends Foldable {
|
|
69
|
+
head: ReadonlyArray<string>
|
|
70
|
+
lines: ReadonlyArray<{ text: string; is_detail: boolean }>
|
|
71
|
+
summary?: string | undefined
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// A frame in its parts, top to bottom: the header above stays. The plan's sections are drawn around
|
|
75
|
+
// the notes: `plan` above them, `below` under them; `processes` between the plan and the notes.
|
|
54
76
|
interface FrameParts {
|
|
55
77
|
above: ReadonlyArray<string>
|
|
56
78
|
plan: ReadonlyArray<PlanSection>
|
|
79
|
+
processes?: DetailPart | undefined
|
|
57
80
|
notes: NotesPart
|
|
81
|
+
below?: ReadonlyArray<PlanSection> | undefined
|
|
58
82
|
// The reviewers thanked, drawn right above the legend; none where nobody is.
|
|
59
83
|
thanks?: ReadonlyArray<string> | undefined
|
|
60
84
|
legend: ReadonlyArray<string>
|
|
61
85
|
footer: ReadonlyArray<string>
|
|
62
86
|
}
|
|
63
87
|
|
|
64
|
-
// One thing that gives way: a part as a whole, one note (the oldest shown),
|
|
65
|
-
|
|
88
|
+
// One thing that gives way: a part as a whole, the processes' details, one note (the oldest shown),
|
|
89
|
+
// or one issue row.
|
|
90
|
+
type Yielder = 'thanks' | 'footer' | 'legend' | 'details' | 'note' | PlanLine
|
|
66
91
|
|
|
67
92
|
interface Cut {
|
|
68
93
|
thanks: boolean
|
|
69
94
|
footer: boolean
|
|
70
95
|
legend: boolean
|
|
96
|
+
details: boolean
|
|
71
97
|
notes: number
|
|
72
98
|
rows: ReadonlySet<PlanLine>
|
|
73
99
|
}
|
|
74
100
|
|
|
75
|
-
const NO_CUT: Cut = {
|
|
101
|
+
const NO_CUT: Cut = {
|
|
102
|
+
thanks: false,
|
|
103
|
+
footer: false,
|
|
104
|
+
legend: false,
|
|
105
|
+
details: false,
|
|
106
|
+
notes: 0,
|
|
107
|
+
rows: new Set(),
|
|
108
|
+
}
|
|
76
109
|
|
|
77
110
|
// The columns a line takes on screen: its color escapes take none, an emoji two.
|
|
78
111
|
function width_of(line: string): number {
|
|
@@ -92,25 +125,50 @@ function more_lines(hidden: number): Array<string> {
|
|
|
92
125
|
}
|
|
93
126
|
|
|
94
127
|
// A section that ends on an epic whose children were all cut ends on its last row instead.
|
|
95
|
-
function
|
|
128
|
+
function kept_lines(section: PlanSection, cut: ReadonlySet<PlanLine>): Array<string> {
|
|
96
129
|
const kept = section.lines.filter((line) => !cut.has(line))
|
|
97
130
|
const last = kept.findLastIndex((line) => line.row !== undefined)
|
|
98
131
|
|
|
99
|
-
|
|
132
|
+
return kept.slice(0, last + 1).map((line) => line.text)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// A folding section counts its own cut rows while any of its rows is left; with none left it goes,
|
|
136
|
+
// and the plan's `more N` counts them.
|
|
137
|
+
function is_folding(section: PlanSection, cut: ReadonlySet<PlanLine>): boolean {
|
|
138
|
+
return section.fold !== undefined && kept_lines(section, cut).length > 0
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// The fold line a folding section ends on while any of its rows is cut.
|
|
142
|
+
function fold_lines(section: PlanSection, cut: ReadonlySet<PlanLine>): Array<string> {
|
|
143
|
+
const gone = section.lines.filter((line) => cut.has(line))
|
|
144
|
+
|
|
145
|
+
if (!is_folding(section, cut) || gone.length === 0) return []
|
|
146
|
+
|
|
147
|
+
return [section.fold?.(gone) ?? '']
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function section_lines(section: PlanSection, cut: ReadonlySet<PlanLine>): Array<string> {
|
|
151
|
+
if (section.is_folded === true) return [...section.head]
|
|
152
|
+
|
|
153
|
+
const kept = kept_lines(section, cut)
|
|
154
|
+
|
|
155
|
+
if (kept.length === 0) return []
|
|
100
156
|
|
|
101
|
-
return [...section.head, ...kept
|
|
157
|
+
return [...section.head, ...kept, ...fold_lines(section, cut)]
|
|
102
158
|
}
|
|
103
159
|
|
|
104
|
-
// The
|
|
105
|
-
function
|
|
106
|
-
const
|
|
107
|
-
const
|
|
160
|
+
// The cut rows no folding section counts.
|
|
161
|
+
function unfolded(plan: ReadonlyArray<PlanSection>, cut: ReadonlySet<PlanLine>): number {
|
|
162
|
+
const folding = plan.filter((section) => is_folding(section, cut))
|
|
163
|
+
const folded = new Set(folding.flatMap((section) => section.lines))
|
|
108
164
|
|
|
109
|
-
return [...
|
|
165
|
+
return [...cut].filter((line) => !folded.has(line)).length
|
|
110
166
|
}
|
|
111
167
|
|
|
112
168
|
// The notes give way from the oldest shown; with none left the section goes, heading and all.
|
|
113
169
|
function notes_lines(notes: NotesPart, cut: number): Array<string> {
|
|
170
|
+
if (notes.is_folded === true) return [...notes.head]
|
|
171
|
+
|
|
114
172
|
const kept = notes.lines.slice(0, notes.lines.length - cut)
|
|
115
173
|
|
|
116
174
|
if (kept.length === 0) return []
|
|
@@ -118,11 +176,45 @@ function notes_lines(notes: NotesPart, cut: number): Array<string> {
|
|
|
118
176
|
return [...notes.head, ...kept, ...more_lines(notes.hidden + cut)]
|
|
119
177
|
}
|
|
120
178
|
|
|
179
|
+
function sections_lines(
|
|
180
|
+
sections: ReadonlyArray<PlanSection>,
|
|
181
|
+
cut: ReadonlySet<PlanLine>,
|
|
182
|
+
): Array<string> {
|
|
183
|
+
return sections.flatMap((section) => section_lines(section, cut))
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// The processes under their heading, the groups alone once their details are cut.
|
|
187
|
+
function detail_lines(part: DetailPart | undefined, is_cut: boolean): Array<string> {
|
|
188
|
+
if (part === undefined) return []
|
|
189
|
+
|
|
190
|
+
const kept = part.lines.filter((line) => !is_cut || !line.is_detail)
|
|
191
|
+
|
|
192
|
+
return [...part.head, ...kept.map((line) => line.text)]
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// The plan's sections around the notes, its cut rows counted on one line after its last drawn section —
|
|
196
|
+
// under `below` while any of it is drawn, else above the processes and the notes, never under the
|
|
197
|
+
// notes' own `more` — and under a blank when no section is left above it.
|
|
198
|
+
function body_lines(parts: FrameParts, cut: Cut): Array<string> {
|
|
199
|
+
const below = parts.below ?? []
|
|
200
|
+
const [plan, notes, under] = [
|
|
201
|
+
sections_lines(parts.plan, cut.rows),
|
|
202
|
+
[...detail_lines(parts.processes, cut.details), ...notes_lines(parts.notes, cut.notes)],
|
|
203
|
+
sections_lines(below, cut.rows),
|
|
204
|
+
]
|
|
205
|
+
const more = more_lines(unfolded([...parts.plan, ...below], cut.rows))
|
|
206
|
+
|
|
207
|
+
if (under.length > 0) return [...plan, ...notes, ...under, ...more]
|
|
208
|
+
|
|
209
|
+
const lead = plan.length === 0 && more.length > 0 ? [''] : []
|
|
210
|
+
|
|
211
|
+
return [...lead, ...plan, ...more, ...notes]
|
|
212
|
+
}
|
|
213
|
+
|
|
121
214
|
function compose(parts: FrameParts, cut: Cut): Array<string> {
|
|
122
215
|
return [
|
|
123
216
|
...parts.above,
|
|
124
|
-
...
|
|
125
|
-
...notes_lines(parts.notes, cut.notes),
|
|
217
|
+
...body_lines(parts, cut),
|
|
126
218
|
...(cut.thanks ? [] : (parts.thanks ?? [])),
|
|
127
219
|
...(cut.legend ? [] : parts.legend),
|
|
128
220
|
...(cut.footer ? [] : parts.footer),
|
|
@@ -154,25 +246,39 @@ function yielding(rows: ReadonlyArray<Indexed>, stage: YieldStage): Array<PlanLi
|
|
|
154
246
|
.map((entry) => entry.line)
|
|
155
247
|
}
|
|
156
248
|
|
|
157
|
-
//
|
|
158
|
-
|
|
159
|
-
|
|
249
|
+
// The stages in the order their rows give way.
|
|
250
|
+
const STAGES: ReadonlyArray<YieldStage> = [
|
|
251
|
+
'finished',
|
|
252
|
+
'waiting',
|
|
253
|
+
'pending',
|
|
254
|
+
'parked',
|
|
255
|
+
'decision',
|
|
256
|
+
'running',
|
|
257
|
+
]
|
|
258
|
+
|
|
259
|
+
// The issue rows of some sections, in the order they give way.
|
|
260
|
+
function rows_yielding(sections: ReadonlyArray<PlanSection>): Array<PlanLine> {
|
|
261
|
+
const rows = sections
|
|
160
262
|
.flatMap((section) => section.lines)
|
|
161
263
|
.map((line, index) => ({ line, index }))
|
|
162
264
|
.filter((entry) => entry.line.row !== undefined)
|
|
265
|
+
|
|
266
|
+
return STAGES.flatMap((stage) => yielding(rows, stage))
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Everything that gives way, in the order it does: the rows drawn under the notes before them, the
|
|
270
|
+
// processes' details before the notes, the rows above them after the thanks.
|
|
271
|
+
function order_of(parts: FrameParts): Array<Yielder> {
|
|
163
272
|
const notes = parts.notes.lines.map((): Yielder => 'note')
|
|
164
|
-
const surplus = Math.max(0, notes.length - NOTES_KEPT)
|
|
165
273
|
|
|
166
274
|
return [
|
|
167
275
|
'footer',
|
|
168
276
|
'legend',
|
|
169
|
-
...
|
|
170
|
-
|
|
171
|
-
...notes
|
|
277
|
+
...rows_yielding(parts.below ?? []),
|
|
278
|
+
'details',
|
|
279
|
+
...notes,
|
|
172
280
|
'thanks',
|
|
173
|
-
...
|
|
174
|
-
...yielding(rows, 'parked'),
|
|
175
|
-
...yielding(rows, 'running'),
|
|
281
|
+
...rows_yielding(parts.plan),
|
|
176
282
|
]
|
|
177
283
|
}
|
|
178
284
|
|
|
@@ -188,6 +294,7 @@ function cut_of(order: ReadonlyArray<Yielder>, count: number): Cut {
|
|
|
188
294
|
thanks: gone.includes('thanks'),
|
|
189
295
|
footer: gone.includes('footer'),
|
|
190
296
|
legend: gone.includes('legend'),
|
|
297
|
+
details: gone.includes('details'),
|
|
191
298
|
notes: gone.filter((item) => item === 'note').length,
|
|
192
299
|
rows: new Set(gone.filter((item) => is_line(item))),
|
|
193
300
|
}
|
|
@@ -227,4 +334,14 @@ function fit(parts: FrameParts, size: TerminalSize): Array<string> {
|
|
|
227
334
|
const run_board_fit = { fit, height_of, whole, width_of }
|
|
228
335
|
|
|
229
336
|
export { run_board_fit }
|
|
230
|
-
export type {
|
|
337
|
+
export type {
|
|
338
|
+
DetailPart,
|
|
339
|
+
FrameParts,
|
|
340
|
+
NotesPart,
|
|
341
|
+
PlanLine,
|
|
342
|
+
PlanSection,
|
|
343
|
+
RowYield,
|
|
344
|
+
SectionKey,
|
|
345
|
+
TerminalSize,
|
|
346
|
+
YieldStage,
|
|
347
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import {
|
|
2
|
+
run_board_fit,
|
|
3
|
+
type DetailPart,
|
|
4
|
+
type FrameParts,
|
|
5
|
+
type NotesPart,
|
|
6
|
+
type PlanSection,
|
|
7
|
+
type SectionKey,
|
|
8
|
+
type TerminalSize,
|
|
9
|
+
} from './run-board-fit'
|
|
10
|
+
import { run_board_render_section } from './run-board-render-section'
|
|
11
|
+
|
|
12
|
+
// A live `run:board`'s sections folded and unfolded by one key each (joshuafolkken/kit#4172): every
|
|
13
|
+
// section starts unfolded, and what a person folds holds until the board closes — it is never saved.
|
|
14
|
+
// A folded section is its heading alone, led by ▸ and saying what it holds, and the rows it gave up go
|
|
15
|
+
// to the other sections before `run-board-fit.ts` cuts anything; an unfolded one's heading is led by ▾.
|
|
16
|
+
|
|
17
|
+
const { folded_head, open_head } = run_board_render_section
|
|
18
|
+
const SECTION_KEYS: ReadonlyMap<string, SectionKey> = new Map([
|
|
19
|
+
['l', 'lanes'],
|
|
20
|
+
['p', 'processes'],
|
|
21
|
+
['f', 'findings'],
|
|
22
|
+
['q', 'queued'],
|
|
23
|
+
['w', 'waiting'],
|
|
24
|
+
['d', 'done'],
|
|
25
|
+
])
|
|
26
|
+
const ALL_KEY = 'a'
|
|
27
|
+
const SECTIONS: ReadonlyArray<SectionKey> = [...SECTION_KEYS.values()]
|
|
28
|
+
const KEYS_LINE = ` ${[...SECTION_KEYS.keys()].join(' ')}: fold · ${ALL_KEY}: all · Ctrl-C: quit`
|
|
29
|
+
|
|
30
|
+
// The live terminal a frame is kept within, the footer the frame ends on and gives way first, and the
|
|
31
|
+
// sections a person folded; none for a frame that is not redrawn in place, which is drawn as it was.
|
|
32
|
+
interface FrameBounds {
|
|
33
|
+
size?: TerminalSize | undefined
|
|
34
|
+
footer?: ReadonlyArray<string> | undefined
|
|
35
|
+
folded?: ReadonlySet<SectionKey> | undefined
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface Headed {
|
|
39
|
+
head: ReadonlyArray<string>
|
|
40
|
+
is_folded?: boolean | undefined
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function flipped(folded: ReadonlySet<SectionKey>, section: SectionKey): ReadonlySet<SectionKey> {
|
|
44
|
+
const rest = [...folded].filter((key) => key !== section)
|
|
45
|
+
|
|
46
|
+
return new Set(folded.has(section) ? rest : [...rest, section])
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// What a key leaves folded: `a` folds every section, or unfolds them all once every one is folded; a key
|
|
50
|
+
// that names no section leaves it as it was.
|
|
51
|
+
function toggled(folded: ReadonlySet<SectionKey>, key: string): ReadonlySet<SectionKey> {
|
|
52
|
+
if (key === ALL_KEY) return new Set(folded.size === SECTIONS.length ? [] : SECTIONS)
|
|
53
|
+
|
|
54
|
+
const section = SECTION_KEYS.get(key)
|
|
55
|
+
|
|
56
|
+
return section === undefined ? folded : flipped(folded, section)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// A part's heading: ▾ while it is open, its one ▸ line saying `summary` once it is folded.
|
|
60
|
+
function headed<Part extends Headed>(part: Part, label: string, summary: string | undefined): Part {
|
|
61
|
+
if (summary === undefined) return { ...part, head: open_head(part.head, label) }
|
|
62
|
+
|
|
63
|
+
return { ...part, head: folded_head(label, summary), is_folded: true }
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// A folded section counts its rows.
|
|
67
|
+
function fold_section(section: PlanSection, folded: ReadonlySet<SectionKey>): PlanSection {
|
|
68
|
+
const { key, label } = section
|
|
69
|
+
|
|
70
|
+
if (key === undefined || label === undefined) return section
|
|
71
|
+
if (!folded.has(key)) return headed(section, label, undefined)
|
|
72
|
+
|
|
73
|
+
const count = section.lines.filter((line) => line.row !== undefined).length
|
|
74
|
+
|
|
75
|
+
return { ...headed(section, label, String(count)), lines: [] }
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// The findings count every one there is, the ones past the section's limit too; with none there is no
|
|
79
|
+
// section to fold.
|
|
80
|
+
function fold_notes(notes: NotesPart, folded: ReadonlySet<SectionKey>): NotesPart {
|
|
81
|
+
const { label } = notes
|
|
82
|
+
|
|
83
|
+
if (label === undefined || notes.lines.length === 0) return notes
|
|
84
|
+
if (!folded.has('findings')) return headed(notes, label, undefined)
|
|
85
|
+
|
|
86
|
+
const count = String(notes.lines.length + notes.hidden)
|
|
87
|
+
|
|
88
|
+
return { ...headed(notes, label, count), lines: [], hidden: 0 }
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// The processes say each group's totals.
|
|
92
|
+
function fold_processes(
|
|
93
|
+
part: DetailPart | undefined,
|
|
94
|
+
folded: ReadonlySet<SectionKey>,
|
|
95
|
+
): DetailPart | undefined {
|
|
96
|
+
if (part?.label === undefined) return part
|
|
97
|
+
if (!folded.has('processes')) return headed(part, part.label, undefined)
|
|
98
|
+
|
|
99
|
+
return { ...headed(part, part.label, part.summary ?? ''), lines: [] }
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function fold_parts(parts: FrameParts, folded: ReadonlySet<SectionKey>): FrameParts {
|
|
103
|
+
return {
|
|
104
|
+
...parts,
|
|
105
|
+
plan: parts.plan.map((section) => fold_section(section, folded)),
|
|
106
|
+
below: parts.below?.map((section) => fold_section(section, folded)),
|
|
107
|
+
processes: fold_processes(parts.processes, folded),
|
|
108
|
+
notes: fold_notes(parts.notes, folded),
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// A live frame is kept within its terminal, folded as a person folded it; any other is drawn whole.
|
|
113
|
+
function bounded(parts: FrameParts, bounds: FrameBounds): Array<string> {
|
|
114
|
+
const { size, folded } = bounds
|
|
115
|
+
const shown = folded === undefined ? parts : fold_parts(parts, folded)
|
|
116
|
+
|
|
117
|
+
return size === undefined ? run_board_fit.whole(shown) : run_board_fit.fit(shown, size)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const run_board_fold = { KEYS_LINE, bounded, fold_parts, toggled }
|
|
121
|
+
|
|
122
|
+
export { run_board_fold }
|
|
123
|
+
export type { FrameBounds }
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { styleText } from 'node:util'
|
|
2
|
-
import {
|
|
2
|
+
import { MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
3
3
|
|
|
4
4
|
// **The one place a freshly updated part of `run:board` is emphasized** — the header's `💓` and third
|
|
5
5
|
// line, an issue row's phase, start and end (joshuafolkken/kit#3784). The emphasis fades in three
|
|
@@ -17,7 +17,7 @@ interface FreshFrame {
|
|
|
17
17
|
spinner: string | undefined
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
const STAGE_MS =
|
|
20
|
+
const STAGE_MS = MS_PER_SECOND
|
|
21
21
|
const FADING: ReadonlyArray<FreshStage> = ['inverse', 'bold-color', 'bold']
|
|
22
22
|
const FORMATS: Readonly<Record<Exclude<FreshStage, 'none'>, TextFormat>> = {
|
|
23
23
|
inverse: 'inverse',
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { setTimeout as sleep } from 'node:timers/promises'
|
|
2
|
+
import { core_budget } from '#scripts/gate/core-budget'
|
|
3
|
+
import { machine_capacity } from '#scripts/gate/machine-capacity'
|
|
4
|
+
import { lane_process_table } from '#scripts/lane/lane-process-table'
|
|
5
|
+
import type { GatherPorts } from './run-board-gather'
|
|
6
|
+
import { run_board_read } from './run-board-read'
|
|
7
|
+
import { run_board_usage_read } from './run-board-usage-read'
|
|
8
|
+
|
|
9
|
+
// The live reads off this machine, shared by the live board's worker thread
|
|
10
|
+
// (`run-board-gather-worker.ts`) and the single frame that reads where it draws.
|
|
11
|
+
|
|
12
|
+
function ports_of(is_live: boolean): GatherPorts {
|
|
13
|
+
return {
|
|
14
|
+
read_table: lane_process_table.read_table,
|
|
15
|
+
read_local: run_board_read.read_local,
|
|
16
|
+
read_machine: machine_capacity.read_sample,
|
|
17
|
+
read_waits: () => core_budget.budget_waits(),
|
|
18
|
+
read_usage: run_board_usage_read.usage_reader(),
|
|
19
|
+
is_live,
|
|
20
|
+
now: () => Date.now(),
|
|
21
|
+
sleep: async (ms) => {
|
|
22
|
+
await sleep(ms)
|
|
23
|
+
},
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const run_board_gather_live = { ports_of }
|
|
28
|
+
|
|
29
|
+
export { run_board_gather_live }
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { isDeepStrictEqual } from 'node:util'
|
|
2
|
+
import { Worker } from 'node:worker_threads'
|
|
3
|
+
import {
|
|
4
|
+
run_board_gather,
|
|
5
|
+
type Gatherer,
|
|
6
|
+
type GatherPorts,
|
|
7
|
+
type GatherRead,
|
|
8
|
+
type GatherState,
|
|
9
|
+
} from './run-board-gather'
|
|
10
|
+
import type { LocalRead } from './run-board-read'
|
|
11
|
+
|
|
12
|
+
// The live board's side of its worker thread (`run-board-gather-worker.ts`): the worker takes the
|
|
13
|
+
// reads off this machine and hands each round over; a redraw draws the last one it handed, so no read
|
|
14
|
+
// stops the board's spinner. A round that throws is handed over as failed, and the worker reads again
|
|
15
|
+
// next round; a worker that dies is said on the board, and started again on the next redraw — there is
|
|
16
|
+
// no other place the reads are taken.
|
|
17
|
+
|
|
18
|
+
const WORKER_URL = new URL('run-board-gather-worker.ts', import.meta.url)
|
|
19
|
+
const EMPTY_READ = run_board_gather.read_of(run_board_gather.FRESH_GATHER)
|
|
20
|
+
|
|
21
|
+
// The run's read as the worker hands it over. A stream read again unchanged is not handed over — the
|
|
22
|
+
// board keeps its own array, so the folds it keyed on that array are not folded again.
|
|
23
|
+
interface LocalPost {
|
|
24
|
+
value: LocalRead | undefined
|
|
25
|
+
is_same_events?: boolean | undefined
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// One round as the worker hands it over: the run's read only when it was read again, so the board
|
|
29
|
+
// does not copy the whole stream every second.
|
|
30
|
+
interface GatherPost {
|
|
31
|
+
read: Omit<GatherRead, 'local'>
|
|
32
|
+
local?: LocalPost | undefined
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// A round whose reads threw, handed over with why; the worker reads again next round.
|
|
36
|
+
interface FailedPost {
|
|
37
|
+
failed: string
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// The part of a worker the board listens to.
|
|
41
|
+
interface GatherWorker {
|
|
42
|
+
on: (event: 'message' | 'error' | 'exit', listener: (value: unknown) => void) => unknown
|
|
43
|
+
unref: () => void
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
type Spawn = () => GatherWorker
|
|
47
|
+
|
|
48
|
+
interface Thread {
|
|
49
|
+
worker: GatherWorker | undefined
|
|
50
|
+
latest: GatherRead | undefined
|
|
51
|
+
waiting: Array<(read: GatherRead) => void>
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function local_post(before: LocalRead | undefined, after: LocalRead | undefined): LocalPost {
|
|
55
|
+
if (before === undefined || after === undefined) return { value: after }
|
|
56
|
+
if (!isDeepStrictEqual(before.events, after.events)) return { value: after }
|
|
57
|
+
|
|
58
|
+
return { value: { ...after, events: [] }, is_same_events: true }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function post_of(before: GatherState, after: GatherState): GatherPost {
|
|
62
|
+
const { local, ...read } = run_board_gather.read_of(after)
|
|
63
|
+
const is_reread = after.read_ms !== before.read_ms
|
|
64
|
+
|
|
65
|
+
return { read, local: is_reread ? local_post(before.local, local) : undefined }
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function is_post(value: unknown): value is GatherPost {
|
|
69
|
+
return typeof value === 'object' && value !== null && 'read' in value
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// What a failure is said as: the first line of its message.
|
|
73
|
+
function reason_of(error: unknown): string {
|
|
74
|
+
const message = error instanceof Error ? error.message : String(error)
|
|
75
|
+
|
|
76
|
+
return message.split('\n', 1)[0] ?? ''
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function failed_of(error: unknown): FailedPost {
|
|
80
|
+
return { failed: reason_of(error) }
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// One round on the worker: the reads handed over, or why they threw — the state kept for the next.
|
|
84
|
+
async function gather_round(
|
|
85
|
+
state: GatherState,
|
|
86
|
+
ports: GatherPorts,
|
|
87
|
+
post: (value: GatherPost | FailedPost) => void,
|
|
88
|
+
): Promise<GatherState> {
|
|
89
|
+
try {
|
|
90
|
+
const next = await run_board_gather.gather(state, ports, 'background')
|
|
91
|
+
|
|
92
|
+
post(post_of(state, next))
|
|
93
|
+
|
|
94
|
+
return next
|
|
95
|
+
} catch (error) {
|
|
96
|
+
post(failed_of(error))
|
|
97
|
+
|
|
98
|
+
return state
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function is_failed(value: unknown): value is FailedPost {
|
|
103
|
+
return typeof value === 'object' && value !== null && 'failed' in value
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function settle(thread: Thread, read: GatherRead): void {
|
|
107
|
+
thread.latest = read
|
|
108
|
+
|
|
109
|
+
for (const resolve of thread.waiting.splice(0)) resolve(read)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function local_of(thread: Thread, post: LocalPost): LocalRead | undefined {
|
|
113
|
+
const { value, is_same_events } = post
|
|
114
|
+
const kept = thread.latest?.local
|
|
115
|
+
|
|
116
|
+
if (is_same_events !== true || value === undefined || kept === undefined) return value
|
|
117
|
+
|
|
118
|
+
return { ...value, events: kept.events }
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function receive(thread: Thread, post: GatherPost): void {
|
|
122
|
+
const local = post.local === undefined ? thread.latest?.local : local_of(thread, post.local)
|
|
123
|
+
|
|
124
|
+
settle(thread, { ...post.read, local, read_failed_ms: undefined, read_error: undefined })
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// A failed read keeps the last round on screen, said failed and why until the next answers.
|
|
128
|
+
function said_failed(thread: Thread, reason: string, now: () => number): void {
|
|
129
|
+
settle(thread, { ...(thread.latest ?? EMPTY_READ), read_failed_ms: now(), read_error: reason })
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// A worker that threw or exited is started again on the next redraw.
|
|
133
|
+
function fail(thread: Thread, worker: GatherWorker, reason: string, now: () => number): void {
|
|
134
|
+
if (thread.worker !== worker) return
|
|
135
|
+
|
|
136
|
+
thread.worker = undefined
|
|
137
|
+
said_failed(thread, reason, now)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function listen(thread: Thread, worker: GatherWorker, now: () => number): void {
|
|
141
|
+
worker.on('message', (value) => {
|
|
142
|
+
if (is_post(value)) receive(thread, value)
|
|
143
|
+
else if (is_failed(value)) said_failed(thread, value.failed, now)
|
|
144
|
+
})
|
|
145
|
+
worker.on('error', (error) => {
|
|
146
|
+
fail(thread, worker, reason_of(error), now)
|
|
147
|
+
})
|
|
148
|
+
worker.on('exit', (code) => {
|
|
149
|
+
fail(thread, worker, `exit ${String(code)}`, now)
|
|
150
|
+
})
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function start(thread: Thread, spawn: Spawn, now: () => number): GatherWorker {
|
|
154
|
+
const worker = spawn()
|
|
155
|
+
|
|
156
|
+
listen(thread, worker, now)
|
|
157
|
+
// The board's own loop keeps the process; the worker never holds it open past the board.
|
|
158
|
+
worker.unref()
|
|
159
|
+
|
|
160
|
+
return worker
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
async function latest_of(thread: Thread): Promise<GatherRead> {
|
|
164
|
+
if (thread.latest !== undefined) return thread.latest
|
|
165
|
+
|
|
166
|
+
return await new Promise((resolve) => {
|
|
167
|
+
thread.waiting.push(resolve)
|
|
168
|
+
})
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function spawn_worker(): GatherWorker {
|
|
172
|
+
return new Worker(WORKER_URL)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// The first redraw waits for the worker's first round; every later one draws the last round handed.
|
|
176
|
+
function worker_gatherer(spawn: Spawn = spawn_worker, now: () => number = Date.now): Gatherer {
|
|
177
|
+
const thread: Thread = { worker: undefined, latest: undefined, waiting: [] }
|
|
178
|
+
|
|
179
|
+
return async () => {
|
|
180
|
+
thread.worker ??= start(thread, spawn, now)
|
|
181
|
+
|
|
182
|
+
return await latest_of(thread)
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const run_board_gather_thread = { WORKER_URL, gather_round, post_of, worker_gatherer }
|
|
187
|
+
|
|
188
|
+
export { run_board_gather_thread }
|
|
189
|
+
export type { FailedPost, GatherPost, GatherWorker }
|