@joshuafolkken/kit 1.1471.0 → 1.1784.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,34 +1,45 @@
|
|
|
1
|
+
import { backlog_drive_named } from '#scripts/backlog/backlog-drive-named'
|
|
1
2
|
import { backlog_overlap } from '#scripts/backlog/backlog-overlap'
|
|
2
3
|
import type { EpicChild } from '#scripts/epic/epic-graph'
|
|
4
|
+
import { epic_solo, type Labelled, type SoloQueue } from '#scripts/epic/epic-solo'
|
|
3
5
|
import { epic_triage } from '#scripts/epic/epic-triage'
|
|
6
|
+
import { has_label_name, has_parked_label, IN_PROGRESS_LABEL } from '#scripts/issue/issue-labels'
|
|
7
|
+
import { issue_not_before } from '#scripts/issue/issue-not-before'
|
|
8
|
+
import { issue_sample_gate } from '#scripts/issue/issue-sample-gate'
|
|
9
|
+
import { lane_state } from '#scripts/lane/lane-state'
|
|
10
|
+
import type { RunCarry } from '#scripts/run/carry/run-carry'
|
|
4
11
|
import { run_event_setup } from '#scripts/run/event/run-event-setup'
|
|
5
12
|
import type { RunEvent } from '#scripts/run/event/run-event-stream'
|
|
13
|
+
import { run_board_labels } from './run-board-labels'
|
|
6
14
|
import { run_board_layout, type Overlay, type ReasonOf, type RowReason } from './run-board-layout'
|
|
15
|
+
import { run_board_machine, type MachineGauges } from './run-board-machine'
|
|
16
|
+
import { run_board_planning, type Planning } from './run-board-planning'
|
|
7
17
|
import { run_board_setup } from './run-board-setup'
|
|
8
18
|
import type { ItemStatus } from './run-board-status'
|
|
9
19
|
|
|
10
|
-
// Why each waiting row waits — pure, so the
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
20
|
+
// Why each waiting row waits — pure, so the reasons are tested apart from the screen. Each is one
|
|
21
|
+
// `RowReason` its row only draws (joshuafolkken/kit#4288): an icon, the condition column's value and
|
|
22
|
+
// what follows the title. A row whose lane is being opened leads with the stage that lane is at; any
|
|
23
|
+
// other with what `backlog:next` would answer for it, read off the same rules — after the row a
|
|
24
|
+
// planning run is for, which says so (`run-board-planning.ts`): the driver's declared order for a named
|
|
25
|
+
// run's issue, `epic_triage` for an untriaged issue, `epic_solo` for a running `run:solo` issue, a
|
|
26
|
+
// waiting one and the rows behind it, `backlog_overlap` for a declared path a running issue holds,
|
|
27
|
+
// the lane limit for a full pool. A start time the body declares and the clock has not reached
|
|
28
|
+
// (`issue-not-before.ts`) comes before the pool's reasons, since the pickup never offers the row
|
|
29
|
+
// until then; it reads in the local time every other time on the board does (#4017). A blocker
|
|
30
|
+
// leads its row with `🔗`; a row that nobody has judged leads with ❓ even where it is blocked, since
|
|
31
|
+
// judging it is what a person can do meanwhile.
|
|
16
32
|
|
|
17
33
|
const { LANE_STAGE } = run_event_setup
|
|
34
|
+
const { HEADER_ICONS, STAGE_ICONS, STATE_ICONS, WAIT_ICONS } = run_board_labels
|
|
18
35
|
const NO_FREE_LANES = 0
|
|
36
|
+
const FIRST_ONLY = 1
|
|
19
37
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
} as const
|
|
26
|
-
|
|
27
|
-
// A lane's stage as its row says it: the event's own words, cut to what fits beside a title.
|
|
28
|
-
const STAGE_WORDS: ReadonlyArray<readonly [stage: string, word: string]> = [
|
|
29
|
-
[LANE_STAGE.OPENING, 'opening lane'],
|
|
30
|
-
[LANE_STAGE.INSTALLING, 'installing'],
|
|
31
|
-
[LANE_STAGE.DISPATCHING, 'dispatching'],
|
|
38
|
+
// The stages a lane's launch passes, each leading its row with its own icon.
|
|
39
|
+
const LANE_STAGES: ReadonlyArray<string> = [
|
|
40
|
+
LANE_STAGE.OPENING,
|
|
41
|
+
LANE_STAGE.INSTALLING,
|
|
42
|
+
LANE_STAGE.DISPATCHING,
|
|
32
43
|
]
|
|
33
44
|
|
|
34
45
|
// What the reasons are read from, beside the plan and the statuses a layout is drawn from.
|
|
@@ -36,28 +47,48 @@ interface ReasonRead extends Overlay {
|
|
|
36
47
|
events: ReadonlyArray<RunEvent>
|
|
37
48
|
// How many more lanes the limit allows; `undefined` where it could not be read.
|
|
38
49
|
free_lanes: number | undefined
|
|
50
|
+
// How many lanes hold a place under the limit, counted after `🧵`.
|
|
51
|
+
occupied_count?: number | undefined
|
|
52
|
+
// The limit those lanes fill; `undefined` where it could not be read.
|
|
53
|
+
lane_limit?: number | undefined
|
|
54
|
+
// The driver holds its offered issue for memory (`backlog-drive-memory.ts`).
|
|
55
|
+
is_memory_held?: boolean | undefined
|
|
56
|
+
// The machine's latest gauges, the figures a memory hold names.
|
|
57
|
+
gauges?: MachineGauges | undefined
|
|
58
|
+
// The run's record, whose declared order holds the issues declared after one in flight.
|
|
59
|
+
carry?: RunCarry | undefined
|
|
39
60
|
// A stopped run opens no lane, so a stage its stream ends on is not one any lane is at.
|
|
40
61
|
is_stopped: boolean
|
|
41
62
|
}
|
|
42
63
|
|
|
43
64
|
// What every row of one layout is weighed against, read once.
|
|
44
65
|
interface Pool {
|
|
45
|
-
//
|
|
46
|
-
|
|
66
|
+
// The untriaged issue nothing blocks that withholds every candidate (`epic-triage.ts`), if any.
|
|
67
|
+
held_by: number | undefined
|
|
47
68
|
running: ReadonlyArray<number>
|
|
69
|
+
// The issues the classifier withholds for a person (`epic-outside-blocker.ts`'s `human`).
|
|
70
|
+
withheld: ReadonlySet<number>
|
|
71
|
+
// The row the run's planning is for, while the run plans (`run-board-planning.ts`).
|
|
72
|
+
planning: Planning | undefined
|
|
73
|
+
// The first `run:solo` candidate and the candidates behind it (`epic-solo.ts`), if any.
|
|
74
|
+
solo: SoloQueue | undefined
|
|
75
|
+
// The running `run:solo` issue that lets nothing new start (`epic_solo.holder_of`), if any.
|
|
76
|
+
solo_holder: number | undefined
|
|
48
77
|
}
|
|
49
78
|
|
|
50
|
-
function
|
|
51
|
-
|
|
79
|
+
function stage_icon(text: string): string | undefined {
|
|
80
|
+
const stage = LANE_STAGES.find((name) => text.startsWith(name))
|
|
81
|
+
|
|
82
|
+
return stage === undefined ? undefined : STAGE_ICONS[stage]
|
|
52
83
|
}
|
|
53
84
|
|
|
54
85
|
function stage_of(child: EpicChild, read: ReasonRead): RowReason | undefined {
|
|
55
86
|
const stage = read.is_stopped ? undefined : run_board_setup.lane_stage(read.events, child.number)
|
|
56
|
-
const
|
|
87
|
+
const icon = stage === undefined ? undefined : stage_icon(stage.text)
|
|
57
88
|
|
|
58
|
-
if (stage === undefined ||
|
|
89
|
+
if (stage === undefined || icon === undefined) return undefined
|
|
59
90
|
|
|
60
|
-
return {
|
|
91
|
+
return { icon, since_ms: stage.at_ms }
|
|
61
92
|
}
|
|
62
93
|
|
|
63
94
|
function is_untriaged_candidate(child: EpicChild, read: ReasonRead): boolean {
|
|
@@ -73,52 +104,214 @@ function running_of(read: ReasonRead): Array<number> {
|
|
|
73
104
|
return [...read.statuses].filter(([, status]) => holds_paths(status)).map(([issue]) => issue)
|
|
74
105
|
}
|
|
75
106
|
|
|
107
|
+
// A waiting row the pool could offer: judged, due, and with no blocker standing — a start time not yet
|
|
108
|
+
// reached keeps a row out of `backlog:next`'s candidates, so it holds nothing behind it.
|
|
109
|
+
function is_candidate(child: EpicChild, read: ReasonRead): boolean {
|
|
110
|
+
return (
|
|
111
|
+
epic_triage.is_triaged(child) &&
|
|
112
|
+
issue_not_before.is_due(child.body) &&
|
|
113
|
+
!run_board_layout.is_blocked(child, read)
|
|
114
|
+
)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Every open issue holding a lane as `backlog:next` reads it (`epic-busy.ts`): `in-progress` and no
|
|
118
|
+
// park label — a paused lane, or one another run or a person works, holds as this run's lanes do.
|
|
119
|
+
function running_labelled(read: ReasonRead): Array<Labelled> {
|
|
120
|
+
return [...read.plan.labels]
|
|
121
|
+
.filter(([, labels]) => has_label_name(labels, IN_PROGRESS_LABEL) && !has_parked_label(labels))
|
|
122
|
+
.map(([number, labels]) => ({ number, labels }))
|
|
123
|
+
}
|
|
124
|
+
|
|
76
125
|
function pool_of(read: ReasonRead): Pool {
|
|
77
126
|
const waiting = run_board_layout.waiting_children(read)
|
|
127
|
+
const running = running_of(read)
|
|
128
|
+
const candidates = waiting.filter((child) => is_candidate(child, read))
|
|
78
129
|
|
|
79
130
|
return {
|
|
80
|
-
|
|
81
|
-
running
|
|
131
|
+
held_by: waiting.find((child) => is_untriaged_candidate(child, read))?.number,
|
|
132
|
+
running,
|
|
133
|
+
withheld: read.plan.withheld ?? new Set(),
|
|
134
|
+
planning: run_board_planning.planning_of(read, running),
|
|
135
|
+
solo: epic_solo.queue_of(candidates),
|
|
136
|
+
solo_holder: epic_solo.holder_of(running_labelled(read)),
|
|
82
137
|
}
|
|
83
138
|
}
|
|
84
139
|
|
|
85
|
-
function
|
|
140
|
+
function planned_of(child: EpicChild, pool: Pool): RowReason | undefined {
|
|
141
|
+
return pool.planning?.issue === child.number ? pool.planning.reason : undefined
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// ` — paused since 01:28 by lane:pause` for a holder whose lane is paused (joshuafolkken/kit#4270):
|
|
145
|
+
// only a paused lane's status carries who paused it, and its end is when.
|
|
146
|
+
function paused_tail(status: ItemStatus | undefined): string {
|
|
147
|
+
const { ended_ms, paused_by } = status ?? {}
|
|
148
|
+
|
|
149
|
+
if (paused_by === undefined || ended_ms === undefined) return ''
|
|
150
|
+
|
|
151
|
+
return ` — ${lane_state.paused_text(ended_ms, paused_by)}`
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// `📂 4238 … scripts/gate/machine-capacity.ts`: the running issue holding a path this row declares,
|
|
155
|
+
// and the path after the title — with when and by what the holder was paused, where it is.
|
|
156
|
+
function overlap_of(child: EpicChild, read: ReasonRead, pool: Pool): RowReason | undefined {
|
|
86
157
|
const { declared = new Map(), context } = read.plan
|
|
87
158
|
const holding = { holders: pool.running, repo: context.repo }
|
|
88
159
|
const clash = backlog_overlap.running_clash(child, declared, holding)
|
|
89
160
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
161
|
+
if (clash === undefined) return undefined
|
|
162
|
+
|
|
163
|
+
const tail = `${clash.path}${paused_tail(read.statuses.get(clash.holder))}`
|
|
164
|
+
|
|
165
|
+
return { icon: WAIT_ICONS.path, issues: [String(clash.holder)], tail }
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// `🧵 4/4`: how many lanes hold a place against the limit the row starts after a free one of. Every
|
|
169
|
+
// waiting row repeated the same breakdown of them, so the row counts them and names none (#4111).
|
|
170
|
+
function no_lane_of(read: ReasonRead): RowReason {
|
|
171
|
+
const { occupied_count = 0, lane_limit } = read
|
|
172
|
+
|
|
173
|
+
if (lane_limit === undefined) return { icon: WAIT_ICONS.lane }
|
|
174
|
+
|
|
175
|
+
return { icon: WAIT_ICONS.lane, value: `${String(occupied_count)}/${String(lane_limit)}` }
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// `🧠 88% … 💾 12M/s`: run:board's own latest 🧠 / 💾, not the driver's reading, so a hold the kernel's
|
|
179
|
+
// verdict alone raised may show both green. Each is drawn only where it was read (#4084); the 💾 follows
|
|
180
|
+
// the title, so the row draws 🧠 once.
|
|
181
|
+
function no_memory_of(gauges: MachineGauges | undefined): RowReason {
|
|
182
|
+
const { percent_text, rate_text } = run_board_machine
|
|
183
|
+
const memory = gauges?.memory_percent
|
|
184
|
+
const swap = gauges?.swap_mb_per_s
|
|
185
|
+
|
|
186
|
+
return {
|
|
187
|
+
icon: WAIT_ICONS.memory,
|
|
188
|
+
value: memory === undefined ? undefined : percent_text(memory).trim(),
|
|
189
|
+
tail: swap === undefined ? undefined : `${HEADER_ICONS.swap} ${rate_text(swap).trim()}`,
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// The machine's room: no lane left under the limit, else no memory for one more.
|
|
194
|
+
function room_wait(read: ReasonRead): RowReason | undefined {
|
|
195
|
+
if (read.free_lanes === NO_FREE_LANES) return no_lane_of(read)
|
|
196
|
+
|
|
197
|
+
return read.is_memory_held === true ? no_memory_of(read.gauges) : undefined
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// `📋 4198`: the declared issue a named run starts this one after — the driver's own reading
|
|
201
|
+
// (`backlog-drive-named.ts`), asked before it offers anything.
|
|
202
|
+
function named_of(child: EpicChild, read: ReasonRead, pool: Pool): RowReason | undefined {
|
|
203
|
+
if (read.carry === undefined) return undefined
|
|
204
|
+
const in_flight = pool.running.map(String)
|
|
205
|
+
const holder = backlog_drive_named.held_after(read.carry, in_flight, child.number)
|
|
206
|
+
|
|
207
|
+
return holder === undefined ? undefined : { icon: WAIT_ICONS.named, issues: [String(holder)] }
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// `✋ 4301`: the untriaged issue the pool is held for a judgment of.
|
|
211
|
+
function held_of(pool: Pool): RowReason | undefined {
|
|
212
|
+
if (pool.held_by === undefined) return undefined
|
|
213
|
+
|
|
214
|
+
return { icon: WAIT_ICONS.held, issues: [String(pool.held_by)] }
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// `🔒 4374`: the running `run:solo` issue nothing new starts beside until it merges or is parked.
|
|
218
|
+
function held_solo_of(pool: Pool): RowReason | undefined {
|
|
219
|
+
if (pool.solo_holder === undefined) return undefined
|
|
220
|
+
|
|
221
|
+
return { icon: WAIT_ICONS.solo_running, issues: [String(pool.solo_holder)] }
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// `🧍 4288+1 … 4268`: a `run:solo` issue starts only into an idle repository, so it names the running
|
|
225
|
+
// lanes it waits for — the first in the condition column, the rest after the title.
|
|
226
|
+
function alone_of(running: ReadonlyArray<number>): RowReason | undefined {
|
|
227
|
+
return running.length === 0 ? undefined : { icon: WAIT_ICONS.solo, issues: running.map(String) }
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// `🙅 4287`: nothing ranked behind a waiting `run:solo` issue is offered past it.
|
|
231
|
+
function solo_of(child: EpicChild, pool: Pool): RowReason | undefined {
|
|
232
|
+
const { solo } = pool
|
|
233
|
+
|
|
234
|
+
if (solo === undefined) return undefined
|
|
235
|
+
if (solo.solo.number === child.number) return alone_of(pool.running)
|
|
236
|
+
const is_behind = solo.behind.some((item) => item.number === child.number)
|
|
237
|
+
|
|
238
|
+
return is_behind ? { icon: WAIT_ICONS.solo_ahead, issues: [String(solo.solo.number)] } : undefined
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// The `run:solo` gate as `epic_solo.select` reads it: a running `run:solo` issue first, then a waiting
|
|
242
|
+
// one's wait.
|
|
243
|
+
function solo_wait(child: EpicChild, pool: Pool): RowReason | undefined {
|
|
244
|
+
return held_solo_of(pool) ?? solo_of(child, pool)
|
|
93
245
|
}
|
|
94
246
|
|
|
95
|
-
// A candidate nothing blocks, in the order
|
|
96
|
-
//
|
|
97
|
-
|
|
98
|
-
|
|
247
|
+
// A candidate nothing blocks, in the order the driver answers: the declared order, then what
|
|
248
|
+
// `backlog:next` answers — the pool held for a judgment, then a running `run:solo` issue, then a
|
|
249
|
+
// waiting `run:solo` issue's wait, then a path a running issue declares, then a pool with no lane
|
|
250
|
+
// left, then a machine with no memory.
|
|
251
|
+
function offer_wait(child: EpicChild, read: ReasonRead, pool: Pool): RowReason | undefined {
|
|
252
|
+
return (
|
|
253
|
+
named_of(child, read, pool) ??
|
|
254
|
+
held_of(pool) ??
|
|
255
|
+
solo_wait(child, pool) ??
|
|
256
|
+
overlap_of(child, read, pool) ??
|
|
257
|
+
room_wait(read)
|
|
258
|
+
)
|
|
259
|
+
}
|
|
99
260
|
|
|
100
|
-
|
|
261
|
+
// `📅 3/10`: the merges the ledger recorded after the declared pull request merged, of those the body
|
|
262
|
+
// waits on; `📅 4313` while that pull request has not merged or its merge is unread.
|
|
263
|
+
function sample_wait_of(child: EpicChild): RowReason | undefined {
|
|
264
|
+
const wait = issue_sample_gate.wait_of(child.body)
|
|
101
265
|
|
|
102
|
-
if (
|
|
266
|
+
if (wait === undefined) return undefined
|
|
267
|
+
if (wait.kind !== 'short') return { icon: WAIT_ICONS.not_before, issues: [String(wait.pr)] }
|
|
103
268
|
|
|
104
|
-
return
|
|
269
|
+
return { icon: WAIT_ICONS.not_before, value: `${String(wait.counted)}/${String(wait.needed)}` }
|
|
105
270
|
}
|
|
106
271
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
272
|
+
// `📅 10-20 16:30`: the start time the body declares and the clock has not reached, in the board's
|
|
273
|
+
// local time.
|
|
274
|
+
function not_before_of(child: EpicChild): RowReason | undefined {
|
|
275
|
+
const ms = issue_not_before.waiting_ms(child.body)
|
|
276
|
+
|
|
277
|
+
if (ms === undefined) return sample_wait_of(child)
|
|
278
|
+
|
|
279
|
+
return {
|
|
280
|
+
icon: WAIT_ICONS.not_before,
|
|
281
|
+
value: run_board_labels.day_minute_of(ms),
|
|
282
|
+
not_before_ms: ms,
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// `🔗 4183` for a blocker the run finishes, `🙋 4183` where the classifier withholds the row for a
|
|
287
|
+
// person: the run will not finish a blocker it waits on (joshuafolkken/kit#4292).
|
|
288
|
+
function blocker_icon(child: EpicChild, pool: Pool): string {
|
|
289
|
+
return pool.withheld.has(child.number) ? STATE_ICONS.human : WAIT_ICONS.blocker
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// `❓ 4183`: an issue nobody has judged, naming its first standing blocker where it has one.
|
|
293
|
+
function untriaged_of(waits: ReadonlyArray<string>): RowReason {
|
|
294
|
+
return { icon: WAIT_ICONS.untriaged, issues: waits.slice(0, FIRST_ONLY) }
|
|
295
|
+
}
|
|
110
296
|
|
|
111
|
-
|
|
297
|
+
function wait_of(
|
|
298
|
+
child: EpicChild,
|
|
299
|
+
waits: ReadonlyArray<string>,
|
|
300
|
+
read: ReasonRead,
|
|
301
|
+
pool: Pool,
|
|
302
|
+
): RowReason | undefined {
|
|
303
|
+
if (!epic_triage.is_triaged(child)) return untriaged_of(waits)
|
|
304
|
+
if (waits.length > 0) return { icon: blocker_icon(child, pool), issues: waits }
|
|
112
305
|
|
|
113
|
-
return
|
|
306
|
+
return not_before_of(child) ?? offer_wait(child, read, pool)
|
|
114
307
|
}
|
|
115
308
|
|
|
116
309
|
// What each waiting row of one layout says, the pool-wide facts read once for all of them.
|
|
117
310
|
function reader(read: ReasonRead): ReasonOf {
|
|
118
311
|
const pool = pool_of(read)
|
|
119
312
|
|
|
120
|
-
return function reason_of(child
|
|
121
|
-
return stage_of(child, read) ?? wait_of(child, read, pool)
|
|
313
|
+
return function reason_of(child, waits) {
|
|
314
|
+
return stage_of(child, read) ?? planned_of(child, pool) ?? wait_of(child, waits, read, pool)
|
|
122
315
|
}
|
|
123
316
|
}
|
|
124
317
|
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { has_parked_label } from '#scripts/issue/issue-labels'
|
|
2
|
+
import type { ItemStatus, OpenRead } from './run-board-status'
|
|
3
|
+
|
|
4
|
+
// A parked child a person has released by removing `needs-decision` is no longer the run's: the
|
|
5
|
+
// listing, read after the park, holds it open without the label. Its status is dropped, so the board
|
|
6
|
+
// lays it where the plan places it, as it does any issue the run has not touched.
|
|
7
|
+
|
|
8
|
+
type ReleaseRead = Pick<OpenRead, 'read_ms' | 'labels'>
|
|
9
|
+
|
|
10
|
+
function is_read_after_park(status: ItemStatus, read_ms: number | undefined): boolean {
|
|
11
|
+
return read_ms !== undefined && (status.ended_ms ?? 0) <= read_ms
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// A person still owns a parked child while any park label (`PARKED_LABELS`) is on it. An issue the
|
|
15
|
+
// listing did not hold has no labels to read, and stays parked.
|
|
16
|
+
function is_undecided(labels: ReadonlyArray<string> | undefined): boolean {
|
|
17
|
+
return labels !== undefined && !has_parked_label(labels)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function is_released(issue: number, status: ItemStatus, read: ReleaseRead): boolean {
|
|
21
|
+
if (status.state !== 'parked') return false
|
|
22
|
+
|
|
23
|
+
return is_read_after_park(status, read.read_ms) && is_undecided(read.labels.get(issue))
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function without_released(
|
|
27
|
+
statuses: ReadonlyMap<number, ItemStatus>,
|
|
28
|
+
read: ReleaseRead,
|
|
29
|
+
): ReadonlyMap<number, ItemStatus> {
|
|
30
|
+
return new Map([...statuses].filter(([issue, status]) => !is_released(issue, status, read)))
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const run_board_released = { without_released }
|
|
34
|
+
|
|
35
|
+
export { run_board_released }
|
|
@@ -20,11 +20,13 @@ const CODERABBIT_COLORS: Readonly<Partial<Record<CodeRabbitState, TextColor>>> =
|
|
|
20
20
|
'rate-limited': 'yellow',
|
|
21
21
|
failed: 'red',
|
|
22
22
|
}
|
|
23
|
-
//
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
// Each mark the legend can name, in its order, with its word.
|
|
24
|
+
const CHECK_WORDS: ReadonlyArray<readonly [string, string]> = [
|
|
25
|
+
[CHECK_ICONS.pass, 'passed'],
|
|
26
|
+
[CHECK_ICONS.pending, 'pending'],
|
|
27
|
+
[CHECK_ICONS.fail, 'failed'],
|
|
27
28
|
]
|
|
29
|
+
const RATE_LIMITED_MARK = CODERABBIT_MARKS['rate-limited'] ?? ''
|
|
28
30
|
|
|
29
31
|
function tinted(text: string, color: TextColor | undefined): string {
|
|
30
32
|
return color === undefined ? text : styleText(color, text)
|
|
@@ -50,6 +52,38 @@ function checks_part(checks: PrChecks): string {
|
|
|
50
52
|
].join(GAP)
|
|
51
53
|
}
|
|
52
54
|
|
|
53
|
-
|
|
55
|
+
// The marks one row's part draws: each count it leaves in and CodeRabbit's mark.
|
|
56
|
+
function marks_of(checks: PrChecks): Array<string> {
|
|
57
|
+
const counts: ReadonlyArray<readonly [string, number]> = [
|
|
58
|
+
[CHECK_ICONS.pass, checks.pass],
|
|
59
|
+
[CHECK_ICONS.pending, checks.pending],
|
|
60
|
+
[CHECK_ICONS.fail, checks.fail],
|
|
61
|
+
]
|
|
62
|
+
const drawn = counts.filter(([, count]) => count > 0).map(([icon]) => icon)
|
|
63
|
+
|
|
64
|
+
return [...drawn, CODERABBIT_MARKS[checks.coderabbit] ?? '']
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function coderabbit_legend(drawn: ReadonlyArray<PrChecks>): Array<string> {
|
|
68
|
+
const states = new Set(drawn.map((checks) => checks.coderabbit))
|
|
69
|
+
const limited = states.has('rate-limited') ? ` (${RATE_LIMITED_MARK} rate-limited)` : ''
|
|
70
|
+
|
|
71
|
+
states.delete('none')
|
|
72
|
+
|
|
73
|
+
return states.size === 0 ? [] : [`${CODERABBIT_ICON} CodeRabbit${limited}`]
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// What the legend says of the parts the rows draw (`drawn`): only the marks some part draws.
|
|
77
|
+
function legend_of(drawn: ReadonlyArray<PrChecks>): Array<string> {
|
|
78
|
+
const marks = new Set(drawn.flatMap((checks) => marks_of(checks)))
|
|
79
|
+
const shown = CHECK_WORDS.filter(([icon]) => marks.has(icon))
|
|
80
|
+
const icons = shown.map(([icon]) => icon).join(' ')
|
|
81
|
+
const words = shown.map(([, word]) => word).join(' · ')
|
|
82
|
+
const checks = shown.length === 0 ? [] : [`${icons} checks ${words}`]
|
|
83
|
+
|
|
84
|
+
return [...checks, ...coderabbit_legend(drawn)]
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const run_board_render_checks = { checks_part, legend_of }
|
|
54
88
|
|
|
55
89
|
export { run_board_render_checks }
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { run_board_fit } from './run-board-fit'
|
|
2
|
+
import { run_board_fresh } from './run-board-fresh'
|
|
3
|
+
import type { BoardHeader } from './run-board-header'
|
|
4
|
+
import { run_board_labels } from './run-board-labels'
|
|
5
|
+
import { run_board_layout, type BoardRow, type RowReason } from './run-board-layout'
|
|
6
|
+
|
|
7
|
+
// A queued, waiting or done row's condition column, and the issues its wait names after its title
|
|
8
|
+
// (joshuafolkken/kit#4288, #4292) — pure. The column is one width in every section, the widest value's
|
|
9
|
+
// — a 📅 row's or a done row's `MM-DD HH:MM` — so every row's number starts in one column. A value is
|
|
10
|
+
// padded on its drawn width: a linked issue's escape draws nothing.
|
|
11
|
+
|
|
12
|
+
const CONDITION_WIDTH = run_board_labels.day_minute_of(0).length
|
|
13
|
+
const ISSUE_SEPARATOR = ', '
|
|
14
|
+
const FIRST = 1
|
|
15
|
+
|
|
16
|
+
// `+1` for each issue after the first, which follow the title.
|
|
17
|
+
function more_of(issues: ReadonlyArray<string>): string {
|
|
18
|
+
return issues.length > FIRST ? `+${String(issues.length - FIRST)}` : ''
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// How many of the wait's issues the column draws: the first, where it fits with its `+N` — a
|
|
22
|
+
// cross-repo `owner/repo#N` reference overruns the column, so it and the rest follow the title.
|
|
23
|
+
function column_count_of(issues: ReadonlyArray<string>): number {
|
|
24
|
+
const [first] = issues
|
|
25
|
+
|
|
26
|
+
if (first === undefined) return 0
|
|
27
|
+
|
|
28
|
+
return run_board_fit.width_of(`${first}${more_of(issues)}`) <= CONDITION_WIDTH ? FIRST : 0
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// The first issue with its `+N` where the column draws it, else blank.
|
|
32
|
+
function issue_value_of(issues: ReadonlyArray<string>, header: BoardHeader): string {
|
|
33
|
+
const [first = ''] = issues.slice(0, column_count_of(issues))
|
|
34
|
+
|
|
35
|
+
return first === '' ? '' : `${header.link(first)}${more_of(issues)}`
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// The wait's issues, else how long a stage has stood, else the wait's own figure.
|
|
39
|
+
function value_of(reason: RowReason, header: BoardHeader): string {
|
|
40
|
+
const { issues = [], since_ms } = reason
|
|
41
|
+
|
|
42
|
+
if (issues.length > 0) return issue_value_of(issues, header)
|
|
43
|
+
if (since_ms !== undefined) return run_board_labels.span_of(header.now_ms - since_ms)
|
|
44
|
+
|
|
45
|
+
return reason.value ?? ''
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// A finished row's end, `MM-DD HH:MM`, emphasized while fresh (joshuafolkken/kit#4292); blank where
|
|
49
|
+
// the row is not finished or recorded no end.
|
|
50
|
+
function ended_of(row: BoardRow, header: BoardHeader): string {
|
|
51
|
+
const ended_ms = row.status?.ended_ms
|
|
52
|
+
|
|
53
|
+
if (ended_ms === undefined || !run_board_layout.is_finished(row.state)) return ''
|
|
54
|
+
|
|
55
|
+
return run_board_fresh.since(run_board_labels.day_minute_of(ended_ms), ended_ms, header)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// The column as drawn: what the row waits on, else when it finished, else blank.
|
|
59
|
+
function condition_of(row: BoardRow, header: BoardHeader): string {
|
|
60
|
+
const reason_value = row.reason === undefined ? '' : value_of(row.reason, header)
|
|
61
|
+
const value = reason_value === '' ? ended_of(row, header) : reason_value
|
|
62
|
+
const blank = Math.max(0, CONDITION_WIDTH - run_board_fit.width_of(value))
|
|
63
|
+
|
|
64
|
+
return `${value}${' '.repeat(blank)}`
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// The issues the wait names that the column does not draw, which follow the title; `undefined` where
|
|
68
|
+
// it names none.
|
|
69
|
+
function rest_of(reason: RowReason | undefined): ReadonlyArray<string> | undefined {
|
|
70
|
+
const issues = reason?.issues
|
|
71
|
+
|
|
72
|
+
return issues?.slice(column_count_of(issues))
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function linked(issues: ReadonlyArray<string>, header: BoardHeader): string | undefined {
|
|
76
|
+
if (issues.length === 0) return undefined
|
|
77
|
+
|
|
78
|
+
return issues.map((reference) => header.link(reference)).join(ISSUE_SEPARATOR)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// What a row waits on after its title: in a section that draws the condition column, the issues its
|
|
82
|
+
// wait names after the first; any other row — a 🙋 one, or a stalled one whose wait names no issue
|
|
83
|
+
// even there — `🔗` and every blocker still standing.
|
|
84
|
+
function waits_of(row: BoardRow, header: BoardHeader, is_conditioned = false): string | undefined {
|
|
85
|
+
const rest = is_conditioned ? rest_of(row.reason) : undefined
|
|
86
|
+
|
|
87
|
+
if (rest !== undefined) return linked(rest, header)
|
|
88
|
+
|
|
89
|
+
const blockers = linked(row.waits, header)
|
|
90
|
+
|
|
91
|
+
return blockers === undefined ? undefined : `${run_board_labels.WAITS_ICON} ${blockers}`
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const run_board_render_condition = { CONDITION_WIDTH, condition_of, waits_of }
|
|
95
|
+
|
|
96
|
+
export { run_board_render_condition }
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { run_board_header, type BoardHeader } from './run-board-header'
|
|
2
|
+
import { run_board_labels } from './run-board-labels'
|
|
3
|
+
import { run_board_layout, type BoardRow } from './run-board-layout'
|
|
4
|
+
import { run_board_render_checks } from './run-board-render-checks'
|
|
5
|
+
import type { LegendDrawn } from './run-board-render-legend'
|
|
6
|
+
import { run_board_render_tail } from './run-board-render-tail'
|
|
7
|
+
import { run_board_render_waits } from './run-board-render-waits'
|
|
8
|
+
|
|
9
|
+
// What a `run:board` frame draws, read for its legend (joshuafolkken/kit#4047): every icon a phase may be
|
|
10
|
+
// drawn with — the rows' leads, the header's third line and the rows' ends — the activity kinds their
|
|
11
|
+
// words leave unnamed, the header's estimated finish (joshuafolkken/kit#4044), and a followup row's checks
|
|
12
|
+
// (joshuafolkken/kit#3770).
|
|
13
|
+
|
|
14
|
+
const { HEADER_ICONS, NOW_ICONS, WORDS } = run_board_labels
|
|
15
|
+
|
|
16
|
+
function present(icons: ReadonlyArray<string | undefined>): Set<string> {
|
|
17
|
+
return new Set(icons.filter((icon) => icon !== undefined))
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// The lanes rule stands ⏰ over the lanes' times wherever a lanes section is drawn.
|
|
21
|
+
function has_lanes(header: BoardHeader): boolean {
|
|
22
|
+
const { layout } = header
|
|
23
|
+
|
|
24
|
+
return layout !== undefined && run_board_layout.lanes_drawn(layout).length > 0
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// The third line's kinds, ⏰ where the lanes rule stands it over the lanes' times, then the estimated
|
|
28
|
+
// finish.
|
|
29
|
+
function named_of(header: BoardHeader, icons: ReadonlySet<string>): Array<string> {
|
|
30
|
+
const is_operation = icons.has(NOW_ICONS.operation)
|
|
31
|
+
const operation = is_operation ? `${NOW_ICONS.operation} ${WORDS.operation}` : undefined
|
|
32
|
+
const elapsed = has_lanes(header) ? `${HEADER_ICONS.elapsed} ${WORDS.elapsed}` : undefined
|
|
33
|
+
const legends = [
|
|
34
|
+
run_board_header.now_legend(header),
|
|
35
|
+
operation,
|
|
36
|
+
elapsed,
|
|
37
|
+
run_board_header.estimate_legend(header),
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
return legends.filter((legend) => legend !== undefined)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// `leads` is the icons the rows lead with, which the frame's rows already know.
|
|
44
|
+
function drawn_of(
|
|
45
|
+
header: BoardHeader,
|
|
46
|
+
rows: ReadonlyArray<BoardRow>,
|
|
47
|
+
leads: ReadonlySet<string>,
|
|
48
|
+
): LegendDrawn {
|
|
49
|
+
const ends = rows.flatMap((row) => [
|
|
50
|
+
run_board_render_tail.phase_icon(row),
|
|
51
|
+
run_board_render_tail.activity_icon(row, header),
|
|
52
|
+
])
|
|
53
|
+
const icons = present([...leads, run_board_header.now_icon(header), ...ends])
|
|
54
|
+
const checks = rows.flatMap((row) => run_board_render_tail.checks_of(row, header) ?? [])
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
leads,
|
|
58
|
+
icons,
|
|
59
|
+
named: named_of(header, icons),
|
|
60
|
+
checks: run_board_render_checks.legend_of(checks),
|
|
61
|
+
held: run_board_render_waits.legend_of(header),
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const run_board_render_drawn = { drawn_of }
|
|
66
|
+
|
|
67
|
+
export { run_board_render_drawn }
|