@joshuafolkken/kit 1.1240.0 → 1.1373.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 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +52 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +19 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +26 -16
- package/.claude/skills/workflow-commands/latest-gate.md +17 -28
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +23 -66
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +43 -11
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-7UBFU3CL.js} +18 -20
- package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-7WKYHEGU.js} +8 -44
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-AKGCP4LX.js} +285 -363
- package/dist/hooks/{chunk-QVSWU24O.js → chunk-BZMPVFDY.js} +7 -5
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-XZYKEM6J.js → chunk-JCRDBQXB.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-JGW24KKM.js} +4 -4
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-SLSFIWTX.js} +550 -875
- package/dist/hooks/chunk-UTHMB4O2.js +1590 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-V4TKZHER.js} +4 -4
- package/dist/hooks/chunk-YLBBSSTF.js +3705 -0
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +195 -181
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -187
- package/dist/josh.js +282 -95
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +17 -11
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +3 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +30 -5
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +2 -2
- package/scripts/gate/core-budget.ts +15 -26
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +70 -35
- package/scripts/gate/gate-report.ts +14 -15
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +168 -30
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +53 -51
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +7 -7
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +1 -1
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +24 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +52 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +9 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +34 -38
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +17 -7
- package/scripts/issue/issue-release.ts +3 -3
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +30 -35
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +25 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +4 -5
- package/scripts/josh/josh-commands-lane.ts +14 -4
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-run.ts +21 -7
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +6 -7
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +12 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +2 -2
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +20 -19
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +12 -11
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +16 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +1 -1
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cross-file-recheck.ts +155 -0
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +35 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-runs.ts +1 -1
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +6 -7
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +54 -36
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +9 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +171 -46
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +26 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +64 -18
- package/scripts/run/run-step.ts +107 -51
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -32
- package/scripts/run/wake/run-wake-describe.ts +24 -28
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +9 -9
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -279
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +26 -26
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { WriteStream } from 'node:tty'
|
|
2
|
+
import { styleText } from 'node:util'
|
|
3
|
+
import type { FiledKind } from '#scripts/run/event/run-event-filed'
|
|
4
|
+
import cli_spinners from 'cli-spinners'
|
|
5
|
+
import type { BoardNote } from './run-board-notes'
|
|
6
|
+
import type { Phase } from './run-board-phase'
|
|
7
|
+
import type { ItemState } from './run-board-status'
|
|
8
|
+
|
|
9
|
+
// The words and the clock `run:board` draws with. A moment on the board is a local `HH:MM:SS` clock;
|
|
10
|
+
// how long something has run is a short `MM:SS`, so a person reads the board against the clock on
|
|
11
|
+
// their own screen.
|
|
12
|
+
|
|
13
|
+
const CLOCK_WIDTH = 2
|
|
14
|
+
const CLOCK_PAD = '0'
|
|
15
|
+
const MS_PER_SECOND = 1000
|
|
16
|
+
const SECONDS_PER_MINUTE = 60
|
|
17
|
+
const MINUTES_PER_HOUR = 60
|
|
18
|
+
const MS_PER_MINUTE = MS_PER_SECOND * SECONDS_PER_MINUTE
|
|
19
|
+
// Every gauge is this wide — the plan, the machine and a row's phase.
|
|
20
|
+
const BAR_WIDTH = 10
|
|
21
|
+
// A centered square done and a thin line left: the shapes alone tell the two apart where no color is
|
|
22
|
+
// drawn, and a terminal dims the line so the gauge does not read heavy. The square, not a full block,
|
|
23
|
+
// leaves a gap between stacked bars at line height 1.
|
|
24
|
+
const BAR_DONE = '■'
|
|
25
|
+
const BAR_LEFT = '─'
|
|
26
|
+
const BAR_DONE_COLOR: TextColor = 'cyan'
|
|
27
|
+
const BAR_LEFT_COLOR: TextColor = 'dim'
|
|
28
|
+
// The spinner a running run and a running row turn, at the package's own interval.
|
|
29
|
+
const SPINNER_FRAMES = cli_spinners.dots.frames
|
|
30
|
+
const SPINNER_INTERVAL_MS = cli_spinners.dots.interval
|
|
31
|
+
// The color depth from which a terminal draws a 24-bit color, and the escapes that draw one.
|
|
32
|
+
const RGB_COLOR_DEPTH = 24
|
|
33
|
+
const ESC = '\u{1B}'
|
|
34
|
+
const DEFAULT_FOREGROUND = `${ESC}[39m`
|
|
35
|
+
|
|
36
|
+
// The words the board draws, English whatever the session language: one set of words reads the same
|
|
37
|
+
// on every board. The board draws most of what it says as a symbol; the words left are the ones a
|
|
38
|
+
// symbol cannot carry, and the legend that names the symbols.
|
|
39
|
+
const WORDS = {
|
|
40
|
+
no_run: 'no run',
|
|
41
|
+
plan: 'plan',
|
|
42
|
+
merged: 'merged',
|
|
43
|
+
parked: 'parked',
|
|
44
|
+
done: 'done',
|
|
45
|
+
in_progress: 'running',
|
|
46
|
+
stopped: 'stopped',
|
|
47
|
+
waiting: 'waiting',
|
|
48
|
+
decision: 'decision',
|
|
49
|
+
waits: 'waits on',
|
|
50
|
+
investigate: 'investigate',
|
|
51
|
+
implement: 'implement',
|
|
52
|
+
ship: 'ship',
|
|
53
|
+
review: 'review',
|
|
54
|
+
gate: 'gate',
|
|
55
|
+
sync: 'sync',
|
|
56
|
+
commit: 'commit',
|
|
57
|
+
round_two: 'round-2',
|
|
58
|
+
followup: 'followup',
|
|
59
|
+
report: 'report',
|
|
60
|
+
failed: 'failed',
|
|
61
|
+
idle_until: 'wait ends',
|
|
62
|
+
idle_left: 'left',
|
|
63
|
+
idle_end_idle: 'ends and reports if nothing new',
|
|
64
|
+
idle_end_run: 'ends at the whole-run cut-off and reports',
|
|
65
|
+
next_check: 'next check',
|
|
66
|
+
notes: 'findings and decisions',
|
|
67
|
+
more: 'more',
|
|
68
|
+
filed: 'filed',
|
|
69
|
+
breaking: 'breaking',
|
|
70
|
+
feature: 'feature',
|
|
71
|
+
fix: 'fix',
|
|
72
|
+
park: 'park',
|
|
73
|
+
note: 'note',
|
|
74
|
+
found_during: ' (found during {n})',
|
|
75
|
+
// The session a stopped run waits in, and what closing the board leaves.
|
|
76
|
+
resume: 'stopped — resume with',
|
|
77
|
+
keeps_running: 'Closing this screen leaves the run going · reopen with `pnpm josh backlogrun`',
|
|
78
|
+
} as const
|
|
79
|
+
|
|
80
|
+
type Words = typeof WORDS
|
|
81
|
+
|
|
82
|
+
type TextColor = Parameters<typeof styleText>[0]
|
|
83
|
+
|
|
84
|
+
// A color that does not depend on the terminal's palette: `rgb` as the
|
|
85
|
+
// `38;2;R;G;B` escape takes it, drawn where the output has 24-bit color, and `named` — the palette's own
|
|
86
|
+
// — where it does not.
|
|
87
|
+
interface Shade {
|
|
88
|
+
rgb: string
|
|
89
|
+
named: TextColor
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
type Paint = TextColor | Shade
|
|
93
|
+
|
|
94
|
+
// Every row icon is an emoji a terminal draws two columns wide by default (Emoji_Presentation), so the
|
|
95
|
+
// number after it lines up whichever state a row is in: 🅿 and ☑ are text symbols a terminal such as
|
|
96
|
+
// VSCode's draws one column wide, which would shift a parked or finished row.
|
|
97
|
+
const STATE_ICONS: Readonly<Record<ItemState, string>> = {
|
|
98
|
+
running: '🔄',
|
|
99
|
+
merged: '✅',
|
|
100
|
+
parked: '💤',
|
|
101
|
+
done: '🏁',
|
|
102
|
+
waiting: '⏳',
|
|
103
|
+
human: '🙋',
|
|
104
|
+
stopped: '🛑',
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// The blocking edge, chosen on the same rule: ⛓ is a text symbol.
|
|
108
|
+
const WAITS_ICON = '🔗'
|
|
109
|
+
|
|
110
|
+
// A running row's phases as icons, chosen on the same rule; the row draws every phase it has passed,
|
|
111
|
+
// so the rightmost icon is what it is doing now. Each of `josh ship`'s stages has its own; ⚓ rather
|
|
112
|
+
// than 🔁, which reads as a retry.
|
|
113
|
+
const PHASE_ICONS: Readonly<Record<Phase, string>> = {
|
|
114
|
+
investigate: '🔍',
|
|
115
|
+
plan: '📝',
|
|
116
|
+
implement: '🔨',
|
|
117
|
+
ship: '🚢',
|
|
118
|
+
review: '👀',
|
|
119
|
+
gate: '🚦',
|
|
120
|
+
sync: '🔀',
|
|
121
|
+
commit: '📦',
|
|
122
|
+
round_two: '🔂',
|
|
123
|
+
followup: '⚓',
|
|
124
|
+
report: '📣',
|
|
125
|
+
failed: '💥',
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// The legend's word for each phase — the header's own `plan` where the phase shares one.
|
|
129
|
+
const PHASE_WORDS: Readonly<Record<Phase, keyof Words>> = {
|
|
130
|
+
investigate: 'investigate',
|
|
131
|
+
plan: 'plan',
|
|
132
|
+
implement: 'implement',
|
|
133
|
+
ship: 'ship',
|
|
134
|
+
review: 'review',
|
|
135
|
+
gate: 'gate',
|
|
136
|
+
sync: 'sync',
|
|
137
|
+
commit: 'commit',
|
|
138
|
+
round_two: 'round_two',
|
|
139
|
+
followup: 'followup',
|
|
140
|
+
report: 'report',
|
|
141
|
+
failed: 'failed',
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// The findings section's rule and each note kind's lead, chosen on the same rule and apart from every
|
|
145
|
+
// phase and state icon, so the legend names them and a row needs no word. 🆕 is a filed issue whose
|
|
146
|
+
// kind is none of `FILED_KIND_ICONS`.
|
|
147
|
+
const NOTES_ICON = '📌'
|
|
148
|
+
const NOTE_ICONS: Readonly<Record<BoardNote['kind'], string>> = {
|
|
149
|
+
filed: '🆕',
|
|
150
|
+
park: STATE_ICONS.parked,
|
|
151
|
+
note: '💬',
|
|
152
|
+
}
|
|
153
|
+
// A filed issue's line leads with its kind in place of 🆕: inside the 📌 section a line is already
|
|
154
|
+
// read as a filing, so 🆕 beside the kind would only widen it. 🧨 rather than 💥, which a failed ship
|
|
155
|
+
// draws.
|
|
156
|
+
const FILED_KIND_ICONS: Readonly<Record<FiledKind, string>> = {
|
|
157
|
+
'breaking-change': '🧨',
|
|
158
|
+
bug: '🐛',
|
|
159
|
+
enhancement: '✨',
|
|
160
|
+
}
|
|
161
|
+
// A row leads its title with its kind's icon (joshuafolkken/kit#3577), and one with no kind with as many
|
|
162
|
+
// blank columns, so every title starts in one column. The legend names a kind by its release category.
|
|
163
|
+
const KIND_BLANK = ' '
|
|
164
|
+
const KIND_WORDS: Readonly<Record<FiledKind, keyof Words>> = {
|
|
165
|
+
'breaking-change': 'breaking',
|
|
166
|
+
enhancement: 'feature',
|
|
167
|
+
bug: 'fix',
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// The header's gauges and marks. ⚡ rather than 🔥: a fire beside a gauge drawn green reads as an
|
|
171
|
+
// alarm.
|
|
172
|
+
const HEADER_ICONS = {
|
|
173
|
+
cpu: '⚡',
|
|
174
|
+
memory: '🧠',
|
|
175
|
+
swap: '💾',
|
|
176
|
+
ended: '🔚',
|
|
177
|
+
loading: '⏳',
|
|
178
|
+
} as const
|
|
179
|
+
|
|
180
|
+
// **The machine gauges' three colors, decided here alone**: Activity Monitor's green, yellow and red
|
|
181
|
+
// in the system's dark-mode values. A palette's `green` draws blue and its `red` orange in a VSCode
|
|
182
|
+
// terminal, so the normal gauge would read as the cyan plan bar and the busy one as yellow.
|
|
183
|
+
const GAUGE_SHADES = {
|
|
184
|
+
normal: { rgb: '48;209;88', named: 'green' },
|
|
185
|
+
yellow: { rgb: '255;214;10', named: 'yellow' },
|
|
186
|
+
red: { rgb: '255;69;58', named: 'red' },
|
|
187
|
+
} as const satisfies Readonly<Record<string, Shade>>
|
|
188
|
+
|
|
189
|
+
function two_digits(value: number): string {
|
|
190
|
+
return String(value).padStart(CLOCK_WIDTH, CLOCK_PAD)
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// The local wall-clock `HH:MM:SS` of a moment.
|
|
194
|
+
function clock_of(ms: number): string {
|
|
195
|
+
const date = new Date(ms)
|
|
196
|
+
|
|
197
|
+
return [date.getHours(), date.getMinutes(), date.getSeconds()]
|
|
198
|
+
.map((value) => two_digits(value))
|
|
199
|
+
.join(':')
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// The local wall-clock `HH:MM` of a moment, for one a person reads to the minute — when a run ended, or
|
|
203
|
+
// when a finding was filed.
|
|
204
|
+
function minute_of(ms: number): string {
|
|
205
|
+
const date = new Date(ms)
|
|
206
|
+
|
|
207
|
+
return [date.getHours(), date.getMinutes()].map((value) => two_digits(value)).join(':')
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// How long something has run, as `MM:SS` whose minutes never carry into hours (`61:05`), so the header
|
|
211
|
+
// and every row read one short column; a negative span reads as zero.
|
|
212
|
+
function elapsed_of(ms: number): string {
|
|
213
|
+
const seconds = Math.floor(Math.max(0, ms) / MS_PER_SECOND)
|
|
214
|
+
const minutes = Math.floor(seconds / SECONDS_PER_MINUTE)
|
|
215
|
+
|
|
216
|
+
return `${two_digits(minutes)}:${two_digits(seconds % SECONDS_PER_MINUTE)}`
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// How long is left, as `7h38m`; a deadline already passed reads as zero.
|
|
220
|
+
function left_of(ms: number): string {
|
|
221
|
+
const minutes = Math.floor(Math.max(0, ms) / MS_PER_MINUTE)
|
|
222
|
+
const hours = Math.floor(minutes / MINUTES_PER_HOUR)
|
|
223
|
+
|
|
224
|
+
return `${String(hours)}h${two_digits(minutes % MINUTES_PER_HOUR)}m`
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function is_shade(color: Paint): color is Shade {
|
|
228
|
+
return typeof color === 'object' && 'rgb' in color
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// A shade in 24-bit color where stdout draws it, else its palette color. Whether stdout draws color at
|
|
232
|
+
// all is `styleText`'s answer alone, so a shade draws no escape where its palette color would not.
|
|
233
|
+
function shaded(shade: Shade, text: string): string {
|
|
234
|
+
const named = styleText(shade.named, text)
|
|
235
|
+
|
|
236
|
+
if (named === text || WriteStream.prototype.getColorDepth() < RGB_COLOR_DEPTH) return named
|
|
237
|
+
|
|
238
|
+
return `${ESC}[38;2;${shade.rgb}m${text}${DEFAULT_FOREGROUND}`
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// A part of a gauge in its color; an empty part, or no color, draws no escape. `styleText` drops the
|
|
242
|
+
// escape itself where stdout draws no color (a pipe, `NO_COLOR`), so a gauge never disagrees with the
|
|
243
|
+
// rest of the board about it.
|
|
244
|
+
function painted(color: Paint | undefined, text: string): string {
|
|
245
|
+
if (color === undefined || text === '') return text
|
|
246
|
+
|
|
247
|
+
return is_shade(color) ? shaded(color, text) : styleText(color, text)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// **The one progress bar the board draws** — the header's plan, the machine and every running row's
|
|
251
|
+
// phase: `done` of `total` filled in proportion across `width` cells, the done part in `color`
|
|
252
|
+
// (`undefined` leaves it the terminal's own).
|
|
253
|
+
function bar_of(
|
|
254
|
+
done: number,
|
|
255
|
+
total: number,
|
|
256
|
+
width: number = BAR_WIDTH,
|
|
257
|
+
color: Paint | undefined = BAR_DONE_COLOR,
|
|
258
|
+
): string {
|
|
259
|
+
const filled = total === 0 ? 0 : Math.round((Math.min(done, total) / total) * width)
|
|
260
|
+
|
|
261
|
+
return (
|
|
262
|
+
painted(color, BAR_DONE.repeat(filled)) +
|
|
263
|
+
painted(BAR_LEFT_COLOR, BAR_LEFT.repeat(width - filled))
|
|
264
|
+
)
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// The spinner's frame at a moment, from the clock rather than a count of redraws, so the frame a redraw
|
|
268
|
+
// draws needs no state carried between redraws.
|
|
269
|
+
function spinner_of(now_ms: number): string {
|
|
270
|
+
const step = Math.floor(Math.max(0, now_ms) / SPINNER_INTERVAL_MS)
|
|
271
|
+
|
|
272
|
+
return SPINNER_FRAMES[step % SPINNER_FRAMES.length] ?? ''
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const run_board_labels = {
|
|
276
|
+
FILED_KIND_ICONS,
|
|
277
|
+
GAUGE_SHADES,
|
|
278
|
+
HEADER_ICONS,
|
|
279
|
+
KIND_BLANK,
|
|
280
|
+
KIND_WORDS,
|
|
281
|
+
NOTES_ICON,
|
|
282
|
+
NOTE_ICONS,
|
|
283
|
+
PHASE_ICONS,
|
|
284
|
+
PHASE_WORDS,
|
|
285
|
+
SPINNER_INTERVAL_MS,
|
|
286
|
+
STATE_ICONS,
|
|
287
|
+
WAITS_ICON,
|
|
288
|
+
WORDS,
|
|
289
|
+
bar_of,
|
|
290
|
+
clock_of,
|
|
291
|
+
elapsed_of,
|
|
292
|
+
left_of,
|
|
293
|
+
minute_of,
|
|
294
|
+
painted,
|
|
295
|
+
spinner_of,
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
export { run_board_labels }
|
|
299
|
+
export type { Paint, TextColor, Words }
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { backlog_plan, type PlanContext } from '#scripts/backlog/backlog-plan'
|
|
2
|
+
import type { WavePlan } from '#scripts/backlog/backlog-waves'
|
|
3
|
+
import type { EpicChild } from '#scripts/epic/epic-graph'
|
|
4
|
+
import type { IssueReference } from '#scripts/epic/epic-reference'
|
|
5
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
6
|
+
import { has_label_name, NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
|
|
7
|
+
import type { FiledKind } from '#scripts/run/event/run-event-filed'
|
|
8
|
+
import { run_board_kind } from './run-board-kind'
|
|
9
|
+
import type { ItemState, ItemStatus } from './run-board-status'
|
|
10
|
+
|
|
11
|
+
// The plan with each issue's status laid over it — pure, so the order the board
|
|
12
|
+
// draws is tested apart from the screen. **The order is the plan's**: the waves are `backlog_waves.build`'s,
|
|
13
|
+
// the same play-forward `backlog:plan --waves` prints, so a merge, a park or a new arrival that changes the
|
|
14
|
+
// plan changes the board with it. The plan leaves out what a run already holds or has closed, so those
|
|
15
|
+
// rows come from the stream instead, in the leading active section.
|
|
16
|
+
//
|
|
17
|
+
// **An epic and its children are a tree; every other dependency is not.** A child an opted-in epic
|
|
18
|
+
// tracks is drawn under its epic; a `blocked_by` edge is a DAG, so it stays a waiting-on note at the end of the row.
|
|
19
|
+
|
|
20
|
+
interface BoardPlan {
|
|
21
|
+
waves: WavePlan
|
|
22
|
+
// Which opted-in epic tracks which child (`Plan.tracked`).
|
|
23
|
+
tracked: ReadonlyMap<number, number>
|
|
24
|
+
context: PlanContext
|
|
25
|
+
// Each issue's label names as the open listing read them, so a running row is drawn as its labels
|
|
26
|
+
// say it stopped.
|
|
27
|
+
labels: ReadonlyMap<number, ReadonlyArray<string>>
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
interface BoardRow {
|
|
31
|
+
number: number
|
|
32
|
+
title: string | undefined
|
|
33
|
+
// The release category its labels place it in (joshuafolkken/kit#3577), none for an Other Change.
|
|
34
|
+
kind: FiledKind | undefined
|
|
35
|
+
state: ItemState
|
|
36
|
+
status: ItemStatus | undefined
|
|
37
|
+
// The standing blockers this row still waits on, as the plan names them.
|
|
38
|
+
waits: ReadonlyArray<string>
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
type WaveEntry =
|
|
42
|
+
| { kind: 'row'; row: BoardRow }
|
|
43
|
+
| { kind: 'epic'; epic: number; title: string | undefined; rows: Array<BoardRow> }
|
|
44
|
+
|
|
45
|
+
interface BoardLayout {
|
|
46
|
+
active: ReadonlyArray<BoardRow>
|
|
47
|
+
waves: ReadonlyArray<ReadonlyArray<WaveEntry>>
|
|
48
|
+
people: ReadonlyArray<BoardRow>
|
|
49
|
+
unreached: ReadonlyArray<BoardRow>
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// What an active row is named and classified by — each issue's title and labels.
|
|
53
|
+
interface RowRead {
|
|
54
|
+
titles: ReadonlyMap<number, string>
|
|
55
|
+
labels: ReadonlyMap<number, ReadonlyArray<string>>
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
interface Overlay {
|
|
59
|
+
plan: BoardPlan
|
|
60
|
+
statuses: ReadonlyMap<number, ItemStatus>
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const SETTLED_STATES: ReadonlySet<ItemState> = new Set(['merged', 'parked', 'done'])
|
|
64
|
+
|
|
65
|
+
function is_settled(state: ItemState): boolean {
|
|
66
|
+
return SETTLED_STATES.has(state)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// A blocker the plan still names, unless the stream has already seen it merge — the plan was read up
|
|
70
|
+
// to two minutes ago, and a merge since then is no longer worth waiting on.
|
|
71
|
+
function is_waiting_on(edge: IssueReference, overlay: Overlay): boolean {
|
|
72
|
+
const { context } = overlay.plan
|
|
73
|
+
const is_merged =
|
|
74
|
+
edge.repo === context.repo && overlay.statuses.get(edge.number)?.state === 'merged'
|
|
75
|
+
|
|
76
|
+
return !is_merged && backlog_plan.is_standing(edge, context)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function reference_of(edge: IssueReference, repo: string): string {
|
|
80
|
+
return edge.repo === repo ? String(edge.number) : issue_cite.plain(edge.number, edge.repo)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function plan_row(child: EpicChild, state: ItemState, overlay: Overlay): BoardRow {
|
|
84
|
+
const { context } = overlay.plan
|
|
85
|
+
const waits = child.blocked_by
|
|
86
|
+
.filter((edge) => is_waiting_on(edge, overlay))
|
|
87
|
+
.map((edge) => reference_of(edge, context.repo))
|
|
88
|
+
|
|
89
|
+
return {
|
|
90
|
+
number: child.number,
|
|
91
|
+
title: context.titles.get(child.number),
|
|
92
|
+
kind: run_board_kind.kind_of(child.labels),
|
|
93
|
+
state,
|
|
94
|
+
status: undefined,
|
|
95
|
+
waits,
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function started_of(row: BoardRow): number {
|
|
100
|
+
return row.status?.started_ms ?? Infinity
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Every child the run has touched, in the order each started.
|
|
104
|
+
function active_rows(statuses: ReadonlyMap<number, ItemStatus>, read: RowRead): Array<BoardRow> {
|
|
105
|
+
const rows = [...statuses].map(([number, status]) => ({
|
|
106
|
+
number,
|
|
107
|
+
title: read.titles.get(number),
|
|
108
|
+
kind: run_board_kind.kind_of(read.labels.get(number)),
|
|
109
|
+
state: status.state,
|
|
110
|
+
status,
|
|
111
|
+
waits: [],
|
|
112
|
+
}))
|
|
113
|
+
|
|
114
|
+
return rows.toSorted((left, right) => started_of(left) - started_of(right))
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// The epic row carries its own title, read from the same open listing as its children's — an opted-in
|
|
118
|
+
// epic is an open issue.
|
|
119
|
+
function place_in_epic(
|
|
120
|
+
entries: Array<WaveEntry>,
|
|
121
|
+
epic: number,
|
|
122
|
+
overlay: Overlay,
|
|
123
|
+
row: BoardRow,
|
|
124
|
+
): void {
|
|
125
|
+
const group = entries.find((entry) => entry.kind === 'epic' && entry.epic === epic)
|
|
126
|
+
const title = overlay.plan.context.titles.get(epic)
|
|
127
|
+
|
|
128
|
+
if (group?.kind === 'epic') group.rows.push(row)
|
|
129
|
+
else entries.push({ kind: 'epic', epic, title, rows: [row] })
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function is_untouched(child: EpicChild, overlay: Overlay): boolean {
|
|
133
|
+
return !overlay.statuses.has(child.number)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function is_human(child: EpicChild): boolean {
|
|
137
|
+
return has_label_name(child.labels, NEEDS_DECISION_LABEL)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// A wave row waits, unless it waits on a person's decision — the one wait the board marks.
|
|
141
|
+
function wave_state(child: EpicChild): ItemState {
|
|
142
|
+
return is_human(child) ? 'human' : 'waiting'
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// One wave, its rows in the plan's order, an epic's children gathered under the epic where the first
|
|
146
|
+
// of them falls.
|
|
147
|
+
function wave_entries(wave: ReadonlyArray<EpicChild>, overlay: Overlay): Array<WaveEntry> {
|
|
148
|
+
const entries: Array<WaveEntry> = []
|
|
149
|
+
|
|
150
|
+
for (const child of wave) {
|
|
151
|
+
const row = plan_row(child, wave_state(child), overlay)
|
|
152
|
+
const epic = overlay.plan.tracked.get(child.number)
|
|
153
|
+
|
|
154
|
+
if (epic === undefined) entries.push({ kind: 'row', row })
|
|
155
|
+
else place_in_epic(entries, epic, overlay, row)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return entries
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function unreached_rows(overlay: Overlay, is_people: boolean): Array<BoardRow> {
|
|
162
|
+
const state: ItemState = is_people ? 'human' : 'waiting'
|
|
163
|
+
|
|
164
|
+
return overlay.plan.waves.unreached
|
|
165
|
+
.filter((child) => is_untouched(child, overlay) && is_human(child) === is_people)
|
|
166
|
+
.map((child) => plan_row(child, state, overlay))
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function layout_of(plan: BoardPlan, statuses: ReadonlyMap<number, ItemStatus>): BoardLayout {
|
|
170
|
+
const overlay = { plan, statuses }
|
|
171
|
+
const waves = plan.waves.waves.map((wave) =>
|
|
172
|
+
wave_entries(
|
|
173
|
+
wave.filter((child) => is_untouched(child, overlay)),
|
|
174
|
+
overlay,
|
|
175
|
+
),
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
return {
|
|
179
|
+
active: active_rows(statuses, { titles: plan.context.titles, labels: plan.labels }),
|
|
180
|
+
waves: waves.filter((wave) => wave.length > 0),
|
|
181
|
+
people: unreached_rows(overlay, true),
|
|
182
|
+
unreached: unreached_rows(overlay, false),
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const EMPTY_LAYOUT: BoardLayout = { active: [], waves: [], people: [], unreached: [] }
|
|
187
|
+
|
|
188
|
+
// The run's own children before the plan is read: the stream and the lanes are local and read at
|
|
189
|
+
// once, so the rows, their states and how long each has run are drawn while GitHub answers; the titles
|
|
190
|
+
// and every issue the run has not touched wait for the plan.
|
|
191
|
+
function local_layout_of(statuses: ReadonlyMap<number, ItemStatus>): BoardLayout {
|
|
192
|
+
return {
|
|
193
|
+
...EMPTY_LAYOUT,
|
|
194
|
+
active: active_rows(statuses, { titles: new Map(), labels: new Map() }),
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Every issue the plan holds, wave or unreached — the run's scope a lane is checked against.
|
|
199
|
+
function numbers_of(plan: BoardPlan): ReadonlySet<number> {
|
|
200
|
+
return new Set([...plan.waves.waves.flat(), ...plan.waves.unreached].map((child) => child.number))
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Every row the layout draws, an epic's children among them — what the header counts and the legend reads.
|
|
204
|
+
function rows_of(layout: BoardLayout): Array<BoardRow> {
|
|
205
|
+
const waves = layout.waves
|
|
206
|
+
.flat()
|
|
207
|
+
.flatMap((entry) => (entry.kind === 'row' ? [entry.row] : entry.rows))
|
|
208
|
+
|
|
209
|
+
return [...layout.active, ...waves, ...layout.people, ...layout.unreached]
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const run_board_layout = {
|
|
213
|
+
EMPTY_LAYOUT,
|
|
214
|
+
is_settled,
|
|
215
|
+
layout_of,
|
|
216
|
+
local_layout_of,
|
|
217
|
+
numbers_of,
|
|
218
|
+
rows_of,
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export { run_board_layout }
|
|
222
|
+
export type { BoardLayout, BoardPlan, BoardRow, WaveEntry }
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// The issue numbers on `run:board` open their GitHub issue: each is wrapped in
|
|
2
|
+
// an OSC 8 terminal hyperlink, so VSCode's terminal opens it on Cmd+click while the visible text stays
|
|
3
|
+
// the number. A reference is drawn the way the plan names it — `3450` for this repository's issue,
|
|
4
|
+
// `owner/repo#12` for one elsewhere — and links to the repository it names.
|
|
5
|
+
//
|
|
6
|
+
// The columns are padded on the text before it is linked: the escape draws nothing, but `padEnd`
|
|
7
|
+
// counts it. Whether a terminal gets the escape at all is the `link` port's answer.
|
|
8
|
+
|
|
9
|
+
const GITHUB_URL_PREFIX = 'https://github.com/'
|
|
10
|
+
const QUALIFIED = /^(?<repo>[^#]+)#(?<number>\d+)$/u
|
|
11
|
+
|
|
12
|
+
type Link = (text: string, url: string) => string
|
|
13
|
+
|
|
14
|
+
// `owner/repo#12` names its own repository; a bare number names `repo`'s.
|
|
15
|
+
function issue_url(reference: string, repo: string): string {
|
|
16
|
+
const { repo: target = repo, number = reference } = QUALIFIED.exec(reference)?.groups ?? {}
|
|
17
|
+
|
|
18
|
+
return `${GITHUB_URL_PREFIX}${target}/issues/${number}`
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// A board with no plan read yet knows no repository, so its references stay plain text.
|
|
22
|
+
function linker(repo: string | undefined, link: Link): (reference: string) => string {
|
|
23
|
+
if (repo === undefined) return (reference) => reference
|
|
24
|
+
|
|
25
|
+
return (reference) => link(reference, issue_url(reference, repo))
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const run_board_link = { issue_url, linker }
|
|
29
|
+
|
|
30
|
+
export { run_board_link }
|
|
31
|
+
export type { Link }
|