@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,198 @@
|
|
|
1
|
+
import { machine_capacity, type MachineSample } from '#scripts/gate/machine-capacity'
|
|
2
|
+
import { run_board_labels, type Paint } from './run-board-labels'
|
|
3
|
+
|
|
4
|
+
// The machine line of `run:board`: whether a quiet run is stuck or only slow on a machine that has
|
|
5
|
+
// run out of room.
|
|
6
|
+
//
|
|
7
|
+
// **The reading is the gate's own** (`machine-capacity.ts`), so the board shows what the core budget
|
|
8
|
+
// admits against. 🔥 is the busy share of the CPU between two samples; 🧠 the kernel's memory pressure,
|
|
9
|
+
// never a GB figure that would disagree with Activity Monitor's "memory used"; 💾 how fast pages are
|
|
10
|
+
// swapped, never how much swap is held — macOS grows its swap files, so a usage share reads near 100%
|
|
11
|
+
// and the amount itself does no harm. A figure that needs two samples is not drawn on the first, and a
|
|
12
|
+
// figure that could not be read is not drawn at all.
|
|
13
|
+
//
|
|
14
|
+
// **Each gauge is green, yellow or red**, the three Activity Monitor draws. 🧠 takes its color from
|
|
15
|
+
// the kernel's pressure verdict, as Activity Monitor does, and from its thresholds only where no
|
|
16
|
+
// verdict was read; 💾 takes no color until it swaps. The three are `GAUGE_SHADES`, so no terminal
|
|
17
|
+
// palette draws them blue or orange.
|
|
18
|
+
|
|
19
|
+
const { GAUGE_SHADES, HEADER_ICONS, bar_of, painted } = run_board_labels
|
|
20
|
+
const PERCENT = 100
|
|
21
|
+
const MS_PER_SECOND = 1000
|
|
22
|
+
const PERCENT_WIDTH = '100%'.length
|
|
23
|
+
const RATE_WIDTH = '3.1M/s'.length
|
|
24
|
+
// Below this a rate keeps one decimal, so `0.4M/s` is not drawn as `0M/s`.
|
|
25
|
+
const RATE_DECIMAL_BELOW = 10
|
|
26
|
+
// The header's gap between its parts, the gauges' as well.
|
|
27
|
+
const GAP = ' '
|
|
28
|
+
|
|
29
|
+
// Where each gauge is full and where it turns yellow and red. **Provisional, not yet measured**: to
|
|
30
|
+
// be tuned against a heavy run's readings.
|
|
31
|
+
const CPU_YELLOW = 70
|
|
32
|
+
const CPU_RED = 90
|
|
33
|
+
const MEMORY_YELLOW = 70
|
|
34
|
+
const MEMORY_RED = 85
|
|
35
|
+
const SWAP_FULL_MB_PER_S = 20
|
|
36
|
+
const SWAP_RED_MB_PER_S = 10
|
|
37
|
+
|
|
38
|
+
type Alert = 'normal' | 'yellow' | 'red'
|
|
39
|
+
|
|
40
|
+
// `kern.memorystatus_vm_pressure_level`'s verdicts.
|
|
41
|
+
const PRESSURE_NORMAL = 1
|
|
42
|
+
const PRESSURE_WARNING = 2
|
|
43
|
+
const PRESSURE_CRITICAL = 4
|
|
44
|
+
const PRESSURE_ALERTS: ReadonlyMap<number, Alert> = new Map([
|
|
45
|
+
[PRESSURE_NORMAL, 'normal'],
|
|
46
|
+
[PRESSURE_WARNING, 'yellow'],
|
|
47
|
+
[PRESSURE_CRITICAL, 'red'],
|
|
48
|
+
])
|
|
49
|
+
|
|
50
|
+
// One sample and the moment it was taken, so a rate is over the time that really passed.
|
|
51
|
+
interface MachineMark {
|
|
52
|
+
sample: MachineSample
|
|
53
|
+
at_ms: number
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
interface MachineGauges {
|
|
57
|
+
cpu_percent: number | undefined
|
|
58
|
+
memory_percent: number | undefined
|
|
59
|
+
swap_mb_per_s: number | undefined
|
|
60
|
+
memory_pressure: number | undefined
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
interface GaugeSpec {
|
|
64
|
+
icon: string
|
|
65
|
+
// The done part's color below the yellow threshold; `undefined` leaves it the terminal's own.
|
|
66
|
+
normal: Paint | undefined
|
|
67
|
+
full: number
|
|
68
|
+
yellow: number
|
|
69
|
+
red: number
|
|
70
|
+
format: (value: number) => string
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function percent_text(value: number): string {
|
|
74
|
+
return `${String(Math.round(value))}%`.padStart(PERCENT_WIDTH)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function rate_text(value: number): string {
|
|
78
|
+
const figure = value < RATE_DECIMAL_BELOW ? value.toFixed(1) : String(Math.round(value))
|
|
79
|
+
|
|
80
|
+
return `${figure}M/s`.padStart(RATE_WIDTH)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const SPECS = {
|
|
84
|
+
cpu: {
|
|
85
|
+
icon: HEADER_ICONS.cpu,
|
|
86
|
+
normal: GAUGE_SHADES.normal,
|
|
87
|
+
full: PERCENT,
|
|
88
|
+
yellow: CPU_YELLOW,
|
|
89
|
+
red: CPU_RED,
|
|
90
|
+
format: percent_text,
|
|
91
|
+
},
|
|
92
|
+
memory: {
|
|
93
|
+
icon: HEADER_ICONS.memory,
|
|
94
|
+
normal: GAUGE_SHADES.normal,
|
|
95
|
+
full: PERCENT,
|
|
96
|
+
yellow: MEMORY_YELLOW,
|
|
97
|
+
red: MEMORY_RED,
|
|
98
|
+
format: percent_text,
|
|
99
|
+
},
|
|
100
|
+
swap: {
|
|
101
|
+
icon: HEADER_ICONS.swap,
|
|
102
|
+
normal: undefined,
|
|
103
|
+
full: SWAP_FULL_MB_PER_S,
|
|
104
|
+
yellow: 1,
|
|
105
|
+
red: SWAP_RED_MB_PER_S,
|
|
106
|
+
format: rate_text,
|
|
107
|
+
},
|
|
108
|
+
} as const satisfies Readonly<Record<string, GaugeSpec>>
|
|
109
|
+
|
|
110
|
+
function cpu_percent(before: MachineMark | undefined, after: MachineMark): number | undefined {
|
|
111
|
+
if (before === undefined) return undefined
|
|
112
|
+
|
|
113
|
+
const share = machine_capacity.busy_share_between(before.sample.cpu, after.sample.cpu)
|
|
114
|
+
|
|
115
|
+
return share === undefined ? undefined : share * PERCENT
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function memory_percent(sample: MachineSample): number | undefined {
|
|
119
|
+
const { available_mb } = sample.memory
|
|
120
|
+
|
|
121
|
+
return available_mb === undefined
|
|
122
|
+
? undefined
|
|
123
|
+
: PERCENT - (available_mb / sample.total_mb) * PERCENT
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function swap_rate(before: MachineMark | undefined, after: MachineMark): number | undefined {
|
|
127
|
+
if (before === undefined) return undefined
|
|
128
|
+
|
|
129
|
+
const swapped = machine_capacity.swapped_between(
|
|
130
|
+
before.sample.memory.swapped_mb,
|
|
131
|
+
after.sample.memory.swapped_mb,
|
|
132
|
+
)
|
|
133
|
+
const seconds = (after.at_ms - before.at_ms) / MS_PER_SECOND
|
|
134
|
+
|
|
135
|
+
return swapped === undefined || seconds <= 0 ? undefined : swapped / seconds
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function gauges_of(before: MachineMark | undefined, after: MachineMark): MachineGauges {
|
|
139
|
+
return {
|
|
140
|
+
cpu_percent: cpu_percent(before, after),
|
|
141
|
+
memory_percent: memory_percent(after.sample),
|
|
142
|
+
swap_mb_per_s: swap_rate(before, after),
|
|
143
|
+
memory_pressure: after.sample.memory.pressure_level,
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function threshold_alert(value: number, spec: Pick<GaugeSpec, 'red' | 'yellow'>): Alert {
|
|
148
|
+
if (value >= spec.red) return 'red'
|
|
149
|
+
|
|
150
|
+
return value >= spec.yellow ? 'yellow' : 'normal'
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// A pressure verdict the kernel gave decides the color; an unread or unknown one falls to the thresholds.
|
|
154
|
+
function alert_of(spec: GaugeSpec, value: number, pressure: number | undefined): Alert {
|
|
155
|
+
const verdict = pressure === undefined ? undefined : PRESSURE_ALERTS.get(pressure)
|
|
156
|
+
|
|
157
|
+
return verdict ?? threshold_alert(value, spec)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Icon, figure, then bar: the figure is what a person reads, and its fixed
|
|
161
|
+
// width keeps every bar starting in one column. The bar stops full past `spec.full`; the figure still
|
|
162
|
+
// says how far past, and takes the warning colors only, so a quiet machine's figures stay the terminal's
|
|
163
|
+
// own.
|
|
164
|
+
function gauge(spec: GaugeSpec, value: number | undefined, pressure?: number): string | undefined {
|
|
165
|
+
if (value === undefined) return undefined
|
|
166
|
+
|
|
167
|
+
const alert = alert_of(spec, value, pressure)
|
|
168
|
+
const warning = alert === 'normal' ? undefined : GAUGE_SHADES[alert]
|
|
169
|
+
const bar = bar_of(value, spec.full, undefined, warning ?? spec.normal)
|
|
170
|
+
|
|
171
|
+
return `${spec.icon} ${painted(warning, spec.format(value))} ${bar}`
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// `undefined` when not one gauge could be read, so the header draws no line at all.
|
|
175
|
+
function line_of(gauges: MachineGauges | undefined): string | undefined {
|
|
176
|
+
if (gauges === undefined) return undefined
|
|
177
|
+
|
|
178
|
+
const parts = [
|
|
179
|
+
gauge(SPECS.cpu, gauges.cpu_percent),
|
|
180
|
+
gauge(SPECS.memory, gauges.memory_percent, gauges.memory_pressure),
|
|
181
|
+
gauge(SPECS.swap, gauges.swap_mb_per_s),
|
|
182
|
+
].filter((part) => part !== undefined)
|
|
183
|
+
|
|
184
|
+
return parts.length === 0 ? undefined : parts.join(GAP)
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const run_board_machine = {
|
|
188
|
+
CPU_YELLOW,
|
|
189
|
+
GAP,
|
|
190
|
+
MEMORY_YELLOW,
|
|
191
|
+
gauges_of,
|
|
192
|
+
line_of,
|
|
193
|
+
percent_text,
|
|
194
|
+
threshold_alert,
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export { run_board_machine }
|
|
198
|
+
export type { Alert, MachineGauges, MachineMark }
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
|
|
2
|
+
import { run_event_filed, type FiledKind } from '#scripts/run/event/run-event-filed'
|
|
3
|
+
import { run_event_scope } from '#scripts/run/event/run-event-scope'
|
|
4
|
+
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
5
|
+
|
|
6
|
+
// The board's findings section: what a run filed, what it parked and the
|
|
7
|
+
// one-line observations it left, read off the event stream alone. A run started from the command line
|
|
8
|
+
// says these in no chat a person reads, so the board is where they surface. Nothing is inferred from a
|
|
9
|
+
// conversation log — an event that is not on the stream is not on the board.
|
|
10
|
+
|
|
11
|
+
type NoteKind = 'filed' | 'park' | 'note'
|
|
12
|
+
|
|
13
|
+
interface BoardNote {
|
|
14
|
+
kind: NoteKind
|
|
15
|
+
at_ms: number
|
|
16
|
+
// The issue the line is about: the filed Issue, the parked child, or the one a note names.
|
|
17
|
+
issue: string | undefined
|
|
18
|
+
text: string
|
|
19
|
+
// Whose work turned up a filed Issue: the lane child, else the Issue the branch names.
|
|
20
|
+
found_during?: string | undefined
|
|
21
|
+
// A filed Issue's classification, which its line leads with.
|
|
22
|
+
filed_kind?: FiledKind | undefined
|
|
23
|
+
// A park waiting on a person's decision, drawn apart from an ordinary park.
|
|
24
|
+
is_decision: boolean
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const KIND = run_event_stream.EVENT_KIND
|
|
28
|
+
// `#<N> parked`, `#<N> parked (<reason>)` and `#<N> waiting on #<M>` lose their leading number, so a
|
|
29
|
+
// waiting park does not name its issue twice.
|
|
30
|
+
const PARK_PREFIX = /^#\d+ (?:parked\s*)?/u
|
|
31
|
+
const PARENTHESES = /^\((?<inner>.*)\)$/u
|
|
32
|
+
|
|
33
|
+
function filed_note(event: RunEvent): BoardNote | undefined {
|
|
34
|
+
const filed = run_event_filed.parse(event.text)
|
|
35
|
+
|
|
36
|
+
if (filed === undefined) return undefined
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
kind: 'filed',
|
|
40
|
+
at_ms: Date.parse(event.at),
|
|
41
|
+
issue: filed.reference.replace(/^#/u, ''),
|
|
42
|
+
text: filed.title,
|
|
43
|
+
found_during: filed.found_during,
|
|
44
|
+
filed_kind: filed.kind,
|
|
45
|
+
is_decision: false,
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// The board's titles by issue number: the plan's listing with its closed children's.
|
|
50
|
+
type Titles = ReadonlyMap<number, string>
|
|
51
|
+
|
|
52
|
+
// `#<N> parked (needs-decision)` reads as the reason `needs-decision`; a bare park has none.
|
|
53
|
+
function reason_of(event: RunEvent): string {
|
|
54
|
+
const rest = event.text.replace(PARK_PREFIX, '')
|
|
55
|
+
|
|
56
|
+
return PARENTHESES.exec(rest)?.groups?.['inner'] ?? rest
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// The parked issue's title with its reason after it; before the plan is read there is no title, and
|
|
60
|
+
// the reason alone is drawn.
|
|
61
|
+
function park_text(title: string | undefined, reason: string): string {
|
|
62
|
+
if (title === undefined) return reason
|
|
63
|
+
|
|
64
|
+
return reason === '' ? title : `${title} (${reason})`
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function park_note(event: RunEvent, titles: Titles): BoardNote {
|
|
68
|
+
const reason = reason_of(event)
|
|
69
|
+
const issue = run_event_scope.issue_named(event)
|
|
70
|
+
const title = issue === undefined ? undefined : titles.get(Number(issue))
|
|
71
|
+
const is_decision = reason.includes(NEEDS_DECISION_LABEL)
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
kind: 'park',
|
|
75
|
+
at_ms: Date.parse(event.at),
|
|
76
|
+
issue,
|
|
77
|
+
text: park_text(title, reason),
|
|
78
|
+
is_decision,
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function plain_note(event: RunEvent): BoardNote {
|
|
83
|
+
const issue = run_event_scope.issue_named(event)
|
|
84
|
+
|
|
85
|
+
return { kind: 'note', at_ms: Date.parse(event.at), issue, text: event.text, is_decision: false }
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function note_of(event: RunEvent, titles: Titles): BoardNote | undefined {
|
|
89
|
+
if (event.kind === KIND.FILED) return filed_note(event)
|
|
90
|
+
if (event.kind === KIND.PARK) return park_note(event, titles)
|
|
91
|
+
|
|
92
|
+
return event.kind === KIND.NOTE ? plain_note(event) : undefined
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Newest first: the line a person glancing at the board needs is the latest one.
|
|
96
|
+
function notes_of(events: ReadonlyArray<RunEvent>, titles: Titles): ReadonlyArray<BoardNote> {
|
|
97
|
+
return events.flatMap((event) => note_of(event, titles) ?? []).toReversed()
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const run_board_notes = { notes_of }
|
|
101
|
+
|
|
102
|
+
export { run_board_notes }
|
|
103
|
+
export type { BoardNote, Titles }
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
2
|
+
import { run_ship_stage } from '#scripts/run/ship/run-ship-stage'
|
|
3
|
+
|
|
4
|
+
// How far a running lane child has got, read from the events that name its issue. **Each phase comes
|
|
5
|
+
// from a record a step already writes**: the launch, the `plan` event `run-event-plan.ts` writes, the
|
|
6
|
+
// `lane-phase` the PreToolUse hook writes at the first implementation edit of each session, the ship
|
|
7
|
+
// supervisor's launch, `josh ship`'s own stage trace and its stop. Nothing is guessed from the clock,
|
|
8
|
+
// so a child that never reaches a record stays on the phase before it rather than being drawn further
|
|
9
|
+
// on.
|
|
10
|
+
//
|
|
11
|
+
// **A child's phases are a history, not a high-water mark**: a ship that stops sends the child back to
|
|
12
|
+
// implement, so a furthest phase that never went back would hold a row on 👀 while it codes again.
|
|
13
|
+
// Each phase is written after the last, and a failed ship's own stages fold into the `ship`, `failed`
|
|
14
|
+
// pair, so the retries read as the count of 🔨 and of 🚢💥. A stage line that lists its attempt
|
|
15
|
+
// redraws that attempt whole (`replayed`).
|
|
16
|
+
|
|
17
|
+
const PHASES = [
|
|
18
|
+
'investigate',
|
|
19
|
+
'plan',
|
|
20
|
+
'implement',
|
|
21
|
+
'ship',
|
|
22
|
+
'review',
|
|
23
|
+
'gate',
|
|
24
|
+
'sync',
|
|
25
|
+
'commit',
|
|
26
|
+
'round_two',
|
|
27
|
+
'followup',
|
|
28
|
+
'report',
|
|
29
|
+
'failed',
|
|
30
|
+
] as const
|
|
31
|
+
|
|
32
|
+
type Phase = (typeof PHASES)[number]
|
|
33
|
+
|
|
34
|
+
const KIND = run_event_stream.EVENT_KIND
|
|
35
|
+
const { STAGE } = run_ship_stage
|
|
36
|
+
// A launched child is investigating until a later record says otherwise — no event marks the start.
|
|
37
|
+
const LAUNCHED_PHASE: Phase = 'investigate'
|
|
38
|
+
const WORD_SEPARATOR = ' '
|
|
39
|
+
const STAGE_INDEX = 1
|
|
40
|
+
|
|
41
|
+
// `josh ship`'s stages, each its own phase; the preflight is the ship's own start.
|
|
42
|
+
const SHIP_PHASES: Readonly<Partial<Record<string, Phase>>> = {
|
|
43
|
+
[STAGE.PREFLIGHT]: 'ship',
|
|
44
|
+
[STAGE.REVIEW]: 'review',
|
|
45
|
+
[STAGE.GATE]: 'gate',
|
|
46
|
+
[STAGE.SYNC]: 'sync',
|
|
47
|
+
[STAGE.COMMIT]: 'commit',
|
|
48
|
+
[STAGE.ROUND_TWO]: 'round_two',
|
|
49
|
+
[STAGE.FOLLOWUP]: 'followup',
|
|
50
|
+
[STAGE.REPORT]: 'report',
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const LANE_PHASES: Readonly<Partial<Record<string, Phase>>> = { implement: 'implement' }
|
|
54
|
+
|
|
55
|
+
// The kinds that mark one phase whatever their text says.
|
|
56
|
+
const KIND_PHASES: Readonly<Partial<Record<string, Phase>>> = {
|
|
57
|
+
[KIND.PLAN]: 'plan',
|
|
58
|
+
[KIND.SHIP_LAUNCH]: 'ship',
|
|
59
|
+
[KIND.SHIP_STOP]: 'failed',
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// The word after the issue — `#<N> <stage> <phase>` carries the stage second.
|
|
63
|
+
function stage_word_of(event: RunEvent): string {
|
|
64
|
+
return event.text.split(WORD_SEPARATOR)[STAGE_INDEX] ?? ''
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// A stage marks its phase when it starts; its `done`, and one a resumed ship passed over, mark none.
|
|
68
|
+
function ship_phase_of(event: RunEvent): Phase | undefined {
|
|
69
|
+
if (!run_event_stream.is_stage_start(event)) return undefined
|
|
70
|
+
|
|
71
|
+
return SHIP_PHASES[stage_word_of(event)]
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// The phase one event marks, or `undefined` for an event that marks none.
|
|
75
|
+
function phase_of(event: RunEvent): Phase | undefined {
|
|
76
|
+
if (event.kind === KIND.LANE_PHASE) return LANE_PHASES[stage_word_of(event)]
|
|
77
|
+
if (event.kind === KIND.SHIP_STAGE) return ship_phase_of(event)
|
|
78
|
+
|
|
79
|
+
return KIND_PHASES[event.kind]
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// A failed ship keeps only its own start: everything after the newest `ship` folds into `failed`.
|
|
83
|
+
function failed_after(track: ReadonlyArray<Phase>): Array<Phase> {
|
|
84
|
+
const ship = track.lastIndexOf('ship')
|
|
85
|
+
|
|
86
|
+
return [...track.slice(0, ship + 1), 'failed']
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// The history after one more phase: the same phase twice in a row — a `ship-launch` and its preflight,
|
|
90
|
+
// a second session's first edit — is written once.
|
|
91
|
+
function history_after(track: ReadonlyArray<Phase>, next: Phase): Array<Phase> {
|
|
92
|
+
if (next === 'failed') return failed_after(track)
|
|
93
|
+
|
|
94
|
+
return track.at(-1) === next ? [...track] : [...track, next]
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const ATTEMPT_PHASES: ReadonlySet<Phase | undefined> = new Set(Object.values(SHIP_PHASES))
|
|
98
|
+
|
|
99
|
+
// The phases a `ship-stage` line says its attempt has started (`run-ship-stage.ts` → `event_text`), in
|
|
100
|
+
// the order they ran and led by the ship's own start, which a resumed ship's passed-over preflight does
|
|
101
|
+
// not list. `undefined` for a line that carries none — an older three-word line is read one phase at a
|
|
102
|
+
// time.
|
|
103
|
+
function attempt_of(event: RunEvent): ReadonlyArray<Phase> | undefined {
|
|
104
|
+
const started = event.kind === KIND.SHIP_STAGE ? run_ship_stage.started_of(event.text) : undefined
|
|
105
|
+
|
|
106
|
+
if (started === undefined) return undefined
|
|
107
|
+
|
|
108
|
+
return [...new Set<Phase>(['ship', ...started.flatMap((stage) => SHIP_PHASES[stage] ?? [])])]
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Where the current ship attempt starts on a track: the first `ship` of the stages that end it, else the
|
|
112
|
+
// end — a failed or re-implemented attempt before it is history, never redrawn. A supervisor restarted
|
|
113
|
+
// with no stop between adds a second `ship` inside the same attempt, which the line redraws whole.
|
|
114
|
+
function attempt_start(track: ReadonlyArray<Phase>): number {
|
|
115
|
+
const tail = track.findLastIndex((phase) => !ATTEMPT_PHASES.has(phase)) + 1
|
|
116
|
+
const ship = track.indexOf('ship', tail)
|
|
117
|
+
|
|
118
|
+
return ship === -1 ? track.length : ship
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// **The newest line restores what the bound dropped**: on a stream full of
|
|
122
|
+
// positions only each issue's newest stage line survives, so the current attempt is redrawn from it, in
|
|
123
|
+
// the order the line lists. A line that misses a phase the track holds — a restarted supervisor's, which
|
|
124
|
+
// lists none of the stages it passed over — is added after them rather than replacing them.
|
|
125
|
+
function replayed(track: ReadonlyArray<Phase>, attempt: ReadonlyArray<Phase>): Array<Phase> {
|
|
126
|
+
const start = attempt_start(track)
|
|
127
|
+
const current = track.slice(start)
|
|
128
|
+
const is_covered = current.every((phase) => attempt.includes(phase))
|
|
129
|
+
|
|
130
|
+
return [...track.slice(0, start), ...(is_covered ? attempt : new Set([...current, ...attempt]))]
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const run_board_phase = { LAUNCHED_PHASE, PHASES, attempt_of, history_after, phase_of, replayed }
|
|
134
|
+
|
|
135
|
+
export { run_board_phase }
|
|
136
|
+
export type { Phase }
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { auto_ok_cli, type OptedInRead } from '#scripts/auto-ok/auto-ok-cli'
|
|
2
|
+
import type { OptedIn } from '#scripts/backlog/backlog-next'
|
|
3
|
+
import type { NamedPlan } from '#scripts/backlog/backlog-plan'
|
|
4
|
+
import { backlog_plan_read, type OpenListing, type Plan } from '#scripts/backlog/backlog-plan-read'
|
|
5
|
+
import { backlog_waves } from '#scripts/backlog/backlog-waves'
|
|
6
|
+
import type { EpicChild } from '#scripts/epic/epic-graph'
|
|
7
|
+
import type { OpenIssueData } from '#scripts/git/git-schemas'
|
|
8
|
+
import type { BoardPlan } from './run-board-layout'
|
|
9
|
+
|
|
10
|
+
// The plan `run:board` lays the run over, scoped to what the run was asked to do.
|
|
11
|
+
// **`--only`** draws the named issues alone — a named epic expanded into its children; **a named prefix
|
|
12
|
+
// without it** draws the named issues first and the opted-in waves after them; **nothing named** draws the
|
|
13
|
+
// opted-in waves. The named issues are classified through the very function `backlog:next`
|
|
14
|
+
// places the pool with, fed as an opted-in set of their own, so an epic is expanded the way the run
|
|
15
|
+
// expands it and no second placement exists to disagree with it.
|
|
16
|
+
|
|
17
|
+
// The reads the plan is drawn from, a seam so each scope is tested without GitHub.
|
|
18
|
+
interface PlanPorts {
|
|
19
|
+
fetch_open: () => Promise<OpenListing | undefined>
|
|
20
|
+
fetch_opted_in: () => Promise<OptedInRead>
|
|
21
|
+
classify: (opted_in: OptedIn, exclude: ReadonlyArray<number>) => Promise<Plan | undefined>
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const LIVE_PORTS: PlanPorts = {
|
|
25
|
+
fetch_open: backlog_plan_read.fetch_open,
|
|
26
|
+
fetch_opted_in: auto_ok_cli.fetch_opted_in,
|
|
27
|
+
classify: backlog_plan_read.classify,
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// One classified plan, against the listing it was read with.
|
|
31
|
+
interface PlanRead {
|
|
32
|
+
listing: OpenListing
|
|
33
|
+
ports: PlanPorts
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// A row the listing read without its labels is left out, so it reads as unknown rather than unlabelled.
|
|
37
|
+
function labels_of(rows: ReadonlyArray<OpenIssueData>): ReadonlyMap<number, ReadonlyArray<string>> {
|
|
38
|
+
const labelled = rows.flatMap((row) =>
|
|
39
|
+
row.labels === undefined ? [] : [[row.number, row.labels.map((label) => label.name)] as const],
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
return new Map(labelled)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async function board_of(
|
|
46
|
+
opted_in: OptedIn,
|
|
47
|
+
exclude: ReadonlyArray<number>,
|
|
48
|
+
read: PlanRead,
|
|
49
|
+
): Promise<BoardPlan | undefined> {
|
|
50
|
+
const plan = await read.ports.classify(opted_in, exclude)
|
|
51
|
+
|
|
52
|
+
if (plan === undefined) return undefined
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
waves: backlog_waves.build(plan.result, plan.repo, plan.scope),
|
|
56
|
+
tracked: plan.tracked,
|
|
57
|
+
context: backlog_plan_read.context_of(plan, read.listing),
|
|
58
|
+
labels: labels_of(read.listing.rows),
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function pool_board(
|
|
63
|
+
exclude: ReadonlyArray<number>,
|
|
64
|
+
read: PlanRead,
|
|
65
|
+
): Promise<BoardPlan | undefined> {
|
|
66
|
+
const opted_in = await read.ports.fetch_opted_in()
|
|
67
|
+
|
|
68
|
+
return opted_in.kind === 'read' ? await board_of(opted_in, exclude, read) : undefined
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// The named issues as the open listing holds them — a closed one is the stream's to show, not the plan's.
|
|
72
|
+
async function named_board(named: NamedPlan, read: PlanRead): Promise<BoardPlan | undefined> {
|
|
73
|
+
const issues = read.listing.rows.filter((row) => named.issues.includes(row.number))
|
|
74
|
+
|
|
75
|
+
return await board_of({ kind: 'read', issues, cutoff: 'none' }, [], read)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function children_of(plan: BoardPlan): Array<EpicChild> {
|
|
79
|
+
return [...plan.waves.waves.flat(), ...plan.waves.unreached]
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function not_held(children: ReadonlyArray<EpicChild>, held: ReadonlySet<number>): Array<EpicChild> {
|
|
83
|
+
return children.filter((child) => !held.has(child.number))
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// The named waves lead and the pool's follow, a child the named plan already holds left out of the pool
|
|
87
|
+
// so a named epic's children are not drawn twice.
|
|
88
|
+
function joined(lead: BoardPlan, pool: BoardPlan): BoardPlan {
|
|
89
|
+
const held = new Set(children_of(lead).map((child) => child.number))
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
waves: {
|
|
93
|
+
waves: [...lead.waves.waves, ...pool.waves.waves.map((wave) => not_held(wave, held))],
|
|
94
|
+
unreached: [...lead.waves.unreached, ...not_held(pool.waves.unreached, held)],
|
|
95
|
+
},
|
|
96
|
+
tracked: new Map([...pool.tracked, ...lead.tracked]),
|
|
97
|
+
context: pool.context,
|
|
98
|
+
labels: pool.labels,
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async function scoped_board(named: NamedPlan, read: PlanRead): Promise<BoardPlan | undefined> {
|
|
103
|
+
const lead = await named_board(named, read)
|
|
104
|
+
|
|
105
|
+
if (lead === undefined || named.only) return lead
|
|
106
|
+
|
|
107
|
+
const pool = await pool_board(named.issues, read)
|
|
108
|
+
|
|
109
|
+
return pool === undefined ? undefined : joined(lead, pool)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// `undefined` is a failed read, which the board answers by keeping the plan it already has.
|
|
113
|
+
async function read_plan(
|
|
114
|
+
named: NamedPlan,
|
|
115
|
+
ports: PlanPorts = LIVE_PORTS,
|
|
116
|
+
): Promise<BoardPlan | undefined> {
|
|
117
|
+
const listing = await ports.fetch_open()
|
|
118
|
+
|
|
119
|
+
if (listing === undefined) return undefined
|
|
120
|
+
|
|
121
|
+
const read = { listing, ports }
|
|
122
|
+
|
|
123
|
+
return named.issues.length === 0 ? await pool_board([], read) : await scoped_board(named, read)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const run_board_plan = { read_plan }
|
|
127
|
+
|
|
128
|
+
export { run_board_plan }
|
|
129
|
+
export type { PlanPorts }
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { NamedPlan } from '#scripts/backlog/backlog-plan'
|
|
2
|
+
import { lane_registry } from '#scripts/lane/lane-registry'
|
|
3
|
+
import { run_carry } from '#scripts/run/carry/run-carry'
|
|
4
|
+
import { run_carry_ended } from '#scripts/run/carry/run-carry-ended'
|
|
5
|
+
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
6
|
+
import { run_board_scope } from './run-board-scope'
|
|
7
|
+
import { run_board_span, type BoardSpan } from './run-board-span'
|
|
8
|
+
|
|
9
|
+
// What `run:board` reads locally each tick: the run's span and scope, its events and its open lanes.
|
|
10
|
+
// The run is the running one, or the one that last ended until the next run begins.
|
|
11
|
+
interface LocalRead {
|
|
12
|
+
started_ms: number
|
|
13
|
+
// Set only once the run has ended; the board then draws its end-of-run screen.
|
|
14
|
+
ended_ms: number | undefined
|
|
15
|
+
// What the run was asked to do, from its invocation.
|
|
16
|
+
scope: NamedPlan
|
|
17
|
+
events: ReadonlyArray<RunEvent>
|
|
18
|
+
lanes: ReadonlyArray<string>
|
|
19
|
+
// The session a stopped run is resumed from; `undefined` otherwise.
|
|
20
|
+
resume: string | undefined
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface SpanHere {
|
|
24
|
+
span: BoardSpan | undefined
|
|
25
|
+
resume: string | undefined
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function span_here(repository: string): SpanHere {
|
|
29
|
+
const read = run_carry.read_carry(run_carry.carry_path(repository))
|
|
30
|
+
const ended = run_carry_ended.read_ended(run_carry_ended.ended_path(repository))
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
span: run_board_span.span_of(read, ended),
|
|
34
|
+
resume: run_board_span.resume_of(read, ended),
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// `undefined` when no run has started here.
|
|
39
|
+
async function read_local(): Promise<LocalRead | undefined> {
|
|
40
|
+
const repository = await run_carry.repository_directory()
|
|
41
|
+
const { span, resume } =
|
|
42
|
+
repository === undefined ? { span: undefined, resume: undefined } : span_here(repository)
|
|
43
|
+
|
|
44
|
+
if (repository === undefined || span === undefined) return undefined
|
|
45
|
+
|
|
46
|
+
const events = run_event_stream.read_events(run_event_stream.target_of(repository))
|
|
47
|
+
const lanes = await lane_registry.list_lanes()
|
|
48
|
+
|
|
49
|
+
return {
|
|
50
|
+
started_ms: span.started_ms,
|
|
51
|
+
ended_ms: span.ended_ms,
|
|
52
|
+
scope: run_board_scope.scope_of(span.invocation),
|
|
53
|
+
events: run_board_span.events_of(events, span),
|
|
54
|
+
lanes: lanes.map((lane) => lane.issue),
|
|
55
|
+
resume,
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const run_board_read = { read_local }
|
|
60
|
+
|
|
61
|
+
export { run_board_read }
|
|
62
|
+
export type { LocalRead }
|