@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
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
|
|
3
|
+
// The name an app is drawn under on `run:board`'s 💻 processes section, computed from its command.
|
|
4
|
+
// `run-board-process-groups.ts` remembers each command's answer, so a redraw names only the processes
|
|
5
|
+
// new since the last one (joshuafolkken/kit#4263).
|
|
6
|
+
|
|
7
|
+
const APP_SUFFIX = '.app'
|
|
8
|
+
const COMMAND_SEPARATOR = ' '
|
|
9
|
+
|
|
10
|
+
// An app's name: the outermost `.app` bundle its executable sits in, else its command's own name.
|
|
11
|
+
function app_of(command: string): string {
|
|
12
|
+
const bundle = command.split(path.sep).find((part) => part.endsWith(APP_SUFFIX))
|
|
13
|
+
|
|
14
|
+
if (bundle !== undefined) return bundle.slice(0, -APP_SUFFIX.length)
|
|
15
|
+
|
|
16
|
+
const executable = command.startsWith(path.sep) ? command : command.split(COMMAND_SEPARATOR)[0]
|
|
17
|
+
|
|
18
|
+
return path.basename(executable ?? command)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const run_board_app_name = { app_of }
|
|
22
|
+
|
|
23
|
+
export { run_board_app_name }
|
|
@@ -1,24 +1,25 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
1
|
import { setTimeout as sleep } from 'node:timers/promises'
|
|
3
|
-
import { fileURLToPath } from 'node:url'
|
|
4
2
|
import { styleText } from 'node:util'
|
|
5
|
-
import {
|
|
6
|
-
import { machine_capacity } from '#scripts/gate/machine-capacity'
|
|
3
|
+
import { MS_PER_MINUTE } from '#scripts/lib/timeouts'
|
|
7
4
|
import { telegram_notify } from '#scripts/notify/telegram-notify'
|
|
8
5
|
import { run_progress } from '#scripts/run/progress/run-progress'
|
|
9
6
|
import { run_progress_read } from '#scripts/run/progress/run-progress-read'
|
|
10
7
|
import terminalLink from 'terminal-link'
|
|
11
8
|
import { run_board_closed } from './run-board-closed'
|
|
12
9
|
import { run_board_every } from './run-board-every'
|
|
10
|
+
import { run_board_fold } from './run-board-fold'
|
|
11
|
+
import { run_board_gather } from './run-board-gather'
|
|
12
|
+
import { run_board_gather_live } from './run-board-gather-live'
|
|
13
|
+
import { run_board_gather_thread } from './run-board-gather-thread'
|
|
14
|
+
import { run_board_keys, type KeyReading } from './run-board-keys'
|
|
13
15
|
import { run_board_labels } from './run-board-labels'
|
|
14
|
-
import {
|
|
15
|
-
import { run_board_read } from './run-board-read'
|
|
16
|
+
import { run_board_plan_shared } from './run-board-plan-shared'
|
|
16
17
|
import { run_board_screen, type Screen } from './run-board-screen'
|
|
18
|
+
import { run_board_snapshot } from './run-board-snapshot'
|
|
17
19
|
import { run_board_spin } from './run-board-spin'
|
|
18
20
|
import type { BoardPorts } from './run-board-state'
|
|
19
21
|
import { run_board_thanks_read } from './run-board-thanks-read'
|
|
20
22
|
import { run_board_tick } from './run-board-tick'
|
|
21
|
-
import { run_board_usage_read } from './run-board-usage-read'
|
|
22
23
|
|
|
23
24
|
// `josh run:board` — a full-screen board of the running `backlogrun`, redrawn once a second, its
|
|
24
25
|
// spinners turned between redraws, for a person to keep open beside the run. What one redraw reads,
|
|
@@ -26,7 +27,6 @@ import { run_board_usage_read } from './run-board-usage-read'
|
|
|
26
27
|
// terminal around it. A run that ended stays on screen until the next one starts; with no run in this
|
|
27
28
|
// checkout it reads nothing from GitHub and waits.
|
|
28
29
|
|
|
29
|
-
const ARGV_OFFSET = 2
|
|
30
30
|
const SUCCESS_EXIT_CODE = 0
|
|
31
31
|
const FAILURE_EXIT_CODE = 1
|
|
32
32
|
const ONCE_FLAG = '--once'
|
|
@@ -48,13 +48,10 @@ function on_exit(leave: () => void): void {
|
|
|
48
48
|
process.once('SIGTERM', () => process.exit(SIGTERM_EXIT_CODE))
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
const LIVE_PORTS: BoardPorts = {
|
|
52
|
-
read_plan: async (scope) => await
|
|
53
|
-
read_local: run_board_read.read_local,
|
|
54
|
-
read_machine: machine_capacity.read_sample,
|
|
55
|
-
read_waits: () => core_budget.budget_waits(),
|
|
56
|
-
read_usage: run_board_usage_read.usage_reader(),
|
|
51
|
+
const LIVE_PORTS: Omit<BoardPorts, 'gather'> = {
|
|
52
|
+
read_plan: async (scope) => await run_board_plan_shared.read(scope),
|
|
57
53
|
read_closed: async (issues) => await run_board_closed.read_all(issues),
|
|
54
|
+
snapshot: run_board_snapshot.file_store(),
|
|
58
55
|
read_thanks: async () => await run_board_thanks_read.read_thanks(),
|
|
59
56
|
now: () => Date.now(),
|
|
60
57
|
write: (frame) => process.stdout.write(frame),
|
|
@@ -64,6 +61,20 @@ const LIVE_PORTS: BoardPorts = {
|
|
|
64
61
|
// Read on every redraw, so a resized pane is fitted on the next one.
|
|
65
62
|
size: () => ({ rows: process.stdout.rows, columns: process.stdout.columns }),
|
|
66
63
|
form: 'screen',
|
|
64
|
+
keys: {
|
|
65
|
+
is_tty: process.stdin.isTTY,
|
|
66
|
+
raw: (is_raw) => {
|
|
67
|
+
process.stdin.setRawMode(is_raw)
|
|
68
|
+
},
|
|
69
|
+
listen: (on_data) => {
|
|
70
|
+
process.stdin.setEncoding('utf8').on('data', on_data).resume()
|
|
71
|
+
},
|
|
72
|
+
// Stops reading, so stdin no longer holds the process open.
|
|
73
|
+
close: () => {
|
|
74
|
+
process.stdin.pause()
|
|
75
|
+
},
|
|
76
|
+
interrupt: () => process.exit(SIGINT_EXIT_CODE),
|
|
77
|
+
},
|
|
67
78
|
mark: async () => {
|
|
68
79
|
run_progress_read.mark(await run_progress_read.stamp_target(), Date.now())
|
|
69
80
|
},
|
|
@@ -76,14 +87,27 @@ const LIVE_PORTS: BoardPorts = {
|
|
|
76
87
|
},
|
|
77
88
|
}
|
|
78
89
|
|
|
90
|
+
// A live board reads on its worker thread, so no read stops its spinner; a single frame has no spinner
|
|
91
|
+
// to stop, and reads where it draws.
|
|
92
|
+
function live_ports(is_live: boolean): BoardPorts {
|
|
93
|
+
const gather = is_live
|
|
94
|
+
? run_board_gather_thread.worker_gatherer()
|
|
95
|
+
: run_board_gather.frame_gatherer(run_board_gather_live.ports_of(false))
|
|
96
|
+
|
|
97
|
+
return { ...LIVE_PORTS, gather }
|
|
98
|
+
}
|
|
99
|
+
|
|
79
100
|
// Every frame starts from the top of the alternate screen, erasing what the last one left below it, and
|
|
80
101
|
// ends on the line that says closing the screen leaves the run going — only a screen a person can
|
|
81
102
|
// close says it, and it is the first line to give way to a short pane. Nothing follows the last line,
|
|
82
103
|
// so a frame that fills the pane never scrolls the header off the top.
|
|
104
|
+
// The keys are named under it where a person can type them.
|
|
83
105
|
function framed(ports: BoardPorts, screen: Screen): BoardPorts {
|
|
106
|
+
const keys = ports.folded === undefined ? [] : [run_board_fold.KEYS_LINE]
|
|
107
|
+
|
|
84
108
|
return {
|
|
85
109
|
...ports,
|
|
86
|
-
footer: ['', styleText('dim',
|
|
110
|
+
footer: ['', ...[WORDS.keeps_running, ...keys].map((line) => styleText('dim', line))],
|
|
87
111
|
write: (frame) => {
|
|
88
112
|
ports.write(`${screen.frame}${frame.replace(TRAILING_NEWLINE, '')}`)
|
|
89
113
|
},
|
|
@@ -91,13 +115,15 @@ function framed(ports: BoardPorts, screen: Screen): BoardPorts {
|
|
|
91
115
|
}
|
|
92
116
|
|
|
93
117
|
// Leaves the alternate screen once, whichever path gets there first: a second leave would restore the
|
|
94
|
-
// cursor saved on entering and draw over whatever was printed after the first.
|
|
95
|
-
|
|
118
|
+
// cursor saved on entering and draw over whatever was printed after the first. The terminal leaves raw
|
|
119
|
+
// mode with it.
|
|
120
|
+
function leaver(ports: BoardPorts, screen: Screen, keys: KeyReading): () => void {
|
|
96
121
|
let has_left = false
|
|
97
122
|
|
|
98
123
|
return () => {
|
|
99
124
|
if (has_left) return
|
|
100
125
|
has_left = true
|
|
126
|
+
keys.stop?.()
|
|
101
127
|
ports.write(screen.leave)
|
|
102
128
|
}
|
|
103
129
|
}
|
|
@@ -121,13 +147,14 @@ async function redraw_forever(ports: BoardPorts, screen: Screen): Promise<void>
|
|
|
121
147
|
// lands on the normal screen rather than vanishing with the alternate one.
|
|
122
148
|
async function watch(ports: BoardPorts): Promise<void> {
|
|
123
149
|
const screen = run_board_screen.screen_of('live')
|
|
124
|
-
const
|
|
150
|
+
const keys = run_board_keys.read_keys(ports.keys)
|
|
151
|
+
const leave = leaver(ports, screen, keys)
|
|
125
152
|
|
|
126
153
|
ports.write(screen.enter)
|
|
127
154
|
ports.on_exit(leave)
|
|
128
155
|
|
|
129
156
|
try {
|
|
130
|
-
await redraw_forever(ports, screen)
|
|
157
|
+
await redraw_forever({ ...ports, folded: keys.folded }, screen)
|
|
131
158
|
} finally {
|
|
132
159
|
leave()
|
|
133
160
|
}
|
|
@@ -162,25 +189,35 @@ async function push_every(minutes: string | undefined, ports: BoardPorts): Promi
|
|
|
162
189
|
return SUCCESS_EXIT_CODE
|
|
163
190
|
}
|
|
164
191
|
|
|
165
|
-
await run_board_every.push_until_ended(ports, interval *
|
|
192
|
+
await run_board_every.push_until_ended(ports, interval * MS_PER_MINUTE)
|
|
166
193
|
|
|
167
194
|
return SUCCESS_EXIT_CODE
|
|
168
195
|
}
|
|
169
196
|
|
|
170
|
-
|
|
197
|
+
// The ports a test hands in, else the live ones.
|
|
198
|
+
function ports_for(ports: BoardPorts | undefined, is_live: boolean): BoardPorts {
|
|
199
|
+
return ports ?? live_ports(is_live)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
async function draw(flag: string, ports: BoardPorts | undefined): Promise<void> {
|
|
171
203
|
if (flag === CHAT_FLAG) {
|
|
172
|
-
await answer(ports)
|
|
204
|
+
await answer(ports_for(ports, false))
|
|
173
205
|
|
|
174
206
|
return
|
|
175
207
|
}
|
|
176
208
|
|
|
177
|
-
const
|
|
209
|
+
const { is_tty } = ports ?? LIVE_PORTS
|
|
210
|
+
const mode = run_board_screen.mode_of({ is_tty, is_once: flag === ONCE_FLAG })
|
|
211
|
+
|
|
212
|
+
if (mode === 'live') {
|
|
213
|
+
await watch(ports_for(ports, true))
|
|
214
|
+
|
|
215
|
+
return
|
|
216
|
+
}
|
|
178
217
|
|
|
179
218
|
// One plain frame stays on the terminal after the command, so it draws the still icons rather than a
|
|
180
219
|
// spinner frame frozen mid-turn.
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
await (mode === 'live' ? watch(ports) : tick(FRESH_STATE, once_ports))
|
|
220
|
+
await tick(FRESH_STATE, { ...ports_for(ports, false), is_tty: false, size: undefined })
|
|
184
221
|
}
|
|
185
222
|
|
|
186
223
|
function is_every(flag: string, rest: ReadonlyArray<string>): boolean {
|
|
@@ -191,10 +228,10 @@ function is_refused(flag: string, rest: ReadonlyArray<string>): boolean {
|
|
|
191
228
|
return rest.length > 0 || !FLAGS.has(flag)
|
|
192
229
|
}
|
|
193
230
|
|
|
194
|
-
async function run(argv: ReadonlyArray<string>, ports
|
|
231
|
+
async function run(argv: ReadonlyArray<string>, ports?: BoardPorts): Promise<number> {
|
|
195
232
|
const [flag = '', ...rest] = argv
|
|
196
233
|
|
|
197
|
-
if (is_every(flag, rest)) return await push_every(rest[0], ports)
|
|
234
|
+
if (is_every(flag, rest)) return await push_every(rest[0], ports_for(ports, false))
|
|
198
235
|
if (is_refused(flag, rest)) return refuse()
|
|
199
236
|
|
|
200
237
|
await draw(flag, ports)
|
|
@@ -204,8 +241,4 @@ async function run(argv: ReadonlyArray<string>, ports: BoardPorts = LIVE_PORTS):
|
|
|
204
241
|
|
|
205
242
|
const run_board_cli = { DISABLED_NOTICE, USAGE, run }
|
|
206
243
|
|
|
207
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
208
|
-
process.exitCode = await run(process.argv.slice(ARGV_OFFSET))
|
|
209
|
-
}
|
|
210
|
-
|
|
211
244
|
export { run_board_cli }
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { lane_state } from '#scripts/lane/lane-state'
|
|
2
|
+
import { run_board_kind } from './run-board-kind'
|
|
3
|
+
import type { BoardRow, RowRead } from './run-board-layout'
|
|
4
|
+
import type { ItemStatus } from './run-board-status'
|
|
5
|
+
|
|
6
|
+
// The lanes on `run:board` that are not this run's (joshuafolkken/kit#4200, #4260, #4269): an earlier
|
|
7
|
+
// run's lane that still holds a place under the limit, drawn after the run's own lanes with what its
|
|
8
|
+
// record and the stream say it is doing — its phase, its time, its usage and its newest activity, as a
|
|
9
|
+
// row of this run's is — and a lane with no lane state record, drawn unknown. Neither is ever counted
|
|
10
|
+
// as this run's.
|
|
11
|
+
|
|
12
|
+
// The earlier run's lanes still holding a place, what each is doing, and the open lanes with no record.
|
|
13
|
+
interface EarlierLanes {
|
|
14
|
+
lanes: ReadonlyArray<string>
|
|
15
|
+
statuses?: ReadonlyMap<number, ItemStatus> | undefined
|
|
16
|
+
unknown?: ReadonlyArray<string> | undefined
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const NO_EARLIER: EarlierLanes = { lanes: [] }
|
|
20
|
+
|
|
21
|
+
// What an unknown lane's row says after its title: it has no record, and keeps its place.
|
|
22
|
+
const UNKNOWN_TAIL = lane_state.NO_STATE_HINT
|
|
23
|
+
|
|
24
|
+
// The mark an earlier run's running lane leads with in place of its phase (joshuafolkken/kit#4269),
|
|
25
|
+
// two columns wide as every row icon is (`run-board-labels.ts`, kept out of it by its size).
|
|
26
|
+
const EARLIER_ICON = '🧳'
|
|
27
|
+
|
|
28
|
+
// A child working now — this run's, or an earlier run's lane holding a place.
|
|
29
|
+
function is_live(row: BoardRow): boolean {
|
|
30
|
+
return row.state === 'running'
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function base_row(
|
|
34
|
+
number: number,
|
|
35
|
+
read: RowRead,
|
|
36
|
+
): Pick<BoardRow, 'number' | 'title' | 'kind' | 'priority'> {
|
|
37
|
+
const labels = read.labels.get(number)
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
number,
|
|
41
|
+
title: read.titles.get(number),
|
|
42
|
+
kind: run_board_kind.kind_of(labels),
|
|
43
|
+
priority: run_board_kind.priority_of(labels),
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// The row is drawn as its status says, marked as an earlier run's (`is_earlier`).
|
|
48
|
+
function earlier_row(number: number, status: ItemStatus | undefined, read: RowRead): BoardRow {
|
|
49
|
+
return {
|
|
50
|
+
...base_row(number, read),
|
|
51
|
+
state: status?.state ?? 'running',
|
|
52
|
+
status,
|
|
53
|
+
waits: [],
|
|
54
|
+
is_earlier: true,
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function unknown_row(number: number, read: RowRead): BoardRow {
|
|
59
|
+
return {
|
|
60
|
+
...base_row(number, read),
|
|
61
|
+
state: 'unknown',
|
|
62
|
+
status: undefined,
|
|
63
|
+
waits: [],
|
|
64
|
+
reason: { tail: UNKNOWN_TAIL },
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function apart_of(
|
|
69
|
+
lanes: ReadonlyArray<string>,
|
|
70
|
+
statuses: ReadonlyMap<number, ItemStatus>,
|
|
71
|
+
): Array<number> {
|
|
72
|
+
return lanes.map(Number).filter((number) => !statuses.has(number))
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// An earlier run's lane holding a place, then a lane with no record, unless this run has touched its
|
|
76
|
+
// issue since.
|
|
77
|
+
function rows_of(
|
|
78
|
+
earlier: EarlierLanes,
|
|
79
|
+
statuses: ReadonlyMap<number, ItemStatus>,
|
|
80
|
+
read: RowRead,
|
|
81
|
+
): Array<BoardRow> {
|
|
82
|
+
const lanes = apart_of(earlier.lanes, statuses)
|
|
83
|
+
const unknown = apart_of(earlier.unknown ?? [], statuses)
|
|
84
|
+
|
|
85
|
+
return [
|
|
86
|
+
...lanes.map((number) => earlier_row(number, earlier.statuses?.get(number), read)),
|
|
87
|
+
...unknown.map((number) => unknown_row(number, read)),
|
|
88
|
+
]
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const run_board_earlier = { EARLIER_ICON, NO_EARLIER, UNKNOWN_TAIL, is_live, rows_of }
|
|
92
|
+
|
|
93
|
+
export { run_board_earlier }
|
|
94
|
+
export type { EarlierLanes }
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { run_event_scope } from '#scripts/run/event/run-event-scope'
|
|
2
|
+
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
3
|
+
import { run_stalled } from '#scripts/run/park/run-stalled'
|
|
4
|
+
|
|
5
|
+
// Why a child's park or withdraw ended it, in the ending event's own words — the reason its board row
|
|
6
|
+
// draws and its park note carries.
|
|
7
|
+
|
|
8
|
+
const KIND = run_event_stream.EVENT_KIND
|
|
9
|
+
// `#<N> parked`, `#<N> parked (<reason>)` and `#<N> waiting on #<M>` lose their leading number, so a
|
|
10
|
+
// waiting park does not name its issue twice.
|
|
11
|
+
const PARK_PREFIX = /^#\d+ (?:parked\s*)?/u
|
|
12
|
+
const PARENTHESES = /^\((?<inner>.*)\)$/u
|
|
13
|
+
// `#<N> withdrawn by a person: <reason>` (`lane-withdraw.ts`).
|
|
14
|
+
const WITHDRAW_PREFIX = /^#\d+ withdrawn by a person:\s*/u
|
|
15
|
+
|
|
16
|
+
// `#<N> parked (needs-decision)` reads as the reason `needs-decision`; a bare park has none.
|
|
17
|
+
function park_reason(event: RunEvent): string {
|
|
18
|
+
const rest = event.text.replace(PARK_PREFIX, '')
|
|
19
|
+
|
|
20
|
+
return PARENTHESES.exec(rest)?.groups?.['inner'] ?? rest
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// A withdraw's reason after its prefix; a text in any other shape carries none.
|
|
24
|
+
function withdraw_reason(event: RunEvent): string {
|
|
25
|
+
const rest = event.text.replace(WITHDRAW_PREFIX, '')
|
|
26
|
+
|
|
27
|
+
return rest === event.text ? '' : rest.trim()
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// A `run:stalled` park reads as its cause and the action that resumes it (`run-stalled.ts`); any other
|
|
31
|
+
// park as its reason.
|
|
32
|
+
function park_row_reason(event: RunEvent): string {
|
|
33
|
+
const reason = park_reason(event)
|
|
34
|
+
const cause = run_stalled.cause_of(reason)
|
|
35
|
+
const issue = run_event_scope.issue_named(event)
|
|
36
|
+
|
|
37
|
+
return cause === undefined || issue === undefined ? reason : run_stalled.row_text(issue, cause)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// The reason an ending event gives, `undefined` for an event that is neither a park nor a withdraw or
|
|
41
|
+
// that gives none.
|
|
42
|
+
function reason_of(event: RunEvent): string | undefined {
|
|
43
|
+
if (event.kind === KIND.PARK) return park_row_reason(event) || undefined
|
|
44
|
+
|
|
45
|
+
return event.kind === KIND.WITHDRAW ? withdraw_reason(event) || undefined : undefined
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
interface EndingRecord {
|
|
49
|
+
reason?: string
|
|
50
|
+
elapsed_ms?: number
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// What an ending event records for its row: the reason it gives and the lane time its writer recorded
|
|
54
|
+
// (joshuafolkken/kit#4481), each only where the event carries it.
|
|
55
|
+
function recorded_of(event: RunEvent): EndingRecord {
|
|
56
|
+
const reason = reason_of(event)
|
|
57
|
+
const { elapsed_ms } = event
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
...(reason !== undefined && { reason }),
|
|
61
|
+
...(elapsed_ms !== undefined && { elapsed_ms }),
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const run_board_ending_reason = { park_reason, reason_of, recorded_of }
|
|
66
|
+
|
|
67
|
+
export { run_board_ending_reason }
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { run_board_labels } from './run-board-labels'
|
|
2
|
+
import type { BoardRow } from './run-board-layout'
|
|
3
|
+
|
|
4
|
+
// Where each waiting child lands on the lanes (joshuafolkken/kit#4319): onto the lane that frees
|
|
5
|
+
// first, but never before what it waits on ends — a 🔗 blocker, the 📂 child holding its path, the
|
|
6
|
+
// running lanes a 🧍 `run:solo` child waits out, the 🙅 solo child ahead of it, the 📋 issue a named run
|
|
7
|
+
// starts it after — nor before a `run:solo` child ends: a running one, or a 🧍 one placed ahead, which
|
|
8
|
+
// itself starts once every lane placed before it has freed. A child waiting on an issue the board does
|
|
9
|
+
// not carry waits past this run, so it is left out.
|
|
10
|
+
|
|
11
|
+
const { WAIT_ICONS } = run_board_labels
|
|
12
|
+
const AFTER_ICONS: ReadonlySet<string> = new Set([
|
|
13
|
+
WAIT_ICONS.path,
|
|
14
|
+
WAIT_ICONS.solo,
|
|
15
|
+
WAIT_ICONS.solo_ahead,
|
|
16
|
+
WAIT_ICONS.named,
|
|
17
|
+
])
|
|
18
|
+
|
|
19
|
+
interface Lanes {
|
|
20
|
+
// When each lane frees, from now.
|
|
21
|
+
free: Array<number>
|
|
22
|
+
// When each child on the board ends, from now.
|
|
23
|
+
ends: Map<number, number>
|
|
24
|
+
// No waiting child starts before this — the end of a `run:solo` child running or placed.
|
|
25
|
+
floor: number
|
|
26
|
+
per_child: number
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface Pending {
|
|
30
|
+
number: number
|
|
31
|
+
after: ReadonlyArray<number>
|
|
32
|
+
// A 🧍 `run:solo` child: it starts once every lane is free and lets none start beside it.
|
|
33
|
+
is_solo: boolean
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// The issues a row's reason says it starts after, none for a wait no child's end lifts.
|
|
37
|
+
function named_of(reason: BoardRow['reason']): ReadonlyArray<string> {
|
|
38
|
+
if (reason?.icon === undefined || !AFTER_ICONS.has(reason.icon)) return []
|
|
39
|
+
|
|
40
|
+
return reason.issues ?? []
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// The issues a waiting row starts after: its standing blockers, and those its reason names.
|
|
44
|
+
function pending_of(row: BoardRow): Pending {
|
|
45
|
+
const after = new Set([...row.waits, ...named_of(row.reason)])
|
|
46
|
+
|
|
47
|
+
const is_solo = row.reason?.icon === WAIT_ICONS.solo
|
|
48
|
+
|
|
49
|
+
return { number: row.number, after: [...after].map(Number), is_solo }
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function is_ready(pending: Pending, lanes: Lanes): boolean {
|
|
53
|
+
return pending.after.every((issue) => lanes.ends.has(issue))
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// The lane freeing latest by the time the child can start, so a child waiting on an end leaves the
|
|
57
|
+
// lane free sooner to a child ready before it; the lane free first where none has freed by then.
|
|
58
|
+
function lane_for(free: ReadonlyArray<number>, ready: number): number {
|
|
59
|
+
const fits = free.filter((at) => at <= ready)
|
|
60
|
+
|
|
61
|
+
return free.indexOf(fits.length > 0 ? Math.max(...fits) : Math.min(...free))
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function place(pending: Pending, lanes: Lanes): void {
|
|
65
|
+
const waited = pending.after.map((issue) => lanes.ends.get(issue) ?? 0)
|
|
66
|
+
const busy = pending.is_solo ? lanes.free : []
|
|
67
|
+
const ready = Math.max(lanes.floor, ...waited, ...busy)
|
|
68
|
+
const lane = lane_for(lanes.free, ready)
|
|
69
|
+
const end = Math.max(lanes.free[lane] ?? 0, ready) + lanes.per_child
|
|
70
|
+
|
|
71
|
+
lanes.free[lane] = end
|
|
72
|
+
lanes.ends.set(pending.number, end)
|
|
73
|
+
if (pending.is_solo) lanes.floor = end
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// One pass over the children not yet placed, placing each whose waits have ended; the rest are left.
|
|
77
|
+
function pass(pending: ReadonlyArray<Pending>, lanes: Lanes): Array<Pending> {
|
|
78
|
+
const ready = pending.filter((entry) => is_ready(entry, lanes))
|
|
79
|
+
|
|
80
|
+
for (const entry of ready) place(entry, lanes)
|
|
81
|
+
|
|
82
|
+
return pending.filter((entry) => !lanes.ends.has(entry.number))
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// The time the last lane ends, the waiting rows placed pass after pass until a pass places none.
|
|
86
|
+
function end_of(waiting: ReadonlyArray<BoardRow>, lanes: Lanes): number {
|
|
87
|
+
let left = waiting.map((row) => pending_of(row))
|
|
88
|
+
let placed = Infinity
|
|
89
|
+
|
|
90
|
+
while (left.length > 0 && placed > 0) {
|
|
91
|
+
const next = pass(left, lanes)
|
|
92
|
+
|
|
93
|
+
placed = left.length - next.length
|
|
94
|
+
left = next
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return Math.max(...lanes.free)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const run_board_estimate_schedule = { end_of }
|
|
101
|
+
|
|
102
|
+
export { run_board_estimate_schedule }
|
|
103
|
+
export type { Lanes }
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { run_board_estimate_schedule, type Lanes } from './run-board-estimate-schedule'
|
|
2
|
+
import { run_board_labels } from './run-board-labels'
|
|
3
|
+
import { run_board_layout, type BoardLayout, type BoardRow } from './run-board-layout'
|
|
4
|
+
import { run_board_phase, type Phase } from './run-board-phase'
|
|
5
|
+
import type { ItemStatus } from './run-board-status'
|
|
6
|
+
import type { UsualTimes } from './run-board-usual'
|
|
7
|
+
|
|
8
|
+
// How long the run has left, from how long each phase usually takes (`run-board-usual.ts`,
|
|
9
|
+
// joshuafolkken/kit#4044). A running child has left what remains of its phase and every phase it has
|
|
10
|
+
// not reached; a waiting child the plan's waves hold takes one child's usual time, stacked onto the
|
|
11
|
+
// lane that frees first once what it waits on has ended (`run-board-estimate-schedule.ts`). A parked
|
|
12
|
+
// child, and one the plan has not reached — a start date or a blocker ahead of it — wait on something
|
|
13
|
+
// no usual time measures, so they are left out. Without a usual time nothing is estimated.
|
|
14
|
+
|
|
15
|
+
const { HEADER_ICONS, WORDS, minute_span_of } = run_board_labels
|
|
16
|
+
const LEGEND = `${HEADER_ICONS.estimate} ${WORDS.estimate}`
|
|
17
|
+
const ESTIMATE_MARK = '~'
|
|
18
|
+
// A failed ship sends its child back to implement, so it has that phase and every later one left.
|
|
19
|
+
const FAILED_PHASE: Phase = 'failed'
|
|
20
|
+
const RESUMED_PHASE: Phase = 'implement'
|
|
21
|
+
// The phases a child passes in order, a failed ship aside.
|
|
22
|
+
const PATH: ReadonlyArray<Phase> = run_board_phase.PHASES.filter((phase) => phase !== FAILED_PHASE)
|
|
23
|
+
const MIN_LANES = 1
|
|
24
|
+
|
|
25
|
+
interface EstimateRead {
|
|
26
|
+
now_ms: number
|
|
27
|
+
ended_ms: number | undefined
|
|
28
|
+
layout: BoardLayout | undefined
|
|
29
|
+
usual?: UsualTimes | undefined
|
|
30
|
+
lane_limit?: number | undefined
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function usual_sum(phases: ReadonlyArray<Phase>, usual: UsualTimes): number {
|
|
34
|
+
return phases.reduce((sum, phase) => sum + (usual.get(phase) ?? 0), 0)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// The phase a child stands at, as the path counts it.
|
|
38
|
+
function phase_of(status: ItemStatus | undefined): Phase {
|
|
39
|
+
const phase = status?.track?.at(-1) ?? run_board_phase.LAUNCHED_PHASE
|
|
40
|
+
|
|
41
|
+
return phase === FAILED_PHASE ? RESUMED_PHASE : phase
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// What a running child has left: its phase's usual time less what it has spent there, then every
|
|
45
|
+
// phase after it.
|
|
46
|
+
function running_left(row: BoardRow, read: EstimateRead, usual: UsualTimes): number {
|
|
47
|
+
const phase = phase_of(row.status)
|
|
48
|
+
const spent = read.now_ms - (row.status?.phase_ms ?? read.now_ms)
|
|
49
|
+
const current = Math.max(0, (usual.get(phase) ?? 0) - spent)
|
|
50
|
+
|
|
51
|
+
return current + usual_sum(PATH.slice(PATH.indexOf(phase) + 1), usual)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// The queued rows a lane will take, a decision a person owes left out.
|
|
55
|
+
function waiting_rows(layout: BoardLayout): Array<BoardRow> {
|
|
56
|
+
const queued: BoardLayout = { ...run_board_layout.EMPTY_LAYOUT, queued: layout.queued }
|
|
57
|
+
|
|
58
|
+
return run_board_layout.rows_of(queued).filter((row) => row.state === 'waiting')
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// The lanes as the running children leave them: each running child's end, the free lanes at zero, and
|
|
62
|
+
// a running `run:solo` child's end as the floor no waiting child starts before.
|
|
63
|
+
function lanes_of(running: ReadonlyArray<BoardRow>, read: EstimateRead, usual: UsualTimes): Lanes {
|
|
64
|
+
const ends = new Map(running.map((row) => [row.number, running_left(row, read, usual)]))
|
|
65
|
+
const count = Math.max(read.lane_limit ?? running.length, running.length, MIN_LANES)
|
|
66
|
+
const free = [...ends.values(), ...Array.from({ length: count - ends.size }, () => 0)]
|
|
67
|
+
const solo = running.filter((row) => row.is_solo === true).map((row) => ends.get(row.number) ?? 0)
|
|
68
|
+
|
|
69
|
+
return { free, ends, floor: Math.max(0, ...solo), per_child: usual_sum(PATH, usual) }
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// How long the run has left, `undefined` where nothing is left to run or no usual time is known.
|
|
73
|
+
function left_ms(read: EstimateRead): number | undefined {
|
|
74
|
+
const { layout, usual } = read
|
|
75
|
+
|
|
76
|
+
if (layout === undefined || usual === undefined || usual.size === 0) return undefined
|
|
77
|
+
|
|
78
|
+
const running = layout.active.filter((row) => row.state === 'running')
|
|
79
|
+
const waiting = waiting_rows(layout)
|
|
80
|
+
|
|
81
|
+
if (running.length + waiting.length === 0) return undefined
|
|
82
|
+
|
|
83
|
+
return run_board_estimate_schedule.end_of(waiting, lanes_of(running, read, usual))
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// `🎯 ~25′`, `undefined` for an ended run or one with nothing to estimate.
|
|
87
|
+
function part_of(read: EstimateRead): string | undefined {
|
|
88
|
+
const left = read.ended_ms === undefined ? left_ms(read) : undefined
|
|
89
|
+
|
|
90
|
+
return left === undefined
|
|
91
|
+
? undefined
|
|
92
|
+
: `${HEADER_ICONS.estimate} ${ESTIMATE_MARK}${minute_span_of(left)}`
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const run_board_estimate = { LEGEND, left_ms, part_of }
|
|
96
|
+
|
|
97
|
+
export { run_board_estimate }
|
|
98
|
+
export type { EstimateRead }
|