@joshuafolkken/kit 1.1240.0 → 1.1370.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +50 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +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 +29 -47
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
- 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-ZQGD4GBY.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
- 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 +216 -202
- 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 +281 -94
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +16 -10
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +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 +26 -2
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +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 +20 -6
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +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/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-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 +5 -6
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +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 +25 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +13 -15
- package/scripts/run/run-step.ts +58 -47
- 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
|
@@ -5,7 +5,7 @@ import { defect_rate, type DefectRate, type IssueKind } from '#scripts/issue/def
|
|
|
5
5
|
import { defect_rate_cli } from '#scripts/issue/defect-rate-cli'
|
|
6
6
|
|
|
7
7
|
// While the defect rate is above its baseline, `backlog:next` offers defects and hardening first and
|
|
8
|
-
// defers new mechanisms
|
|
8
|
+
// defers new mechanisms. The re-ordering stays inside the runnable set — every
|
|
9
9
|
// candidate is already ready to start — so no dependency the graph recorded is crossed.
|
|
10
10
|
|
|
11
11
|
const UNMEASURED_MESSAGE =
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
1
2
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
2
3
|
import type { DriveState } from './backlog-drive'
|
|
3
4
|
|
|
4
5
|
// The `josh backlog:drive` flags — read into a `DriveContext`, and written back as the `resume:` line —
|
|
5
|
-
// split out of `backlog-drive-cli.ts` when it neared its line limit
|
|
6
|
+
// split out of `backlog-drive-cli.ts` when it neared its line limit.
|
|
6
7
|
// `backlog_drive_cli` re-exports `parse` and `resume_line` under the names they always had, so the move
|
|
7
8
|
// changed no call site and no suite that reads them through `backlog_drive_cli`.
|
|
8
9
|
|
|
9
10
|
const MS_PER_MINUTE = 60_000
|
|
10
11
|
const LIST_SEPARATOR = ','
|
|
11
12
|
const COUNT_PATTERN = /^\d+$/u
|
|
12
|
-
const ISSUE_PATTERN = /^[1-9]\d*$/u
|
|
13
13
|
const USAGE =
|
|
14
14
|
'Usage: josh backlog:drive --owner <pid> [--active <ISO-8601>] [--max <n>] [--idle <minutes>] [--only] [--exclude <n>[,<n>...]] [--await <n>[,<n>...]] [--window <minutes>] [--stopped <n>]'
|
|
15
15
|
|
|
@@ -51,7 +51,7 @@ function to_issues(raw: string | undefined): ReadonlyArray<string> | undefined {
|
|
|
51
51
|
|
|
52
52
|
const issues = raw.split(LIST_SEPARATOR)
|
|
53
53
|
|
|
54
|
-
return issues.some((issue) => !
|
|
54
|
+
return issues.some((issue) => !issue_number_shape.is_issue_number(issue)) ? undefined : issues
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
function forwarded_of(values: Values): ReadonlyArray<string> | undefined {
|
|
@@ -72,7 +72,8 @@ function is_valid_window(raw: string | undefined): boolean {
|
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
function is_valid_single(values: Values): boolean {
|
|
75
|
-
const is_valid_stopped =
|
|
75
|
+
const is_valid_stopped =
|
|
76
|
+
values.stopped === undefined || issue_number_shape.ISSUE_NUMBER_PATTERN.test(values.stopped)
|
|
76
77
|
|
|
77
78
|
return is_valid_stopped && is_valid_window(values.window)
|
|
78
79
|
}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { setTimeout as sleep } from 'node:timers/promises'
|
|
3
3
|
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
4
5
|
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
5
6
|
import { josh_command } from '#scripts/josh/josh-run'
|
|
6
7
|
import { lane_await, type AwaitState } from '#scripts/lane/lane-await'
|
|
7
8
|
import { lane_registry } from '#scripts/lane/lane-registry'
|
|
9
|
+
import { lane_sampler } from '#scripts/lane/lane-sampler'
|
|
8
10
|
import { error_text } from '#scripts/lib/error-message'
|
|
11
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
9
12
|
import { run_carry, type RunCarry } from '#scripts/run/carry/run-carry'
|
|
10
13
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
11
14
|
import { run_merge_cli, type MergeResult } from '#scripts/run/merge/run-merge-cli'
|
|
@@ -29,7 +32,7 @@ import { backlog_drive_retrospective } from './backlog-drive-retrospective'
|
|
|
29
32
|
import { backlog_offer_cli } from './backlog-offer-cli'
|
|
30
33
|
import { backlog_ready } from './backlog-ready'
|
|
31
34
|
|
|
32
|
-
// `josh backlog:drive` — the backlogrun parent's loop as one resident wait
|
|
35
|
+
// `josh backlog:drive` — the backlogrun parent's loop as one resident wait.
|
|
33
36
|
// The parent issues it once, in the background, and is woken only when it exits — with a token the model
|
|
34
37
|
// has to read. The loop itself is `backlog-drive.ts`; this file is its ports onto the commands it reuses.
|
|
35
38
|
//
|
|
@@ -58,13 +61,7 @@ const offer_read_schema = z.object({
|
|
|
58
61
|
const offer_schema = z.object({ [backlog_offer_cli.JSON_KEY]: offer_read_schema })
|
|
59
62
|
|
|
60
63
|
function to_offer(out: string): OfferRead | undefined {
|
|
61
|
-
|
|
62
|
-
const parsed = offer_schema.safeParse(JSON.parse(out))
|
|
63
|
-
|
|
64
|
-
return parsed.success ? parsed.data[backlog_offer_cli.JSON_KEY] : undefined
|
|
65
|
-
} catch {
|
|
66
|
-
return undefined
|
|
67
|
-
}
|
|
64
|
+
return json_value.parse_with(out, offer_schema)?.[backlog_offer_cli.JSON_KEY]
|
|
68
65
|
}
|
|
69
66
|
|
|
70
67
|
async function read_record(): Promise<RunCarry | undefined> {
|
|
@@ -110,7 +107,7 @@ function merge_token(out: string, code: number): string {
|
|
|
110
107
|
|
|
111
108
|
// The child's transcript, where its lane recorded one, so `run:merge` can tell an API outage from a
|
|
112
109
|
// failure exactly as it does for the parent that passes `--output` by hand. No hand-off threshold: the
|
|
113
|
-
// supervisor runs this loop, and a process has no context to cut
|
|
110
|
+
// supervisor runs this loop, and a process has no context to cut.
|
|
114
111
|
async function merge(issue: string, owner: string): Promise<MergeResult> {
|
|
115
112
|
await backlog_drive_owner.assert_current(owner)
|
|
116
113
|
const lane = await lane_registry.find_open_lane(issue)
|
|
@@ -165,7 +162,7 @@ async function open_lanes(): Promise<ReadonlyArray<string>> {
|
|
|
165
162
|
|
|
166
163
|
function end_line(end: DriveEnd): string {
|
|
167
164
|
const token = end.token === undefined || end.token === end.reason ? [] : [end.token]
|
|
168
|
-
const issue = end.issue === undefined ? [] : [
|
|
165
|
+
const issue = end.issue === undefined ? [] : [issue_cite.plain(end.issue)]
|
|
169
166
|
const base = [end.reason, ...token, ...issue].join(' ')
|
|
170
167
|
|
|
171
168
|
return end.detail === undefined ? base : `${base} ${end.detail}`
|
|
@@ -224,13 +221,19 @@ async function drive(context: DriveContext): Promise<number> {
|
|
|
224
221
|
return SUCCESS_EXIT_CODE
|
|
225
222
|
}
|
|
226
223
|
|
|
224
|
+
// The machine load is sampled for exactly as long as the drive runs, so a `backlogrun` leaves its own
|
|
225
|
+
// load in the lane ledger without a sampler anyone has to start or stop (`lane-sampler.ts`).
|
|
227
226
|
async function run_safe(context: DriveContext): Promise<number> {
|
|
227
|
+
const stop_sampling = lane_sampler.start()
|
|
228
|
+
|
|
228
229
|
try {
|
|
229
230
|
return await drive(context)
|
|
230
231
|
} catch (error) {
|
|
231
232
|
console.info(`error ${error_text.message_of(error)}`)
|
|
232
233
|
|
|
233
234
|
return FAILURE_EXIT_CODE
|
|
235
|
+
} finally {
|
|
236
|
+
stop_sampling()
|
|
234
237
|
}
|
|
235
238
|
}
|
|
236
239
|
|
|
@@ -260,6 +263,7 @@ const backlog_drive_cli = {
|
|
|
260
263
|
offer_argv: backlog_drive_offer_argv.offer_argv,
|
|
261
264
|
parse: backlog_drive_args.parse,
|
|
262
265
|
resume_line: backlog_drive_args.resume_line,
|
|
266
|
+
run,
|
|
263
267
|
to_offer,
|
|
264
268
|
}
|
|
265
269
|
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { git_gh_repo } from '#scripts/gh/git-gh-repo'
|
|
2
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
3
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
4
|
+
import { josh_command } from '#scripts/josh/josh-run'
|
|
5
|
+
import type { DriveState, OfferRead } from './backlog-drive'
|
|
6
|
+
import { backlog_drive_named } from './backlog-drive-named'
|
|
7
|
+
import { backlog_offer } from './backlog-offer'
|
|
8
|
+
|
|
9
|
+
// A named epic is driven from the epic itself. The work list is the epic's
|
|
10
|
+
// current children as `epic:next` derives them, never a copy in the carry record — so a child filed
|
|
11
|
+
// into the epic mid-run, by any route (`issue:file`, `epic --add`, a hand edit), is dispatched once it
|
|
12
|
+
// is runnable, without `run:add` and without waking a parent session.
|
|
13
|
+
//
|
|
14
|
+
// **Only what needs a person is handed back.** `stop` means every child left waits on a person, which a
|
|
15
|
+
// judgment session reads. A failed `epic:next` is either a network blip or a broken graph (a cycle, an
|
|
16
|
+
// undeclared order, an unreadable child), and its exit code does not tell them apart — so a failure is
|
|
17
|
+
// a `wait` that retries on the next pass, and `backlog:offer`'s consecutive-retry limit of them hands the
|
|
18
|
+
// epic back too, rather than waiting out the idle budget on an anomaly nobody is shown.
|
|
19
|
+
|
|
20
|
+
const NO_RETRIES = 0
|
|
21
|
+
const SUCCESS_EXIT_CODE = 0
|
|
22
|
+
const FIRST_LINE = 0
|
|
23
|
+
const WAIT: OfferRead = { verdict: 'wait', issues: [], retries: NO_RETRIES }
|
|
24
|
+
|
|
25
|
+
// `--lanes` lists every child a free lane could take, so one the loop already knows about is passed
|
|
26
|
+
// over rather than standing in front of the rest. `undefined` is an answer that could not be read.
|
|
27
|
+
async function ask_next(epic: string): Promise<ReadonlyArray<string> | undefined> {
|
|
28
|
+
const repo = await git_gh_repo.repo_get_name_with_owner()
|
|
29
|
+
if (repo === undefined) return undefined
|
|
30
|
+
const result = await josh_command.josh_run(['epic:next', epic, '--repo', repo, '--lanes'], true)
|
|
31
|
+
|
|
32
|
+
return result.code === SUCCESS_EXIT_CODE ? result.out.trim().split('\n') : undefined
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function handed_back(epic: string): OfferRead {
|
|
36
|
+
return { ...WAIT, verdict: `epic ${issue_cite.plain(epic)}` }
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function failed_offer(epic: string, state: DriveState): OfferRead {
|
|
40
|
+
const retries = state.retries + 1
|
|
41
|
+
|
|
42
|
+
return retries >= backlog_offer.RETRY_LIMIT ? handed_back(epic) : { ...WAIT, retries }
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// A child the loop already launched, or merged and excluded, can still read as runnable while GitHub
|
|
46
|
+
// catches up, so it is skipped rather than launched twice. One child per offer
|
|
47
|
+
// keeps the carried maximum checked before each launch.
|
|
48
|
+
function child_offer(children: ReadonlyArray<string>, state: DriveState): OfferRead {
|
|
49
|
+
const child = children.find(
|
|
50
|
+
(item) => !state.in_flight.includes(item) && !state.exclude.includes(item),
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
return child === undefined ? WAIT : { verdict: 'run', issues: [child], retries: NO_RETRIES }
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function answered_offer(
|
|
57
|
+
epic: string,
|
|
58
|
+
answers: ReadonlyArray<string>,
|
|
59
|
+
state: DriveState,
|
|
60
|
+
owner: string,
|
|
61
|
+
): Promise<OfferRead> {
|
|
62
|
+
const token = answers[FIRST_LINE]
|
|
63
|
+
|
|
64
|
+
if (token !== undefined && issue_number_shape.ISSUE_NUMBER_PATTERN.test(token)) {
|
|
65
|
+
return child_offer(answers, state)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (token === 'stop') return handed_back(epic)
|
|
69
|
+
|
|
70
|
+
if (token === 'complete') {
|
|
71
|
+
await backlog_drive_named.mark_done(epic, { outcome: 'merged', code: 0, token: 'none' }, owner)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return WAIT
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async function offer(epic: string, state: DriveState, owner: string): Promise<OfferRead> {
|
|
78
|
+
const answers = await ask_next(epic)
|
|
79
|
+
|
|
80
|
+
return answers === undefined
|
|
81
|
+
? failed_offer(epic, state)
|
|
82
|
+
: await answered_offer(epic, answers, state, owner)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export const backlog_drive_epic = { offer }
|
|
@@ -2,7 +2,7 @@ import { git_stash } from '#scripts/git/stash/git-stash'
|
|
|
2
2
|
import { lane_launch_cli, type LaunchOutcome } from '#scripts/lane/lane-launch-cli'
|
|
3
3
|
import { backlog_drive_owner } from './backlog-drive-owner'
|
|
4
4
|
|
|
5
|
-
// The driver's lane launch
|
|
5
|
+
// The driver's lane launch. The parent that ran `josh latest` in the primary
|
|
6
6
|
// checkout leaves its rewritten lock file in a stash under this message — `backlogrun-lanes.md` →
|
|
7
7
|
// "Once per repository, before the first lane opens" — and the lane that pops it carries the update
|
|
8
8
|
// into its pull request. **The stash itself is the "first lane" marker**: each launch asks whether it
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
1
2
|
import { EPIC_LABEL, has_label_name, NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
|
|
2
3
|
import type { IssueState } from '#scripts/issue/issue-state'
|
|
3
4
|
import { issue_state_cli } from '#scripts/issue/issue-state-cli'
|
|
4
5
|
import type { RunCarry } from '#scripts/run/carry/run-carry'
|
|
6
|
+
import { run_carry_added } from '#scripts/run/carry/run-carry-added'
|
|
5
7
|
import type { MergeResult } from '#scripts/run/merge/run-merge-cli'
|
|
8
|
+
import { run_invocation } from '#scripts/run/run-invocation'
|
|
6
9
|
import { backlog_budget } from './backlog-budget'
|
|
7
10
|
import type { DriveState, OfferRead } from './backlog-drive'
|
|
11
|
+
import { backlog_drive_epic } from './backlog-drive-epic'
|
|
8
12
|
import { backlog_drive_named } from './backlog-drive-named'
|
|
9
13
|
|
|
10
14
|
interface NamedContext {
|
|
@@ -47,15 +51,20 @@ function budget_offer(
|
|
|
47
51
|
}
|
|
48
52
|
|
|
49
53
|
// The outcome a named issue has already reached without this run dispatching it: closed is merged, and
|
|
50
|
-
// a `needs-decision` park waits on a person, so re-dispatching it only repeats the stop it parked on
|
|
51
|
-
//
|
|
54
|
+
// a `needs-decision` park waits on a person, so re-dispatching it only repeats the stop it parked on.
|
|
55
|
+
// Either is booked done rather than offered.
|
|
52
56
|
function settled_outcome(state: IssueState): MergeResult['outcome'] | undefined {
|
|
53
57
|
if (state.state.toUpperCase() === 'CLOSED') return 'merged'
|
|
54
58
|
|
|
55
59
|
return has_label_name(state.labels, NEEDS_DECISION_LABEL) ? 'parked' : undefined
|
|
56
60
|
}
|
|
57
61
|
|
|
58
|
-
async function classify(
|
|
62
|
+
async function classify(
|
|
63
|
+
issue: string,
|
|
64
|
+
named: OfferRead,
|
|
65
|
+
state: DriveState,
|
|
66
|
+
owner: string,
|
|
67
|
+
): Promise<OfferRead> {
|
|
59
68
|
const result = await issue_state_cli.read_issue(issue)
|
|
60
69
|
|
|
61
70
|
if (result.kind !== 'state') return { verdict: 'issue-state', issues: [], retries: NO_RETRIES }
|
|
@@ -68,11 +77,53 @@ async function classify(issue: string, named: OfferRead, owner: string): Promise
|
|
|
68
77
|
return { verdict: 'wait', issues: [], retries: NO_RETRIES }
|
|
69
78
|
}
|
|
70
79
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
80
|
+
return has_label_name(result.state.labels, EPIC_LABEL)
|
|
81
|
+
? await backlog_drive_epic.offer(issue, state, owner)
|
|
82
|
+
: named
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// **A named issue booked done is not thereby merged**: a park and a failure are
|
|
86
|
+
// booked done too, so the run moves past them. One the run's own merges did not record and GitHub does
|
|
87
|
+
// not read as closed ended without a merge — and an unreadable state counts as that, because a false
|
|
88
|
+
// stop reaches a person while a false finish ends the run where nobody sees it.
|
|
89
|
+
async function is_unmerged(issue: number, merged: ReadonlyArray<number>): Promise<boolean> {
|
|
90
|
+
if (merged.includes(issue)) return false
|
|
91
|
+
|
|
92
|
+
const result = await issue_state_cli.read_issue(String(issue))
|
|
93
|
+
|
|
94
|
+
return result.kind !== 'state' || result.state.state.toUpperCase() !== 'CLOSED'
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// The issues `run:add` put in count too: one that parked is no more a merge
|
|
98
|
+
// than a declared one.
|
|
99
|
+
async function unmerged_of(carry: RunCarry): Promise<Array<number>> {
|
|
100
|
+
const declared = run_carry_added.ordered(
|
|
101
|
+
run_invocation.issue_numbers(carry.invocation) ?? [],
|
|
102
|
+
carry.added,
|
|
103
|
+
)
|
|
104
|
+
const merged = carry.merged_issues ?? []
|
|
105
|
+
const flags = await Promise.all(declared.map(async (issue) => await is_unmerged(issue, merged)))
|
|
106
|
+
|
|
107
|
+
return declared.filter((_, index) => flags[index] === true)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// The `--only` run's end: a finish when every named issue merged, otherwise a stop naming the ones that
|
|
111
|
+
// did not, which `backlog-drive-finish.ts` closes with `run:carry --end --stopped` and its ⏸️ notice.
|
|
112
|
+
async function only_end(carry: RunCarry, named: OfferRead): Promise<OfferRead> {
|
|
113
|
+
const unmerged = await unmerged_of(carry)
|
|
114
|
+
|
|
115
|
+
if (unmerged.length === 0) return named
|
|
116
|
+
|
|
117
|
+
const listed = unmerged.map((issue) => issue_cite.plain(issue)).join(', ')
|
|
74
118
|
|
|
75
|
-
return named
|
|
119
|
+
return { ...named, reason: `only: ${listed} ended without a merge`, is_finish: false }
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
async function not_run(
|
|
123
|
+
carry: RunCarry,
|
|
124
|
+
named: OfferRead | undefined,
|
|
125
|
+
): Promise<OfferRead | undefined> {
|
|
126
|
+
return named?.is_finish === true ? await only_end(carry, named) : named
|
|
76
127
|
}
|
|
77
128
|
|
|
78
129
|
async function read(
|
|
@@ -81,12 +132,12 @@ async function read(
|
|
|
81
132
|
context: NamedContext,
|
|
82
133
|
): Promise<OfferRead | undefined> {
|
|
83
134
|
const named = backlog_drive_named.offer(carry, state, context.is_only)
|
|
84
|
-
if (named?.verdict !== 'run') return named
|
|
135
|
+
if (named?.verdict !== 'run') return await not_run(carry, named)
|
|
85
136
|
const budget = budget_offer(carry, state, context.forwarded)
|
|
86
137
|
if (budget.verdict !== 'run') return budget
|
|
87
138
|
const [issue] = named.issues
|
|
88
139
|
|
|
89
|
-
return issue === undefined ? undefined : await classify(issue, named, context.owner)
|
|
140
|
+
return issue === undefined ? undefined : await classify(issue, named, state, context.owner)
|
|
90
141
|
}
|
|
91
142
|
|
|
92
143
|
export const backlog_drive_named_offer = { read }
|
|
@@ -3,16 +3,39 @@ import { issue_state_cli } from '#scripts/issue/issue-state-cli'
|
|
|
3
3
|
import { run_carry, type RunCarry } from '#scripts/run/carry/run-carry'
|
|
4
4
|
import type { RunEvent } from '#scripts/run/event/run-event-stream'
|
|
5
5
|
import type { MergeResult } from '#scripts/run/merge/run-merge-cli'
|
|
6
|
+
import { run_merge_token } from '#scripts/run/merge/run-merge-token'
|
|
7
|
+
import { run_invocation } from '#scripts/run/run-invocation'
|
|
6
8
|
import type { DriveState, OfferRead } from './backlog-drive'
|
|
7
9
|
import { backlog_drive_restore } from './backlog-drive-restore'
|
|
8
10
|
import { backlog_named } from './backlog-named'
|
|
9
11
|
|
|
12
|
+
const { MERGE_TOKEN } = run_merge_token
|
|
13
|
+
|
|
10
14
|
const NO_RETRIES = 0
|
|
11
15
|
const FIRST = 0
|
|
12
16
|
const TERMINAL_OUTCOMES: ReadonlySet<string> = new Set(['merged', 'parked', 'split'])
|
|
13
17
|
|
|
18
|
+
// The skip follows the declared order alone: an issue `run:add` put in was
|
|
19
|
+
// asked for on its own, so its failure skips nothing and a declared failure does not skip it.
|
|
20
|
+
function is_declared(carry: RunCarry, issue: string): boolean {
|
|
21
|
+
return run_invocation.issue_numbers(carry.invocation)?.includes(Number(issue)) === true
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// An issue `run:add` put in that is already in flight holds nothing up: it was
|
|
25
|
+
// asked for on its own, so the declared item behind it — an epic whose children fill the free lanes —
|
|
26
|
+
// is offered beside it. A declared issue in flight still holds the ones declared after it.
|
|
27
|
+
function is_held(carry: RunCarry, state: DriveState, issue: number): boolean {
|
|
28
|
+
return !state.in_flight.includes(String(issue)) || is_declared(carry, String(issue))
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function next_of(carry: RunCarry, state: DriveState): number | undefined {
|
|
32
|
+
const remaining = run_carry.remaining_of(carry) ?? []
|
|
33
|
+
|
|
34
|
+
return remaining.find((issue) => is_held(carry, state, issue)) ?? remaining[FIRST]
|
|
35
|
+
}
|
|
36
|
+
|
|
14
37
|
function offer(carry: RunCarry, state: DriveState, is_only: boolean): OfferRead | undefined {
|
|
15
|
-
const next =
|
|
38
|
+
const next = next_of(carry, state)
|
|
16
39
|
|
|
17
40
|
if (next !== undefined) {
|
|
18
41
|
const issue = String(next)
|
|
@@ -28,9 +51,11 @@ function offer(carry: RunCarry, state: DriveState, is_only: boolean): OfferRead
|
|
|
28
51
|
}
|
|
29
52
|
|
|
30
53
|
function is_done(result: MergeResult): boolean {
|
|
31
|
-
if (TERMINAL_OUTCOMES.has(result.outcome))
|
|
54
|
+
if (TERMINAL_OUTCOMES.has(result.outcome)) {
|
|
55
|
+
return result.code === 0 && result.token !== MERGE_TOKEN.BUSY
|
|
56
|
+
}
|
|
32
57
|
|
|
33
|
-
return result.outcome === 'failed' && result.code === 0 && result.token !==
|
|
58
|
+
return result.outcome === 'failed' && result.code === 0 && result.token !== MERGE_TOKEN.STOP
|
|
34
59
|
}
|
|
35
60
|
|
|
36
61
|
function can_mark(carry: RunCarry, issue: string, owner: string): boolean {
|
|
@@ -48,17 +73,22 @@ function mark_one(target: string, issue: string, owner: string): boolean {
|
|
|
48
73
|
return true
|
|
49
74
|
}
|
|
50
75
|
|
|
51
|
-
function
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const remaining = run_carry.remaining_of(read.carry) ?? []
|
|
76
|
+
function skipped_of(carry: RunCarry, issue: string): ReadonlyArray<number> {
|
|
77
|
+
if (!is_declared(carry, issue)) return []
|
|
78
|
+
const remaining = run_carry.remaining_of({ ...carry, added: undefined }) ?? []
|
|
55
79
|
const named = [
|
|
56
80
|
{ issue: Number(issue), is_epic: false },
|
|
57
81
|
...remaining.map((number) => ({ issue: number, is_epic: false })),
|
|
58
82
|
]
|
|
59
|
-
const { skipped } = backlog_named.after_failure(named, Number(issue))
|
|
60
83
|
|
|
61
|
-
|
|
84
|
+
return backlog_named.after_failure(named, Number(issue)).skipped
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function skip_after_failure(target: string, issue: string, owner: string): void {
|
|
88
|
+
const read = run_carry.read_carry(target)
|
|
89
|
+
if (read.kind !== 'carried') return
|
|
90
|
+
|
|
91
|
+
for (const number of skipped_of(read.carry, issue)) {
|
|
62
92
|
if (!mark_one(target, String(number), owner)) return
|
|
63
93
|
}
|
|
64
94
|
}
|
|
@@ -3,7 +3,7 @@ import type { DriveState } from './backlog-drive'
|
|
|
3
3
|
|
|
4
4
|
const LIST_SEPARATOR = ','
|
|
5
5
|
|
|
6
|
-
// **A child in flight is never offered
|
|
6
|
+
// **A child in flight is never offered**. A lane child merges its own PR and
|
|
7
7
|
// drops `in-progress` before GitHub closes the issue and before the loop collects it, so `backlog:next`
|
|
8
8
|
// can offer it again; launching it then is refused by its still-open lane and handed to an AI session.
|
|
9
9
|
function excluded(state: DriveState): ReadonlyArray<string> {
|
|
@@ -64,4 +64,4 @@ function restore(
|
|
|
64
64
|
return lanes.filter((issue) => active.has(issue) && !merged_issues.includes(Number(issue)))
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
export const backlog_drive_restore = { restore, settled_issues, parked_issues }
|
|
67
|
+
export const backlog_drive_restore = { active_issues, restore, settled_issues, parked_issues }
|
|
@@ -4,8 +4,8 @@ import type { RunCarry } from '#scripts/run/carry/run-carry'
|
|
|
4
4
|
import { run_retrospective } from '#scripts/run/run-retrospective'
|
|
5
5
|
|
|
6
6
|
// Whether a drain owes the retrospective, read through the owed rule `run:step` reads, so a drain it
|
|
7
|
-
// owes nothing at keeps the idle watch rather than waking a session with nothing to run
|
|
8
|
-
//
|
|
7
|
+
// owes nothing at keeps the idle watch rather than waking a session with nothing to run.
|
|
8
|
+
// The drive is the parent's loop, never a lane child's.
|
|
9
9
|
function is_owed(carry: RunCarry): boolean {
|
|
10
10
|
const root = find_package_directory(process.cwd())
|
|
11
11
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// The body of `josh backlog:drive`: the backlogrun parent's mechanical transitions, run as one resident
|
|
2
|
-
// wait instead of a model turn per event
|
|
2
|
+
// wait instead of a model turn per event.
|
|
3
3
|
//
|
|
4
|
-
// **What it replaces is the parent's turn between two commands.**
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
4
|
+
// **What it replaces is the parent's turn between two commands.** Without it the parent spends about
|
|
5
|
+
// half of its backlogrun requests on nothing but glue: a child's process ends, the model wakes, runs
|
|
6
|
+
// `run:merge`, reads a number, runs `lane:launch`, restarts `lane:await`, ends its turn — or, headless,
|
|
7
|
+
// polls in the foreground because its turn cannot end. Every one of those steps is a command
|
|
8
8
|
// whose answer is already a token, so the loop here only reads tokens and never decides what one means.
|
|
9
9
|
//
|
|
10
10
|
// **It decides nothing another command answers.** Collecting a child is `run:merge`'s, choosing the next
|
|
@@ -16,25 +16,40 @@
|
|
|
16
16
|
// **Everything it touches is a port**, the pattern `run-wake-loop.ts` set, so the sequencing is pinned
|
|
17
17
|
// without a process, a network or a clock.
|
|
18
18
|
|
|
19
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
19
20
|
import type { LaunchOutcome } from '#scripts/lane/lane-launch-cli'
|
|
20
21
|
import type { MergeResult } from '#scripts/run/merge/run-merge-cli'
|
|
22
|
+
import { run_merge_token, type MergeToken } from '#scripts/run/merge/run-merge-token'
|
|
21
23
|
|
|
24
|
+
const { MERGE_TOKEN } = run_merge_token
|
|
22
25
|
const RUN_VERDICT = 'run'
|
|
23
26
|
const STOP_VERDICT = 'stop'
|
|
24
|
-
//
|
|
25
|
-
// a
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
]
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
27
|
+
// How the loop reads each `run:merge` token — keyed by the producer's own type, so a token added there
|
|
28
|
+
// is a type error here until it is classified. `hand-back` ends the loop at once: a hand-off, a person's
|
|
29
|
+
// stop, the environment down, a foreign owner, an unreadable state. `stop` — a parked backlog or the
|
|
30
|
+
// failure guard — is the offer's `stop` reached through a merge: the child is collected, nothing more
|
|
31
|
+
// starts, and the children still in flight are collected before the loop ends. `await` is a cut resumed
|
|
32
|
+
// in place: the same lane is awaited again.
|
|
33
|
+
type TokenHandling = 'hand-back' | 'stop' | 'await'
|
|
34
|
+
const TOKEN_HANDLING: Readonly<Record<MergeToken, TokenHandling>> = {
|
|
35
|
+
[MERGE_TOKEN.OVER]: 'hand-back',
|
|
36
|
+
[MERGE_TOKEN.HUMAN_REVIEW]: 'hand-back',
|
|
37
|
+
[MERGE_TOKEN.ENVIRONMENT]: 'hand-back',
|
|
38
|
+
[MERGE_TOKEN.BUSY]: 'hand-back',
|
|
39
|
+
[MERGE_TOKEN.RETRY]: 'hand-back',
|
|
40
|
+
[MERGE_TOKEN.STOP]: 'stop',
|
|
41
|
+
[MERGE_TOKEN.RESUMED]: 'await',
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function tokens_handled(...handlings: ReadonlyArray<TokenHandling>): ReadonlySet<string> {
|
|
45
|
+
const entries = Object.entries(TOKEN_HANDLING)
|
|
46
|
+
|
|
47
|
+
return new Set(entries.filter(([, handling]) => handlings.includes(handling)).map(([key]) => key))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const IMMEDIATE_TOKENS = tokens_handled('hand-back')
|
|
51
|
+
// Every token `run:merge` prints first even on a non-zero exit.
|
|
52
|
+
const HANDOFF_TOKENS = tokens_handled('hand-back', 'stop')
|
|
38
53
|
const MERGED_OUTCOME = 'merged'
|
|
39
54
|
const WATCH_VERDICT = 'watch'
|
|
40
55
|
// The verdicts the loop acts on without the parent. Any other is handed back as it was printed.
|
|
@@ -56,7 +71,7 @@ interface OfferRead {
|
|
|
56
71
|
answer?: string | undefined
|
|
57
72
|
reason?: string | undefined
|
|
58
73
|
// Whether a drain here owes the retrospective: the opt-in switch is on and it has not run yet. Absent
|
|
59
|
-
// reads as not owed, so a drain with the switch off keeps the idle watch
|
|
74
|
+
// reads as not owed, so a drain with the switch off keeps the idle watch.
|
|
60
75
|
is_retrospective_owed?: boolean
|
|
61
76
|
is_finish?: boolean | undefined
|
|
62
77
|
}
|
|
@@ -65,8 +80,7 @@ interface DriveState {
|
|
|
65
80
|
// The children this run has in flight — seeded from the open lanes, so a restarted loop resumes them.
|
|
66
81
|
in_flight: Array<string>
|
|
67
82
|
// Every child merged, fed back to `backlog:offer` because GitHub closes a merged issue late. A parked
|
|
68
|
-
// child is left out: its labels classify it, so one a person released is offered again
|
|
69
|
-
// (joshuafolkken/kit#3041).
|
|
83
|
+
// child is left out: its labels classify it, so one a person released is offered again.
|
|
70
84
|
exclude: Array<string>
|
|
71
85
|
// When the run last did something, handed to `backlog:budget` as `--active`.
|
|
72
86
|
active: string
|
|
@@ -160,7 +174,7 @@ function merge_stopped(issue: string, state: DriveState): DriveState {
|
|
|
160
174
|
return {
|
|
161
175
|
...state,
|
|
162
176
|
is_stopping: true,
|
|
163
|
-
stop_reason: `run:merge
|
|
177
|
+
stop_reason: `run:merge ${issue_cite.plain(issue)} answered stop`,
|
|
164
178
|
stopped_by: issue,
|
|
165
179
|
}
|
|
166
180
|
}
|
|
@@ -181,7 +195,7 @@ function collected_state(
|
|
|
181
195
|
active: string,
|
|
182
196
|
): DriveState {
|
|
183
197
|
const in_flight =
|
|
184
|
-
collected.token ===
|
|
198
|
+
collected.token === MERGE_TOKEN.RESUMED
|
|
185
199
|
? state.in_flight
|
|
186
200
|
: state.in_flight.filter((item) => item !== issue)
|
|
187
201
|
const exclude = excluded(issue, collected.outcome, state)
|
|
@@ -200,7 +214,7 @@ async function collect(issue: string, state: DriveState, ports: DrivePorts): Pro
|
|
|
200
214
|
|
|
201
215
|
const next = collected_state(issue, collected, state, ports.now().toISOString())
|
|
202
216
|
|
|
203
|
-
return { kind: 'continue', state: token ===
|
|
217
|
+
return { kind: 'continue', state: token === MERGE_TOKEN.STOP ? merge_stopped(issue, next) : next }
|
|
204
218
|
}
|
|
205
219
|
|
|
206
220
|
async function collect_finished(state: DriveState, ports: DrivePorts): Promise<PassResult> {
|
|
@@ -219,7 +233,7 @@ async function collect_finished(state: DriveState, ports: DrivePorts): Promise<P
|
|
|
219
233
|
return { kind: 'continue', state: current }
|
|
220
234
|
}
|
|
221
235
|
|
|
222
|
-
// A `lane:open` refused with every lane taken is a wait, not a judgement
|
|
236
|
+
// A `lane:open` refused with every lane taken is a wait, not a judgement: the
|
|
223
237
|
// next offer after a lane frees retries it. A step failing after the lane opened is always handed back —
|
|
224
238
|
// that lane holds the last seat itself, so the free count would read the failure as a full pool.
|
|
225
239
|
async function refused(
|
|
@@ -234,12 +248,12 @@ async function refused(
|
|
|
234
248
|
return ended('launch', state, undefined, issue)
|
|
235
249
|
}
|
|
236
250
|
|
|
237
|
-
// **No more launches than free lanes
|
|
251
|
+
// **No more launches than free lanes**. `backlog:offer` lists every ready issue
|
|
238
252
|
// without reading the lanes, so launching all of them overran `JOSH_LANE_LIMIT` until `lane:open` ran
|
|
239
253
|
// out of seats. The free count is read once, before the first launch, because every launch here opens
|
|
240
254
|
// a lane the count would otherwise have to be told about.
|
|
241
255
|
//
|
|
242
|
-
// **Only a launch is activity
|
|
256
|
+
// **Only a launch is activity**: a pass that started nothing — every lane taken
|
|
243
257
|
// — keeps `active` where it was, or the once-a-minute offer would restart the idle budget for good.
|
|
244
258
|
function launched(state: DriveState, in_flight: Array<string>, ports: DrivePorts): DriveState {
|
|
245
259
|
if (in_flight.length === state.in_flight.length) return { ...state, in_flight }
|
|
@@ -410,6 +424,7 @@ async function run_loop(
|
|
|
410
424
|
|
|
411
425
|
const backlog_drive = {
|
|
412
426
|
HANDOFF_TOKENS,
|
|
427
|
+
TOKEN_HANDLING,
|
|
413
428
|
initial_state,
|
|
414
429
|
merge_stopped,
|
|
415
430
|
run_loop,
|