@joshuafolkken/kit 1.1514.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +5 -5
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +5 -5
- package/.claude/skills/workflow-commands/background-commands.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +10 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +17 -13
- package/.claude/skills/workflow-commands/backlogrun-park.md +14 -23
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +5 -5
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +13 -7
- package/.claude/skills/workflow-commands/delegation.md +6 -5
- package/.claude/skills/workflow-commands/entry-sequence.md +9 -9
- package/.claude/skills/workflow-commands/followup.md +9 -31
- package/.claude/skills/workflow-commands/fullrun-steps.md +36 -45
- package/.claude/skills/workflow-commands/fullrun.md +2 -2
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +16 -12
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +1 -1
- package/.claude/skills/workflow-commands/pre-gate-cut.md +13 -30
- package/.claude/skills/workflow-commands/prerequisite.md +10 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +13 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +120 -10
- package/.github/workflows/publish.yml +8 -1
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +3 -7
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +3 -7
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +79 -37
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-TNUMY6NL.js → chunk-PT5R6UJD.js} +4193 -1900
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-APUO6U4J.js → chunk-WR2KQAYZ.js} +1843 -440
- package/dist/hooks/{chunk-O6GDRNJB.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +5 -6
- package/dist/hooks/inputs.json +443 -317
- package/dist/hooks/pretool-guard.js +7 -25
- package/dist/hooks/session-lang.js +44 -51
- package/dist/hooks/stop-guard.js +7716 -2187
- package/dist/josh.js +6002 -3583
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +3 -1
- package/package.json +10 -48
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -7
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +33 -16
- package/prompts/collaboration-workflow/lane-instructions.md +1 -2
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +4 -6
- package/prompts/collaboration-workflow/output-bounds.md +2 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +5 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +2 -2
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +14 -4
- package/prompts/collaboration-workflow/wip-cap.md +1 -1
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +41 -21
- package/prompts/testing-guide.md +8 -43
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +53 -6
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +30 -7
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/investigation-guard.ts +0 -8
- package/scripts/delegation/investigation-reads.ts +3 -4
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +8 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +80 -98
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +37 -5
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-ledger.ts +32 -4
- package/scripts/gate/gate-plan.ts +41 -34
- package/scripts/gate/gate-report.ts +14 -2
- package/scripts/gate/gate-run-steps.ts +53 -8
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +27 -24
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-write.ts +67 -29
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +2 -2
- package/scripts/git/main-merge.ts +25 -9
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +0 -8
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +30 -3
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +32 -19
- package/scripts/hooks/reserved-run.ts +67 -9
- package/scripts/hooks/run-hook.sh +13 -4
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +2 -21
- package/scripts/hooks/stop-guard.ts +13 -9
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +1 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +0 -9
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +12 -7
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +2 -10
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +15 -43
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +157 -158
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +103 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-logic.ts +6 -13
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +62 -21
- package/scripts/lane/lane-child-invocation.ts +8 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +24 -3
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +92 -123
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-measure-cli.ts +57 -11
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +24 -3
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +19 -5
- package/scripts/lane/lane-session-broker.ts +102 -21
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw.ts +50 -49
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +62 -30
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +2 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +81 -15
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +8 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +80 -2
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +7 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +4 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +9 -1
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +1 -1
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +1 -1
- package/scripts/rules/shell-segments.ts +35 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +3 -4
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +82 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +116 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +151 -27
- package/scripts/run/board/run-board-reason.ts +235 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +207 -265
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +147 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +122 -107
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +6 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +34 -8
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +62 -48
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +33 -9
- package/scripts/run/merge/run-merge-steps.ts +120 -85
- package/scripts/run/merge/run-merge.ts +38 -37
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +63 -140
- package/scripts/run/ship/run-ship-detach.ts +19 -8
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +18 -2
- package/scripts/run/ship/run-ship-overlap.ts +42 -5
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +81 -24
- package/scripts/run/ship/run-ship-preflight.ts +137 -32
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +107 -23
- package/scripts/run/ship/run-ship-review-steps.ts +105 -151
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +43 -6
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +42 -24
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +61 -149
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +97 -10
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +4 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
type FrameParts,
|
|
4
|
-
type NotesPart,
|
|
5
|
-
type PlanLine,
|
|
6
|
-
type PlanSection,
|
|
7
|
-
type TerminalSize,
|
|
8
|
-
} from './run-board-fit'
|
|
1
|
+
import type { FrameParts, PlanLine, PlanSection, TerminalSize, YieldStage } from './run-board-fit'
|
|
2
|
+
import { run_board_fold, type FrameBounds } from './run-board-fold'
|
|
9
3
|
import { run_board_fresh } from './run-board-fresh'
|
|
10
4
|
import { run_board_header, type BoardHeader } from './run-board-header'
|
|
11
5
|
import { run_board_labels } from './run-board-labels'
|
|
@@ -13,50 +7,49 @@ import {
|
|
|
13
7
|
run_board_layout,
|
|
14
8
|
type BoardLayout,
|
|
15
9
|
type BoardRow,
|
|
16
|
-
type
|
|
10
|
+
type QueuedEntry,
|
|
17
11
|
} from './run-board-layout'
|
|
18
12
|
import type { Link } from './run-board-link'
|
|
19
|
-
import type
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
13
|
+
import { run_board_notes, type BoardNote } from './run-board-notes'
|
|
14
|
+
import { run_board_priority } from './run-board-priority'
|
|
15
|
+
import { run_board_render_condition } from './run-board-render-condition'
|
|
16
|
+
import { run_board_render_foot } from './run-board-render-foot'
|
|
17
|
+
import { run_board_render_icon } from './run-board-render-icon'
|
|
18
|
+
import { run_board_render_lanes, type LaneCells } from './run-board-render-lanes'
|
|
19
|
+
import { run_board_render_lead } from './run-board-render-lead'
|
|
22
20
|
import { run_board_render_notes } from './run-board-render-notes'
|
|
23
|
-
import {
|
|
21
|
+
import { run_board_render_processes } from './run-board-render-processes'
|
|
22
|
+
import { run_board_render_section } from './run-board-render-section'
|
|
24
23
|
import { run_board_render_tail } from './run-board-render-tail'
|
|
25
|
-
import {
|
|
26
|
-
import { run_board_render_title } from './run-board-render-title'
|
|
27
|
-
import { run_board_render_waits } from './run-board-render-waits'
|
|
24
|
+
import { run_board_render_time } from './run-board-render-time'
|
|
25
|
+
import { run_board_render_title, type RowCut, type RowFit } from './run-board-render-title'
|
|
28
26
|
import { run_board_row_yield } from './run-board-row-yield'
|
|
29
27
|
import type { Thanks } from './run-board-thanks-csv'
|
|
30
28
|
|
|
31
29
|
// The whole `run:board` screen as lines — pure, so what a person sees is tested apart from the
|
|
32
|
-
// terminal. The header says where the run is; the
|
|
33
|
-
//
|
|
34
|
-
// is a rule rather than a heading, and the legend
|
|
35
|
-
//
|
|
36
|
-
// reads the same on every board.
|
|
37
|
-
|
|
38
|
-
const { FILED_KIND_ICONS, KIND_BLANK,
|
|
39
|
-
|
|
40
|
-
const {
|
|
41
|
-
const { clock_of, elapsed_of } = run_board_labels
|
|
30
|
+
// terminal. The header says where the run is; under it the run's own rows, then the ones waiting on a
|
|
31
|
+
// person's decision, then the findings — what the run would otherwise have said in no chat anyone
|
|
32
|
+
// reads — and the plan's rest in its order. A section is a rule rather than a heading, and the legend
|
|
33
|
+
// at the foot names the symbols, so a row carries only what differs between rows. Every word is
|
|
34
|
+
// English whatever the session language: one set of words reads the same on every board.
|
|
35
|
+
|
|
36
|
+
const { FILED_KIND_ICONS, KIND_BLANK, STATE_ICONS, WAITS_ICON, WORDS, clock_of } = run_board_labels
|
|
37
|
+
const { time_of, time_width } = run_board_render_time
|
|
38
|
+
const { state_icon } = run_board_render_icon
|
|
42
39
|
const { NOTE_LIMIT } = run_board_render_notes
|
|
43
|
-
const {
|
|
44
|
-
const {
|
|
40
|
+
const { lane_cells_of, lanes_section, number_text } = run_board_render_lanes
|
|
41
|
+
const { LANE_INDENT, lead_of: lane_lead_of, running_fresh } = run_board_render_lead
|
|
42
|
+
const { ELLIPSIS, TITLE_LIMIT, WHOLE, fitted, reason_text, row_overrun, title_of } =
|
|
43
|
+
run_board_render_title
|
|
45
44
|
const { padded } = run_board_fresh
|
|
45
|
+
const { condition_of, waits_of } = run_board_render_condition
|
|
46
|
+
const { legend_lines, resume_lines, thanks_part } = run_board_render_foot
|
|
47
|
+
const { ROW_INDENT, done_section, keyed, plan_section } = run_board_render_section
|
|
46
48
|
const GAP = ' '
|
|
47
|
-
const
|
|
48
|
-
const BRANCH =
|
|
49
|
-
const LAST_BRANCH =
|
|
50
|
-
const
|
|
51
|
-
const RULE_LEAD = `${RULE}${RULE}`
|
|
52
|
-
const RULE_WIDTH = 50
|
|
53
|
-
|
|
54
|
-
// The live terminal a frame is kept within, and the footer the frame ends on and gives way first;
|
|
55
|
-
// neither for a frame that is not redrawn in place.
|
|
56
|
-
interface FrameBounds {
|
|
57
|
-
size?: TerminalSize | undefined
|
|
58
|
-
footer?: ReadonlyArray<string> | undefined
|
|
59
|
-
}
|
|
49
|
+
const FILED_LEAD = `${run_board_labels.FILED_RUN_MARK} `
|
|
50
|
+
const BRANCH = `${ROW_INDENT} ├ `
|
|
51
|
+
const LAST_BRANCH = `${ROW_INDENT} └ `
|
|
52
|
+
const { bounded } = run_board_fold
|
|
60
53
|
|
|
61
54
|
interface BoardView extends FrameBounds {
|
|
62
55
|
header: BoardHeader
|
|
@@ -68,18 +61,32 @@ interface BoardView extends FrameBounds {
|
|
|
68
61
|
link?: Link | undefined
|
|
69
62
|
}
|
|
70
63
|
|
|
71
|
-
//
|
|
72
|
-
|
|
73
|
-
|
|
64
|
+
// When the reads off this machine last failed, and why.
|
|
65
|
+
type ReadFailure = Pick<BoardHeader, 'read_error' | 'read_failed_ms'>
|
|
66
|
+
|
|
67
|
+
// What every row of one frame is drawn with: the header, how wide the time column is, so a
|
|
68
|
+
// `2°05′30″` and a `42″` end in the same column, and the lane cells after a row's lead where its
|
|
69
|
+
// section draws them.
|
|
74
70
|
interface RowFrame {
|
|
75
71
|
header: BoardHeader
|
|
76
72
|
time_width: number
|
|
77
|
-
|
|
78
|
-
slot_width: number
|
|
73
|
+
cells?: LaneCells | undefined
|
|
79
74
|
// The columns a row's title is cut to: the title column's, or fewer where a row gives some up.
|
|
80
75
|
title_limit: number
|
|
76
|
+
// The columns cut off the end of a row's reason, where its title alone could not give up enough.
|
|
77
|
+
reason_cut: number
|
|
81
78
|
// The pane's width where the frame is kept within one.
|
|
82
79
|
columns: number | undefined
|
|
80
|
+
// The issues the run filed, whose rows lead their title with ✚.
|
|
81
|
+
filed: ReadonlySet<number>
|
|
82
|
+
// The columns a lane row that draws a tail gives up with every other such row.
|
|
83
|
+
shared?: number | undefined
|
|
84
|
+
// The queued, waiting and done sections draw a condition column after the icon
|
|
85
|
+
// (joshuafolkken/kit#4288, #4292).
|
|
86
|
+
is_conditioned?: boolean | undefined
|
|
87
|
+
// The lanes section draws each row's lead — progress, phase and times — before its cells
|
|
88
|
+
// (`run-board-render-lead.ts`).
|
|
89
|
+
is_lane_row?: boolean | undefined
|
|
83
90
|
}
|
|
84
91
|
|
|
85
92
|
// A row drawn before the plan is read has no title yet, and says so.
|
|
@@ -89,316 +96,241 @@ function row_title(row: BoardRow, header: BoardHeader): string | undefined {
|
|
|
89
96
|
return ELLIPSIS
|
|
90
97
|
}
|
|
91
98
|
|
|
92
|
-
// A
|
|
93
|
-
//
|
|
94
|
-
function
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// How long a row has run: a running one until now, a settled one its whole span.
|
|
99
|
-
function elapsed_ms(row: BoardRow, now_ms: number): number | undefined {
|
|
100
|
-
const started = row.status?.started_ms
|
|
101
|
-
const ended = end_of(row, now_ms)
|
|
102
|
-
|
|
103
|
-
if (started === undefined || ended === undefined) return undefined
|
|
104
|
-
|
|
105
|
-
return ended - started
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
function time_of(row: BoardRow, now_ms: number): string | undefined {
|
|
109
|
-
const elapsed = elapsed_ms(row, now_ms)
|
|
110
|
-
|
|
111
|
-
return elapsed === undefined ? undefined : elapsed_of(elapsed)
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
function waits_of(row: BoardRow, header: BoardHeader): string | undefined {
|
|
115
|
-
if (row.waits.length === 0) return undefined
|
|
99
|
+
// A row the run filed leads its title with ✚ (joshuafolkken/kit#4099), cut by as many columns, so every
|
|
100
|
+
// column after it stays where an unmarked row has it.
|
|
101
|
+
function title_text(row: BoardRow, frame: RowFrame): string {
|
|
102
|
+
const title = row_title(row, frame.header)
|
|
116
103
|
|
|
117
|
-
|
|
118
|
-
}
|
|
104
|
+
if (!frame.filed.has(row.number)) return title_of(title, frame.title_limit)
|
|
119
105
|
|
|
120
|
-
|
|
121
|
-
// start and its phase; a settled row's are long past.
|
|
122
|
-
function running_fresh(
|
|
123
|
-
row: BoardRow,
|
|
124
|
-
text: string,
|
|
125
|
-
at_ms: number | undefined,
|
|
126
|
-
header: BoardHeader,
|
|
127
|
-
): string {
|
|
128
|
-
return row.state === 'running' ? run_board_fresh.since(text, at_ms, header) : text
|
|
106
|
+
return `${FILED_LEAD}${title_of(title, frame.title_limit - FILED_LEAD.length)}`
|
|
129
107
|
}
|
|
130
108
|
|
|
131
109
|
// The title padded to the title column and the time to the time column — blanks where a row has none —
|
|
132
|
-
// so the times form one column, and what follows them starts in one column on every row
|
|
110
|
+
// so the times form one column, and what follows them starts in one column on every row but a waiting
|
|
111
|
+
// one, whose title is not padded. A lane row draws its time in its lead.
|
|
133
112
|
function timed_parts(row: BoardRow, frame: RowFrame): Array<string> {
|
|
113
|
+
const title = title_text(row, frame)
|
|
114
|
+
|
|
115
|
+
if (row.state === 'waiting') return [title]
|
|
116
|
+
if (frame.is_lane_row === true) return [title.padEnd(frame.title_limit)]
|
|
117
|
+
|
|
134
118
|
const time = time_of(row, frame.header.now_ms) ?? ''
|
|
135
|
-
const title = title_of(row_title(row, frame.header), frame.title_limit)
|
|
136
119
|
const fresh = running_fresh(row, time, row.status?.started_ms, frame.header)
|
|
137
120
|
|
|
138
121
|
return [title.padEnd(frame.title_limit), padded(time, frame.time_width, fresh)]
|
|
139
122
|
}
|
|
140
123
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
function state_icon(row: BoardRow): string {
|
|
144
|
-
const current = row.state === 'running' ? row.status?.track?.at(-1) : undefined
|
|
145
|
-
|
|
146
|
-
return current === undefined ? STATE_ICONS[row.state] : PHASE_ICONS[current]
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// A running row turns the spinner in the first column of its indent where the header has one, so its
|
|
150
|
-
// title starts in the same column as every other row's.
|
|
151
|
-
function indent_of(prefix: string, row: BoardRow, header: BoardHeader): string {
|
|
152
|
-
if (row.state !== 'running' || header.spinner === undefined) return prefix
|
|
153
|
-
|
|
154
|
-
return `${header.spinner}${prefix.slice(1)}`
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// A row's usage column as drawn: a settled row's finish time emphasized while it is fresh.
|
|
158
|
-
function slot_text(row: BoardRow, usage: UsageSlot, header: BoardHeader): string | undefined {
|
|
159
|
-
const slot = slot_of(row, usage, header.now_ms)
|
|
160
|
-
const ended = row.state === 'running' ? undefined : row.status?.ended_ms
|
|
161
|
-
|
|
162
|
-
return slot === undefined ? slot : run_board_fresh.since(slot, ended, header)
|
|
124
|
+
function joined(parts: ReadonlyArray<string | undefined>): string {
|
|
125
|
+
return parts.filter((part) => part !== undefined && part !== '').join(GAP)
|
|
163
126
|
}
|
|
164
127
|
|
|
165
|
-
// A row's
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
function cell_text(row: BoardRow, frame: RowFrame): string | undefined {
|
|
169
|
-
const { usage, slot_width } = frame
|
|
128
|
+
// A lane row's lead, else the icon and, in a section that draws one, the condition column after it.
|
|
129
|
+
function icon_text(row: BoardRow, frame: RowFrame): string {
|
|
130
|
+
const { header } = frame
|
|
170
131
|
|
|
171
|
-
if (
|
|
172
|
-
if (row.status === undefined) return ' '.repeat(slot_width)
|
|
132
|
+
if (frame.is_lane_row === true) return lane_lead_of(row, header)
|
|
173
133
|
|
|
174
|
-
|
|
175
|
-
}
|
|
134
|
+
const icon = running_fresh(row, state_icon(row), row.status?.phase_ms, header)
|
|
176
135
|
|
|
177
|
-
|
|
178
|
-
return parts.filter((part) => part !== undefined && part !== '').join(GAP)
|
|
136
|
+
return frame.is_conditioned === true ? `${icon} ${condition_of(row, header)}` : icon
|
|
179
137
|
}
|
|
180
138
|
|
|
181
|
-
// The release kind's
|
|
182
|
-
// ends at its
|
|
183
|
-
|
|
139
|
+
// The priority and the release kind's icons between the number — and its lane cells, where drawn —
|
|
140
|
+
// and the title, one space either side; a row with no title ends at its kind, so what follows keeps
|
|
141
|
+
// its usual gap.
|
|
142
|
+
function lead_of(row: BoardRow, frame: RowFrame, title: string): string {
|
|
143
|
+
const { header } = frame
|
|
184
144
|
const kind = row.kind === undefined ? KIND_BLANK : FILED_KIND_ICONS[row.kind]
|
|
185
|
-
const
|
|
186
|
-
const lead = `${
|
|
145
|
+
const number = number_text(row, frame.cells, header.link)
|
|
146
|
+
const lead = `${icon_text(row, frame)} ${number} ${run_board_priority.cell_of(row)} ${kind}`
|
|
187
147
|
|
|
188
148
|
return title === '' ? lead : `${lead} ${title}`
|
|
189
149
|
}
|
|
190
150
|
|
|
191
|
-
// A row up to its
|
|
151
|
+
// A row up to its tail — the columns that stay where they are on every row. A waiting row has no time
|
|
152
|
+
// to line up, so it ends at its title and what it waits on follows two blanks on.
|
|
192
153
|
function head_text(row: BoardRow, frame: RowFrame): string {
|
|
193
154
|
const [title = '', time] = timed_parts(row, frame)
|
|
155
|
+
const lead = lead_of(row, frame, title)
|
|
156
|
+
|
|
157
|
+
if (row.state === 'waiting') return lead
|
|
194
158
|
|
|
195
|
-
return joined([
|
|
159
|
+
return joined([lead, time])
|
|
196
160
|
}
|
|
197
161
|
|
|
198
|
-
// Every row carries its state's icon,
|
|
162
|
+
// Every row carries its state's icon, or the icon of what it waits on; a running row ends on its tail
|
|
199
163
|
// (`run-board-render-tail.ts`), and a row with nothing after its padded columns ends where its text does.
|
|
200
164
|
function row_text(row: BoardRow, frame: RowFrame): string {
|
|
201
165
|
const { header } = frame
|
|
202
166
|
const tail = run_board_render_tail.tail_of(row, header)
|
|
203
|
-
const notes = [waits_of(row, header), reason_text(row,
|
|
167
|
+
const notes = [waits_of(row, header, frame.is_conditioned), reason_text(row, frame.reason_cut)]
|
|
204
168
|
|
|
205
169
|
return joined([head_text(row, frame), ...tail, ...notes]).trimEnd()
|
|
206
170
|
}
|
|
207
171
|
|
|
172
|
+
// A row drawn whole or cut, after its indent.
|
|
173
|
+
function row_draw(indent: string, row: BoardRow, frame: RowFrame): (cut: RowCut) => string {
|
|
174
|
+
return (cut) => `${indent}${row_text(row, { ...frame, ...cut })}`
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// A row drawn with lane cells keeps its head on one line, its title giving up their columns where the
|
|
178
|
+
// pane is narrow. A row that draws a tail keeps its whole line, giving up the columns its section's
|
|
179
|
+
// rows give up together (joshuafolkken/kit#4226).
|
|
180
|
+
function row_fit(indent: string, row: BoardRow, frame: RowFrame): RowFit {
|
|
181
|
+
const is_line_kept = run_board_render_tail.tail_of(row, frame.header).length > 0
|
|
182
|
+
|
|
183
|
+
return {
|
|
184
|
+
is_line_kept,
|
|
185
|
+
lead: frame.filed.has(row.number) ? FILED_LEAD.length : 0,
|
|
186
|
+
head: (cut) => `${indent}${head_text(row, { ...frame, ...cut })}`,
|
|
187
|
+
is_head_kept: frame.cells !== undefined,
|
|
188
|
+
shared: is_line_kept ? frame.shared : undefined,
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
208
192
|
// A plan line that draws one issue row, and one that draws none — a blank, a rule, an epic's own line.
|
|
209
|
-
function row_line(
|
|
210
|
-
const
|
|
211
|
-
const text = fitted(
|
|
212
|
-
row,
|
|
213
|
-
frame.columns,
|
|
214
|
-
(title_limit) => `${indent}${row_text(row, { ...frame, title_limit })}`,
|
|
215
|
-
)
|
|
193
|
+
function row_line(indent: string, row: BoardRow, frame: RowFrame, stage?: YieldStage): PlanLine {
|
|
194
|
+
const fit = row_fit(indent, row, frame)
|
|
195
|
+
const text = fitted(row, frame.columns, row_draw(indent, row, frame), fit)
|
|
216
196
|
|
|
217
|
-
return { text, row: run_board_row_yield.yield_of(row) }
|
|
197
|
+
return { text, row: run_board_row_yield.yield_of(row, stage) }
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// The most columns a lane row that draws a tail runs past the pane, which every such row gives up, so
|
|
201
|
+
// their titles end in one column and the tails after them start in one.
|
|
202
|
+
function shared_overrun(rows: ReadonlyArray<BoardRow>, frame: RowFrame): number {
|
|
203
|
+
const overruns = rows.map((row) => {
|
|
204
|
+
const fit = row_fit(LANE_INDENT, row, frame)
|
|
205
|
+
|
|
206
|
+
return fit.is_line_kept === true
|
|
207
|
+
? row_overrun(row, frame.columns, row_draw(LANE_INDENT, row, frame), fit)
|
|
208
|
+
: 0
|
|
209
|
+
})
|
|
210
|
+
|
|
211
|
+
return Math.max(0, ...overruns)
|
|
218
212
|
}
|
|
219
213
|
|
|
220
214
|
function bare(text: string): PlanLine {
|
|
221
215
|
return { text, row: undefined }
|
|
222
216
|
}
|
|
223
217
|
|
|
224
|
-
|
|
218
|
+
// A running child turns the spinner in the first column of its branch where the header has one, so its
|
|
219
|
+
// tree says which child is moving.
|
|
220
|
+
function branch_of(prefix: string, row: BoardRow, header: BoardHeader): string {
|
|
221
|
+
if (row.state !== 'running' || header.spinner === undefined) return prefix
|
|
222
|
+
|
|
223
|
+
return `${header.spinner}${prefix.slice(1)}`
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function epic_lines(
|
|
227
|
+
entry: Extract<QueuedEntry, { kind: 'epic' }>,
|
|
228
|
+
frame: RowFrame,
|
|
229
|
+
): Array<PlanLine> {
|
|
225
230
|
const last = entry.rows.length - 1
|
|
226
231
|
const children = entry.rows.map((row, index) =>
|
|
227
|
-
row_line(index === last ? LAST_BRANCH : BRANCH, row, frame),
|
|
232
|
+
row_line(branch_of(index === last ? LAST_BRANCH : BRANCH, row, frame.header), row, frame),
|
|
228
233
|
)
|
|
229
234
|
const title = title_of(entry.title)
|
|
230
235
|
const number = frame.header.link(String(entry.epic))
|
|
231
236
|
const epic = title === '' ? number : `${number}${GAP}${title}`
|
|
232
237
|
|
|
233
|
-
return [bare(`${
|
|
238
|
+
return [bare(`${ROW_INDENT}📁 ${epic}`), ...children]
|
|
234
239
|
}
|
|
235
240
|
|
|
236
|
-
function entry_lines(entry:
|
|
237
|
-
if (entry.kind === 'row') return [row_line(
|
|
241
|
+
function entry_lines(entry: QueuedEntry, frame: RowFrame): Array<PlanLine> {
|
|
242
|
+
if (entry.kind === 'row') return [row_line(ROW_INDENT, entry.row, frame)]
|
|
238
243
|
|
|
239
244
|
return epic_lines(entry, frame)
|
|
240
245
|
}
|
|
241
246
|
|
|
242
|
-
function rule_of(label: string): string {
|
|
243
|
-
return `${RULE_LEAD} ${label} `.padEnd(RULE_WIDTH, RULE)
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
function heading_lines(heading: string | undefined): Array<string> {
|
|
247
|
-
return heading === undefined ? [''] : ['', rule_of(heading)]
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
function plan_section(
|
|
251
|
-
heading: string | undefined,
|
|
252
|
-
lines: ReadonlyArray<PlanLine>,
|
|
253
|
-
): Array<PlanSection> {
|
|
254
|
-
if (lines.length === 0) return []
|
|
255
|
-
|
|
256
|
-
return [{ head: heading_lines(heading), lines }]
|
|
257
|
-
}
|
|
258
|
-
|
|
259
247
|
function rows_section(
|
|
260
248
|
heading: string | undefined,
|
|
261
249
|
rows: ReadonlyArray<BoardRow>,
|
|
262
250
|
frame: RowFrame,
|
|
251
|
+
stage?: YieldStage,
|
|
263
252
|
): Array<PlanSection> {
|
|
264
253
|
return plan_section(
|
|
265
254
|
heading,
|
|
266
|
-
rows.map((row) => row_line(
|
|
267
|
-
)
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
// The time column's width: the widest time any active row draws in this frame.
|
|
271
|
-
function time_width(header: BoardHeader): number {
|
|
272
|
-
const times = (header.layout?.active ?? []).map((row) => time_of(row, header.now_ms) ?? '')
|
|
273
|
-
|
|
274
|
-
return Math.max(0, ...times.map((time) => time.length))
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
// Whether every row's usage column still fits one terminal line — measured as the deepest, an epic's
|
|
278
|
-
// child — where a frame is kept within a terminal. The tail and the notes after it are left out: a
|
|
279
|
-
// row's reason makes room for itself, so one long reason would otherwise take the column off every row.
|
|
280
|
-
function is_usage_fitting(
|
|
281
|
-
rows: ReadonlyArray<BoardRow>,
|
|
282
|
-
frame: RowFrame,
|
|
283
|
-
size: TerminalSize | undefined,
|
|
284
|
-
): boolean {
|
|
285
|
-
if (size === undefined) return true
|
|
286
|
-
|
|
287
|
-
return rows.every(
|
|
288
|
-
(row) => run_board_fit.height_of(`${BRANCH}${head_text(row, frame)}`, size.columns) === 1,
|
|
255
|
+
rows.map((row) => row_line(ROW_INDENT, row, frame, stage)),
|
|
289
256
|
)
|
|
290
257
|
}
|
|
291
258
|
|
|
292
|
-
// The usage column is drawn on every row or on none: a pane too narrow for it on any row draws it on
|
|
293
|
-
// none — a finish time with it.
|
|
294
259
|
function frame_of(
|
|
295
260
|
header: BoardHeader,
|
|
296
|
-
|
|
261
|
+
notes: ReadonlyArray<BoardNote>,
|
|
297
262
|
size: TerminalSize | undefined,
|
|
298
263
|
): RowFrame {
|
|
299
|
-
|
|
300
|
-
const usage = header.usages === undefined ? undefined : usage_slot(rows, header.usages)
|
|
301
|
-
const frame = {
|
|
264
|
+
return {
|
|
302
265
|
header,
|
|
303
266
|
time_width: time_width(header),
|
|
304
|
-
|
|
305
|
-
slot_width: usage === undefined ? 0 : column_width(rows, usage, header.now_ms),
|
|
306
|
-
title_limit: TITLE_LIMIT,
|
|
267
|
+
...WHOLE,
|
|
307
268
|
columns: size?.columns,
|
|
269
|
+
filed: run_board_notes.filed_numbers(notes),
|
|
308
270
|
}
|
|
309
|
-
|
|
310
|
-
return is_usage_fitting(rows, frame, size) ? frame : { ...frame, usage: undefined }
|
|
311
271
|
}
|
|
312
272
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
const waves = layout.waves.flatMap((wave, index) =>
|
|
320
|
-
plan_section(
|
|
321
|
-
String(index + 1),
|
|
322
|
-
wave.flatMap((entry) => entry_lines(entry, frame)),
|
|
323
|
-
),
|
|
273
|
+
// The rows not yet started under one heading, in the order they are offered: a running batch starts
|
|
274
|
+
// each once a lane and its paths are free, never wave by wave (joshuafolkken/kit#4137).
|
|
275
|
+
function queued_section(layout: BoardLayout, frame: RowFrame): Array<PlanSection> {
|
|
276
|
+
return plan_section(
|
|
277
|
+
`${STATE_ICONS.waiting} ${WORDS.queued}`,
|
|
278
|
+
layout.queued.flatMap((entry) => entry_lines(entry, { ...frame, is_conditioned: true })),
|
|
324
279
|
)
|
|
325
|
-
|
|
326
|
-
return [
|
|
327
|
-
...rows_section(undefined, layout.active, frame),
|
|
328
|
-
...waves,
|
|
329
|
-
...rows_section(STATE_ICONS.human, layout.people, frame),
|
|
330
|
-
...rows_section(WAITS_ICON, layout.unreached, frame),
|
|
331
|
-
]
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
// The findings under a rule, led by 📌 where a legend names it and by its word where none does, and how
|
|
335
|
-
// many more there are, so the section never pushes the plan off the screen.
|
|
336
|
-
function notes_part(notes: ReadonlyArray<BoardNote>, header: BoardHeader): NotesPart {
|
|
337
|
-
const has_legend = header.layout !== undefined
|
|
338
|
-
const lines = run_board_render_notes.note_lines(notes, has_legend, header.link)
|
|
339
|
-
const label = has_legend ? NOTES_ICON : WORDS.notes
|
|
340
|
-
|
|
341
|
-
return { head: heading_lines(label), lines, hidden: notes.length - lines.length }
|
|
342
280
|
}
|
|
343
281
|
|
|
344
|
-
// The
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
const
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
const checks = is_checks ? run_board_render_checks.LEGEND : []
|
|
282
|
+
// The rows above the findings: the run's own, the earlier run's lanes still holding a place, then the
|
|
283
|
+
// ones waiting on a person's decision — a child parked on one and an untouched plan row alike
|
|
284
|
+
// (joshuafolkken/kit#4099).
|
|
285
|
+
function active_sections(layout: BoardLayout, frame: RowFrame): Array<PlanSection> {
|
|
286
|
+
const people = run_board_layout.people_of(layout)
|
|
287
|
+
const lead = run_board_layout.lanes_drawn(layout)
|
|
288
|
+
const decision = `${STATE_ICONS.human} ${WORDS.decision}`
|
|
289
|
+
const cells = lane_cells_of(frame.header, lead)
|
|
290
|
+
const lane_frame = { ...frame, cells, is_lane_row: true }
|
|
291
|
+
const shared = shared_overrun(lead, lane_frame)
|
|
292
|
+
const lanes = lanes_section(
|
|
293
|
+
lead.map((row) => row_line(LANE_INDENT, row, { ...lane_frame, shared })),
|
|
294
|
+
cells,
|
|
295
|
+
)
|
|
359
296
|
|
|
360
|
-
return [...
|
|
297
|
+
return [...lanes, ...rows_section(decision, people, frame)]
|
|
361
298
|
}
|
|
362
299
|
|
|
363
|
-
//
|
|
364
|
-
function
|
|
300
|
+
// The plan's rest under the findings, the 🔗 waiting rows giving way before them.
|
|
301
|
+
function plan_parts(
|
|
302
|
+
header: BoardHeader,
|
|
303
|
+
notes: ReadonlyArray<BoardNote>,
|
|
304
|
+
size: TerminalSize | undefined,
|
|
305
|
+
): Pick<FrameParts, 'below' | 'plan'> {
|
|
365
306
|
const { layout } = header
|
|
366
307
|
|
|
367
|
-
if (layout === undefined) return []
|
|
368
|
-
|
|
369
|
-
const rows = run_board_layout.rows_of(layout)
|
|
370
|
-
const drawn = new Set(rows.map((row) => state_icon(row)))
|
|
371
|
-
const named = activity_named(header, rows)
|
|
308
|
+
if (layout === undefined) return { plan: [] }
|
|
372
309
|
|
|
373
|
-
|
|
374
|
-
}
|
|
310
|
+
const frame = frame_of(header, notes, size)
|
|
311
|
+
const conditioned = { ...frame, is_conditioned: true }
|
|
312
|
+
const done = layout.active.filter((row) => run_board_layout.is_finished(row.state))
|
|
313
|
+
const waiting = `${WAITS_ICON} ${WORDS.waiting}`
|
|
375
314
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
function bounded(parts: FrameParts, bounds: FrameBounds): Array<string> {
|
|
385
|
-
const { size } = bounds
|
|
386
|
-
|
|
387
|
-
return size === undefined ? run_board_fit.whole(parts) : run_board_fit.fit(parts, size)
|
|
315
|
+
return {
|
|
316
|
+
plan: active_sections(layout, frame),
|
|
317
|
+
below: [
|
|
318
|
+
...keyed('queued', queued_section(layout, frame)),
|
|
319
|
+
...keyed('waiting', rows_section(waiting, layout.unreached, conditioned, 'waiting')),
|
|
320
|
+
...done_section(done, (row) => row_line(ROW_INDENT, row, conditioned)),
|
|
321
|
+
],
|
|
322
|
+
}
|
|
388
323
|
}
|
|
389
324
|
|
|
390
325
|
function render(view: BoardView): Array<string> {
|
|
391
326
|
const { header, notes } = view
|
|
392
|
-
const above = [
|
|
393
|
-
...run_board_header.header_lines(header),
|
|
394
|
-
...run_board_render_waits.wait_lines(header.budget_waits, header.link),
|
|
395
|
-
...resume_lines(view.resume),
|
|
396
|
-
]
|
|
327
|
+
const above = [...run_board_header.header_lines(header), ...resume_lines(view.resume)]
|
|
397
328
|
const parts = {
|
|
398
329
|
above,
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
330
|
+
...plan_parts(header, notes, view.size),
|
|
331
|
+
processes: run_board_render_processes.processes_part(header),
|
|
332
|
+
notes: run_board_render_notes.notes_part(notes, { ...header, columns: view.size?.columns }),
|
|
333
|
+
thanks: thanks_part(view.thanks, view.link, view.size?.columns),
|
|
402
334
|
legend: legend_lines(header, notes),
|
|
403
335
|
footer: view.footer ?? [],
|
|
404
336
|
}
|
|
@@ -406,8 +338,18 @@ function render(view: BoardView): Array<string> {
|
|
|
406
338
|
return bounded(parts, view)
|
|
407
339
|
}
|
|
408
340
|
|
|
409
|
-
|
|
410
|
-
|
|
341
|
+
// No run read here — or the reads failed, which the line says, and why, in place of `no run`: a read
|
|
342
|
+
// that failed cannot tell whether a run is there.
|
|
343
|
+
function render_no_run(
|
|
344
|
+
now_ms: number,
|
|
345
|
+
bounds: FrameBounds = {},
|
|
346
|
+
failure: ReadFailure = {},
|
|
347
|
+
): Array<string> {
|
|
348
|
+
const { read_failed_ms, read_error } = failure
|
|
349
|
+
const warning = run_board_header.warning_of(WORDS.read, read_failed_ms, read_error)
|
|
350
|
+
const said = warning === undefined ? WORDS.no_run : undefined
|
|
351
|
+
const parts = ['■ backlogrun', said, clock_of(now_ms), warning]
|
|
352
|
+
const above = [parts.filter((part) => part !== undefined).join(GAP)]
|
|
411
353
|
const notes = { head: [], lines: [], hidden: 0 }
|
|
412
354
|
|
|
413
355
|
return bounded({ above, plan: [], notes, legend: [], footer: bounds.footer ?? [] }, bounds)
|
|
@@ -421,4 +363,4 @@ const run_board_render = {
|
|
|
421
363
|
}
|
|
422
364
|
|
|
423
365
|
export { run_board_render }
|
|
424
|
-
export type { BoardView
|
|
366
|
+
export type { BoardView }
|