@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
|
@@ -2,45 +2,44 @@ import { agent_argv, type AgentArgv, type AgentArgvResult } from '#scripts/agent
|
|
|
2
2
|
import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
3
3
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
4
4
|
import type { LabelWrite } from '#scripts/gh/git-gh-issue-write'
|
|
5
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
5
6
|
import { IN_PROGRESS_LABEL } from '#scripts/issue/issue-labels'
|
|
7
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
8
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
6
9
|
import { telegram_notify } from '#scripts/notify/telegram-notify'
|
|
7
10
|
import { detached_launch } from '#scripts/run/detached-launch'
|
|
8
11
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
9
12
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
10
13
|
import { run_ending } from '#scripts/run/run-ending'
|
|
11
|
-
import {
|
|
14
|
+
import { run_label } from '#scripts/run/run-label'
|
|
12
15
|
import { lane_child_invocation } from './lane-child-invocation'
|
|
13
16
|
import { lane_child_marker } from './lane-child-marker'
|
|
14
17
|
import { lane_dispatch_log } from './lane-dispatch-log'
|
|
18
|
+
import { lane_ledger } from './lane-ledger'
|
|
15
19
|
import { lane_output } from './lane-output'
|
|
16
20
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
17
21
|
import { lane_resume, type ResumePlan } from './lane-resume'
|
|
18
22
|
import { openai_lane_supervisor } from './openai-lane-supervisor'
|
|
19
23
|
|
|
20
|
-
// `josh lane:dispatch <issue-number>` — start a lane's child as an operating-system process of its own
|
|
21
|
-
// (joshuafolkken/kit#1749).
|
|
24
|
+
// `josh lane:dispatch <issue-number>` — start a lane's child as an operating-system process of its own.
|
|
22
25
|
//
|
|
23
|
-
// **
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
// was dead, waited out the silent-unit window, booked each lane `stopped`, and aborted the whole run on
|
|
28
|
-
// the third one. Launched detached, the child survives the cut and the sentence holds as written.
|
|
26
|
+
// **This is what makes the premise the session cut rests on true.** `backlogrun-progress.md` → "The
|
|
27
|
+
// hand-off" says "nothing has to finish, because nothing is being abandoned"; an in-process child
|
|
28
|
+
// would die with the parent it was cut from. Launched detached, the child survives the cut and the
|
|
29
|
+
// sentence holds as written.
|
|
29
30
|
//
|
|
30
31
|
// **Nothing here is new machinery.** The lane is already a linked work tree with its own branch and
|
|
31
32
|
// ports (`lane-open.ts`), the detached launcher is already `run:wake`'s (`detached-launch.ts`), and the
|
|
32
33
|
// recorded output path is already how a session that never opened a lane polls it (`lane-output.ts`).
|
|
33
|
-
//
|
|
34
|
+
// This is the one command that puts the three together.
|
|
34
35
|
//
|
|
35
|
-
// **The recording happens inside the dispatch, so "the lane records no path"
|
|
36
|
-
//
|
|
37
|
-
// recording used to be a separate step a run could forget. A lane dispatched through here is recorded
|
|
38
|
-
// by the same call that starts it.
|
|
36
|
+
// **The recording happens inside the dispatch, so "the lane records no path" is not a state.** A
|
|
37
|
+
// lane dispatched through here is recorded by the same call that starts it, so no run can forget it.
|
|
39
38
|
|
|
40
39
|
// The invocation the child is given. Composed from this constant and a digits-only issue number, never
|
|
41
40
|
// from text that was read from anywhere — the same discipline `run-wake-session.ts` applies to the
|
|
42
41
|
// invocation it rebuilds out of the carry record.
|
|
43
|
-
// The resume guide a relaunched child is pointed at
|
|
42
|
+
// The resume guide a relaunched child is pointed at. It carries the resume
|
|
44
43
|
// procedure a `run:cut` successor follows, so naming it lets the child read one section rather than the
|
|
45
44
|
// workflow-commands entry documents it would otherwise read to learn it is a resume at all.
|
|
46
45
|
const NOTE_SEPARATOR = '; '
|
|
@@ -60,7 +59,7 @@ interface Dispatched {
|
|
|
60
59
|
log_path: string
|
|
61
60
|
pid: number
|
|
62
61
|
profile: AgentProfile
|
|
63
|
-
// The session id this dispatch resumed, or `undefined` when it started fresh
|
|
62
|
+
// The session id this dispatch resumed, or `undefined` when it started fresh.
|
|
64
63
|
// `describe` reports which path was taken, so an `outage` re-dispatch says whether it recovered the
|
|
65
64
|
// disconnected child's context or fell back to a fresh run.
|
|
66
65
|
resumed_from: string | undefined
|
|
@@ -110,14 +109,13 @@ function child_invocation(issue: string): string {
|
|
|
110
109
|
|
|
111
110
|
/**
|
|
112
111
|
* The prompt a relaunched child is given after a `run:cut` — a resume-specific instruction followed by
|
|
113
|
-
* the bare `child_invocation`
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
* `run:cut --resume` and the stage that answers.
|
|
112
|
+
* the bare `child_invocation`. Given the plain `fullrun #<N>`, a relaunched child would read the
|
|
113
|
+
* workflow-commands entry documents every resume before it could learn it was a resume at all — the
|
|
114
|
+
* "do not re-read" exception lives inside the very skill it would have to open. This preamble tells
|
|
115
|
+
* it up front, so it goes straight to `run:cut --resume` and the stage that answers.
|
|
118
116
|
*
|
|
119
117
|
* **It ends with `child_invocation` on purpose, not as decoration.** The parent's liveness poll is
|
|
120
|
-
* `
|
|
118
|
+
* `lane_child_invocation.process_pattern` (read by `run:liveness` — see `log_sentence`), so a relaunched process
|
|
121
119
|
* whose command line did not end with `fullrun #<N>` would be booked stopped while it ran. The trailing
|
|
122
120
|
* invocation keeps that poll matching and is also the ordinary run a `fresh` verdict falls back to.
|
|
123
121
|
*/
|
|
@@ -171,7 +169,7 @@ function failed_start(
|
|
|
171
169
|
|
|
172
170
|
// The `dispatched` outcome, built from the request the launch was composed from — one place so the
|
|
173
171
|
// three launch paths cannot drift on which fields a dispatched child carries (the resume flag among
|
|
174
|
-
// them
|
|
172
|
+
// them). The request's `argv` rides along harmlessly.
|
|
175
173
|
// **`kind` is written last on purpose**: the request was spread from a `Prepared`, so it still carries
|
|
176
174
|
// `kind: 'prepared'` at runtime, and letting the spread win would mislabel the outcome.
|
|
177
175
|
function dispatched_of(
|
|
@@ -190,7 +188,7 @@ function existing_dispatch(request: StartRequest): DispatchOutcome | undefined {
|
|
|
190
188
|
if (!openai_lane_supervisor.approve(request.lane.directory, active.nonce)) {
|
|
191
189
|
return failed_start(
|
|
192
190
|
request,
|
|
193
|
-
`the OpenAI supervisor for lane
|
|
191
|
+
`the OpenAI supervisor for lane ${session_cite.issue(request.lane.issue)} was cancelled`,
|
|
194
192
|
[],
|
|
195
193
|
)
|
|
196
194
|
}
|
|
@@ -216,13 +214,17 @@ async function openai_dispatched_start(
|
|
|
216
214
|
if (owner?.issue !== lane.issue) {
|
|
217
215
|
if (nonce !== undefined) openai_lane_supervisor.cancel(lane.directory, nonce)
|
|
218
216
|
|
|
219
|
-
return failed_start(
|
|
217
|
+
return failed_start(
|
|
218
|
+
request,
|
|
219
|
+
`the OpenAI supervisor did not claim lane ${session_cite.issue(lane.issue)}`,
|
|
220
|
+
notes,
|
|
221
|
+
)
|
|
220
222
|
}
|
|
221
223
|
|
|
222
224
|
if (!openai_lane_supervisor.approve(lane.directory, owner.nonce)) {
|
|
223
225
|
return failed_start(
|
|
224
226
|
request,
|
|
225
|
-
`the OpenAI supervisor for lane
|
|
227
|
+
`the OpenAI supervisor for lane ${session_cite.issue(lane.issue)} was cancelled`,
|
|
226
228
|
notes,
|
|
227
229
|
)
|
|
228
230
|
}
|
|
@@ -267,7 +269,7 @@ async function started(request: StartRequest): Promise<DispatchOutcome> {
|
|
|
267
269
|
|
|
268
270
|
// Build the argv the plan calls for: a resume carries the stored session id, a fresh start does not.
|
|
269
271
|
// Both run the same profile diagnostics under the already-resolved profile, so a resume is refused for
|
|
270
|
-
// exactly the reasons a fresh dispatch is
|
|
272
|
+
// exactly the reasons a fresh dispatch is.
|
|
271
273
|
function built_for(plan: ResumePlan, profile: AgentProfile, lane: LaneInfo): AgentArgvResult {
|
|
272
274
|
if (plan.kind === 'resume') {
|
|
273
275
|
return agent_argv.with_resume_in(plan.invocation, profile, plan.session_id, lane.directory)
|
|
@@ -276,7 +278,7 @@ function built_for(plan: ResumePlan, profile: AgentProfile, lane: LaneInfo): Age
|
|
|
276
278
|
return agent_argv.with_profile_in(plan.invocation, profile, lane.directory)
|
|
277
279
|
}
|
|
278
280
|
|
|
279
|
-
// **The re-dispatch decides resume-or-fresh from the lane's own exit record
|
|
281
|
+
// **The re-dispatch decides resume-or-fresh from the lane's own exit record**.
|
|
280
282
|
// The record is read from the log the previous dispatch of this lane wrote — a first dispatch finds
|
|
281
283
|
// none and starts fresh, an `outage` ending with a session id resumes it. The provider is resolved
|
|
282
284
|
// first because the resume mechanism is Claude Code's, and an OpenAI lane falls back to fresh.
|
|
@@ -304,30 +306,33 @@ function prepared(lane: LaneInfo): Prepared {
|
|
|
304
306
|
// **The parent claims the marker before it starts the child**, so the window in which a running child
|
|
305
307
|
// is uncounted closes at dispatch rather than tens of minutes later once the child's own `fullrun` gets
|
|
306
308
|
// to its (idempotent) apply. `issue_add_label` creates the label if the repository lacks it — a
|
|
307
|
-
// `POST /issues/{N}/labels` provisions a missing label with a generated color
|
|
308
|
-
//
|
|
309
|
+
// `POST /issues/{N}/labels` provisions a missing label with a generated color
|
|
310
|
+
// (`git-gh-issue-write.ts`) — so no separate `label_ensure` is needed here, and
|
|
309
311
|
// its unapplied answer is a real refusal to launch rather than a note — confirmed by a read-back, so
|
|
310
|
-
// a write that landed but answered with an error still launches
|
|
312
|
+
// a write that landed but answered with an error still launches.
|
|
311
313
|
async function mark_in_progress(issue: string): Promise<LabelWrite> {
|
|
312
314
|
return await git_gh_command.issue_apply_label(issue, IN_PROGRESS_LABEL)
|
|
313
315
|
}
|
|
314
316
|
|
|
315
|
-
// The dispatch owns both halves of the marker: it applied it, so a launch that never started takes it
|
|
316
|
-
// back off, leaving no `in-progress` on an issue nothing is running. A removal that itself fails is
|
|
317
|
-
// swallowed — the failed launch is already warned about, and `lane:list` / `run:progress` surface a
|
|
318
|
-
// stuck marker — so this never turns a launch failure into a thrown error.
|
|
319
|
-
async function unmark_in_progress(issue: string): Promise<void> {
|
|
320
|
-
try {
|
|
321
|
-
await git_gh_command.issue_remove_label(issue, IN_PROGRESS_LABEL)
|
|
322
|
-
} catch {
|
|
323
|
-
/* the launch already failed and is warned about; a stuck marker is reported by lane:list */
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
|
|
327
317
|
// A started child is recorded on the run's stream, which is where the stall detector ages the last
|
|
328
|
-
// dispatch from
|
|
318
|
+
// dispatch from — unrecorded, every stall read "hours since the last dispatch"
|
|
329
319
|
// minutes after a launch. A failed start records nothing: no child is running. The marker is claimed
|
|
330
320
|
// first, so a refused one starts nothing.
|
|
321
|
+
//
|
|
322
|
+
// The dispatch owns both halves of the marker: it applied it, so a launch that never started takes it
|
|
323
|
+
// back off through `run_label.unmark`, leaving no `in-progress` on an issue nothing is running. That
|
|
324
|
+
// removal warns and never throws, so it cannot turn a launch failure into a thrown error.
|
|
325
|
+
//
|
|
326
|
+
// The lane ledger takes the same instant: `lane:stats` times a lane's implementation from it, and the
|
|
327
|
+
// stream is capped, so a period's earlier dispatches would be gone from there.
|
|
328
|
+
async function record_started(issue: string): Promise<void> {
|
|
329
|
+
await run_event_stream_emit.emit(
|
|
330
|
+
run_event_stream.EVENT_KIND.CHILD_LAUNCH,
|
|
331
|
+
`${issue_cite.plain(issue)} dispatched`,
|
|
332
|
+
)
|
|
333
|
+
await lane_ledger.record_dispatch(Number(issue))
|
|
334
|
+
}
|
|
335
|
+
|
|
331
336
|
async function finish_dispatch(issue: string, request: StartRequest): Promise<DispatchOutcome> {
|
|
332
337
|
const mark = await mark_in_progress(issue)
|
|
333
338
|
|
|
@@ -336,16 +341,14 @@ async function finish_dispatch(issue: string, request: StartRequest): Promise<Di
|
|
|
336
341
|
|
|
337
342
|
const is_failed = outcome.kind === 'failed'
|
|
338
343
|
|
|
339
|
-
await (is_failed
|
|
340
|
-
? unmark_in_progress(issue)
|
|
341
|
-
: run_event_stream_emit.emit(run_event_stream.EVENT_KIND.CHILD_LAUNCH, `#${issue} dispatched`))
|
|
344
|
+
await (is_failed ? run_label.unmark(issue) : record_started(issue))
|
|
342
345
|
|
|
343
346
|
return outcome
|
|
344
347
|
}
|
|
345
348
|
|
|
346
349
|
/** Start `fullrun #<N>` detached in the lane for `#<N>`, recording where it writes as it does so. */
|
|
347
350
|
async function dispatch_child(issue: string): Promise<DispatchOutcome> {
|
|
348
|
-
|
|
351
|
+
issue_number_shape.require_issue_number(issue)
|
|
349
352
|
|
|
350
353
|
const lane = await lane_registry.find_open_lane(issue)
|
|
351
354
|
|
|
@@ -366,25 +369,11 @@ async function dispatch_child(issue: string): Promise<DispatchOutcome> {
|
|
|
366
369
|
// The child is running — saying otherwise would send the caller to dispatch a second one into the same
|
|
367
370
|
// lane — but its output is going nowhere, so a message naming the path would point at a file that will
|
|
368
371
|
// never grow, and a poll of that file would book a working child as stopped.
|
|
369
|
-
// The liveness pattern the parent polls with — the shared one, which also finds a detached ship
|
|
370
|
-
// supervisor (joshuafolkken/kit#2428). `describe` never throws, so an issue that is not a number falls
|
|
371
|
-
// back to the launched invocation rather than raising from the validator.
|
|
372
|
-
function poll_pattern(outcome: Dispatched, issue: string): string {
|
|
373
|
-
if (!run_issue_number.ISSUE_NUMBER_PATTERN.test(issue)) return `${outcome.invocation}$`
|
|
374
|
-
|
|
375
|
-
return lane_child_invocation.process_pattern(issue)
|
|
376
|
-
}
|
|
377
|
-
|
|
378
372
|
function log_sentence(outcome: Dispatched, issue: string): string {
|
|
379
|
-
//
|
|
380
|
-
//
|
|
381
|
-
//
|
|
382
|
-
|
|
383
|
-
// anchor is what keeps `fullrun #12` from matching a running `fullrun #123`. `run:liveness` takes
|
|
384
|
-
// `--process` as what the caller *saw*, never as a property of the child's kind — told to pass
|
|
385
|
-
// `alive`, a parent that never ran `pgrep` would answer `alive` for a child that crashed an hour ago
|
|
386
|
-
// and poll it for ever.
|
|
387
|
-
const poll = `run \`pgrep -laf "${poll_pattern(outcome, issue)}"\` and pass what it found to \`pnpm josh run:liveness ${issue} --output ${outcome.log_path} --process alive\` — or \`--process none\` where it found nothing`
|
|
373
|
+
// **`run:liveness` reads the child's process for itself**, with the shared
|
|
374
|
+
// pattern that matches the child's own command line and a detached ship supervisor, so no parent
|
|
375
|
+
// passes `alive` by hand for a child that crashed an hour ago.
|
|
376
|
+
const poll = `run \`pnpm josh run:liveness ${issue} --output ${outcome.log_path}\` — it reads the child's process for itself`
|
|
388
377
|
|
|
389
378
|
if (outcome.notes.length > 0) {
|
|
390
379
|
return ` Its output is NOT being kept — ${outcome.notes.join(NOTE_SEPARATOR)} — so ${outcome.log_path} will not grow and the process trace is the only answer: ${poll}.`
|
|
@@ -394,7 +383,7 @@ function log_sentence(outcome: Dispatched, issue: string): string {
|
|
|
394
383
|
}
|
|
395
384
|
|
|
396
385
|
// Whether this dispatch resumed the disconnected child's session or started fresh — the report the
|
|
397
|
-
// `outage` re-dispatch owes
|
|
386
|
+
// `outage` re-dispatch owes. A fresh start says so too, so the absence of a
|
|
398
387
|
// resume is never silent when an outage record was present.
|
|
399
388
|
function resume_sentence(outcome: Dispatched): string {
|
|
400
389
|
if (outcome.resumed_from === undefined) {
|
|
@@ -408,20 +397,20 @@ function resume_sentence(outcome: Dispatched): string {
|
|
|
408
397
|
// message the warning exists to carry — the pid among it, with the child already running.
|
|
409
398
|
function describe(outcome: DispatchOutcome, issue: string): string {
|
|
410
399
|
if (outcome.kind === 'no-lane') {
|
|
411
|
-
return `No lane is open for
|
|
400
|
+
return `No lane is open for ${session_cite.issue(issue)}. Run \`pnpm josh lane:open ${issue}\` first, then dispatch into it.`
|
|
412
401
|
}
|
|
413
402
|
|
|
414
403
|
if (outcome.kind === 'unrecordable') return outcome.reason
|
|
415
404
|
|
|
416
405
|
if (outcome.kind === LABEL_UNSET_KIND) {
|
|
417
|
-
return `The child for
|
|
406
|
+
return `The child for ${session_cite.issue(issue)} was not started: the \`${IN_PROGRESS_LABEL}\` label could not be applied (${outcome.reason}), so the lane would be counted as empty. Nothing was launched.`
|
|
418
407
|
}
|
|
419
408
|
|
|
420
409
|
if (outcome.kind === 'failed') {
|
|
421
|
-
return `The child for
|
|
410
|
+
return `The child for ${session_cite.issue(issue)} did not start: ${outcome.note}.${agent_role_profile.default_notice()} Its log is at ${outcome.log_path}.`
|
|
422
411
|
}
|
|
423
412
|
|
|
424
|
-
return `Dispatched \`${outcome.invocation}\` as process ${String(outcome.pid)} in ${outcome.lane.directory} with ${agent_role_profile.describe(outcome.profile)}.${resume_sentence(outcome)}${log_sentence(outcome, issue)}`
|
|
413
|
+
return `Dispatched \`${outcome.invocation}\` as process ${String(outcome.pid)} in ${outcome.lane.directory} with ${agent_role_profile.describe(outcome.profile)}.${agent_role_profile.default_notice()}${resume_sentence(outcome)}${log_sentence(outcome, issue)}`
|
|
425
414
|
}
|
|
426
415
|
|
|
427
416
|
/**
|
|
@@ -441,7 +430,7 @@ function is_worth_warning(outcome: DispatchOutcome): boolean {
|
|
|
441
430
|
// own failures to standard error and never throws, so this cannot turn a refusal into an exception.
|
|
442
431
|
async function warn_of_problem(outcome: DispatchOutcome, issue: string): Promise<void> {
|
|
443
432
|
await telegram_notify.warn({
|
|
444
|
-
issue_title: `${WARNING_TITLE}
|
|
433
|
+
issue_title: `${WARNING_TITLE} ${issue_cite.plain(issue)}`,
|
|
445
434
|
body: describe(outcome, issue),
|
|
446
435
|
recovery: WARNING_RECOVERY,
|
|
447
436
|
})
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { LANE_SEAT_KEY, PORT_SEED_KEY, ports } from '#ports'
|
|
2
2
|
import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
3
3
|
|
|
4
|
-
// The lane's `.env`, built from the root's
|
|
4
|
+
// The lane's `.env`, built from the root's.
|
|
5
5
|
//
|
|
6
6
|
// **Port separation is required here, not optional.** `ports/index.js` resolves the project root as
|
|
7
7
|
// the nearest ancestor holding a `package.json` — which, inside a linked work tree, is the lane's
|
|
@@ -9,8 +9,8 @@ import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role
|
|
|
9
9
|
// root's runs on the root's exact offset; either way every lane lands on one pair of ports, and a
|
|
10
10
|
// busy port fails without retrying on another. At the default six lanes that turns E2E from "fails
|
|
11
11
|
// sometimes" into "fails nearly always". So the lane's `.env` keeps the project's `PORT_SEED`
|
|
12
|
-
// unchanged and adds `JOSH_LANE_SEAT`, and `ports/index.js` combines them as `seed × 10 + seat
|
|
13
|
-
//
|
|
12
|
+
// unchanged and adds `JOSH_LANE_SEAT`, and `ports/index.js` combines them as `seed × 10 + seat`:
|
|
13
|
+
// the file plainly shows which number is the project's and which is the
|
|
14
14
|
// seat, and the multiplication that separates the bands lives in one place rather than here.
|
|
15
15
|
//
|
|
16
16
|
// **Everything else in the file is carried across verbatim**, comments and blank lines included:
|
|
@@ -18,7 +18,7 @@ import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role
|
|
|
18
18
|
// are as necessary inside a lane as outside one, and a lane that had to have them re-entered would
|
|
19
19
|
// not be a place a run could start unattended.
|
|
20
20
|
|
|
21
|
-
// Where the delegated unit running this lane's child writes
|
|
21
|
+
// Where the delegated unit running this lane's child writes. It goes in the
|
|
22
22
|
// lane's own `.env` — the store `lane-registry.ts` already reads — rather than in a ledger beside the
|
|
23
23
|
// trees, so `git worktree remove` erases the record along with the lane it described and there is
|
|
24
24
|
// nothing left to go stale. `.env` is gitignored in kit and in every consumer `josh sync` reaches,
|
|
@@ -149,7 +149,7 @@ function read_lane_ports(content: string): { development: number; preview: numbe
|
|
|
149
149
|
/**
|
|
150
150
|
* The output path a lane's `.env` records, or `undefined` where it records none.
|
|
151
151
|
*
|
|
152
|
-
* **A blank assignment is `undefined` rather than an empty path
|
|
152
|
+
* **A blank assignment is `undefined` rather than an empty path**. A lane
|
|
153
153
|
* whose record was cleared has nothing to poll, and an empty string handed to
|
|
154
154
|
* `pnpm josh run:liveness --output` is a relative path — refused by its own root check, so the
|
|
155
155
|
* child would come back `undetermined` for ever rather than saying the record is missing.
|
|
@@ -1,35 +1,21 @@
|
|
|
1
1
|
import { lane_child_marker, type MarkerSource } from './lane-child-marker'
|
|
2
2
|
|
|
3
3
|
// How each `PreToolUse` guard behaves in a dispatched lane child, as an enumeration rather than a
|
|
4
|
-
// judgement
|
|
4
|
+
// judgement.
|
|
5
5
|
//
|
|
6
6
|
// **The three guards were built for the interactive main line, where a refusal is guidance.** A denial
|
|
7
7
|
// rewrites the next move of a person's session. A dispatched lane child is a headless `claude -p`
|
|
8
|
-
// process, so a *denial* ends the conversation with nothing committed
|
|
9
|
-
//
|
|
10
|
-
// them a read of a file the child was about to edit. So a guard whose correction is a denial cannot fire
|
|
11
|
-
// as one in a child.
|
|
8
|
+
// process, so a *denial* ends the conversation with nothing committed. So a guard whose correction is a
|
|
9
|
+
// denial cannot fire as one in a child.
|
|
12
10
|
//
|
|
13
|
-
// **But a denial is not the only way a guard can speak
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
// in the child for exactly that reason. So the choice is three-valued, not two:
|
|
11
|
+
// **But a denial is not the only way a guard can speak.** A guard can also raise a *notice* — a
|
|
12
|
+
// non-blocking `additionalContext` that carries the same guidance without a `permissionDecision`, so the
|
|
13
|
+
// turn is never ended. So the choice is three-valued, not two:
|
|
17
14
|
//
|
|
18
15
|
// - `refuse` — deny the call (the main-line default; the child keeps this for the safety rules).
|
|
19
16
|
// - `notice` — let the call through but attach the guidance, so a headless child is nudged, not killed.
|
|
20
17
|
// - `off` — say nothing at all, for a guard whose remedy the child cannot carry out.
|
|
21
18
|
//
|
|
22
|
-
// **The notice did not move the number, kit#2178 took it off, and kit#2276 restores it changed.** The
|
|
23
|
-
// lane child that ran right after kit#2164 merged came in at 1.00 calls per turn on both sides of the
|
|
24
|
-
// first notice (transcript `f39efeb5`), so kit#2178 turned the batching notice `off` in the child rather
|
|
25
|
-
// than pay the per-turn context cost of guidance measured not to work. But with it off, the notice fired
|
|
26
|
-
// **zero** times across the 2026-09-21 backlogrun the density was next measured on, so the 1.147 read
|
|
27
|
-
// there is the rate with no guidance at all — not a second measurement of the notice failing. kit#2276
|
|
28
|
-
// therefore restores it as `notice`, with the two things #2164's lacked: it names the concrete recent
|
|
29
|
-
// calls the run issued one-per-turn, and it recurs every single-call turn rather than every three. The
|
|
30
|
-
// mode stays a genuine experiment — the density is re-measured on the next backlogrun, and a notice that
|
|
31
|
-
// still does not move it is redesigned rather than kept.
|
|
32
|
-
//
|
|
33
19
|
// **It is an enumeration and not a judgement, for the reason `delegation-policy.ts` is one.** "This
|
|
34
20
|
// guard's mode in a child" is a call made under the same pressure that produced the misfire. The list is
|
|
35
21
|
// the whole of it, and a guard nobody classified refuses — the safe direction, since a wrongly-silenced
|
|
@@ -37,7 +23,7 @@ import { lane_child_marker, type MarkerSource } from './lane-child-marker'
|
|
|
37
23
|
// survived once. `lane-guard-policy.test.ts` pins that the enumeration and the guards' live behavior
|
|
38
24
|
// cannot disagree.
|
|
39
25
|
|
|
40
|
-
// The three ways a guard may behave in a lane child
|
|
26
|
+
// The three ways a guard may behave in a lane child. Outside a lane child every
|
|
41
27
|
// guard is `refuse`, which is why that is also the fail-safe default below.
|
|
42
28
|
type LaneGuardMode = 'refuse' | 'notice' | 'off'
|
|
43
29
|
type LaneGuardId = 'investigation' | 'batching' | 'rule' | 'duplicate-read'
|
|
@@ -2,12 +2,12 @@ import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
|
2
2
|
import { run_ship_detach } from '#scripts/run/ship/run-ship-detach'
|
|
3
3
|
import { lane_child_marker, type MarkerSource } from './lane-child-marker'
|
|
4
4
|
|
|
5
|
-
// Whether a lane has handed its post-implementation region to the detached ship
|
|
5
|
+
// Whether a lane has handed its post-implementation region to the detached ship.
|
|
6
6
|
//
|
|
7
7
|
// **A child that ran `pnpm josh ship --detach` waits on nobody when it ends.** The supervisor drives the
|
|
8
8
|
// gate, the review and the merge, and notifies on its own outcome, so the `Stop` hook's demand for a
|
|
9
9
|
// `confirmation` notify and `lane-park`'s refusal of that notify only bought a "nothing needed"
|
|
10
|
-
// Telegram and a wasted turn
|
|
10
|
+
// Telegram and a wasted turn.
|
|
11
11
|
// Both hooks read this one predicate, so they cannot disagree about whether the lane was handed off.
|
|
12
12
|
//
|
|
13
13
|
// **Running, never merely recorded.** A ship that failed hands its region back to the child, whose
|
|
@@ -3,7 +3,7 @@ import path from 'node:path'
|
|
|
3
3
|
import { buffered_process } from '#scripts/lib/buffered-process'
|
|
4
4
|
import { INSTALL_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
5
5
|
|
|
6
|
-
// Filling the lane, which is the other half of opening one
|
|
6
|
+
// Filling the lane, which is the other half of opening one.
|
|
7
7
|
//
|
|
8
8
|
// **A work tree with no `node_modules` is not a lane yet.** A linked work tree starts as a checkout
|
|
9
9
|
// and nothing else, and the lane root is a hidden *sibling* of the repository, so nothing above it
|
|
@@ -19,7 +19,7 @@ import { INSTALL_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
|
19
19
|
// The child is spawned through `buffered_process` rather than through `execa` here. What this needs
|
|
20
20
|
// is exactly that module's contract — output buffered rather than inherited, a non-zero exit
|
|
21
21
|
// reported rather than thrown, and a bound on how long the child may hang — and a second copy of it
|
|
22
|
-
// is how a fix to one missed the other before
|
|
22
|
+
// is how a fix to one missed the other before.
|
|
23
23
|
|
|
24
24
|
// `--frozen-lockfile` because a lane is cut from `refs/remotes/origin/<default>` and has to build
|
|
25
25
|
// exactly the lock committed there. A lock the install would rather rewrite is a finding, not
|
|
@@ -27,8 +27,8 @@ import { INSTALL_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
|
27
27
|
const INSTALL_ARGUMENTS = ['install', '--frozen-lockfile']
|
|
28
28
|
// The manifest whose absence is the whole skip condition. A lane cut from a repository that has no
|
|
29
29
|
// `package.json` has nothing to install, so running `pnpm install` there could only fail on a
|
|
30
|
-
// manifest that was never there — which is exactly the fixture a cross-process lane test needs
|
|
31
|
-
//
|
|
30
|
+
// manifest that was never there — which is exactly the fixture a cross-process lane test needs.
|
|
31
|
+
// The condition is strictly "the file does not exist": a manifest that is
|
|
32
32
|
// present but unreadable or broken still runs the install and still fails as before, so a genuinely
|
|
33
33
|
// broken repository is never passed silently.
|
|
34
34
|
const MANIFEST_FILE_NAME = 'package.json'
|
|
@@ -46,10 +46,9 @@ interface InstallResult {
|
|
|
46
46
|
|
|
47
47
|
// A lane with no manifest has nothing to install, so the install is skipped rather than run — the
|
|
48
48
|
// seam a cross-process lane test needs, and a root-cause fix rather than a switch, because running
|
|
49
|
-
// an install with no install target
|
|
50
|
-
//
|
|
51
|
-
//
|
|
52
|
-
// exactly as before.
|
|
49
|
+
// an install with no install target is the defect. The condition is strictly the file's absence:
|
|
50
|
+
// `existsSync` answers only whether the path is there, never whether its contents parse, so a
|
|
51
|
+
// present-but-broken manifest falls through to the real install and fails there.
|
|
53
52
|
function has_manifest(directory: string): boolean {
|
|
54
53
|
return existsSync(path.join(directory, MANIFEST_FILE_NAME))
|
|
55
54
|
}
|
|
@@ -58,12 +57,12 @@ function has_manifest(directory: string): boolean {
|
|
|
58
57
|
* Install the lane's dependencies, and report whether it worked rather than throwing.
|
|
59
58
|
*
|
|
60
59
|
* **A lane with no `package.json` skips the install** — there is nothing to install, so the reported
|
|
61
|
-
* state is installed rather than failed, and no child is spawned
|
|
60
|
+
* state is installed rather than failed, and no child is spawned. This is
|
|
62
61
|
* the only seam: the production call path, its arguments and its environment are all unchanged.
|
|
63
62
|
*
|
|
64
63
|
* **The verdict is the exit code and only the exit code.** `pnpm install` runs `prepare`, which runs
|
|
65
64
|
* the lefthook installer, and in a linked work tree the hooks are shared with the primary repository
|
|
66
|
-
* — so a warning from it is expected and correct
|
|
65
|
+
* — so a warning from it is expected and correct. Reading the child's
|
|
67
66
|
* text for a word like "failed" would turn that correct warning into a refusal to open a lane.
|
|
68
67
|
*/
|
|
69
68
|
async function install_dependencies(directory: string): Promise<InstallResult> {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
3
4
|
import { josh_command } from '#scripts/josh/josh-run'
|
|
4
5
|
import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
|
|
5
6
|
import { lane_vacant } from '#scripts/lane/lane-vacant'
|
|
@@ -8,7 +9,7 @@ import { INSTALL_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
|
8
9
|
import { execa } from 'execa'
|
|
9
10
|
|
|
10
11
|
// `josh lane:launch <issue> [--stash <message>]` — one composite command for a `backlogrun` lane-start
|
|
11
|
-
// event
|
|
12
|
+
// event. Opening one lane was four to six turns of the parent: `lane:open`,
|
|
12
13
|
// then — only the first lane, and only when `josh latest` had stashed — `stash:pop` and a re-install,
|
|
13
14
|
// then `lane:dispatch`. This collapses them into one call that returns the child's pid, or a refusal,
|
|
14
15
|
// the same shape `lane:dispatch` alone has.
|
|
@@ -24,7 +25,6 @@ const SUCCESS_EXIT_CODE = 0
|
|
|
24
25
|
const FAILURE_EXIT_CODE = 1
|
|
25
26
|
const should_forward_stderr = true
|
|
26
27
|
const PNPM = 'pnpm'
|
|
27
|
-
const ISSUE_PATTERN = /^[1-9]\d*$/u
|
|
28
28
|
|
|
29
29
|
const USAGE = 'Usage: josh lane:launch <issue-number> [--stash <message>]'
|
|
30
30
|
|
|
@@ -44,7 +44,13 @@ function read_context(argv: ReadonlyArray<string>): LaunchContext | undefined {
|
|
|
44
44
|
|
|
45
45
|
const [issue, ...rest] = parsed.positionals
|
|
46
46
|
|
|
47
|
-
if (
|
|
47
|
+
if (
|
|
48
|
+
issue === undefined ||
|
|
49
|
+
rest.length > 0 ||
|
|
50
|
+
!issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue)
|
|
51
|
+
) {
|
|
52
|
+
return undefined
|
|
53
|
+
}
|
|
48
54
|
|
|
49
55
|
return { issue, stash: parsed.values.stash }
|
|
50
56
|
}
|
|
@@ -82,8 +88,7 @@ async function prepare(stash: string | undefined, directory: string): Promise<bo
|
|
|
82
88
|
}
|
|
83
89
|
|
|
84
90
|
// Where the chain ended. `unopened` is a `lane:open` refusal — no lane was taken; `failed` is a step
|
|
85
|
-
// after it, which leaves the opened lane holding a seat, so a caller cannot read the two alike
|
|
86
|
-
// (joshuafolkken/kit#3027).
|
|
91
|
+
// after it, which leaves the opened lane holding a seat, so a caller cannot read the two alike.
|
|
87
92
|
type LaunchOutcome = { kind: 'launched'; pid: string } | { kind: 'unopened' } | { kind: 'failed' }
|
|
88
93
|
|
|
89
94
|
const UNOPENED: LaunchOutcome = { kind: 'unopened' }
|
|
@@ -95,7 +100,7 @@ async function close_if_vacant(lane: LaneInfo | undefined): Promise<void> {
|
|
|
95
100
|
await josh_command.josh_run(['lane:close', lane.issue], should_forward_stderr)
|
|
96
101
|
}
|
|
97
102
|
|
|
98
|
-
// **A lane a park kept open is resumed, not reopened
|
|
103
|
+
// **A lane a park kept open is resumed, not reopened**. A child parked before
|
|
99
104
|
// its commit leaves its uncommitted work in its lane, and `lane:open` refuses that lane as
|
|
100
105
|
// `already-open` — so the released child is dispatched into the kept tree instead. **Only a lane a
|
|
101
106
|
// child was already dispatched into counts as kept**: `lane:dispatch` records the child's output in the
|
|
@@ -103,7 +108,7 @@ async function close_if_vacant(lane: LaneInfo | undefined): Promise<void> {
|
|
|
103
108
|
// `lane:open` and its refusal. So does a stranded lane, whose `.env` is gone with its tree.
|
|
104
109
|
//
|
|
105
110
|
// **A lane no child was dispatched into and that holds nothing is closed and opened afresh**
|
|
106
|
-
//
|
|
111
|
+
// — a run cut between the open and the dispatch leaves one. It is reopened
|
|
107
112
|
// rather than reused because nothing recorded whether its install finished. A lane with work or a live
|
|
108
113
|
// process in it still meets `lane:open`'s refusal.
|
|
109
114
|
async function lane_directory(issue: string): Promise<string | undefined> {
|
|
@@ -119,7 +124,7 @@ async function lane_directory(issue: string): Promise<string | undefined> {
|
|
|
119
124
|
}
|
|
120
125
|
|
|
121
126
|
// The launch chain in-process. The CLI prints the pid; `backlog:drive` launches through this same
|
|
122
|
-
// chain
|
|
127
|
+
// chain.
|
|
123
128
|
async function launch_lane(context: LaunchContext): Promise<LaunchOutcome> {
|
|
124
129
|
const directory = await lane_directory(context.issue)
|
|
125
130
|
|