@joshuafolkken/kit 1.1229.0 → 1.1370.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 +50 -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 +24 -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 +27 -16
- package/.claude/skills/workflow-commands/latest-gate.md +18 -29
- 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/.github/workflows/publish.yml +2 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +38 -57
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- 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-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
- 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 +213 -197
- 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 -201
- package/dist/josh.js +540 -137
- 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 +16 -10
- 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 +4 -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 +26 -2
- 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 +162 -0
- package/scripts/gate/core-budget.ts +134 -91
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +103 -35
- package/scripts/gate/gate-report.ts +39 -21
- 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 +313 -0
- 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 +60 -53
- 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 +12 -8
- 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 +35 -0
- 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 +49 -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 +75 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +14 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +46 -37
- 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 +165 -0
- package/scripts/issue/issue-release.ts +58 -0
- 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 +32 -34
- 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 +33 -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 +11 -5
- package/scripts/josh/josh-commands-lane.ts +16 -5
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-maintenance.ts +2 -2
- package/scripts/josh/josh-commands-run.ts +20 -6
- 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 +10 -10
- 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 +20 -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 +44 -30
- 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 +25 -24
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +22 -8
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +27 -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 +140 -0
- 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/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -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-environment.ts +1 -0
- package/scripts/release/github-release-runs.ts +115 -0
- package/scripts/release/github-release.ts +13 -67
- 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 +5 -6
- 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 +68 -37
- 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 +10 -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 +172 -43
- 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 +25 -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 +13 -15
- package/scripts/run/run-step.ts +62 -48
- 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 -33
- package/scripts/run/wake/run-wake-describe.ts +76 -29
- 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 +13 -21
- 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 -328
- 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 +129 -98
- 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/templates/workflows/github-release.yml +4 -0
- package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
- 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,66 @@
|
|
|
1
|
+
import type { CarryRead } from '#scripts/run/carry/run-carry'
|
|
2
|
+
import type { EndedRun } from '#scripts/run/carry/run-carry-ended'
|
|
3
|
+
import { run_event_scope } from '#scripts/run/event/run-event-scope'
|
|
4
|
+
import type { RunEvent } from '#scripts/run/event/run-event-stream'
|
|
5
|
+
|
|
6
|
+
// Which run `run:board` draws: the running one while its carry record is here,
|
|
7
|
+
// else the one `run:carry --end` last ended, kept on screen until the next run begins. Both ends of the
|
|
8
|
+
// span come from a record — the carry's start, the ended run's start and end — never from the screen.
|
|
9
|
+
|
|
10
|
+
// One run to draw. `ended_ms` is set only for a run that has ended.
|
|
11
|
+
interface BoardSpan {
|
|
12
|
+
invocation: string
|
|
13
|
+
started_ms: number
|
|
14
|
+
ended_ms: number | undefined
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const { moment_of } = run_event_scope
|
|
18
|
+
|
|
19
|
+
function ended_span(ended: EndedRun | undefined): BoardSpan | undefined {
|
|
20
|
+
if (ended === undefined) return undefined
|
|
21
|
+
|
|
22
|
+
const started_ms = moment_of(ended.started_at)
|
|
23
|
+
const ended_ms = moment_of(ended.ended_at)
|
|
24
|
+
|
|
25
|
+
if (started_ms === undefined || ended_ms === undefined) return undefined
|
|
26
|
+
|
|
27
|
+
return { invocation: ended.invocation, started_ms, ended_ms }
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// The running run wins over the ended one, so a run that begins replaces the finished board at once.
|
|
31
|
+
// An expired carry is still the running run's budget spent, not a run that ended, so it draws nothing.
|
|
32
|
+
function span_of(read: CarryRead, ended: EndedRun | undefined): BoardSpan | undefined {
|
|
33
|
+
if (read.kind !== 'carried') return read.kind === 'none' ? ended_span(ended) : undefined
|
|
34
|
+
|
|
35
|
+
const started_ms = moment_of(read.carry.started_at)
|
|
36
|
+
|
|
37
|
+
if (started_ms === undefined) return undefined
|
|
38
|
+
|
|
39
|
+
return { invocation: read.carry.invocation, started_ms, ended_ms: undefined }
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// The session a person resumes a stopped run from: only while the ended run is
|
|
43
|
+
// the one drawn, and only when it stopped rather than finished. A run that begins hides it at once.
|
|
44
|
+
function resume_of(read: CarryRead, ended: EndedRun | undefined): string | undefined {
|
|
45
|
+
if (read.kind !== 'none' || ended?.stopped === undefined) return undefined
|
|
46
|
+
|
|
47
|
+
return ended.session
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function is_within(event: RunEvent, span: BoardSpan): boolean {
|
|
51
|
+
const at = moment_of(event.at)
|
|
52
|
+
|
|
53
|
+
if (at === undefined || at < span.started_ms) return false
|
|
54
|
+
|
|
55
|
+
return span.ended_ms === undefined || at <= span.ended_ms
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// The events inside the span: a later run's events never land on an ended run's board.
|
|
59
|
+
function events_of(events: ReadonlyArray<RunEvent>, span: BoardSpan): ReadonlyArray<RunEvent> {
|
|
60
|
+
return events.filter((event) => is_within(event, span))
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const run_board_span = { events_of, resume_of, span_of }
|
|
64
|
+
|
|
65
|
+
export { run_board_span }
|
|
66
|
+
export type { BoardSpan }
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { stripVTControlCharacters } from 'node:util'
|
|
2
|
+
import { run_progress } from '#scripts/run/progress/run-progress'
|
|
3
|
+
import string_width from 'string-width'
|
|
4
|
+
import { run_board_fit, type TerminalSize } from './run-board-fit'
|
|
5
|
+
import { run_board_labels } from './run-board-labels'
|
|
6
|
+
import type { BoardPorts } from './run-board-state'
|
|
7
|
+
|
|
8
|
+
// The spinners of a live `run:board` frame turned between redraws. The frame
|
|
9
|
+
// is redrawn once a second, on the second, and between redraws only the spinners' own cells are written
|
|
10
|
+
// at the package's interval: a cursor move and one character each, with no read, layout or render. The
|
|
11
|
+
// renderer draws a placeholder where a spinner goes, and each placeholder's place on screen — its row
|
|
12
|
+
// after the lines above it wrap, its column by display width — is recorded as the frame is written. A
|
|
13
|
+
// row the frame was cut to the terminal's rows without is not on screen, so it records nothing.
|
|
14
|
+
|
|
15
|
+
// A private-use character one column wide, as a spinner frame is, so the frame is fitted the same.
|
|
16
|
+
const SPOT = '\u{E000}'
|
|
17
|
+
const REDRAW_MS = run_progress.MS_PER_SECOND
|
|
18
|
+
const CSI = '\u{1B}['
|
|
19
|
+
const RESET = `${CSI}0m`
|
|
20
|
+
// eslint-disable-next-line no-control-regex -- the color escapes a spot keeps are control characters
|
|
21
|
+
const SGR = /\u{1B}\[[\d;]*m/gu
|
|
22
|
+
const { SPINNER_INTERVAL_MS, spinner_of } = run_board_labels
|
|
23
|
+
|
|
24
|
+
// Where one spinner is on screen, 1-based, and the colors in effect where it is drawn.
|
|
25
|
+
interface Spot {
|
|
26
|
+
row: number
|
|
27
|
+
column: number
|
|
28
|
+
style: string
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface Spun {
|
|
32
|
+
lines: Array<string>
|
|
33
|
+
spots: Array<Spot>
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
type SpinPorts = Pick<BoardPorts, 'now' | 'sleep' | 'write'>
|
|
37
|
+
|
|
38
|
+
// The spot of the placeholder at `index` in a line that starts `row` rows down the screen.
|
|
39
|
+
function spot_at(line: string, index: number, row: number, columns: number): Spot {
|
|
40
|
+
const before = line.slice(0, index)
|
|
41
|
+
const width = string_width(stripVTControlCharacters(before))
|
|
42
|
+
const style = (before.match(SGR) ?? []).join('')
|
|
43
|
+
|
|
44
|
+
return { row: row + Math.floor(width / columns), column: (width % columns) + 1, style }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function line_spots(line: string, row: number, columns: number): Array<Spot> {
|
|
48
|
+
return [...line.matchAll(new RegExp(SPOT, 'gu'))].map((match) =>
|
|
49
|
+
spot_at(line, match.index, row, columns),
|
|
50
|
+
)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// The frame with each placeholder drawn as `frame`, and every placeholder's spot that is on screen.
|
|
54
|
+
function spun(lines: ReadonlyArray<string>, frame: string, size?: TerminalSize): Spun {
|
|
55
|
+
const columns = Math.max(1, size?.columns ?? Infinity)
|
|
56
|
+
const rows = size?.rows ?? Infinity
|
|
57
|
+
let row = 1
|
|
58
|
+
const spots = lines.flatMap((line) => {
|
|
59
|
+
const found = line_spots(line, row, columns)
|
|
60
|
+
|
|
61
|
+
row += run_board_fit.height_of(line, columns)
|
|
62
|
+
|
|
63
|
+
return found
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
lines: lines.map((line) => line.split(SPOT).join(frame)),
|
|
68
|
+
spots: spots.filter((spot) => spot.row <= rows),
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// One spinner frame at every spot: the cursor moved there, the spot's colors, the frame, then a reset.
|
|
73
|
+
function spin_bytes(spots: ReadonlyArray<Spot>, frame: string): string {
|
|
74
|
+
return spots
|
|
75
|
+
.map((spot) => `${CSI}${String(spot.row)};${String(spot.column)}H${spot.style}${frame}${RESET}`)
|
|
76
|
+
.join('')
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// The next moment the spinner turns, but never past `until_ms`.
|
|
80
|
+
function next_turn(now_ms: number, until_ms: number): number {
|
|
81
|
+
return Math.min(now_ms - (now_ms % SPINNER_INTERVAL_MS) + SPINNER_INTERVAL_MS, until_ms)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async function turn_until(
|
|
85
|
+
spots: ReadonlyArray<Spot>,
|
|
86
|
+
ports: SpinPorts,
|
|
87
|
+
until_ms: number,
|
|
88
|
+
): Promise<void> {
|
|
89
|
+
for (let now = ports.now(); now < until_ms; now = ports.now()) {
|
|
90
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each turn waits for the spinner's next frame
|
|
91
|
+
await ports.sleep(next_turn(now, until_ms) - now)
|
|
92
|
+
const at_ms = ports.now()
|
|
93
|
+
|
|
94
|
+
if (at_ms < until_ms) ports.write(spin_bytes(spots, spinner_of(at_ms)))
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Waits for the next second, turning the spinners until then; a frame with none just waits.
|
|
99
|
+
async function spin_to_second(spots: ReadonlyArray<Spot>, ports: SpinPorts): Promise<void> {
|
|
100
|
+
const now_ms = ports.now()
|
|
101
|
+
const second_ms = now_ms - (now_ms % REDRAW_MS) + REDRAW_MS
|
|
102
|
+
|
|
103
|
+
if (spots.length === 0) {
|
|
104
|
+
await ports.sleep(second_ms - now_ms)
|
|
105
|
+
|
|
106
|
+
return
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
await turn_until(spots, ports, second_ms)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const run_board_spin = { REDRAW_MS, SPOT, spin_bytes, spin_to_second, spun }
|
|
113
|
+
|
|
114
|
+
export { run_board_spin }
|
|
115
|
+
export type { Spot, Spun }
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import type { NamedPlan } from '#scripts/backlog/backlog-plan'
|
|
2
|
+
import type { MachineSample } from '#scripts/gate/machine-capacity'
|
|
3
|
+
import type { ClosedAnswer, ClosedIssue } from './run-board-closed'
|
|
4
|
+
import type { Fetch } from './run-board-fetch'
|
|
5
|
+
import type { TerminalSize } from './run-board-fit'
|
|
6
|
+
import type { BoardForm } from './run-board-header'
|
|
7
|
+
import type { BoardPlan } from './run-board-layout'
|
|
8
|
+
import type { Link } from './run-board-link'
|
|
9
|
+
import type { MachineGauges, MachineMark } from './run-board-machine'
|
|
10
|
+
import type { LocalRead } from './run-board-read'
|
|
11
|
+
import type { Spot } from './run-board-spin'
|
|
12
|
+
import type { LaneUsages, UsageMark } from './run-board-usage'
|
|
13
|
+
|
|
14
|
+
// What a `run:board` redraw reads through and folds forward, shared by the
|
|
15
|
+
// redraw (`run-board-tick.ts`) and its GitHub reads (`run-board-github.ts`).
|
|
16
|
+
|
|
17
|
+
interface BoardPorts {
|
|
18
|
+
read_plan: (scope: NamedPlan) => Promise<BoardPlan | undefined>
|
|
19
|
+
// `undefined` when no run has started here.
|
|
20
|
+
read_local: () => Promise<LocalRead | undefined>
|
|
21
|
+
read_machine: () => Promise<MachineSample>
|
|
22
|
+
// Every process and its lane, the last reading's lanes reused (`run-board-usage-read.ts`).
|
|
23
|
+
read_usage: (before: UsageMark | undefined) => Promise<UsageMark | undefined>
|
|
24
|
+
// The issues that answered as closed, and whether every issue answered (`run-board-closed.ts`).
|
|
25
|
+
read_closed: (issues: ReadonlyArray<number>) => Promise<ClosedAnswer>
|
|
26
|
+
now: () => number
|
|
27
|
+
write: (frame: string) => void
|
|
28
|
+
// Wraps an issue number in a hyperlink where the terminal opens one, and leaves it plain elsewhere.
|
|
29
|
+
link: Link
|
|
30
|
+
// Whether stdout is a terminal — only a terminal gets the alternate screen and the spinner.
|
|
31
|
+
is_tty: boolean
|
|
32
|
+
// The terminal a live frame is kept within, read at every redraw so a resized pane is fitted on the
|
|
33
|
+
// next one; none where the frame is drawn whole — one frame, a pipe, a chat.
|
|
34
|
+
size?: (() => TerminalSize) | undefined
|
|
35
|
+
// The lines a live frame ends on, the first to give way to a short pane.
|
|
36
|
+
footer?: ReadonlyArray<string> | undefined
|
|
37
|
+
form: BoardForm
|
|
38
|
+
// Records that a progress report was just given, as `run:progress --mark` does, so the next scheduled
|
|
39
|
+
// one waits a full interval from here.
|
|
40
|
+
mark: () => Promise<void>
|
|
41
|
+
// Sends one chat frame off-screen, for `--every` alone.
|
|
42
|
+
push: (frame: string) => Promise<void>
|
|
43
|
+
// Runs `leave` however the process ends: a normal exit, Ctrl+C or SIGTERM.
|
|
44
|
+
on_exit: (leave: () => void) => void
|
|
45
|
+
sleep: (ms: number) => Promise<void>
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// `background` launches the GitHub reads and draws without them; `settled` waits for them before
|
|
49
|
+
// drawing.
|
|
50
|
+
type Pace = 'background' | 'settled'
|
|
51
|
+
|
|
52
|
+
interface BoardState {
|
|
53
|
+
// The last local read, drawn until the next is due; `undefined` when no run had started.
|
|
54
|
+
local: LocalRead | undefined
|
|
55
|
+
read_ms: number | undefined
|
|
56
|
+
// The start of the run the plan state was built for, so a run that begins draws nothing of the last.
|
|
57
|
+
run_started_ms: number | undefined
|
|
58
|
+
plan: BoardPlan | undefined
|
|
59
|
+
// The plan read in flight, `undefined` once it has been folded in.
|
|
60
|
+
plan_fetch: Fetch<BoardPlan | undefined> | undefined
|
|
61
|
+
attempted_ms: number | undefined
|
|
62
|
+
fetched_ms: number | undefined
|
|
63
|
+
failed_ms: number | undefined
|
|
64
|
+
baseline_total: number | undefined
|
|
65
|
+
// The run's children read closed, kept for the run: a closed issue's answer does not change.
|
|
66
|
+
closed: ReadonlyMap<number, ClosedIssue>
|
|
67
|
+
closed_fetch: Fetch<ClosedAnswer> | undefined
|
|
68
|
+
closed_attempted_ms: number | undefined
|
|
69
|
+
// The last ask every child answered, open or closed; a failed read leaves it where it was.
|
|
70
|
+
closed_answered_ms: number | undefined
|
|
71
|
+
// The last machine sample, which the next one is compared against, and the gauges drawn from them.
|
|
72
|
+
machine: MachineMark | undefined
|
|
73
|
+
gauges: MachineGauges | undefined
|
|
74
|
+
// The redraw the last sample was taken on, which the next sample is due a second after.
|
|
75
|
+
sampled_ms: number | undefined
|
|
76
|
+
// Where the last frame drew its spinners, turned between redraws.
|
|
77
|
+
spots: ReadonlyArray<Spot>
|
|
78
|
+
// The last process reading, which the next one is compared against, and each lane's usage drawn from
|
|
79
|
+
// them.
|
|
80
|
+
usage: UsageMark | undefined
|
|
81
|
+
usages: LaneUsages | undefined
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const FRESH_STATE: BoardState = {
|
|
85
|
+
local: undefined,
|
|
86
|
+
read_ms: undefined,
|
|
87
|
+
run_started_ms: undefined,
|
|
88
|
+
plan: undefined,
|
|
89
|
+
plan_fetch: undefined,
|
|
90
|
+
attempted_ms: undefined,
|
|
91
|
+
fetched_ms: undefined,
|
|
92
|
+
failed_ms: undefined,
|
|
93
|
+
baseline_total: undefined,
|
|
94
|
+
closed: new Map(),
|
|
95
|
+
closed_fetch: undefined,
|
|
96
|
+
closed_attempted_ms: undefined,
|
|
97
|
+
closed_answered_ms: undefined,
|
|
98
|
+
machine: undefined,
|
|
99
|
+
gauges: undefined,
|
|
100
|
+
sampled_ms: undefined,
|
|
101
|
+
spots: [],
|
|
102
|
+
usage: undefined,
|
|
103
|
+
usages: undefined,
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function is_due(last_ms: number | undefined, interval_ms: number, now_ms: number): boolean {
|
|
107
|
+
return last_ms === undefined || now_ms - last_ms >= interval_ms
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const run_board_state = { FRESH_STATE, is_due }
|
|
111
|
+
|
|
112
|
+
export { run_board_state }
|
|
113
|
+
export type { BoardPorts, BoardState, Pace }
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { backlog_idle, type IdleWindow } from '#scripts/backlog/backlog-idle'
|
|
2
|
+
import {
|
|
3
|
+
has_label_name,
|
|
4
|
+
IN_PROGRESS_LABEL,
|
|
5
|
+
NEEDS_DECISION_LABEL,
|
|
6
|
+
} from '#scripts/issue/issue-labels'
|
|
7
|
+
import { run_event_scope } from '#scripts/run/event/run-event-scope'
|
|
8
|
+
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
9
|
+
import type { ClosedIssue } from './run-board-closed'
|
|
10
|
+
import { run_board_phase, type Phase } from './run-board-phase'
|
|
11
|
+
|
|
12
|
+
// What each issue of a run is doing now, read from the run's own event stream and its open lanes.
|
|
13
|
+
// Local reads only — no `gh` call — so `run:board` can redraw it every few seconds; the plan these
|
|
14
|
+
// statuses are laid over is the slow GitHub half, and so is what a child that left the open listing
|
|
15
|
+
// answers when read closed.
|
|
16
|
+
|
|
17
|
+
type ItemState = 'running' | 'merged' | 'parked' | 'done' | 'waiting' | 'human' | 'stopped'
|
|
18
|
+
|
|
19
|
+
interface ItemStatus {
|
|
20
|
+
state: ItemState
|
|
21
|
+
started_ms?: number | undefined
|
|
22
|
+
ended_ms?: number | undefined
|
|
23
|
+
// The seat-free lane label (`lane <N>`) of a running child, when it holds one — the running test reads
|
|
24
|
+
// it; the board does not draw it.
|
|
25
|
+
lane?: string | undefined
|
|
26
|
+
// Every phase the child passed while running, in order (`run-board-phase.ts`) — kept once it settles.
|
|
27
|
+
track?: ReadonlyArray<Phase> | undefined
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// The run as a whole, read off the same stream.
|
|
31
|
+
interface RunActivity {
|
|
32
|
+
last_event_ms: number | undefined
|
|
33
|
+
// The idle watch's window, when the newest one opened after the newest launch.
|
|
34
|
+
idle: IdleWindow | undefined
|
|
35
|
+
// The run's last position is a `stop` that names no child — the run itself ended.
|
|
36
|
+
is_stopped: boolean
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const KIND = run_event_stream.EVENT_KIND
|
|
40
|
+
const ENDING_STATES: Readonly<Partial<Record<string, ItemState>>> = {
|
|
41
|
+
[KIND.MERGE]: 'merged',
|
|
42
|
+
[KIND.PARK]: 'parked',
|
|
43
|
+
[KIND.SPLIT]: 'done',
|
|
44
|
+
[KIND.STOP]: 'done',
|
|
45
|
+
}
|
|
46
|
+
// A cut or a resume says the child is still running, on whatever phase it had reached.
|
|
47
|
+
const CONTINUING_KINDS: ReadonlySet<string> = new Set([KIND.CUT, KIND.RESUME])
|
|
48
|
+
|
|
49
|
+
function moment(event: RunEvent): number {
|
|
50
|
+
return Date.parse(event.at)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function launched(event: RunEvent): ItemStatus {
|
|
54
|
+
return { state: 'running', started_ms: moment(event), track: [run_board_phase.LAUNCHED_PHASE] }
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// The status a child settles into: its start and the track it had reached, so a settled row still
|
|
58
|
+
// draws how it got there.
|
|
59
|
+
function settled_as(previous: ItemStatus | undefined, state: ItemState): ItemStatus {
|
|
60
|
+
const track = previous?.track
|
|
61
|
+
|
|
62
|
+
return { state, started_ms: previous?.started_ms, ...(track !== undefined && { track }) }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function ended(previous: ItemStatus | undefined, state: ItemState, event: RunEvent): ItemStatus {
|
|
66
|
+
return { ...settled_as(previous, state), ended_ms: moment(event) }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function continued(previous: ItemStatus | undefined): ItemStatus {
|
|
70
|
+
return { state: 'running', started_ms: previous?.started_ms, track: previous?.track }
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// A stage line carrying its attempt redraws the track of any child launched on this stream — a settled
|
|
74
|
+
// one too, since the line that survived a full stream is often the `report` after the merge — and
|
|
75
|
+
// starts one for a running child whose launch has rolled off.
|
|
76
|
+
function replayed(
|
|
77
|
+
previous: ItemStatus | undefined,
|
|
78
|
+
attempt: ReadonlyArray<Phase>,
|
|
79
|
+
): ItemStatus | undefined {
|
|
80
|
+
if (previous === undefined) return previous
|
|
81
|
+
if (previous.track === undefined && previous.state !== 'running') return previous
|
|
82
|
+
|
|
83
|
+
return { ...previous, track: run_board_phase.replayed(previous.track ?? [], attempt) }
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// A phase moves only a running child, so a three-word `report` stage after its merge — or a `plan`
|
|
87
|
+
// event naming an issue no lane has launched — leaves the status as it was.
|
|
88
|
+
function phased(previous: ItemStatus | undefined, event: RunEvent): ItemStatus | undefined {
|
|
89
|
+
const phase = run_board_phase.phase_of(event)
|
|
90
|
+
|
|
91
|
+
if (phase === undefined || previous?.state !== 'running') return previous
|
|
92
|
+
|
|
93
|
+
return { ...previous, track: run_board_phase.history_after(previous.track ?? [], phase) }
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function advanced(previous: ItemStatus | undefined, event: RunEvent): ItemStatus | undefined {
|
|
97
|
+
const attempt = run_board_phase.attempt_of(event)
|
|
98
|
+
|
|
99
|
+
return attempt === undefined ? phased(previous, event) : replayed(previous, attempt)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// One event folded into the status of the child it names; an event the board does not track keeps it.
|
|
103
|
+
function next_status(previous: ItemStatus | undefined, event: RunEvent): ItemStatus | undefined {
|
|
104
|
+
if (event.kind === KIND.CHILD_LAUNCH) return launched(event)
|
|
105
|
+
|
|
106
|
+
const ending = ENDING_STATES[event.kind]
|
|
107
|
+
|
|
108
|
+
if (ending !== undefined) return ended(previous, ending, event)
|
|
109
|
+
|
|
110
|
+
return CONTINUING_KINDS.has(event.kind) ? continued(previous) : advanced(previous, event)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function fold_events(events: ReadonlyArray<RunEvent>): Map<number, ItemStatus> {
|
|
114
|
+
const statuses = new Map<number, ItemStatus>()
|
|
115
|
+
|
|
116
|
+
for (const event of events) {
|
|
117
|
+
const issue = Number(run_event_scope.issue_named(event))
|
|
118
|
+
const status = next_status(statuses.get(issue), event)
|
|
119
|
+
|
|
120
|
+
if (status !== undefined && Number.isSafeInteger(issue)) statuses.set(issue, status)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return statuses
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// A lane is this run's only when its issue is on the run's stream or in the run's plan, so a lane left
|
|
127
|
+
// over from an earlier day is not drawn as this run's child.
|
|
128
|
+
function is_running_lane(
|
|
129
|
+
issue: number,
|
|
130
|
+
status: ItemStatus | undefined,
|
|
131
|
+
in_run: ReadonlySet<number>,
|
|
132
|
+
): boolean {
|
|
133
|
+
if (status === undefined) return in_run.has(issue)
|
|
134
|
+
|
|
135
|
+
return status.state === 'running'
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Every child the run has touched, with the lane each running child holds. A lane the stream never saw
|
|
139
|
+
// launched — a run restored after the stream rolled — still reads as running while its issue is in the
|
|
140
|
+
// run's plan (`in_run`).
|
|
141
|
+
function statuses_of(
|
|
142
|
+
events: ReadonlyArray<RunEvent>,
|
|
143
|
+
lanes: ReadonlyArray<string>,
|
|
144
|
+
in_run: ReadonlySet<number>,
|
|
145
|
+
): ReadonlyMap<number, ItemStatus> {
|
|
146
|
+
const statuses = fold_events(events)
|
|
147
|
+
|
|
148
|
+
for (const lane of lanes) {
|
|
149
|
+
const issue = Number(lane)
|
|
150
|
+
const status = statuses.get(issue)
|
|
151
|
+
|
|
152
|
+
if (is_running_lane(issue, status, in_run)) {
|
|
153
|
+
statuses.set(issue, { state: 'running', ...status, lane: `lane ${lane}` })
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return statuses
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// The open listing the plan was read with, and when it was read.
|
|
161
|
+
interface OpenRead {
|
|
162
|
+
// `undefined` when the listing was cut short, so absence from it proves nothing.
|
|
163
|
+
open_numbers: ReadonlySet<number> | undefined
|
|
164
|
+
read_ms: number | undefined
|
|
165
|
+
// The children read closed from GitHub (`run-board-closed.ts`), by number.
|
|
166
|
+
closed: ReadonlyMap<number, ClosedIssue>
|
|
167
|
+
// Each listed issue's label names, by number; an issue the listing did not hold has none to read.
|
|
168
|
+
labels: ReadonlyMap<number, ReadonlyArray<string>>
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function is_listed_closed(issue: number, read: OpenRead): boolean {
|
|
172
|
+
return read.open_numbers !== undefined && !read.open_numbers.has(issue)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// The listing was read after the child launched, so what it says about the child is this run's.
|
|
176
|
+
function is_read_after_launch(status: ItemStatus, read: OpenRead): boolean {
|
|
177
|
+
return read.read_ms !== undefined && (status.started_ms ?? 0) <= read.read_ms
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// A child launched before the listing was read and missing from it has closed since.
|
|
181
|
+
function is_closed_running(issue: number, status: ItemStatus, read: OpenRead): boolean {
|
|
182
|
+
return is_listed_closed(issue, read) && is_read_after_launch(status, read)
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// What a running child's labels say it is doing, `undefined` where they agree it is running: the child
|
|
186
|
+
// applies `needs-decision` and drops `in-progress` itself when it stops, while the stream's park is
|
|
187
|
+
// written by a parent that may no longer be there.
|
|
188
|
+
function labelled_state(labels: ReadonlyArray<string> | undefined): ItemState | undefined {
|
|
189
|
+
if (labels === undefined) return undefined
|
|
190
|
+
if (has_label_name(labels, NEEDS_DECISION_LABEL)) return 'human'
|
|
191
|
+
|
|
192
|
+
return has_label_name(labels, IN_PROGRESS_LABEL) ? undefined : 'stopped'
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function labelled(issue: number, status: ItemStatus, read: OpenRead): ItemStatus {
|
|
196
|
+
const state = is_read_after_launch(status, read)
|
|
197
|
+
? labelled_state(read.labels.get(issue))
|
|
198
|
+
: undefined
|
|
199
|
+
|
|
200
|
+
return state === undefined ? status : settled_as(status, state)
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// A close dated before the launch is an earlier life of the issue, not how this run's child ended.
|
|
204
|
+
function is_closed_before_launch(status: ItemStatus, closed: ClosedIssue): boolean {
|
|
205
|
+
if (closed.closed_ms === undefined || status.started_ms === undefined) return false
|
|
206
|
+
|
|
207
|
+
return closed.closed_ms < status.started_ms
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// A running child read closed ends when GitHub says it closed, merged or not.
|
|
211
|
+
function closed_status(
|
|
212
|
+
status: ItemStatus,
|
|
213
|
+
closed: ClosedIssue | undefined,
|
|
214
|
+
): ItemStatus | undefined {
|
|
215
|
+
if (closed === undefined || is_closed_before_launch(status, closed)) return undefined
|
|
216
|
+
|
|
217
|
+
const state = closed.is_merged ? 'merged' : 'done'
|
|
218
|
+
|
|
219
|
+
return { ...settled_as(status, state), ended_ms: closed.closed_ms }
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function settled(issue: number, status: ItemStatus, read: OpenRead): ItemStatus {
|
|
223
|
+
if (status.state !== 'running') return status
|
|
224
|
+
|
|
225
|
+
const from_closed = closed_status(status, read.closed.get(issue))
|
|
226
|
+
|
|
227
|
+
if (from_closed !== undefined) return from_closed
|
|
228
|
+
|
|
229
|
+
if (is_closed_running(issue, status, read)) return settled_as(status, 'done')
|
|
230
|
+
|
|
231
|
+
return labelled(issue, status, read)
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// **The stream stays the source of truth; the listing only unsticks it.** A child whose merge never
|
|
235
|
+
// reached the stream would read as running forever, so a running child the plan's open listing no
|
|
236
|
+
// longer holds is drawn finished instead — merged and timed once GitHub was read for it, finished
|
|
237
|
+
// without a time while that read has not answered. One the listing still holds is drawn as its labels
|
|
238
|
+
// say, so a child that stopped with no parent to record it does not read as running.
|
|
239
|
+
function settle_closed(
|
|
240
|
+
statuses: ReadonlyMap<number, ItemStatus>,
|
|
241
|
+
read: OpenRead,
|
|
242
|
+
): ReadonlyMap<number, ItemStatus> {
|
|
243
|
+
return new Map([...statuses].map(([issue, status]) => [issue, settled(issue, status, read)]))
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function newest_of(events: ReadonlyArray<RunEvent>, kind: string): RunEvent | undefined {
|
|
247
|
+
return events.findLast((event) => event.kind === kind)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function idle_of(events: ReadonlyArray<RunEvent>): IdleWindow | undefined {
|
|
251
|
+
const idle = newest_of(events, KIND.IDLE)
|
|
252
|
+
const launch = newest_of(events, KIND.CHILD_LAUNCH)
|
|
253
|
+
|
|
254
|
+
if (idle === undefined || (launch !== undefined && launch.pos > idle.pos)) return undefined
|
|
255
|
+
|
|
256
|
+
return backlog_idle.parse(idle.text)
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function is_run_stop(event: RunEvent | undefined): boolean {
|
|
260
|
+
return event?.kind === KIND.STOP && run_event_scope.issue_named(event) === undefined
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// `is_ended` is a run `run:carry --end` closed: its record says it stopped, whatever its last event
|
|
264
|
+
// was.
|
|
265
|
+
function activity_of(events: ReadonlyArray<RunEvent>, is_ended = false): RunActivity {
|
|
266
|
+
const last = events.at(-1)
|
|
267
|
+
const position = events.findLast((event) => !run_event_stream.TRACE_KINDS.has(event.kind))
|
|
268
|
+
|
|
269
|
+
return {
|
|
270
|
+
last_event_ms: last === undefined ? undefined : moment(last),
|
|
271
|
+
idle: idle_of(events),
|
|
272
|
+
is_stopped: is_ended || is_run_stop(position),
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const run_board_status = { activity_of, settle_closed, statuses_of }
|
|
277
|
+
|
|
278
|
+
export { run_board_status }
|
|
279
|
+
export type { ItemState, ItemStatus, OpenRead, RunActivity }
|