@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,9 +1,12 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { git_followup_issue_close } from '#scripts/followup/git-followup-issue-close'
|
|
4
|
+
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
5
|
import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
|
|
5
6
|
import { git_stash } from '#scripts/git/stash/git-stash'
|
|
6
|
-
import {
|
|
7
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
8
|
+
import { NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
|
|
9
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
7
10
|
import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
8
11
|
import { lane_close } from '#scripts/lane/lane-close'
|
|
9
12
|
import { lane_reap } from '#scripts/lane/lane-reap'
|
|
@@ -19,22 +22,22 @@ import {
|
|
|
19
22
|
} from '#scripts/run/carry/run-carry'
|
|
20
23
|
import { run_carry_conversation } from '#scripts/run/carry/run-carry-conversation'
|
|
21
24
|
import { run_cut, type RunCut } from '#scripts/run/cut/run-cut'
|
|
25
|
+
import { run_label } from '#scripts/run/run-label'
|
|
22
26
|
import { run_merge } from './run-merge'
|
|
23
27
|
|
|
24
28
|
// The result of attempting to apply a carry change. Distinguishing `refused` from `applied` lets
|
|
25
29
|
// callers surface the refusal as a hard failure rather than silently continuing on a carry that was
|
|
26
|
-
// not advanced
|
|
30
|
+
// not advanced.
|
|
27
31
|
type ApplyCarryResult =
|
|
28
32
|
{ kind: 'applied'; carry: RunCarry } | { kind: 'refused'; carry: RunCarry } | { kind: 'none' }
|
|
29
33
|
|
|
30
|
-
// The side-effect half of `run:merge
|
|
31
|
-
//
|
|
32
|
-
// collapsed into one command.
|
|
34
|
+
// The side-effect half of `run:merge`. The pure decisions are `run-merge.ts`'s; this file is what
|
|
35
|
+
// those decisions drive, collapsed into one command.
|
|
33
36
|
//
|
|
34
|
-
// **
|
|
37
|
+
// **A separate `pnpm josh` command stays one.** `main:sync`, `lane:close`, `cost` and
|
|
35
38
|
// `epic:next` / `backlog:next` are run as captured subprocesses, so their output lands in this
|
|
36
39
|
// command's own return value rather than on the caller's stdout and their report logic is reused
|
|
37
|
-
// rather than cloned. The
|
|
40
|
+
// rather than cloned. The rest — counting the outcome into the single-source carry record, parking
|
|
38
41
|
// a failed child, and generating the progress comment from that record — is in-process, because it has
|
|
39
42
|
// a reusable logic function and no stdout to keep clean.
|
|
40
43
|
|
|
@@ -45,8 +48,9 @@ const LANE_CLOSE_OCCASION = 'lane close'
|
|
|
45
48
|
const GIT_ENTRY = '.git'
|
|
46
49
|
const MERGE_CLOSER = 'pnpm josh run:merge'
|
|
47
50
|
const SINGLE_READ = { attempts: 1, interval_ms: 0 }
|
|
51
|
+
const OPEN_STATE = 'OPEN'
|
|
48
52
|
const SYNC_RETRY = { attempts: 3, interval_ms: 5000 }
|
|
49
|
-
// What the driver judged when it parks a child, stated on the issue
|
|
53
|
+
// What the driver judged when it parks a child, stated on the issue.
|
|
50
54
|
const FAILED_CAUSE = 'the child’s session ended with its issue still open and unfinished.'
|
|
51
55
|
const CUT_RELAUNCH_CAUSE =
|
|
52
56
|
'its lane held a declared cut, but no successor could be relaunched from it (or it already was once).'
|
|
@@ -57,27 +61,31 @@ interface MergeContext {
|
|
|
57
61
|
epic: string | undefined
|
|
58
62
|
repo: string | undefined
|
|
59
63
|
// The hand-off threshold, or `undefined` where no AI session owns the loop — the supervisor's
|
|
60
|
-
// `backlog:drive` has no context to cut, so a merge there is never handed back as `over
|
|
61
|
-
// (joshuafolkken/kit#3156).
|
|
64
|
+
// `backlog:drive` has no context to cut, so a merge there is never handed back as `over`.
|
|
62
65
|
over: number | undefined
|
|
63
66
|
owner: CarryOwner
|
|
64
67
|
// The child's transcript output path, when the caller passed `--output`. Read to tell an API-outage
|
|
65
|
-
// ending apart from a genuine child failure
|
|
66
|
-
//
|
|
68
|
+
// ending apart from a genuine child failure; absent leaves outage detection off, so the child is
|
|
69
|
+
// classified from its GitHub state alone.
|
|
67
70
|
output?: string | undefined
|
|
68
71
|
// The merged pull request that closes the child, when GitHub left the child OPEN after the merge —
|
|
69
|
-
// the one `merged` child whose issue this command still has to close
|
|
72
|
+
// the one `merged` child whose issue this command still has to close.
|
|
70
73
|
merged_pr?: string | undefined
|
|
71
74
|
}
|
|
72
75
|
|
|
73
76
|
interface FailedResult {
|
|
74
77
|
carry: RunCarry | undefined
|
|
75
78
|
is_parked: boolean
|
|
76
|
-
// Set when the carry record refused the count because this session is not its owner
|
|
77
|
-
//
|
|
79
|
+
// Set when the carry record refused the count because this session is not its owner. The caller
|
|
80
|
+
// surfaces this as a hard failure rather than continuing.
|
|
78
81
|
is_refused: boolean
|
|
82
|
+
// The open `blocked-by` blockers the child was released to wait on, cited — empty for a child that
|
|
83
|
+
// was parked (or refused) instead.
|
|
84
|
+
blockers: ReadonlyArray<string>
|
|
79
85
|
}
|
|
80
86
|
|
|
87
|
+
const NO_BLOCKERS: ReadonlyArray<string> = []
|
|
88
|
+
|
|
81
89
|
// A captured `pnpm josh` subprocess: its output is read back rather than inherited, and a non-zero
|
|
82
90
|
// exit is a value to branch on rather than a throw. The step's stderr stays piped here — `run:merge`
|
|
83
91
|
// composes its own report from the captured values — so this passes `josh_command.josh_run`'s default.
|
|
@@ -102,7 +110,7 @@ async function read_record(): Promise<{ target: string; carry: RunCarry } | unde
|
|
|
102
110
|
// Count the outcome into the carry record, respecting the ownership guard so a session whose record
|
|
103
111
|
// was handed off cannot advance a budget that is no longer its own. Returns `refused` when the
|
|
104
112
|
// ownership check fails — callers treat this as a hard failure so the operation is not silently
|
|
105
|
-
// skipped
|
|
113
|
+
// skipped.
|
|
106
114
|
async function apply_carry(
|
|
107
115
|
ctx: MergeContext,
|
|
108
116
|
change: CarryChange | undefined,
|
|
@@ -124,7 +132,7 @@ async function apply_carry(
|
|
|
124
132
|
|
|
125
133
|
// The carry record when this session may not act on it — the same ownership guard `apply_carry` asks —
|
|
126
134
|
// or `undefined`. Asked before an action that counts nothing, like the cut fallback's relaunch, so a
|
|
127
|
-
// stray session is refused rather than relaunching a lane it does not own
|
|
135
|
+
// stray session is refused rather than relaunching a lane it does not own.
|
|
128
136
|
async function refused_carry(ctx: MergeContext): Promise<RunCarry | undefined> {
|
|
129
137
|
const record = await read_record()
|
|
130
138
|
|
|
@@ -133,11 +141,10 @@ async function refused_carry(ctx: MergeContext): Promise<RunCarry | undefined> {
|
|
|
133
141
|
return record.carry
|
|
134
142
|
}
|
|
135
143
|
|
|
136
|
-
// **A failed `main:sync` is retried before it ends the run
|
|
137
|
-
//
|
|
138
|
-
// hand-run `main:sync` minutes later succeeded. **The error carries the step's stderr, not its
|
|
144
|
+
// **A failed `main:sync` is retried before it ends the run**: a sync right after a merge can fail
|
|
145
|
+
// transiently while several lanes merge at once. **The error carries the step's stderr, not its
|
|
139
146
|
// stdout**: `main:sync` reports git's refusal on stderr, while stdout carries the wrapper's guard
|
|
140
|
-
// statistics
|
|
147
|
+
// statistics.
|
|
141
148
|
async function sync_main(): Promise<void> {
|
|
142
149
|
// `poll_until` answers only whether it succeeded, so the last attempt's stderr is kept here.
|
|
143
150
|
let error_output = ''
|
|
@@ -174,12 +181,12 @@ async function stash_work(child: string, directory: string): Promise<void> {
|
|
|
174
181
|
await git_gh_issue_write.issue_try_comment(child, preserved_comment(message))
|
|
175
182
|
}
|
|
176
183
|
|
|
177
|
-
// Stash whatever the lane still holds uncommitted before its tree is removed
|
|
178
|
-
//
|
|
179
|
-
//
|
|
180
|
-
//
|
|
181
|
-
//
|
|
182
|
-
//
|
|
184
|
+
// Stash whatever the lane still holds uncommitted before its tree is removed: `lane:close` deletes by
|
|
185
|
+
// force, and a merged child's uncommitted work may exist nowhere else. The stash stack outlives the
|
|
186
|
+
// tree, so the push is the copy. Returns whether closing is safe — `false` when the tree could not be
|
|
187
|
+
// read or pushed, so it is left rather than lost. A directory with no `.git` is no work tree — the
|
|
188
|
+
// remnant of an interrupted close — and holds nothing git could keep, so it is closed rather than
|
|
189
|
+
// stranded behind a status that fails.
|
|
183
190
|
async function preserve_uncommitted(child: string): Promise<boolean> {
|
|
184
191
|
const lane = await lane_close.resolve_lane(child)
|
|
185
192
|
const { directory } = lane.targets
|
|
@@ -191,7 +198,9 @@ async function preserve_uncommitted(child: string): Promise<boolean> {
|
|
|
191
198
|
|
|
192
199
|
return true
|
|
193
200
|
} catch {
|
|
194
|
-
console.error(
|
|
201
|
+
console.error(
|
|
202
|
+
`${session_cite.issue(child)}: uncommitted work could not be stashed — lane left at ${directory}`,
|
|
203
|
+
)
|
|
195
204
|
|
|
196
205
|
return false
|
|
197
206
|
}
|
|
@@ -201,10 +210,10 @@ function kept_lane_comment(directory: string): string {
|
|
|
201
210
|
return `The split left this issue's lane open: it still holds a commit, an uncommitted change or a live process — ${directory}`
|
|
202
211
|
}
|
|
203
212
|
|
|
204
|
-
// A child promoted to an epic by a split leaves its lane holding a seat
|
|
205
|
-
//
|
|
206
|
-
//
|
|
207
|
-
//
|
|
213
|
+
// A child promoted to an epic by a split leaves its lane holding a seat: the epic root is never
|
|
214
|
+
// dispatched again, so nothing else would ever close it. The lane is closed only when it holds
|
|
215
|
+
// nothing — no commit, no change, no live process (`lane_vacant`); any other lane is kept, and why is
|
|
216
|
+
// stated on the issue.
|
|
208
217
|
async function close_split_lane(child: string): Promise<void> {
|
|
209
218
|
const lane = await lane_registry.find_open_lane(child)
|
|
210
219
|
|
|
@@ -228,7 +237,7 @@ async function post_counters(ctx: MergeContext, carry: RunCarry | undefined): Pr
|
|
|
228
237
|
}
|
|
229
238
|
|
|
230
239
|
// A child merged while GitHub left it OPEN is closed here, through the one close `followup` uses
|
|
231
|
-
//
|
|
240
|
+
// The state was just read OPEN, so it is read once rather than waited on. A
|
|
232
241
|
// close that fails is reported with its recovery and does not undo the merge being counted.
|
|
233
242
|
async function close_merged_open(ctx: MergeContext): Promise<void> {
|
|
234
243
|
if (ctx.merged_pr === undefined) return
|
|
@@ -239,14 +248,16 @@ async function close_merged_open(ctx: MergeContext): Promise<void> {
|
|
|
239
248
|
SINGLE_READ,
|
|
240
249
|
)
|
|
241
250
|
} catch {
|
|
242
|
-
console.error(
|
|
251
|
+
console.error(
|
|
252
|
+
`${session_cite.issue(ctx.child)}: could not be closed — ${git_followup_issue_close.CLOSE_RECOVERY}`,
|
|
253
|
+
)
|
|
243
254
|
}
|
|
244
255
|
}
|
|
245
256
|
|
|
246
257
|
// A merged child: count the merge (which resets the failure streak), return to the default branch,
|
|
247
258
|
// stash any uncommitted work the lane still holds and close it, and mirror the counters onto the epic. Returns the carry when the ownership check
|
|
248
|
-
// fails — the caller treats a non-undefined return as a hard refusal and must not offer a next child
|
|
249
|
-
//
|
|
259
|
+
// fails — the caller treats a non-undefined return as a hard refusal and must not offer a next child.
|
|
260
|
+
// Returns `undefined` on success.
|
|
250
261
|
async function do_merged(ctx: MergeContext): Promise<RunCarry | undefined> {
|
|
251
262
|
const refused = await refused_carry(ctx)
|
|
252
263
|
|
|
@@ -267,33 +278,60 @@ async function do_merged(ctx: MergeContext): Promise<RunCarry | undefined> {
|
|
|
267
278
|
return undefined
|
|
268
279
|
}
|
|
269
280
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
281
|
+
function refused_result(carry: RunCarry): FailedResult {
|
|
282
|
+
return { carry, is_parked: false, is_refused: true, blockers: NO_BLOCKERS }
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// The child's open `blocked-by` blockers, cited. A read that fails answers none, so the child is
|
|
286
|
+
// parked — a relation nobody could read is never taken as a dependency.
|
|
287
|
+
async function open_blockers(child: string): Promise<ReadonlyArray<string>> {
|
|
273
288
|
try {
|
|
274
|
-
await
|
|
289
|
+
const references = await git_gh_command.issue_blocked_by_references(child, '')
|
|
290
|
+
|
|
291
|
+
return references
|
|
292
|
+
.filter((blocker) => blocker.state === OPEN_STATE)
|
|
293
|
+
.map((blocker) => issue_cite.plain(blocker.number, blocker.repo))
|
|
275
294
|
} catch {
|
|
276
|
-
|
|
295
|
+
return NO_BLOCKERS
|
|
277
296
|
}
|
|
278
297
|
}
|
|
279
298
|
|
|
299
|
+
// A child that ended unfinished while an open blocker it records still has to land first is waiting,
|
|
300
|
+
// not failed: nothing is counted and `needs-decision` is not applied — the
|
|
301
|
+
// order is already recorded, so there is nothing for a person to decide — and its stale `in-progress`
|
|
302
|
+
// is dropped so the offer hands it back on its own once the blockers merge. The ownership guard is
|
|
303
|
+
// still asked, so a session that does not own the run cannot release a child it never dispatched.
|
|
304
|
+
async function do_waiting(
|
|
305
|
+
ctx: MergeContext,
|
|
306
|
+
blockers: ReadonlyArray<string>,
|
|
307
|
+
): Promise<FailedResult> {
|
|
308
|
+
const refused = await refused_carry(ctx)
|
|
309
|
+
|
|
310
|
+
if (refused !== undefined) return refused_result(refused)
|
|
311
|
+
|
|
312
|
+
lane_reap.reap_child(ctx.child)
|
|
313
|
+
await run_label.unmark(ctx.child)
|
|
314
|
+
await git_gh_issue_write.issue_try_comment(ctx.child, run_merge.waiting_comment(blockers))
|
|
315
|
+
|
|
316
|
+
return { carry: undefined, is_parked: false, is_refused: false, blockers }
|
|
317
|
+
}
|
|
318
|
+
|
|
280
319
|
// A failed child: count the failure, end whatever of its process is still running (a child judged
|
|
281
320
|
// abandoned that hung on a wait loop would otherwise answer the pgrep liveness check `alive` for its
|
|
282
|
-
// issue number forever
|
|
283
|
-
//
|
|
284
|
-
//
|
|
285
|
-
//
|
|
286
|
-
//
|
|
287
|
-
|
|
288
|
-
async function do_failed(ctx: MergeContext, cause: string = FAILED_CAUSE): Promise<FailedResult> {
|
|
321
|
+
// issue number forever), drop the stale `in-progress`, and park it with `needs-decision` so the next
|
|
322
|
+
// offer does not hand the same child straight back. Returns the record so the caller can read the
|
|
323
|
+
// streak against the guard. Returns `is_refused: true` without touching labels when the carry record
|
|
324
|
+
// rejected the count. A park is always explained on the issue — `cause` says what was judged, and the
|
|
325
|
+
// comment what was read and what a person does next.
|
|
326
|
+
async function park_failed(ctx: MergeContext, cause: string): Promise<FailedResult> {
|
|
289
327
|
const result = await apply_carry(ctx, run_merge.change_of('failed'))
|
|
290
328
|
|
|
291
|
-
if (result.kind === 'refused') return
|
|
329
|
+
if (result.kind === 'refused') return refused_result(result.carry)
|
|
292
330
|
|
|
293
331
|
const carry = result.kind === 'applied' ? result.carry : undefined
|
|
294
332
|
|
|
295
333
|
lane_reap.reap_child(ctx.child)
|
|
296
|
-
await
|
|
334
|
+
await run_label.unmark(ctx.child)
|
|
297
335
|
const is_parked = await git_gh_issue_write.issue_add_label(ctx.child, NEEDS_DECISION_LABEL)
|
|
298
336
|
|
|
299
337
|
if (is_parked) {
|
|
@@ -302,29 +340,39 @@ async function do_failed(ctx: MergeContext, cause: string = FAILED_CAUSE): Promi
|
|
|
302
340
|
await git_gh_issue_write.issue_try_comment(ctx.child, run_merge.park_comment(reason))
|
|
303
341
|
}
|
|
304
342
|
|
|
305
|
-
return { carry, is_parked, is_refused: false }
|
|
343
|
+
return { carry, is_parked, is_refused: false, blockers: NO_BLOCKERS }
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// A child that ended unfinished: waiting when it records an open blocker (`do_waiting`), parked
|
|
347
|
+
// otherwise (`park_failed`) — an order already recorded is never a decision for a person.
|
|
348
|
+
async function do_failed(ctx: MergeContext, cause: string = FAILED_CAUSE): Promise<FailedResult> {
|
|
349
|
+
const blockers = await open_blockers(ctx.child)
|
|
350
|
+
|
|
351
|
+
if (blockers.length > 0) return await do_waiting(ctx, blockers)
|
|
352
|
+
|
|
353
|
+
return await park_failed(ctx, cause)
|
|
306
354
|
}
|
|
307
355
|
|
|
308
356
|
// The outcome of counting an outage: the record to read the streak against, and whether the count was
|
|
309
|
-
// refused because this session does not own the budget
|
|
357
|
+
// refused because this session does not own the budget.
|
|
310
358
|
interface OutageResult {
|
|
311
359
|
carry: RunCarry | undefined
|
|
312
360
|
is_refused: boolean
|
|
313
361
|
}
|
|
314
362
|
|
|
315
363
|
// An API-outage child: count the outage into its own streak, end any process it left — before the
|
|
316
|
-
// re-dispatch launches a second one matching the same pattern
|
|
317
|
-
//
|
|
318
|
-
// the child, so it is re-dispatchable in the same run
|
|
319
|
-
//
|
|
320
|
-
//
|
|
364
|
+
// re-dispatch launches a second one matching the same pattern — and drop the stale `in-progress` so the
|
|
365
|
+
// child is offerable again, but **do not** park it with `needs-decision` — the environment failed, not
|
|
366
|
+
// the child, so it is re-dispatchable in the same run. Returns the record so the caller can read the
|
|
367
|
+
// outage streak against its guard. Returns `is_refused: true` without touching labels when the carry
|
|
368
|
+
// record rejected the count.
|
|
321
369
|
async function do_outage(ctx: MergeContext): Promise<OutageResult> {
|
|
322
370
|
const result = await apply_carry(ctx, run_merge.change_of('outage'))
|
|
323
371
|
|
|
324
372
|
if (result.kind === 'refused') return { carry: result.carry, is_refused: true }
|
|
325
373
|
|
|
326
374
|
lane_reap.reap_child(ctx.child)
|
|
327
|
-
await
|
|
375
|
+
await run_label.unmark(ctx.child)
|
|
328
376
|
|
|
329
377
|
return { carry: result.kind === 'applied' ? result.carry : undefined, is_refused: false }
|
|
330
378
|
}
|
|
@@ -335,8 +383,8 @@ interface RelaunchableCut {
|
|
|
335
383
|
cut: RunCut
|
|
336
384
|
}
|
|
337
385
|
|
|
338
|
-
// The lane's cut the fallback may relaunch, or `undefined
|
|
339
|
-
//
|
|
386
|
+
// The lane's cut the fallback may relaunch, or `undefined`. An OpenAI lane is left out: its
|
|
387
|
+
// supervisor, not this command, starts the process after a standing cut.
|
|
340
388
|
async function relaunchable_lane(child: string): Promise<LaneInfo | undefined> {
|
|
341
389
|
const lane = await lane_registry.find_open_lane(child)
|
|
342
390
|
|
|
@@ -359,7 +407,7 @@ async function has_resumable_cut(child: string): Promise<boolean> {
|
|
|
359
407
|
return (await relaunchable_cut(child)) !== undefined
|
|
360
408
|
}
|
|
361
409
|
|
|
362
|
-
// **The cutting child launches its own successor; this is only the fallback
|
|
410
|
+
// **The cutting child launches its own successor; this is only the fallback**.
|
|
363
411
|
// `lane:await` wakes the parent once every process of the lane has gone, so a cut still unadopted then
|
|
364
412
|
// means the successor never took it over. It is relaunched through the same `lane_relaunch` the cut uses,
|
|
365
413
|
// once per cut — the record is marked first, so a second unadopted return is parked instead. Returns
|
|
@@ -386,8 +434,8 @@ async function is_over_budget(over: number | undefined): Promise<boolean> {
|
|
|
386
434
|
return result.code !== 0 || result.out === OVER
|
|
387
435
|
}
|
|
388
436
|
|
|
389
|
-
// The next offer: one issue number per line up to the free lanes, or a verdict token
|
|
390
|
-
//
|
|
437
|
+
// The next offer: one issue number per line up to the free lanes, or a verdict token. `--lanes` needs
|
|
438
|
+
// `--repo`, so the epic form is used only where both are present.
|
|
391
439
|
async function ask_next(ctx: MergeContext): Promise<string> {
|
|
392
440
|
if (ctx.epic === undefined || ctx.repo === undefined) {
|
|
393
441
|
const backlog = await josh(['backlog:next'])
|
|
@@ -410,9 +458,8 @@ const run_merge_steps = {
|
|
|
410
458
|
has_resumable_cut,
|
|
411
459
|
is_over_budget,
|
|
412
460
|
refused_carry,
|
|
413
|
-
remove_in_progress,
|
|
414
461
|
resume_cut,
|
|
415
462
|
}
|
|
416
463
|
|
|
417
|
-
export type { MergeContext, OutageResult }
|
|
464
|
+
export type { FailedResult, MergeContext, OutageResult }
|
|
418
465
|
export { run_merge_steps }
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// The control verdicts `josh run:merge` prints as its first stdout token — the protocol between it and
|
|
2
|
+
// `backlog:drive`, declared once here so a renamed or added token is a type error on both sides rather
|
|
3
|
+
// than a hand-off the loop silently stops reading.
|
|
4
|
+
|
|
5
|
+
const MERGE_TOKEN = {
|
|
6
|
+
// The hand-off check after a merge: the parent's context is over its threshold.
|
|
7
|
+
OVER: 'over',
|
|
8
|
+
// The child's own ending: it stopped before its commit for a person to look at.
|
|
9
|
+
HUMAN_REVIEW: 'human-review',
|
|
10
|
+
// Matches the `busy` verdict `run:carry` emits for a refused count, so callers see one vocabulary.
|
|
11
|
+
BUSY: 'busy',
|
|
12
|
+
// The consecutive-failure guard tripped, or a failed child could not be parked.
|
|
13
|
+
STOP: 'stop',
|
|
14
|
+
// The consecutive-outage guard tripped: the environment is down, so the run stops rather than
|
|
15
|
+
// re-dispatching into a dead API. Distinct from `stop` so the parent's report can say the environment
|
|
16
|
+
// failed rather than the children.
|
|
17
|
+
ENVIRONMENT: 'environment',
|
|
18
|
+
// The child's state could not be read; re-read before deciding.
|
|
19
|
+
RETRY: 'retry',
|
|
20
|
+
// The child's cut was resumed in its own lane: the parent awaits that lane again, and offers no child
|
|
21
|
+
// in its place.
|
|
22
|
+
RESUMED: 'resumed',
|
|
23
|
+
} as const
|
|
24
|
+
|
|
25
|
+
type MergeToken = (typeof MERGE_TOKEN)[keyof typeof MERGE_TOKEN]
|
|
26
|
+
|
|
27
|
+
const run_merge_token = { MERGE_TOKEN }
|
|
28
|
+
|
|
29
|
+
export type { MergeToken }
|
|
30
|
+
export { run_merge_token }
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
1
2
|
import {
|
|
2
3
|
ALREADY_DONE_LABEL,
|
|
3
4
|
EPIC_LABEL,
|
|
@@ -7,10 +8,9 @@ import {
|
|
|
7
8
|
import type { IssueState } from '#scripts/issue/issue-state'
|
|
8
9
|
import type { CarryChange, RunCarry } from '#scripts/run/carry/run-carry'
|
|
9
10
|
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
// `run:merge <N>` once at a child's return and reads back the next child number, or a control verdict.
|
|
11
|
+
// The pure core of `run:merge`, the one composite command for a `backlogrun` merge event: the parent —
|
|
12
|
+
// the session whose context is largest and per-turn cost highest — calls `run:merge <N>` once at a
|
|
13
|
+
// child's return and reads back the next child number, or a control verdict.
|
|
14
14
|
//
|
|
15
15
|
// Everything here is pure — the classification of the returned child, the counter change that outcome
|
|
16
16
|
// implies, the consecutive-failure guard, and the progress-comment text generated from the
|
|
@@ -23,7 +23,7 @@ const CLOSED_STATE = 'CLOSED'
|
|
|
23
23
|
// resets the streak (`run-carry.ts` → `next_failures`), so the guard trips only on an environment
|
|
24
24
|
// failing every child it is handed rather than on failures scattered across a long run.
|
|
25
25
|
const CONSECUTIVE_FAILURE_LIMIT = 3
|
|
26
|
-
// Three API outages in a row stop the run too
|
|
26
|
+
// Three API outages in a row stop the run too — the same shape as the failure
|
|
27
27
|
// guard, over its own streak. An outage is a child that could not reach the API, so a run of them is
|
|
28
28
|
// the environment being down; stopping is what keeps the run from re-dispatching into a dead API
|
|
29
29
|
// forever. A merge or a genuine child failure resets it (`run-carry.ts` → `next_outages`).
|
|
@@ -34,16 +34,15 @@ const ONE = 1
|
|
|
34
34
|
// alone — the exit record.
|
|
35
35
|
// - `merged` — CLOSED; the child finished and its pull request merged. Also an OPEN, unparked
|
|
36
36
|
// child a merged pull request's `closes #N` names — GitHub merged it without closing
|
|
37
|
-
// the issue
|
|
37
|
+
// the issue.
|
|
38
38
|
// - `human-review` — OPEN and carrying `needs-human-review`; the run's own ending (needs-human-review.md).
|
|
39
39
|
// - `parked` — OPEN and carrying `needs-decision` or `already-done`; a person still owns it.
|
|
40
40
|
// - `split` — OPEN and carrying `epic`; its work was divided into new children.
|
|
41
41
|
// - `outage` — OPEN and carrying neither, but the exit record shows it could not reach the API; not
|
|
42
|
-
// the child's failure, so it is re-dispatchable and uncounted against the failure guard
|
|
43
|
-
// (joshuafolkken/kit#2240).
|
|
42
|
+
// the child's failure, so it is re-dispatchable and uncounted against the failure guard.
|
|
44
43
|
// - `cut` — OPEN and carrying neither, but its lane holds a declared cut no successor adopted;
|
|
45
44
|
// the child ended its session on purpose, so it is resumed rather than parked and
|
|
46
|
-
// counts nothing
|
|
45
|
+
// counts nothing.
|
|
47
46
|
// - `failed` — OPEN and carrying neither, and not an outage; the child did not finish.
|
|
48
47
|
// - `unresolved` — the state could not be read; re-read before deciding.
|
|
49
48
|
type ChildOutcome =
|
|
@@ -63,7 +62,7 @@ interface EndingSignals {
|
|
|
63
62
|
is_outage: boolean
|
|
64
63
|
is_cut: boolean
|
|
65
64
|
// The merged pull request whose `closes #N` names the child, when GitHub left the child OPEN after
|
|
66
|
-
// merging it
|
|
65
|
+
// merging it.
|
|
67
66
|
merged_pr?: string | undefined
|
|
68
67
|
}
|
|
69
68
|
|
|
@@ -84,12 +83,11 @@ function is_parked(state: IssueState): boolean {
|
|
|
84
83
|
// **CLOSED means merged, whatever labels it carries** — a child that finished and merged keeps the
|
|
85
84
|
// `needs-human-review` a person put on it, so that label is read only on an OPEN child
|
|
86
85
|
// (`backlogrun-progress.md` → "Running a named epic's children").
|
|
87
|
-
// An OPEN, unparked child that is not waiting on a person: a declared cut is resumed
|
|
88
|
-
//
|
|
89
|
-
//
|
|
90
|
-
//
|
|
91
|
-
//
|
|
92
|
-
// guard (joshuafolkken/kit#2769).
|
|
86
|
+
// An OPEN, unparked child that is not waiting on a person: a declared cut is resumed, and it is read
|
|
87
|
+
// before the outage so a cut whose process then lost the API is still resumed from its record; an
|
|
88
|
+
// OPEN, unparked child that could not reach the API is an `outage`, not a `failed`. **A merged pull
|
|
89
|
+
// request that closes it is read first**: the work landed and only GitHub's close did not, so it is
|
|
90
|
+
// `merged` — never a failure counted against the guard.
|
|
93
91
|
function unfinished_outcome(signals: EndingSignals): ChildOutcome {
|
|
94
92
|
if (signals.merged_pr !== undefined) return 'merged'
|
|
95
93
|
|
|
@@ -139,14 +137,14 @@ function is_guard_tripped(failures: number): boolean {
|
|
|
139
137
|
return failures >= CONSECUTIVE_FAILURE_LIMIT
|
|
140
138
|
}
|
|
141
139
|
|
|
142
|
-
// The outage guard, over its own streak
|
|
140
|
+
// The outage guard, over its own streak. Same shape as the failure guard: a
|
|
143
141
|
// run of consecutive outages is the environment being down, so the run stops rather than re-dispatching.
|
|
144
142
|
function is_outage_guard_tripped(outages: number): boolean {
|
|
145
143
|
return outages >= CONSECUTIVE_OUTAGE_LIMIT
|
|
146
144
|
}
|
|
147
145
|
|
|
148
146
|
// The progress comment, generated from the single-source carry record so the counters live in one
|
|
149
|
-
// place and this text is derived rather than a second copy kept alongside it
|
|
147
|
+
// place and this text is derived rather than a second copy kept alongside it.
|
|
150
148
|
// It is script-emitted, so it stays English while the run's session-facing prose follows
|
|
151
149
|
// `JOSH_SESSION_LANG`.
|
|
152
150
|
function counters_comment(carry: RunCarry): string {
|
|
@@ -161,9 +159,9 @@ function counters_comment(carry: RunCarry): string {
|
|
|
161
159
|
].join('\n')
|
|
162
160
|
}
|
|
163
161
|
|
|
164
|
-
// Why the run parked a child it judged failed
|
|
165
|
-
//
|
|
166
|
-
//
|
|
162
|
+
// Why the run parked a child it judged failed. A child that stops itself leaves its own comment; one
|
|
163
|
+
// the driver stops leaves none, so this tells a person why it carries `needs-decision`.
|
|
164
|
+
// Script-emitted, so English.
|
|
167
165
|
interface ParkReason {
|
|
168
166
|
child: string
|
|
169
167
|
cause: string
|
|
@@ -185,7 +183,17 @@ function park_comment(reason: ParkReason): string {
|
|
|
185
183
|
`- Why: ${reason.cause}`,
|
|
186
184
|
'- Read: the issue is OPEN, carries none of `needs-decision`, `already-done`, `needs-human-review` or `epic`, and no merged pull request’s `closes #N` names it.',
|
|
187
185
|
streak_line(reason.carry),
|
|
188
|
-
`- Next: read the child’s transcript${transcript}, then either resume it with \`fullrun
|
|
186
|
+
`- Next: read the child’s transcript${transcript}, then either resume it with \`fullrun ${issue_cite.plain(reason.child)}\`, or record the decision here and remove \`needs-decision\`.`,
|
|
187
|
+
].join('\n')
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Why the run released a child it would otherwise have parked: the child records open blockers, so
|
|
191
|
+
// its order is already decided and it waits rather than asking a person. Script-emitted, so English.
|
|
192
|
+
function waiting_comment(blockers: ReadonlyArray<string>): string {
|
|
193
|
+
return [
|
|
194
|
+
'Released to wait by `pnpm josh run:merge`, the `backlogrun` driver — not parked, and not counted as a failure.',
|
|
195
|
+
`- Why: the child’s session ended unfinished while it records open blockers: ${blockers.join(', ')}.`,
|
|
196
|
+
'- Next: its order is already recorded — it becomes runnable again once its blockers merge; a blocker outside the backlog still needs a person to land it.',
|
|
189
197
|
].join('\n')
|
|
190
198
|
}
|
|
191
199
|
|
|
@@ -196,6 +204,7 @@ const run_merge = {
|
|
|
196
204
|
classify_child,
|
|
197
205
|
counters_comment,
|
|
198
206
|
park_comment,
|
|
207
|
+
waiting_comment,
|
|
199
208
|
is_guard_tripped,
|
|
200
209
|
is_outage_guard_tripped,
|
|
201
210
|
}
|
|
@@ -2,18 +2,18 @@ import { cli_flags } from '#scripts/lib/cli-flags'
|
|
|
2
2
|
import { run_progress_config } from './run-progress-config'
|
|
3
3
|
|
|
4
4
|
// The argument half of `josh run:progress`, kept apart from the watcher so the CLI stays inside the file
|
|
5
|
-
// limit
|
|
5
|
+
// limit. Everything here is pure: argv in, values out.
|
|
6
6
|
|
|
7
7
|
// A watcher outlives the turn that started it, so something has to end it. One hour is three of the
|
|
8
8
|
// default twenty-minute intervals: long enough that the bound never truncates a report, short enough
|
|
9
9
|
// that a watcher left waiting on a run that has already merged is gone within the hour. It is
|
|
10
10
|
// deliberately **not** `run:hold`'s eight-hour expiry — that holds an uncommitted working tree across
|
|
11
|
-
// a person's latency and is trampled by being short
|
|
11
|
+
// a person's latency and is trampled by being short, while a watcher holds
|
|
12
12
|
// only a heartbeat the caller restarts on the next interval, so the two guard different things and
|
|
13
13
|
// only one has anything to lose by being short.
|
|
14
14
|
const DEFAULT_MAX_HOURS = 1
|
|
15
|
-
// **`--wait` is bounded by a run, not by three intervals
|
|
16
|
-
//
|
|
15
|
+
// **`--wait` is bounded by a run, not by three intervals.** It does not exit at
|
|
16
|
+
// its first report — the reports go to the event stream — so its one-hour bound would be the last
|
|
17
17
|
// wake that asks the parent for no judgement, a restart an hour. Eight hours is `run:hold`'s expiry;
|
|
18
18
|
// what ends a finished run's watcher sooner is `josh followup` removing its life record, and a stop
|
|
19
19
|
// tearing it down in the same turn.
|