@joshuafolkken/kit 1.1229.0 → 1.1370.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +50 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +24 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +27 -16
- package/.claude/skills/workflow-commands/latest-gate.md +18 -29
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.github/workflows/publish.yml +2 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +38 -57
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +213 -197
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -201
- package/dist/josh.js +540 -137
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +16 -10
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +4 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +26 -2
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +162 -0
- package/scripts/gate/core-budget.ts +134 -91
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +103 -35
- package/scripts/gate/gate-report.ts +39 -21
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +313 -0
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +60 -53
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +12 -8
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +35 -0
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +49 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +75 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +14 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +46 -37
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +165 -0
- package/scripts/issue/issue-release.ts +58 -0
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +32 -34
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +33 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +11 -5
- package/scripts/josh/josh-commands-lane.ts +16 -5
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-maintenance.ts +2 -2
- package/scripts/josh/josh-commands-run.ts +20 -6
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +10 -10
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +20 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +44 -30
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +25 -24
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +22 -8
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +27 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +140 -0
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-environment.ts +1 -0
- package/scripts/release/github-release-runs.ts +115 -0
- package/scripts/release/github-release.ts +13 -67
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +5 -6
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +68 -37
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +10 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +172 -43
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +25 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +13 -15
- package/scripts/run/run-step.ts +62 -48
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -33
- package/scripts/run/wake/run-wake-describe.ts +76 -29
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +13 -21
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -328
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +129 -98
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/templates/workflows/github-release.yml +4 -0
- package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import { spawnSync } from 'node:child_process'
|
|
2
2
|
import { setTimeout as sleep } from 'node:timers/promises'
|
|
3
3
|
import { parseArgs } from 'node:util'
|
|
4
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
4
5
|
import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
5
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
PROCESS_ALIVE,
|
|
8
|
+
PROCESS_NONE,
|
|
9
|
+
PROCESS_UNKNOWN,
|
|
10
|
+
run_liveness,
|
|
11
|
+
type ProcessTrace,
|
|
12
|
+
} from '#scripts/run/run-liveness'
|
|
6
13
|
import { lane_child_invocation } from './lane-child-invocation'
|
|
7
14
|
import { lane_handoff } from './lane-handoff'
|
|
8
15
|
|
|
9
16
|
// Detached lane children are not harness-tracked processes, so their completion fires no
|
|
10
17
|
// re-invocation event in the parent's session. Without a blocking wait the parent notices only
|
|
11
|
-
// on the next heartbeat interval -- up to 15 minutes after the fact
|
|
12
|
-
// (joshuafolkken/kit#2113).
|
|
18
|
+
// on the next heartbeat interval -- up to 15 minutes after the fact.
|
|
13
19
|
//
|
|
14
20
|
// **The re-confirm delay is the one value the caller must not be left to choose.** A process that
|
|
15
21
|
// disappears briefly and reappears (the pre-gate boundary cut, where one process exits and a
|
|
@@ -22,12 +28,12 @@ const RECONFIRM_MS = 15_000
|
|
|
22
28
|
const DEFAULT_POLL_MS = 5000
|
|
23
29
|
const NEVER_APPEARED_TIMEOUT_MS = 600_000
|
|
24
30
|
const MS_PER_SECOND = 1000
|
|
25
|
-
const ISSUE_PATTERN = /^[1-9]\d*$/u
|
|
26
31
|
const PROCESS_FOUND = 0
|
|
32
|
+
const PROCESS_NOT_FOUND = 1
|
|
27
33
|
|
|
28
34
|
// `is_settled` is read once, when the wait starts: a child that ended between two `lane:await` calls
|
|
29
35
|
// never appears in the second one, and only its settled issue tells it apart from one not yet
|
|
30
|
-
// launched
|
|
36
|
+
// launched.
|
|
31
37
|
interface AwaitState {
|
|
32
38
|
appeared: boolean
|
|
33
39
|
disappeared_at: number | undefined
|
|
@@ -52,6 +58,8 @@ interface AwaitOptions {
|
|
|
52
58
|
poll_ms?: number
|
|
53
59
|
reconfirm_ms?: number
|
|
54
60
|
never_appeared_timeout_ms?: number
|
|
61
|
+
now?: () => number
|
|
62
|
+
sleep?: (ms: number) => Promise<void>
|
|
55
63
|
}
|
|
56
64
|
|
|
57
65
|
interface CheckConfig {
|
|
@@ -63,18 +71,28 @@ interface CheckConfig {
|
|
|
63
71
|
interface RunConfig extends CheckConfig {
|
|
64
72
|
is_settled: (issue: string) => Promise<boolean>
|
|
65
73
|
poll_ms: number
|
|
74
|
+
now: () => number
|
|
75
|
+
sleep: (ms: number) => Promise<void>
|
|
66
76
|
}
|
|
67
77
|
|
|
68
|
-
|
|
78
|
+
// Three answers, not two: only pgrep's own "no match" exit is `none`. A pgrep that failed or hit its
|
|
79
|
+
// timeout never looked, and `run:liveness` answers `undetermined` for it rather than booking a live
|
|
80
|
+
// child as stopped.
|
|
81
|
+
function process_trace_default(issue: string): ProcessTrace {
|
|
69
82
|
const pattern = lane_child_invocation.process_pattern(issue)
|
|
70
83
|
const result = spawnSync('pgrep', ['-f', pattern], {
|
|
71
84
|
encoding: 'utf8',
|
|
72
85
|
timeout: PROBE_TIMEOUT_MS,
|
|
73
86
|
})
|
|
74
87
|
|
|
75
|
-
if (result.status === PROCESS_FOUND) return
|
|
88
|
+
if (result.status === PROCESS_FOUND) return PROCESS_ALIVE
|
|
89
|
+
if (lane_handoff.is_ship_running(issue, process.cwd())) return PROCESS_ALIVE
|
|
90
|
+
|
|
91
|
+
return result.status === PROCESS_NOT_FOUND ? PROCESS_NONE : PROCESS_UNKNOWN
|
|
92
|
+
}
|
|
76
93
|
|
|
77
|
-
|
|
94
|
+
function is_process_running_default(issue: string): boolean {
|
|
95
|
+
return process_trace_default(issue) === PROCESS_ALIVE
|
|
78
96
|
}
|
|
79
97
|
|
|
80
98
|
// The same positive evidence `run:liveness` answers `settled` on: the issue closed, or it was parked.
|
|
@@ -101,7 +119,10 @@ function is_valid(raw: RawAwaitArguments): boolean {
|
|
|
101
119
|
const { owner } = raw.values
|
|
102
120
|
const numbers = owner === undefined ? raw.positionals : [...raw.positionals, owner]
|
|
103
121
|
|
|
104
|
-
return
|
|
122
|
+
return (
|
|
123
|
+
raw.positionals.length > 0 &&
|
|
124
|
+
numbers.every((value) => issue_number_shape.is_issue_number(value))
|
|
125
|
+
)
|
|
105
126
|
}
|
|
106
127
|
|
|
107
128
|
// The issues to wait on and the waiting session's pid, or `undefined` for anything else.
|
|
@@ -142,6 +163,8 @@ function resolve_options(options: AwaitOptions): RunConfig {
|
|
|
142
163
|
return {
|
|
143
164
|
is_running: options.is_running ?? is_process_running_default,
|
|
144
165
|
is_settled: options.is_settled ?? is_settled_default,
|
|
166
|
+
now: options.now ?? Date.now,
|
|
167
|
+
sleep: options.sleep ?? sleep,
|
|
145
168
|
...resolve_timing(options),
|
|
146
169
|
}
|
|
147
170
|
}
|
|
@@ -225,12 +248,12 @@ async function wait_for_any(
|
|
|
225
248
|
const states = await make_states(issues, config.is_settled)
|
|
226
249
|
|
|
227
250
|
for (;;) {
|
|
228
|
-
const completed = check_any(states,
|
|
251
|
+
const completed = check_any(states, config.now(), config)
|
|
229
252
|
|
|
230
253
|
if (completed !== undefined) return completed
|
|
231
254
|
|
|
232
255
|
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
233
|
-
await sleep(config.poll_ms)
|
|
256
|
+
await config.sleep(config.poll_ms)
|
|
234
257
|
}
|
|
235
258
|
}
|
|
236
259
|
|
|
@@ -240,6 +263,7 @@ const lane_await = {
|
|
|
240
263
|
check_issue,
|
|
241
264
|
is_process_running_default,
|
|
242
265
|
parse_arguments,
|
|
266
|
+
process_trace_default,
|
|
243
267
|
wait_for_any,
|
|
244
268
|
}
|
|
245
269
|
|
|
@@ -8,15 +8,15 @@ import {
|
|
|
8
8
|
type GateCacheSpec,
|
|
9
9
|
} from '#scripts/josh/josh-command-types'
|
|
10
10
|
|
|
11
|
-
// Warming a fresh lane's verification caches from the main checkout
|
|
11
|
+
// Warming a fresh lane's verification caches from the main checkout.
|
|
12
12
|
//
|
|
13
13
|
// `git worktree add` writes a checkout and nothing beside it, and the three caches the gate reads —
|
|
14
14
|
// `.eslintcache`, `.tsbuildinfo`, `.cspellcache` — are all git-ignored, so a new lane has none of
|
|
15
|
-
// them and only its *first* `josh gate` runs fully cold (
|
|
16
|
-
//
|
|
17
|
-
//
|
|
15
|
+
// them and only its *first* `josh gate` runs fully cold (several minutes against well under a minute
|
|
16
|
+
// warm). The initial seed warms that run; the per-tool sync below keeps the portable ESLint and
|
|
17
|
+
// CSpell caches current afterwards.
|
|
18
18
|
//
|
|
19
|
-
// Content hashes make stale entries safe, but do not by themselves make a cache portable
|
|
19
|
+
// Content hashes make stale entries safe, but do not by themselves make a cache portable.
|
|
20
20
|
// ESLint keys entries by absolute file path, so its JSON is rebased while cspell's relative keys and
|
|
21
21
|
// TypeScript's build info move raw. The spec in `josh-command-types.ts` is the one declaration of
|
|
22
22
|
// which treatment and which continuous sharing each gate cache receives.
|
|
@@ -103,7 +103,7 @@ function seed_caches(source_root: string, destination: string): void {
|
|
|
103
103
|
/**
|
|
104
104
|
* Copy the pre-built hook bundles (`dist/hooks/`) from `source_root` into `destination`, so a fresh
|
|
105
105
|
* lane's child runs each Claude Code hook off `node dist/hooks/<name>.js` rather than the slower
|
|
106
|
-
* `pnpm josh …` fallback
|
|
106
|
+
* `pnpm josh …` fallback. The bundles are git-ignored, so a lane's work tree
|
|
107
107
|
* never carries them and every hook falls back without this seed.
|
|
108
108
|
*
|
|
109
109
|
* Best-effort, exactly like `seed_caches`: a source with no bundles (a checkout that never ran
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
+
import { lane_limit_override } from './lane-limit-override'
|
|
1
2
|
import type { LaneEnvironment } from './lane-paths'
|
|
2
3
|
import { lane_seed_policy } from './lane-seed'
|
|
3
4
|
|
|
4
|
-
// How many lanes one repository may run at once, and how many of them are free
|
|
5
|
-
// (joshuafolkken/kit#1491).
|
|
5
|
+
// How many lanes one repository may run at once, and how many of them are free.
|
|
6
6
|
//
|
|
7
7
|
// **Nothing here knows what a lane holds.** The limit is a number, the occupancy is a number, and
|
|
8
8
|
// the answer is a number — so the same pool serves an epic's children, several epics' children at
|
|
9
9
|
// once, or anything else a scheduler decides to put in a lane. Threading an epic through this module
|
|
10
|
-
// is what would have to be undone the first time two epics run together,
|
|
11
|
-
//
|
|
10
|
+
// is what would have to be undone the first time two epics run together, which is why the scheduler
|
|
11
|
+
// is epic-free.
|
|
12
12
|
//
|
|
13
13
|
// **It is a ceiling, not a prediction.** Six lanes does not say six children will run at once; it
|
|
14
14
|
// says a seventh will not start. What actually runs is bounded by what is runnable, by the port
|
|
@@ -33,40 +33,55 @@ type LimitChoice = { kind: 'limit'; limit: number } | { kind: 'problem'; problem
|
|
|
33
33
|
//
|
|
34
34
|
// Blank is unset, not invalid: an `.env` line left as `JOSH_LANE_LIMIT=` is a variable nobody
|
|
35
35
|
// configured, exactly as `lane_paths.lane_root` reads a blank root.
|
|
36
|
-
|
|
36
|
+
//
|
|
37
|
+
// `name` is what the problem names: `josh lane:limit` reads its argument by the same rule.
|
|
38
|
+
function read_limit(raw: string | undefined, name: string): LimitChoice {
|
|
37
39
|
const trimmed = raw?.trim() ?? ''
|
|
38
40
|
|
|
39
41
|
if (trimmed === '') return { kind: 'limit', limit: DEFAULT_LANE_LIMIT }
|
|
40
42
|
|
|
41
43
|
if (!POSITIVE_INTEGER.test(trimmed)) {
|
|
42
|
-
return {
|
|
43
|
-
kind: 'problem',
|
|
44
|
-
problem: `${LANE_LIMIT_KEY} must be a positive integer, not "${trimmed}"`,
|
|
45
|
-
}
|
|
44
|
+
return { kind: 'problem', problem: `${name} must be a positive integer, not "${trimmed}"` }
|
|
46
45
|
}
|
|
47
46
|
|
|
48
47
|
return { kind: 'limit', limit: Number(trimmed) }
|
|
49
48
|
}
|
|
50
49
|
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
// **A live run's `lane:limit` override outranks the environment**: a running
|
|
51
|
+
// parent keeps the environment it started with, so the override is the only way its limit moves. This
|
|
52
|
+
// stays the one place the limit is read; the override reader is injected so a test reads none.
|
|
53
|
+
async function lane_limit(
|
|
54
|
+
environment: LaneEnvironment = process.env,
|
|
55
|
+
read_override: () => Promise<number | undefined> = lane_limit_override.read_override,
|
|
56
|
+
): Promise<LimitChoice> {
|
|
57
|
+
const override = await read_override()
|
|
58
|
+
|
|
59
|
+
if (override !== undefined) return { kind: 'limit', limit: override }
|
|
60
|
+
|
|
61
|
+
return read_limit(environment[LANE_LIMIT_KEY], LANE_LIMIT_KEY)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// **A limit above the seat count is capped at the seats**. `lane:open` refuses
|
|
65
|
+
// a tenth lane however high the limit is set, so a limit past the seats offers launches bound to be
|
|
66
|
+
// refused.
|
|
67
|
+
function seated_limit(limit: number): number {
|
|
68
|
+
return Math.min(limit, lane_seed_policy.LAST_LANE_SEAT)
|
|
53
69
|
}
|
|
54
70
|
|
|
55
71
|
// Never negative: a repository holding more `in-progress` issues than the limit allows — the limit
|
|
56
72
|
// was lowered, or a stale label outlived its run — has no free lane, and a negative count read as
|
|
57
73
|
// "how many to offer" would be a slice nobody meant.
|
|
58
|
-
//
|
|
59
|
-
// **A limit above the seat count is capped at the seats** (joshuafolkken/kit#3027). `lane:open` refuses
|
|
60
|
-
// a tenth lane however high `JOSH_LANE_LIMIT` is set, so counting free lanes past the seats offers a
|
|
61
|
-
// launch that is bound to be refused.
|
|
62
74
|
function free_lanes(limit: number, occupied: number): number {
|
|
63
|
-
return Math.max(NO_LANES,
|
|
75
|
+
return Math.max(NO_LANES, seated_limit(limit) - occupied)
|
|
64
76
|
}
|
|
65
77
|
|
|
66
78
|
const lane_capacity = {
|
|
67
79
|
LANE_LIMIT_KEY,
|
|
68
|
-
lane_limit,
|
|
69
80
|
free_lanes,
|
|
81
|
+
lane_limit,
|
|
82
|
+
read_limit,
|
|
83
|
+
seated_limit,
|
|
70
84
|
}
|
|
71
85
|
|
|
86
|
+
export type { LimitChoice }
|
|
72
87
|
export { lane_capacity }
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
2
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
2
3
|
import { run_ship_next, type ShipResume } from '#scripts/run/ship/run-ship-next'
|
|
3
4
|
import type { Stage } from '#scripts/run/ship/run-ship-stage'
|
|
4
5
|
|
|
@@ -8,7 +9,7 @@ interface ShipStop extends ShipResume {
|
|
|
8
9
|
|
|
9
10
|
const CHILD_INVOCATION = 'fullrun'
|
|
10
11
|
const RESUME_GUIDE = '.claude/skills/workflow-commands/pre-gate-cut.md'
|
|
11
|
-
// What a detached `josh ship --detach` supervisor's command line carries
|
|
12
|
+
// What a detached `josh ship --detach` supervisor's command line carries. It ends
|
|
12
13
|
// with the `"<title> #<N>"` title on purpose, so the liveness pattern below finds it by the same trailing
|
|
13
14
|
// anchor it finds a child by. **The script path alone is not enough**: where the dispatcher is TypeScript
|
|
14
15
|
// (kit itself) `josh ship` runs in-process, so no process ever carries `run-ship-cli.ts` — the `pnpm josh
|
|
@@ -16,57 +17,58 @@ const RESUME_GUIDE = '.claude/skills/workflow-commands/pre-gate-cut.md'
|
|
|
16
17
|
const SHIP_PROCESS = String.raw`(josh(\.[jt]s)? ship|run-ship-cli\.ts)`
|
|
17
18
|
|
|
18
19
|
function child_invocation(issue: string): string {
|
|
19
|
-
|
|
20
|
+
issue_number_shape.require_issue_number(issue)
|
|
20
21
|
|
|
21
|
-
return `${CHILD_INVOCATION}
|
|
22
|
+
return `${CHILD_INVOCATION} ${issue_cite.plain(issue)}`
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
// The `pgrep -f` pattern that finds a running child: the invocation is always the last argument of
|
|
25
26
|
// its command line — the resume prompts below end with it on purpose — so the anchor matches every
|
|
26
|
-
// launch of `#<N>` and never `#<N>0
|
|
27
|
+
// launch of `#<N>` and never `#<N>0`.
|
|
27
28
|
//
|
|
28
|
-
// **A detached ship supervisor counts as the child
|
|
29
|
+
// **A detached ship supervisor counts as the child**. The agent ends once it has
|
|
29
30
|
// handed the post-implementation region to `josh ship --detach`, and the parent books a lane whose
|
|
30
31
|
// pattern stopped matching as finished — parking an issue that was still shipping. The supervisor's
|
|
31
32
|
// command line ends with its `#<N>` title, so the one extended pattern covers both, and the wait, the
|
|
32
33
|
// liveness read and the reaper keep searching with a single pattern.
|
|
33
34
|
function process_pattern(issue: string): string {
|
|
34
|
-
|
|
35
|
+
issue_number_shape.require_issue_number(issue)
|
|
35
36
|
|
|
36
|
-
return `(${CHILD_INVOCATION}|${SHIP_PROCESS} .*)
|
|
37
|
+
return `(${CHILD_INVOCATION}|${SHIP_PROCESS} .*) ${issue_cite.plain(issue)}$`
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
function resume_invocation(issue: string): string {
|
|
40
|
-
const preamble = `Resuming the lane child for issue
|
|
41
|
+
const preamble = `Resuming the lane child for issue ${issue_cite.plain(issue)} — do not re-read the workflow-commands entry documents (SKILL.md, fullrun.md). Run \`pnpm josh run:cut --resume ${issue}\` before anything else and follow the matching verdict in ${RESUME_GUIDE}: \`resume\` goes to the gate, \`resume-impl\` continues implementation. Only on \`fresh\` proceed as an ordinary`
|
|
41
42
|
|
|
42
43
|
return `${preamble} ${child_invocation(issue)}`
|
|
43
44
|
}
|
|
44
45
|
|
|
45
|
-
// The prompt an `outage` re-dispatch gives a resumed child
|
|
46
|
+
// The prompt an `outage` re-dispatch gives a resumed child. Its session was
|
|
46
47
|
// relaunched with `--resume`, so its full context is already loaded — the preamble tells it not to
|
|
47
48
|
// re-read the entry documents and to find where it stopped with `run:step`, redoing only the last
|
|
48
49
|
// action if it did not complete.
|
|
49
50
|
//
|
|
50
51
|
// **It ends with `child_invocation` on purpose, not as decoration** — for the same reason
|
|
51
|
-
// `resume_invocation` does: the parent's liveness
|
|
52
|
+
// `resume_invocation` does: the parent's liveness read (`run:liveness`, `lane:await`) matches
|
|
53
|
+
// `process_pattern` against the command line, so the trailing
|
|
52
54
|
// `fullrun #<N>` keeps the relaunched process matching, and it is the ordinary run the child carries on.
|
|
53
55
|
function outage_resume_invocation(issue: string): string {
|
|
54
|
-
const preamble = `Resuming the lane child for issue
|
|
56
|
+
const preamble = `Resuming the lane child for issue ${issue_cite.plain(issue)} after an API disconnection — your session was restored with its full context, so do not re-read the workflow-commands entry documents (SKILL.md, fullrun.md). Continue the run from where it stopped: run \`pnpm josh run:step ${issue}\` to find the next action, redoing only the last step if it did not complete.`
|
|
55
57
|
|
|
56
58
|
return `${preamble} ${child_invocation(issue)}`
|
|
57
59
|
}
|
|
58
60
|
|
|
59
61
|
// The prompt a lane child is relaunched with when its detached ship supervisor stopped at a failed
|
|
60
|
-
// stage
|
|
62
|
+
// stage — a red gate, a High/Medium review, a failed push or red CI. The agent
|
|
61
63
|
// ended at the hand-off, so this is how control comes back to one: it reads the stopped report, fixes it
|
|
62
64
|
// and hands the region back. It ends with `child_invocation` for the reason `resume_invocation` does —
|
|
63
65
|
// the parent's poll keeps matching the relaunched process.
|
|
64
66
|
//
|
|
65
|
-
// **A known stage puts the next command in the prompt
|
|
67
|
+
// **A known stage puts the next command in the prompt**, so the relaunched
|
|
66
68
|
// session runs it rather than re-deriving it from `chain-rule.md`. An OpenAI lane's supervisor sees only
|
|
67
69
|
// that the ship failed, not where, so without a stage the prompt points at `run:step` as before.
|
|
68
70
|
function ship_stop_invocation(issue: string, stop?: ShipStop): string {
|
|
69
|
-
const opening = `Resuming the lane child for issue
|
|
71
|
+
const opening = `Resuming the lane child for issue ${issue_cite.plain(issue)} after its detached ship supervisor stopped at a failed stage — do not re-read the workflow-commands entry documents (SKILL.md, fullrun.md).`
|
|
70
72
|
const next =
|
|
71
73
|
stop === undefined
|
|
72
74
|
? `Run \`pnpm josh run:step ${issue}\` and read the stopped report it names, fix what stopped the ship, then hand the region back per chain-rule.md.`
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
2
2
|
import { lane_paths } from './lane-paths'
|
|
3
3
|
|
|
4
4
|
// The mark a dispatched lane child carries, so the pre-gate cut and a resume are decided from the
|
|
5
|
-
// environment rather than from the model's reading of the prompt
|
|
5
|
+
// environment rather than from the model's reading of the prompt.
|
|
6
6
|
//
|
|
7
|
-
// **
|
|
8
|
-
// and the `run:cut` relaunch both start the child with `claude -p "fullrun #<N>"` and
|
|
9
|
-
// environment, and nothing in the argv, the environment or a file
|
|
10
|
-
// typed".
|
|
11
|
-
//
|
|
12
|
-
//
|
|
7
|
+
// **Without this mark a dispatched child is indistinguishable from a person's own session.**
|
|
8
|
+
// `lane:dispatch` and the `run:cut` relaunch both start the child with `claude -p "fullrun #<N>"` and
|
|
9
|
+
// a copied environment, and nothing in the argv, the environment or a file says "this session was
|
|
10
|
+
// launched, not typed". Left to the model, the human-or-child question is answered by reading its own
|
|
11
|
+
// prompt, which decides "person" and declines the cut. This variable is that missing fact, made
|
|
12
|
+
// mechanical.
|
|
13
13
|
//
|
|
14
14
|
// **Its value is the issue number, because a mark that only said "a child" could not be told from one
|
|
15
15
|
// that leaked.** A person's shell, or a parent session that was itself a dispatched child, can carry
|
|
@@ -19,7 +19,7 @@ import { lane_paths } from './lane-paths'
|
|
|
19
19
|
// `.claude/skills/workflow-commands/pre-gate-cut.md`.
|
|
20
20
|
const KEY = 'JOSH_LANE_CHILD'
|
|
21
21
|
|
|
22
|
-
// **A dispatched child also asks for the five-minute prompt-cache TTL
|
|
22
|
+
// **A dispatched child also asks for the five-minute prompt-cache TTL**. A
|
|
23
23
|
// headless `claude -p` session on a subscription defaults to the one-hour TTL, whose writes bill at 2x
|
|
24
24
|
// the input rate against 1.25x for five minutes. A replay of 1,953 lane transcripts (about 57,000
|
|
25
25
|
// requests) found 0.3% of request gaps over five minutes, so the shorter TTL — re-writing the prefix on
|
|
@@ -34,7 +34,7 @@ type MarkerSource = Readonly<Record<string, string | undefined>>
|
|
|
34
34
|
// issue number rather than from text read anywhere — the same discipline `lane-dispatch.ts` applies to
|
|
35
35
|
// the invocation it builds — so a malformed number fails here rather than reaching a child.
|
|
36
36
|
function environment_for(issue: string): Record<string, string> {
|
|
37
|
-
|
|
37
|
+
issue_number_shape.require_issue_number(issue)
|
|
38
38
|
|
|
39
39
|
return { [KEY]: issue, [CACHE_TTL_KEY]: CACHE_TTL }
|
|
40
40
|
}
|
|
@@ -47,14 +47,14 @@ function marked_issue(source: MarkerSource = process.env): string | undefined {
|
|
|
47
47
|
|
|
48
48
|
if (value === undefined) return undefined
|
|
49
49
|
|
|
50
|
-
return
|
|
50
|
+
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(value) ? value : undefined
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
// True when this session is a dispatched lane child for the checkout it is running in: the mark is
|
|
54
54
|
// present and names this lane's own issue, read from the checkout path. A numeric mark naming a
|
|
55
55
|
// *different* issue leaked in from a parent session into a checkout it does not belong to, so it is
|
|
56
56
|
// read as a person's run — the trust condition the header describes, applied the same way
|
|
57
|
-
// `pre-gate-cut.ts` applies it to the resume decision
|
|
57
|
+
// `pre-gate-cut.ts` applies it to the resume decision.
|
|
58
58
|
function is_child_of(directory: string, source: MarkerSource = process.env): boolean {
|
|
59
59
|
const marked = marked_issue(source)
|
|
60
60
|
|
package/scripts/lane/lane-cli.ts
CHANGED
|
@@ -4,6 +4,8 @@ import { epic_busy } from '#scripts/epic/epic-busy'
|
|
|
4
4
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
5
5
|
import type { OpenIssueData } from '#scripts/git/git-schemas'
|
|
6
6
|
import { issue_cite, type IssueCiter } from '#scripts/issue/issue-cite'
|
|
7
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
8
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
7
9
|
import { error_text } from '#scripts/lib/error-message'
|
|
8
10
|
import { run_carry } from '#scripts/run/carry/run-carry'
|
|
9
11
|
import { run_carry_reclaim } from '#scripts/run/carry/run-carry-reclaim'
|
|
@@ -16,9 +18,9 @@ import { lane_output, type ReadOutcome, type RecordOutcome } from './lane-output
|
|
|
16
18
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
17
19
|
import { lane_report } from './lane-report'
|
|
18
20
|
import { lane_seed_policy } from './lane-seed'
|
|
21
|
+
import { lane_stray } from './lane-stray'
|
|
19
22
|
|
|
20
|
-
// `josh lane:open` / `lane:close` / `lane:list` / `lane:prune` — the lane's whole lifecycle
|
|
21
|
-
// (joshuafolkken/kit#1490).
|
|
23
|
+
// `josh lane:open` / `lane:close` / `lane:list` / `lane:prune` — the lane's whole lifecycle.
|
|
22
24
|
//
|
|
23
25
|
// **`lane:open` prints the lane's directory on standard output and nothing else**, so
|
|
24
26
|
// `dir=$(pnpm josh lane:open 1490)` is what a caller needs and a refusal is an empty capture beside
|
|
@@ -32,7 +34,6 @@ const SINGLE_ARGUMENT = 1
|
|
|
32
34
|
const ISSUE_AND_PATH_ARGUMENTS = 2
|
|
33
35
|
const ALL_FLAG = '--all'
|
|
34
36
|
const NONE_TOKEN = 'none'
|
|
35
|
-
const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
36
37
|
|
|
37
38
|
const USAGE = [
|
|
38
39
|
'Usage: josh lane:open <issue-number>',
|
|
@@ -53,8 +54,7 @@ function report_usage(): number {
|
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
// Read the carry record and refuse if this session has already handed off its budget via `--cut`.
|
|
56
|
-
// A cut session must not open new lanes or dispatch new children — the successor owns the budget
|
|
57
|
-
// (joshuafolkken/kit#2114).
|
|
57
|
+
// A cut session must not open new lanes or dispatch new children — the successor owns the budget.
|
|
58
58
|
async function guard_cut_session(): Promise<string | undefined> {
|
|
59
59
|
const directory = await run_carry.repository_directory()
|
|
60
60
|
|
|
@@ -72,7 +72,7 @@ async function guard_cut_session(): Promise<string | undefined> {
|
|
|
72
72
|
function parse_lane_issue(value: string | undefined): string | undefined {
|
|
73
73
|
if (value === undefined) return undefined
|
|
74
74
|
|
|
75
|
-
return ISSUE_NUMBER_PATTERN.test(value) ? value : undefined
|
|
75
|
+
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(value) ? value : undefined
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
function parse_issue(rest: ReadonlyArray<string>): string | undefined {
|
|
@@ -88,7 +88,7 @@ function refusal_message(outcome: Exclude<OpenOutcome, { kind: 'opened' }>): str
|
|
|
88
88
|
return `All ${String(lane_seed_policy.LAST_LANE_SEAT)} lane seats are taken. Run \`pnpm josh lane:list\` to see them and \`pnpm josh lane:close <issue-number>\` to free one.`
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
return `A lane for
|
|
91
|
+
return `A lane for ${session_cite.issue(outcome.lane.issue)} is already open at ${outcome.lane.directory}. Run \`pnpm josh lane:close ${outcome.lane.issue}\` before opening it again.`
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
function report_open(outcome: OpenOutcome): number {
|
|
@@ -118,7 +118,7 @@ function report_issues(issues: ReadonlyArray<string>): number {
|
|
|
118
118
|
function report_close(outcome: CloseOutcome): number {
|
|
119
119
|
if (outcome.reaped.length > 0) {
|
|
120
120
|
console.error(
|
|
121
|
-
`Terminated the lane child for
|
|
121
|
+
`Terminated the lane child for ${session_cite.issue(outcome.issue)} that had not ended by itself: process ${outcome.reaped.join(', ')}.`,
|
|
122
122
|
)
|
|
123
123
|
}
|
|
124
124
|
|
|
@@ -127,7 +127,7 @@ function report_close(outcome: CloseOutcome): number {
|
|
|
127
127
|
}
|
|
128
128
|
|
|
129
129
|
console.error(
|
|
130
|
-
`Closing the lane for
|
|
130
|
+
`Closing the lane for ${session_cite.issue(outcome.issue)} left this behind: ${outcome.left_behind.join(', ')}. Remove it and run \`pnpm josh lane:close ${outcome.issue}\` again.`,
|
|
131
131
|
)
|
|
132
132
|
|
|
133
133
|
return FAILURE_EXIT_CODE
|
|
@@ -140,7 +140,7 @@ function report_sweep(outcome: SweepOutcome): number {
|
|
|
140
140
|
|
|
141
141
|
if (outcome.failed.length === 0) return code
|
|
142
142
|
|
|
143
|
-
const named = outcome.failed.map((issue) =>
|
|
143
|
+
const named = outcome.failed.map((issue) => session_cite.issue(issue)).join(', ')
|
|
144
144
|
|
|
145
145
|
// `lane:list` reads git's work trees, and the usual survivor is a branch whose work tree is
|
|
146
146
|
// already gone — which that listing cannot show. Closing each one again is what names it.
|
|
@@ -193,7 +193,7 @@ const OCCUPANCY_UNREADABLE =
|
|
|
193
193
|
'Could not read the `in-progress` listing, so the lane/label difference was not checked — that is not "everything agrees"; check `gh auth status`.'
|
|
194
194
|
|
|
195
195
|
// The `in-progress` issues this repository shows running, read the way `epic:next` reads lane
|
|
196
|
-
// occupancy — never rebuilt
|
|
196
|
+
// occupancy — never rebuilt. A read that could not see the whole listing is
|
|
197
197
|
// `undefined`, so the difference is skipped rather than computed against a set known to be partial.
|
|
198
198
|
async function to_holders(repo: string): Promise<ReadonlyArray<OpenIssueData> | undefined> {
|
|
199
199
|
const read = await epic_busy.read_repository(repo)
|
|
@@ -203,7 +203,7 @@ async function to_holders(repo: string): Promise<ReadonlyArray<OpenIssueData> |
|
|
|
203
203
|
}
|
|
204
204
|
|
|
205
205
|
// The repository and its running issues, read once: the listing cites each lane from the titles here
|
|
206
|
-
//
|
|
206
|
+
// and the occupancy check compares against the same set.
|
|
207
207
|
interface InProgress {
|
|
208
208
|
repo: string | undefined
|
|
209
209
|
holders: ReadonlyArray<OpenIssueData> | undefined
|
|
@@ -268,7 +268,14 @@ async function list_command(rest: ReadonlyArray<string>): Promise<number> {
|
|
|
268
268
|
async function prune_command(rest: ReadonlyArray<string>): Promise<number> {
|
|
269
269
|
if (rest.length > 0) return report_usage()
|
|
270
270
|
|
|
271
|
-
|
|
271
|
+
const code = report_sweep(await lane_close.prune_lanes())
|
|
272
|
+
|
|
273
|
+
// After the closes, so a lane whose close left its directory behind is swept in the same run. A
|
|
274
|
+
// kept stray is reported, never a failure: it waits on a person, and a non-zero exit would stop
|
|
275
|
+
// every `backlogrun` preparation until one came.
|
|
276
|
+
await lane_stray.sweep_and_report()
|
|
277
|
+
|
|
278
|
+
return code
|
|
272
279
|
}
|
|
273
280
|
|
|
274
281
|
// The recorded path goes to standard output on both arms, so
|
|
@@ -6,7 +6,7 @@ import { lane_paths } from './lane-paths'
|
|
|
6
6
|
import { lane_reap } from './lane-reap'
|
|
7
7
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
8
8
|
|
|
9
|
-
// Closing a lane: no work tree, no branch, no directory
|
|
9
|
+
// Closing a lane: no work tree, no branch, no directory.
|
|
10
10
|
//
|
|
11
11
|
// **A lane is closed after a park, a failure or an interruption as readily as after a success**, so
|
|
12
12
|
// every step here is written to run over a subject that is already gone or that still holds
|
|
@@ -21,7 +21,7 @@ interface LaneTargets {
|
|
|
21
21
|
|
|
22
22
|
// The lane an issue number names: its registration, when there is one, and the paths a close acts on.
|
|
23
23
|
// Resolved once here so a caller that has to look inside the tree before closing it reads the same
|
|
24
|
-
// directory the close removes
|
|
24
|
+
// directory the close removes.
|
|
25
25
|
interface ResolvedLane {
|
|
26
26
|
existing: LaneInfo | undefined
|
|
27
27
|
targets: LaneTargets
|
|
@@ -107,8 +107,8 @@ function close_kind(did_exist: boolean, left_behind: ReadonlyArray<string>): Clo
|
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
// The main work tree's root, not this one's — the same reading `list_lanes` uses, so the fallback
|
|
110
|
-
// directory an unregistered lane is closed by is the one `lane:open` would have created
|
|
111
|
-
//
|
|
110
|
+
// directory an unregistered lane is closed by is the one `lane:open` would have created.
|
|
111
|
+
// Derived here from the current work tree, a close run inside a lane
|
|
112
112
|
// reports `none` over a directory that is still on disk.
|
|
113
113
|
async function lane_root_directory(): Promise<string> {
|
|
114
114
|
return lane_paths.lane_root(await lane_registry.main_repository_root())
|
|
@@ -130,8 +130,8 @@ async function close_lane(issue: string): Promise<CloseOutcome> {
|
|
|
130
130
|
const { existing, targets } = await resolve_lane(issue)
|
|
131
131
|
const did_exist = existing !== undefined || existsSync(targets.directory)
|
|
132
132
|
// Before the removal, not after: a child still running in the tree would keep writing into a
|
|
133
|
-
// directory being deleted, and a process outliving its lane is
|
|
134
|
-
//
|
|
133
|
+
// directory being deleted, and a process outliving its lane is a half-discarded state — the work
|
|
134
|
+
// tree gone, the child still answering `alive`.
|
|
135
135
|
const reaped = lane_reap.reap_child(issue)
|
|
136
136
|
|
|
137
137
|
await remove_lane(targets)
|