@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
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
// `josh ship "<title> #<N>"` — the one call that ships a finished change
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
// into
|
|
5
|
-
//
|
|
6
|
-
//
|
|
1
|
+
// `josh ship "<title> #<N>"` — the one call that ships a finished change. It folds the fixed
|
|
2
|
+
// commit-to-report region — the gate, the commit/push/PR (`git -y`), the CI-wait merge (`followup`)
|
|
3
|
+
// and the report bookkeeping (`run:tail`) — into one composite, extending the post-merge fold of
|
|
4
|
+
// `run:tail` into the body of the region. The region is fixed procedure; the one decision it
|
|
5
|
+
// carried — disposing of a review finding — stays in front of this command, so nothing a reader had
|
|
6
|
+
// to judge is folded away.
|
|
7
7
|
//
|
|
8
8
|
// **This module is the pure half**, kept apart from the chaining CLI the way `run-tail.ts` is. Unlike
|
|
9
9
|
// `run:tail`, ship stops at the first failed step: a red gate must never reach the commit, so the
|
|
10
10
|
// composite ends at the failure, and the report names the step that failed so the run reads only it.
|
|
11
11
|
|
|
12
|
+
import { run_section, type Section } from '#scripts/run/run-section'
|
|
13
|
+
|
|
12
14
|
const PREFLIGHT_HEADER = '=== preflight ==='
|
|
13
15
|
const PRE_DETACH_HEADER = '=== pre-detach checks ==='
|
|
14
16
|
const REVIEW_HEADER = '=== review ==='
|
|
@@ -18,52 +20,35 @@ const COMMIT_HEADER = '=== commit/push/PR ==='
|
|
|
18
20
|
const ROUND_TWO_HEADER = '=== round-2 review ==='
|
|
19
21
|
const FOLLOWUP_HEADER = '=== followup ==='
|
|
20
22
|
const REPORT_HEADER = '=== report ==='
|
|
21
|
-
const SECTION_SEPARATOR = '\n\n'
|
|
22
23
|
const STOPPED_PREFIX = 'stopped at: '
|
|
23
|
-
// The body of a stage a resumed ship passed over
|
|
24
|
+
// The body of a stage a resumed ship passed over — a success, so the report
|
|
24
25
|
// still shows every stage under its header and the reader sees which ones this call did not repeat.
|
|
25
26
|
const SKIPPED_BODY = 'skipped — already done'
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
interface ShipSection {
|
|
31
|
-
header: string
|
|
32
|
-
body: string
|
|
33
|
-
code: number
|
|
34
|
-
// The paths a stopped merge left unmerged (joshuafolkken/kit#3221), handed to the stop prompt.
|
|
28
|
+
type ShipSection = Section & {
|
|
29
|
+
// The paths a stopped merge left unmerged, handed to the stop prompt.
|
|
35
30
|
conflicts?: ReadonlyArray<string>
|
|
36
31
|
}
|
|
37
32
|
|
|
38
|
-
function section_report(section: ShipSection): string {
|
|
39
|
-
return `${section.header}\n${section.body}`
|
|
40
|
-
}
|
|
41
|
-
|
|
42
33
|
// The step that stopped the ship, or `undefined` when every executed step was green. Because the
|
|
43
34
|
// composite breaks at the first failure, this is the last section whenever one exists.
|
|
44
35
|
function failed_section(sections: ReadonlyArray<ShipSection>): ShipSection | undefined {
|
|
45
|
-
return sections.find((section) => section.code !== SUCCESS_EXIT_CODE)
|
|
36
|
+
return sections.find((section) => section.code !== run_section.SUCCESS_EXIT_CODE)
|
|
46
37
|
}
|
|
47
38
|
|
|
48
39
|
// The executed steps under their headers, closed with the name of the step that stopped the run so the
|
|
49
40
|
// reader sees which one to fix without counting sections.
|
|
50
41
|
function format_report(sections: ReadonlyArray<ShipSection>): string {
|
|
51
|
-
const body =
|
|
42
|
+
const body = run_section.format_sections(sections)
|
|
52
43
|
const failed = failed_section(sections)
|
|
53
44
|
|
|
54
45
|
if (failed === undefined) return body
|
|
55
46
|
|
|
56
|
-
return `${body}${SECTION_SEPARATOR}${STOPPED_PREFIX}${failed.header}`
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Non-zero when any executed step failed — the composite only ever collects a failed step as its last,
|
|
60
|
-
// so this reads the same clean/red verdict as the loop that stopped there.
|
|
61
|
-
function exit_code(sections: ReadonlyArray<ShipSection>): number {
|
|
62
|
-
const is_clean = sections.every((section) => section.code === SUCCESS_EXIT_CODE)
|
|
63
|
-
|
|
64
|
-
return is_clean ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
|
|
47
|
+
return `${body}${run_section.SECTION_SEPARATOR}${STOPPED_PREFIX}${failed.header}`
|
|
65
48
|
}
|
|
66
49
|
|
|
50
|
+
// The exit code is non-zero when any executed step failed — the composite only ever collects a failed
|
|
51
|
+
// step as its last, so it reads the same clean/red verdict as the loop that stopped there.
|
|
67
52
|
const run_ship = {
|
|
68
53
|
COMMIT_HEADER,
|
|
69
54
|
FOLLOWUP_HEADER,
|
|
@@ -76,7 +61,7 @@ const run_ship = {
|
|
|
76
61
|
SKIPPED_BODY,
|
|
77
62
|
SYNC_HEADER,
|
|
78
63
|
STOPPED_PREFIX,
|
|
79
|
-
exit_code,
|
|
64
|
+
exit_code: run_section.exit_code_of,
|
|
80
65
|
failed_section,
|
|
81
66
|
format_report,
|
|
82
67
|
}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { backlog_drive_restore } from '#scripts/backlog/backlog-drive-restore'
|
|
3
4
|
import { issue_merged } from '#scripts/issue/issue-merged'
|
|
5
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
4
6
|
import { run_tidy } from './run-tidy'
|
|
5
7
|
import { run_tidy_lanes, type IsMerged } from './run-tidy-lanes'
|
|
6
8
|
import { run_tidy_stashes } from './run-tidy-stashes'
|
|
7
9
|
|
|
8
|
-
// `josh run:tidy` — sweep what merged work left behind at a run's start
|
|
9
|
-
//
|
|
10
|
-
// Both used to wait for a person — `lane:list` flagged a merged lane, `run:carry --end` printed the
|
|
11
|
-
// closed-issue stashes — and a batch ran with two of six seats held by finished work until someone did.
|
|
10
|
+
// `josh run:tidy` — sweep what merged work left behind at a run's start: the lanes still holding a
|
|
11
|
+
// seat after their issue merged, and the stashes whose issues are all merged.
|
|
12
12
|
//
|
|
13
13
|
// `run:hold` calls `sweep` once a claim succeeds, so every `fullrun` / `halfrun` start runs it; a
|
|
14
14
|
// `backlogrun` runs the command itself in its once-per-repository preparation, beside `lane:prune`.
|
|
15
15
|
// **The sweep never fails the run that called it**: the report goes to standard error, where
|
|
16
16
|
// `run:hold`'s one-token standard output is not disturbed, and a failed read is a note, not an exit.
|
|
17
|
+
// A lane the running `backlogrun` still has in flight is left to its `run:merge`.
|
|
17
18
|
|
|
18
19
|
const FAILURE_NOTE = 'run:tidy could not finish; merged lanes and stashes may remain:'
|
|
19
20
|
|
|
@@ -33,7 +34,10 @@ function memoized(read: IsMerged): IsMerged {
|
|
|
33
34
|
async function sweep(): Promise<void> {
|
|
34
35
|
try {
|
|
35
36
|
const read_merged = memoized(issue_merged.read_merged)
|
|
36
|
-
const
|
|
37
|
+
const in_flight = backlog_drive_restore.active_issues(
|
|
38
|
+
await run_event_stream_emit.current_events(),
|
|
39
|
+
)
|
|
40
|
+
const lanes = await run_tidy_lanes.tidy_lanes(read_merged, in_flight)
|
|
37
41
|
const stashes = await run_tidy_stashes.tidy_stashes(read_merged)
|
|
38
42
|
const report = run_tidy.format_report([...lanes, ...stashes])
|
|
39
43
|
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { git_spawn } from '#scripts/git/git-spawn'
|
|
2
2
|
import { git_stash } from '#scripts/git/stash/git-stash'
|
|
3
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
3
4
|
import { lane_close } from '#scripts/lane/lane-close'
|
|
4
5
|
import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
|
|
5
6
|
import { error_text } from '#scripts/lib/error-message'
|
|
6
7
|
import { run_hold } from '#scripts/run/hold/run-hold'
|
|
7
8
|
import { run_tidy, type Outcome, type Verdict } from './run-tidy'
|
|
8
9
|
|
|
9
|
-
// The lane half of `josh run:tidy
|
|
10
|
-
//
|
|
11
|
-
//
|
|
10
|
+
// The lane half of `josh run:tidy`: each lane whose issue merged, read for what would make closing it
|
|
11
|
+
// lose work, then closed with its run record released. A lane whose work tree is already gone is
|
|
12
|
+
// `lane:prune`'s, so it is left to that command. A lane the running `backlogrun` still has in flight
|
|
13
|
+
// is left to its `run:merge`: closed here, it would leave the run with no `merge` event, no ledger
|
|
14
|
+
// line and no merged count.
|
|
12
15
|
|
|
13
16
|
const CLOSED_KIND = 'closed'
|
|
14
17
|
const INCOMPLETE_REASON = 'the close left files behind'
|
|
@@ -87,20 +90,28 @@ async function settle(lane: LaneInfo): Promise<Verdict> {
|
|
|
87
90
|
}
|
|
88
91
|
}
|
|
89
92
|
|
|
90
|
-
async function tidy_lane(
|
|
93
|
+
async function tidy_lane(
|
|
94
|
+
lane: LaneInfo,
|
|
95
|
+
is_merged: IsMerged,
|
|
96
|
+
in_flight: ReadonlySet<string>,
|
|
97
|
+
): Promise<Outcome | undefined> {
|
|
98
|
+
if (in_flight.has(lane.issue)) return undefined
|
|
91
99
|
if (lane.is_stranded || !(await is_merged(lane.issue))) return undefined
|
|
92
100
|
|
|
93
|
-
return { target: `lane
|
|
101
|
+
return { target: `lane ${session_cite.issue(lane.issue)}`, verdict: await settle(lane) }
|
|
94
102
|
}
|
|
95
103
|
|
|
96
104
|
// One lane at a time: a close removes a work tree and prunes the worktree list the next read uses.
|
|
97
|
-
async function tidy_lanes(
|
|
105
|
+
async function tidy_lanes(
|
|
106
|
+
is_merged: IsMerged,
|
|
107
|
+
in_flight: ReadonlySet<string> = new Set(),
|
|
108
|
+
): Promise<Array<Outcome>> {
|
|
98
109
|
const outcomes: Array<Outcome> = []
|
|
99
110
|
const lanes = await lane_registry.list_lanes()
|
|
100
111
|
|
|
101
112
|
for (const lane of lanes) {
|
|
102
113
|
// eslint-disable-next-line no-await-in-loop -- a close prunes the worktree list the next one reads
|
|
103
|
-
const outcome = await tidy_lane(lane, is_merged)
|
|
114
|
+
const outcome = await tidy_lane(lane, is_merged, in_flight)
|
|
104
115
|
|
|
105
116
|
if (outcome !== undefined) outcomes.push(outcome)
|
|
106
117
|
}
|
|
@@ -7,18 +7,18 @@ import { observation_ledger_home } from '#scripts/observations/observation-ledge
|
|
|
7
7
|
import { run_tidy, type Outcome, type Verdict } from './run-tidy'
|
|
8
8
|
import type { IsMerged } from './run-tidy-lanes'
|
|
9
9
|
|
|
10
|
-
// The stash half of `josh run:tidy
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
10
|
+
// The stash half of `josh run:tidy`: each entry whose named issues are all merged is dropped, and one
|
|
11
|
+
// that touches the observation ledger has its lines carried into the ledger first. The ledger is
|
|
12
|
+
// append-only and the digest counts repeats across it, so an entry's lines are never discarded with
|
|
13
|
+
// the entry.
|
|
14
14
|
|
|
15
15
|
// The same width `run-carry-stash.ts` reads issue states at.
|
|
16
16
|
const READ_CONCURRENCY = 8
|
|
17
17
|
const GONE_REASON = 'already dropped by another run'
|
|
18
18
|
const BUSY_REASON = 'another run held the stash sweep lock'
|
|
19
19
|
|
|
20
|
-
// An entry
|
|
21
|
-
//
|
|
20
|
+
// An older entry may hold its lines at an old single-file path, so the lines of every ledger path it
|
|
21
|
+
// touches are carried to the current ledger. The reads are independent, and the
|
|
22
22
|
// lines come back in path order however the reads finish.
|
|
23
23
|
async function added_ledger_lines(
|
|
24
24
|
hash: string,
|
|
@@ -34,8 +34,8 @@ async function added_ledger_lines(
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
// How many ledger lines went into the running work tree's ledger before the drop. The duplicate check
|
|
37
|
-
// reads every issue's file, and the lines land in the file this tree writes
|
|
38
|
-
//
|
|
37
|
+
// reads every issue's file, and the lines land in the file this tree writes, so
|
|
38
|
+
// the run's own commit takes them to the default branch.
|
|
39
39
|
async function carry_ledger(hash: string): Promise<number> {
|
|
40
40
|
const changed = await git_stash.changed_paths(hash)
|
|
41
41
|
const ledger_paths = changed.filter((file_path) => observation_ledger.is_ledger_path(file_path))
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
1
2
|
import { observation_ledger_line } from '#scripts/observations/observation-ledger-line'
|
|
2
3
|
|
|
3
|
-
// The decisions behind `josh run:tidy
|
|
4
|
-
//
|
|
4
|
+
// The decisions behind `josh run:tidy`, kept apart from the git and GitHub reads so each
|
|
5
|
+
// can be pinned without either. A run start sweeps what merged work left behind — the
|
|
5
6
|
// lanes holding a seat after their branch merged, and the stashes of issues that are all merged — and
|
|
6
7
|
// every rule here is written so that doubt keeps the thing: a lane with any uncommitted change or any
|
|
7
8
|
// commit no remote has, and a stash naming any issue that is not merged or naming none at all, stay.
|
|
@@ -52,7 +53,7 @@ function lane_verdict(facts: LaneFacts): Verdict | undefined {
|
|
|
52
53
|
}
|
|
53
54
|
|
|
54
55
|
function unmerged_reason(unmerged: ReadonlyArray<string>): string {
|
|
55
|
-
const named = unmerged.map((issue) =>
|
|
56
|
+
const named = unmerged.map((issue) => session_cite.issue(issue)).join(', ')
|
|
56
57
|
|
|
57
58
|
return `${named} not merged`
|
|
58
59
|
}
|
|
@@ -18,10 +18,9 @@ import { run_wake_restart, type RestartPorts } from './run-wake-restart'
|
|
|
18
18
|
import { run_wake_session, type LaunchResult } from './run-wake-session'
|
|
19
19
|
|
|
20
20
|
// `josh run:wake --start | --list | --stop | --loop` — the supervisor that continues a cut
|
|
21
|
-
// `backlogrun` or `queue` without a person retyping the keyword
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
// from that module's own constants or refused.
|
|
21
|
+
// `backlogrun` or `queue` without a person retyping the keyword. **Which invocations it may continue
|
|
22
|
+
// is `run-invocation.ts`'s answer**, not this file's: nothing here reads the recorded text, it is
|
|
23
|
+
// handed to `wake_argv` and either rebuilt from that module's own constants or refused.
|
|
25
24
|
//
|
|
26
25
|
// The stdout/stderr split is the contract every `run:*` command shares: exactly one verdict token on
|
|
27
26
|
// stdout on every path, the reason and the advice on stderr, so a loop branches on one token.
|
|
@@ -56,26 +55,24 @@ const UNKNOWN_VERDICT = 'unknown'
|
|
|
56
55
|
const FAILED_VERDICT = 'failed'
|
|
57
56
|
|
|
58
57
|
// **The note covers both ways `wake_argv` answers `undefined`**, because it cannot tell them apart and
|
|
59
|
-
// a message that named only the first would accuse a legitimate invocation of carrying unsafe text
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
//
|
|
58
|
+
// a message that named only the first would accuse a legitimate invocation of carrying unsafe text.
|
|
59
|
+
// The second is the one a person actually meets: a `queue` whose references carry a `owner/repo#`
|
|
60
|
+
// prefix is a grammar this supervisor does not rebuild, and `queue.md` → "The session boundary" is why
|
|
61
|
+
// such a queue begins no record in the first place.
|
|
63
62
|
const UNSAFE_INVOCATION_NOTE =
|
|
64
63
|
'the carried invocation is not one this supervisor can continue — it is neither a backlogrun nor a queue it can rebuild, or it carries text that may not be passed to a command line'
|
|
65
|
-
// The command rather than one entry point:
|
|
66
|
-
// `
|
|
67
|
-
//
|
|
64
|
+
// The command rather than one entry point: the supervisor continues a `queue` as readily as a
|
|
65
|
+
// `backlogrun`, and a warning that named the wrong one would send the reader looking at a run that is
|
|
66
|
+
// not the one that stopped.
|
|
68
67
|
const WARNING_TITLE = 'run:wake supervisor'
|
|
69
68
|
const WARNING_RECOVERY = `Check the wake command, then restart with \`pnpm josh run:wake --start\`.`
|
|
70
|
-
// **The stop reasons that reach a person, and what each one tells them
|
|
71
|
-
//
|
|
72
|
-
// `
|
|
73
|
-
//
|
|
69
|
+
// **The stop reasons that reach a person, and what each one tells them.** A reason mapped to
|
|
70
|
+
// `undefined` is one where nothing went wrong: `ended` is the run finishing through `run:carry --end`,
|
|
71
|
+
// `stopped` is a person's own `--stop` or a supervisor being superseded, and a warning channel that
|
|
72
|
+
// fired on those is one that stops being read.
|
|
74
73
|
//
|
|
75
|
-
// **`expired` and `unreadable`
|
|
76
|
-
//
|
|
77
|
-
// off, so the run is left asleep with nothing anywhere saying so — a silent overnight failure, while
|
|
78
|
-
// only the `failed` reason was wired to the notification.
|
|
74
|
+
// **`expired` and `unreadable` warn**, because both end the supervisor while a carry record is still
|
|
75
|
+
// sitting there handed off, so the run would otherwise be left asleep with nothing anywhere saying so.
|
|
79
76
|
// **Every reason is listed, and the silent two are listed as `undefined`.** A partial map would let a
|
|
80
77
|
// sixth stop reason compile straight past this and reach nobody, which is the defect class this
|
|
81
78
|
// section exists to close.
|
|
@@ -145,7 +142,7 @@ async function resolve_context(): Promise<WakeContext | undefined> {
|
|
|
145
142
|
|
|
146
143
|
// Every verb reaches this one function, so creating the log here is what makes the path each of
|
|
147
144
|
// them prints a path that exists — including `--list` and the already-running branch of `--start`,
|
|
148
|
-
// neither of which launches anything
|
|
145
|
+
// neither of which launches anything.
|
|
149
146
|
run_wake_session.ensure_log(log_target, note_to_stderr)
|
|
150
147
|
|
|
151
148
|
return {
|
|
@@ -178,7 +175,7 @@ function wake_session(
|
|
|
178
175
|
if (built.kind === 'rejected') return { kind: 'failed', note: built.note }
|
|
179
176
|
|
|
180
177
|
// The headless mark is what lets the stop hook hold this session's turn open while its lanes run —
|
|
181
|
-
// under `claude -p` a turn-end is the process's end (`run-headless.ts
|
|
178
|
+
// under `claude -p` a turn-end is the process's end (`run-headless.ts`).
|
|
182
179
|
const environment = run_headless.environment()
|
|
183
180
|
const target = { cwd: context.worktree, env: environment, log_path: context.log_target }
|
|
184
181
|
|
|
@@ -224,10 +221,9 @@ async function warn_of_stop(stop: LoopStop, body: string, context: WakeContext):
|
|
|
224
221
|
})
|
|
225
222
|
}
|
|
226
223
|
|
|
227
|
-
// **Only a failed wake exits non-zero
|
|
228
|
-
//
|
|
229
|
-
//
|
|
230
|
-
// exit code, and changing both at once would break a caller to fix a silence.
|
|
224
|
+
// **Only a failed wake exits non-zero; `expired` and `unreadable` warn but exit zero.** The
|
|
225
|
+
// verdict-and-exit-code table in `docs/josh-commands-automation.md` is a contract callers branch on,
|
|
226
|
+
// and what those two need is the notification, not a different exit code.
|
|
231
227
|
function exit_code_of(reason: WakeStopReason): number {
|
|
232
228
|
return reason === run_wake_loop.FAILED_REASON ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
|
|
233
229
|
}
|
|
@@ -235,7 +231,7 @@ function exit_code_of(reason: WakeStopReason): number {
|
|
|
235
231
|
// A failure that reached nobody is the defect, so the Telegram goes out before the verdict is printed.
|
|
236
232
|
// Which stops reach a person, and what each one says — `undefined` for the two where nothing went
|
|
237
233
|
// wrong. It is a function rather than a bare lookup so the decision can be asserted for every reason
|
|
238
|
-
// the loop can end on
|
|
234
|
+
// the loop can end on.
|
|
239
235
|
function stop_body(reason: WakeStopReason): string | undefined {
|
|
240
236
|
return STOP_BODIES[reason]
|
|
241
237
|
}
|
|
@@ -256,8 +252,8 @@ function spawn_supervisor(context: WakeContext, interval: string | undefined): n
|
|
|
256
252
|
if (profile === undefined) return report(FAILED_VERDICT, FAILURE_EXIT_CODE)
|
|
257
253
|
const argv = run_wake_session.supervisor_argv(SCRIPT_PATH, interval)
|
|
258
254
|
// **The supervisor's own output goes to the same file as the sessions it starts.** It is detached
|
|
259
|
-
// with the same call, so
|
|
260
|
-
//
|
|
255
|
+
// with the same call, so otherwise its `console.error` — the launch note that says the agent CLI is
|
|
256
|
+
// not on `PATH`, and the stop note behind every warning — would go nowhere at all.
|
|
261
257
|
const result = run_wake_session.launch(
|
|
262
258
|
{
|
|
263
259
|
argv,
|
|
@@ -297,9 +293,8 @@ function start(context: WakeContext, interval: string | undefined): number {
|
|
|
297
293
|
return spawn_supervisor(context, interval)
|
|
298
294
|
}
|
|
299
295
|
|
|
300
|
-
// **The loop removes its record on the way out, and only its own
|
|
301
|
-
//
|
|
302
|
-
// run then went on with nobody watching it.
|
|
296
|
+
// **The loop removes its record on the way out, and only its own.** A loop that ended after its record
|
|
297
|
+
// was taken over must not delete the *successor's* record, or the run goes on with nobody watching it.
|
|
303
298
|
//
|
|
304
299
|
// **`superseded` is announced, because the two ways of ending look identical otherwise.** A `--stop`
|
|
305
300
|
// and a take-over both leave this loop reporting `stopped` at exit 0, so a supervisor that was
|
|
@@ -322,7 +317,7 @@ function restart_ports(context: WakeContext, ports: LoopPorts, interval_ms: numb
|
|
|
322
317
|
}
|
|
323
318
|
|
|
324
319
|
// A failed pass is restarted while the carry record is still resumable (`run-wake-restart.ts`), so
|
|
325
|
-
// only a failure past the restart bound reaches `finish` and its warning
|
|
320
|
+
// only a failure past the restart bound reaches `finish` and its warning.
|
|
326
321
|
// **The record is claimed once and held across every restart**, so a `--stop` landing in the pause
|
|
327
322
|
// between two passes still finds it, signals this process, and the next pass reads the removal as the
|
|
328
323
|
// person's stop rather than claiming a fresh record and resuming.
|
|
@@ -6,9 +6,8 @@ import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
|
6
6
|
import { run_liveness } from '#scripts/run/run-liveness'
|
|
7
7
|
import { run_wake, type RunWake, type WakeDecision, type WakeDecisionInput } from './run-wake'
|
|
8
8
|
|
|
9
|
-
// The `--list` presentation of a wake record
|
|
10
|
-
//
|
|
11
|
-
// record reads back to a person lives here, one cohesive block.
|
|
9
|
+
// The `--list` presentation of a wake record. What the command *does* stays in `run-wake-cli.ts`; how
|
|
10
|
+
// a supervisor's record reads back to a person lives here, one cohesive block.
|
|
12
11
|
|
|
13
12
|
const UNKNOWN_CUTS = 'an unreadable number of'
|
|
14
13
|
const REPO_LOOKUP_TIMEOUT_MS = 10_000
|
|
@@ -21,14 +20,13 @@ const UNREADABLE_TIME = 'an unreadable time'
|
|
|
21
20
|
interface WakeContext {
|
|
22
21
|
carry_target: string
|
|
23
22
|
wake_target: string
|
|
24
|
-
// Where everything this supervisor starts writes its output
|
|
23
|
+
// Where everything this supervisor starts writes its output. It is named
|
|
25
24
|
// in `--list` and in every warning, because a path nobody is told is a file nobody reads.
|
|
26
25
|
log_target: string
|
|
27
26
|
// The run's event stream, keyed on the primary checkout's git directory — the one the resumed
|
|
28
27
|
// `backlogrun` parent runs in, so its own git directory is this common one, exactly the key the emit
|
|
29
28
|
// side uses. `--list` relays the newest event from here: the report surface belongs to the run, and
|
|
30
|
-
// `--list` is the degenerate last-event read of the same stream the attached session follows
|
|
31
|
-
// (joshuafolkken/kit#2207).
|
|
29
|
+
// `--list` is the degenerate last-event read of the same stream the attached session follows.
|
|
32
30
|
event_target: string
|
|
33
31
|
worktree: string
|
|
34
32
|
}
|
|
@@ -39,10 +37,9 @@ function carry_cuts(read: CarryRead): string {
|
|
|
39
37
|
return UNKNOWN_CUTS
|
|
40
38
|
}
|
|
41
39
|
|
|
42
|
-
// **A wake that has gone out and has not been answered is said out loud
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
// shown nothing to check. `attempts` is present only while a cut is unserved, which is why its
|
|
40
|
+
// **A wake that has gone out and has not been answered is said out loud.** Read from `woke` and `cuts`
|
|
41
|
+
// alone, the forty minutes a supervisor spends retrying one lost cut look exactly like the second
|
|
42
|
+
// before its first launch. `attempts` is present only while a cut is unserved, which is why its
|
|
46
43
|
// absence is what prints nothing.
|
|
47
44
|
function outstanding_line(wake: RunWake): string | undefined {
|
|
48
45
|
if (wake.attempts === undefined) return undefined
|
|
@@ -50,10 +47,10 @@ function outstanding_line(wake: RunWake): string | undefined {
|
|
|
50
47
|
return `${String(wake.attempts)} launch(es) outstanding for the current cut, none claimed yet`
|
|
51
48
|
}
|
|
52
49
|
|
|
53
|
-
// **Why the supervisor is not launching, and until when
|
|
54
|
-
//
|
|
55
|
-
//
|
|
56
|
-
//
|
|
50
|
+
// **Why the supervisor is not launching, and until when.** A supervisor that waits writes nothing to
|
|
51
|
+
// its log, so without this `--list` would show a stalled run and a waiting one alike. The state is
|
|
52
|
+
// `run_wake.decide`'s own answer rather than a second reading of the record: an `idle_since` mark is
|
|
53
|
+
// the last pass having found no work, so it is fed back in as `has_work: false`.
|
|
57
54
|
function wait_input(wake: RunWake, read: CarryRead, now: Date): WakeDecisionInput {
|
|
58
55
|
return {
|
|
59
56
|
read,
|
|
@@ -100,26 +97,25 @@ function wait_line(wake: RunWake, read: CarryRead, now: Date): string | undefine
|
|
|
100
97
|
}
|
|
101
98
|
|
|
102
99
|
// The run's stream, read here because a headless parent's progress reaches its own transcript alone —
|
|
103
|
-
// after a cut, `--list` is the person's one window onto it
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
//
|
|
107
|
-
// rather than the ambient one
|
|
108
|
-
//
|
|
109
|
-
// always shown.
|
|
100
|
+
// after a cut, `--list` is the person's one window onto it. Two lines: the newest event (the
|
|
101
|
+
// degenerate last-event read of the stream the board pane draws, so `--list` and the pane read one
|
|
102
|
+
// stream rather than two paths), and how to watch on from here in a pane of its own — `run:board`, the
|
|
103
|
+
// same surface before and after the cut, with `tail -F` on the raw stream named as a recovery path
|
|
104
|
+
// rather than the ambient one. The event line is omitted before the first event, the way
|
|
105
|
+
// `outstanding_line` omits a count of zero; the watch line is always shown.
|
|
110
106
|
function stream_lines(context: WakeContext): Array<string> {
|
|
111
107
|
const event = run_event_stream.read_last(context.event_target)
|
|
112
108
|
const progress = event === undefined ? [] : [`progress: ${run_event_stream.format_event(event)}`]
|
|
113
|
-
const follow = `watch: \`pnpm josh run:
|
|
109
|
+
const follow = `watch: \`pnpm josh run:board\` in a pane of its own (recover with \`tail -F ${context.event_target}\`)`
|
|
114
110
|
|
|
115
111
|
return [...progress, follow]
|
|
116
112
|
}
|
|
117
113
|
|
|
118
114
|
// The wake count is printed beside the carry record's `cuts` rather than alone, because their relation
|
|
119
115
|
// is the property worth being able to check — one wake per cut, plus one per crashed session the
|
|
120
|
-
// supervisor recovered
|
|
121
|
-
//
|
|
122
|
-
//
|
|
116
|
+
// supervisor recovered, so `woke >= cuts` and the gap is the recoveries. `woke < cuts` is the
|
|
117
|
+
// shortfall that says a cut went unserved; `woke` counts records actually claimed rather than sessions
|
|
118
|
+
// started.
|
|
123
119
|
// **The outstanding line beside it is what makes a shortfall readable**: the count is observed at a
|
|
124
120
|
// poll, so it lags a claim by up to one interval, and launches still outstanding are what say whether
|
|
125
121
|
// a missing wake is one not yet seen or one that never arrived.
|
|
@@ -136,8 +132,8 @@ function describe_wake(wake: RunWake, context: WakeContext, now: Date = new Date
|
|
|
136
132
|
wait_line(wake, read, now),
|
|
137
133
|
run_liveness.describe_agent_state(context.log_target),
|
|
138
134
|
`output: ${context.log_target}`,
|
|
139
|
-
// How progress is seen without asking after the cut: the run's stream, followed from here
|
|
140
|
-
//
|
|
135
|
+
// How progress is seen without asking after the cut: the run's stream, followed from here.
|
|
136
|
+
// `--list` is that reader's one-shot last-event form.
|
|
141
137
|
...stream_lines(context),
|
|
142
138
|
`stop it with \`${STOP_COMMAND}\``,
|
|
143
139
|
]
|
|
@@ -145,7 +141,7 @@ function describe_wake(wake: RunWake, context: WakeContext, now: Date = new Date
|
|
|
145
141
|
.join('\n')
|
|
146
142
|
}
|
|
147
143
|
|
|
148
|
-
// The description as a person reads it, every issue on it a number-link
|
|
144
|
+
// The description as a person reads it, every issue on it a number-link. The
|
|
149
145
|
// invocation and the newest event both name issues (`backlogrun #1 #2`, `#1904 merged`), and a report
|
|
150
146
|
// that copies them bare is what the Stop guard sends back. The repository is asked here, bounded, rather
|
|
151
147
|
// than in the context every verb resolves: only the two describing verbs print it, and a lookup that
|
|
@@ -28,8 +28,8 @@ function is_final_stop(verdict: string | undefined, read: CarryRead): boolean {
|
|
|
28
28
|
return verdict?.startsWith('stop') === true && read.kind === 'none'
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
// **The details are the driver's whole stderr, so only their tail is handed on, and it goes last
|
|
32
|
-
//
|
|
31
|
+
// **The details are the driver's whole stderr, so only their tail is handed on, and it goes last.**
|
|
32
|
+
// The stderr carries every command the driver ran since it started, which
|
|
33
33
|
// after a long run is tens of kilobytes — far past what `is_safe_value` lets into an argv element. Its
|
|
34
34
|
// tail is where the reason for stopping is; placing it last means the cap `wake_argv` applies to the
|
|
35
35
|
// whole prompt can only ever cut into the details, never the verdict, the resume line or the epic note.
|
|
@@ -39,11 +39,11 @@ function details_tail(details: string): string {
|
|
|
39
39
|
: details
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
// **The hand-off names its next move, so the woken session never searches the procedure for it
|
|
43
|
-
//
|
|
44
|
-
//
|
|
42
|
+
// **The hand-off names its next move, so the woken session never searches the procedure for it.**
|
|
43
|
+
// Whatever the branch, the session acts on it and hands the loop back to the supervisor with a cut;
|
|
44
|
+
// only a person's stop ends the run instead.
|
|
45
45
|
//
|
|
46
|
-
// **The claim comes first
|
|
46
|
+
// **The claim comes first.** The supervisor hands the record off before the
|
|
47
47
|
// wake, so until the session adopts it with `--resume` every count it writes — `--merged`, `--done`,
|
|
48
48
|
// the closing `--cut` — is refused as advancing a handed-off budget, and the supervisor, seeing no
|
|
49
49
|
// claim, ends the run as a failed wake.
|
|
@@ -100,9 +100,9 @@ function driver_result(
|
|
|
100
100
|
return { kind: 'judgment', material: handoff_material(verdict, resume, invocation, details) }
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
-
// **The cause is the driver's stdout `error …` line, so it leads the note
|
|
104
|
-
//
|
|
105
|
-
//
|
|
103
|
+
// **The cause is the driver's stdout `error …` line, so it leads the note.** `backlog:drive` prints an
|
|
104
|
+
// exception only to stdout, and its stderr is never empty — every command it ran is there — so reading
|
|
105
|
+
// `err ?? out` would drop the one line that says why. The stderr follows as its
|
|
106
106
|
// tail, for the same reason `details_tail` cuts a judgment's details.
|
|
107
107
|
function cause_of(out: string): string {
|
|
108
108
|
const errors = out.split('\n').filter((line) => line.startsWith(ERROR_PREFIX))
|
|
@@ -133,11 +133,11 @@ function claim_record(target: string, invocation: string): boolean {
|
|
|
133
133
|
return run_carry.adopt_carry(target, current.carry, run_carry.owner_of(process.pid)) !== undefined
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
-
// **A verdict with nothing to judge is re-driven here, never handed to a session
|
|
137
|
-
//
|
|
138
|
-
//
|
|
139
|
-
//
|
|
140
|
-
//
|
|
136
|
+
// **A verdict with nothing to judge is re-driven here, never handed to a session.** A woken session
|
|
137
|
+
// met with `window`, `merge busy` or `merge retry` could only cut and hand the loop back for the same
|
|
138
|
+
// driver to run again — a model round trip, at a cache write each, that decides nothing. The record
|
|
139
|
+
// is already this process's, so the rerun needs no fresh claim; the limit keeps a driver that never
|
|
140
|
+
// settles from holding the supervisor past its own checks.
|
|
141
141
|
const RERUN_VERDICTS: ReadonlyArray<string> = ['window', 'merge busy', 'merge retry']
|
|
142
142
|
const RERUN_LIMIT = 10
|
|
143
143
|
const RERUN_PAUSE_MS = 60_000
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
2
2
|
import { run_carry } from '#scripts/run/carry/run-carry'
|
|
3
3
|
|
|
4
|
-
// The supervisor's recovery hand-off
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
4
|
+
// The supervisor's recovery hand-off. A session that claimed the carry record and then died without
|
|
5
|
+
// `run:carry --cut` leaves it `carried`, owned by a gone process, with no hand-off. `run-wake.ts` →
|
|
6
|
+
// `decide_not_handed_off` re-wakes on that record, and a successor running `--begin` over a record no
|
|
7
|
+
// cut handed off would be answered `standing` — "stop for a person" — ending the run the recovery
|
|
8
|
+
// exists to continue.
|
|
9
9
|
//
|
|
10
|
-
// **The
|
|
10
|
+
// **The recovery is made a cut, rather than teaching the successor a second answer.** Before it
|
|
11
11
|
// launches, the supervisor writes the same `is_handed_off` a `--cut` writes, so the successor's
|
|
12
12
|
// `--begin` classifies `resume` through the one path a declared cut already takes, and `standing` is
|
|
13
13
|
// left meaning what `backlogrun-steps.md` says it means: a record nobody is watching.
|