@joshuafolkken/kit 1.1240.0 → 1.1370.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +50 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +19 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +26 -16
- package/.claude/skills/workflow-commands/latest-gate.md +17 -28
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +29 -47
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +216 -202
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -187
- package/dist/josh.js +281 -94
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +16 -10
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +3 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +26 -2
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +2 -2
- package/scripts/gate/core-budget.ts +15 -26
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +70 -35
- package/scripts/gate/gate-report.ts +14 -15
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +168 -30
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +53 -51
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +7 -7
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +1 -1
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +24 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +52 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +9 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +34 -38
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +17 -7
- package/scripts/issue/issue-release.ts +3 -3
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +30 -35
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +25 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +4 -5
- package/scripts/josh/josh-commands-lane.ts +14 -4
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-run.ts +20 -6
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +6 -7
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +12 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +2 -2
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +20 -19
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +12 -11
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +16 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +1 -1
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-runs.ts +1 -1
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +5 -6
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +54 -36
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +9 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +171 -46
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +25 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +13 -15
- package/scripts/run/run-step.ts +58 -47
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -32
- package/scripts/run/wake/run-wake-describe.ts +24 -28
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +9 -9
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -279
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +26 -26
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -4,16 +4,18 @@ import { fileURLToPath } from 'node:url'
|
|
|
4
4
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
5
5
|
import { lane_capacity } from './lane-capacity'
|
|
6
6
|
import { lane_ledger } from './lane-ledger'
|
|
7
|
-
import {
|
|
7
|
+
import { lane_sampler, type MeasureContext } from './lane-sampler'
|
|
8
|
+
import { lane_stage_stats } from './lane-stage-stats'
|
|
8
9
|
import { lane_stats } from './lane-stats'
|
|
9
10
|
|
|
10
|
-
// `josh lane:sample` / `josh lane:stats` — the lane-limit measurement
|
|
11
|
+
// `josh lane:sample` / `josh lane:stats` — the lane-limit measurement.
|
|
11
12
|
//
|
|
12
13
|
// `lane:sample` appends one machine-load sample to the ledger, or one every `--every <seconds>` until it
|
|
13
14
|
// is stopped; `lane:stats` reduces a period of the ledger to the one table row #3347 records per lane
|
|
14
|
-
// limit
|
|
15
|
-
//
|
|
16
|
-
// `
|
|
15
|
+
// limit, and under it the per-stage durations of the period's lanes. Every entry writes itself during
|
|
16
|
+
// a `backlogrun` — the merges, the gates, the stages, and the load `backlog:drive` samples while it
|
|
17
|
+
// runs — so a person only closes the period with `lane:stats`; `lane:sample` is for a load reading
|
|
18
|
+
// outside one. The procedure is `docs/maintainers/lane-limit-measurement.md`.
|
|
17
19
|
|
|
18
20
|
const ARGV_OFFSET = 2
|
|
19
21
|
const FAILURE_EXIT_CODE = 1
|
|
@@ -28,12 +30,6 @@ const USAGE = [
|
|
|
28
30
|
const SAMPLE_OPTIONS = { every: { type: 'string' } } as const
|
|
29
31
|
const STATS_OPTIONS = { period: { type: 'string' }, limit: { type: 'string' } } as const
|
|
30
32
|
|
|
31
|
-
// Where the ledger is and what "now" is, overridable so a test reads a fixed ledger at a fixed instant.
|
|
32
|
-
interface MeasureContext {
|
|
33
|
-
ledger_path?: string
|
|
34
|
-
now_ms?: number
|
|
35
|
-
}
|
|
36
|
-
|
|
37
33
|
function refuse(): number {
|
|
38
34
|
console.error(USAGE)
|
|
39
35
|
|
|
@@ -47,12 +43,6 @@ function positive(text: string | undefined): number | undefined {
|
|
|
47
43
|
return text !== undefined && Number.isFinite(value) && value > 0 ? value : undefined
|
|
48
44
|
}
|
|
49
45
|
|
|
50
|
-
async function take_sample(context: MeasureContext): Promise<void> {
|
|
51
|
-
const at = new Date(context.now_ms ?? Date.now()).toISOString()
|
|
52
|
-
|
|
53
|
-
await lane_ledger.record(await lane_load.sample(at), context.ledger_path)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
46
|
// The `--every` interval: `{ seconds: undefined }` for a single sample, `undefined` for a refusal.
|
|
57
47
|
function sample_interval(rest: ReadonlyArray<string>): { seconds: number | undefined } | undefined {
|
|
58
48
|
const values = cli_flags.values_of(rest, SAMPLE_OPTIONS)
|
|
@@ -71,7 +61,7 @@ function sample_interval(rest: ReadonlyArray<string>): { seconds: number | undef
|
|
|
71
61
|
async function keep_sampling(context: MeasureContext, seconds: number): Promise<void> {
|
|
72
62
|
const ticks = every(seconds * MS_PER_SECOND, context)
|
|
73
63
|
|
|
74
|
-
for await (const tick_context of ticks) await
|
|
64
|
+
for await (const tick_context of ticks) await lane_sampler.take(tick_context)
|
|
75
65
|
}
|
|
76
66
|
|
|
77
67
|
// One sample now, then — with `--every` — one per interval.
|
|
@@ -83,7 +73,7 @@ async function sample_command(
|
|
|
83
73
|
|
|
84
74
|
if (interval === undefined) return refuse()
|
|
85
75
|
|
|
86
|
-
await
|
|
76
|
+
await lane_sampler.take(context)
|
|
87
77
|
|
|
88
78
|
if (interval.seconds !== undefined) await keep_sampling(context, interval.seconds)
|
|
89
79
|
|
|
@@ -92,10 +82,10 @@ async function sample_command(
|
|
|
92
82
|
|
|
93
83
|
// The label defaults to the limit this process reads, which is the period's limit only when nobody
|
|
94
84
|
// changed it since — `--limit` names it outright.
|
|
95
|
-
function limit_label(given: string | undefined): string {
|
|
85
|
+
async function limit_label(given: string | undefined): Promise<string> {
|
|
96
86
|
if (given !== undefined) return given
|
|
97
87
|
|
|
98
|
-
const choice = lane_capacity.lane_limit()
|
|
88
|
+
const choice = await lane_capacity.lane_limit()
|
|
99
89
|
|
|
100
90
|
return choice.kind === 'limit' ? String(choice.limit) : lane_stats.MISSING
|
|
101
91
|
}
|
|
@@ -118,10 +108,11 @@ async function stats_command(
|
|
|
118
108
|
if (values === undefined || period_days === undefined) return refuse()
|
|
119
109
|
|
|
120
110
|
const window = lane_stats.window_of(period_days, context.now_ms ?? Date.now())
|
|
121
|
-
const label = { limit: limit_label(values.limit), period_days }
|
|
122
|
-
const
|
|
111
|
+
const label = { limit: await limit_label(values.limit), period_days }
|
|
112
|
+
const entries = await read_ledger(context)
|
|
113
|
+
const row = lane_stats.row(entries, window, label)
|
|
123
114
|
|
|
124
|
-
console.info(`${lane_stats.header()}\n${row}`)
|
|
115
|
+
console.info(`${lane_stats.header()}\n${row}\n\n${lane_stage_stats.table(entries, window)}`)
|
|
125
116
|
|
|
126
117
|
return 0
|
|
127
118
|
}
|
|
@@ -145,5 +136,4 @@ const lane_measure_cli = {
|
|
|
145
136
|
|
|
146
137
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
147
138
|
|
|
148
|
-
export type { MeasureContext }
|
|
149
139
|
export { lane_measure_cli }
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
2
|
+
|
|
1
3
|
// The difference between the issues an `in-progress` label says are running and the lanes that are
|
|
2
|
-
// actually open
|
|
4
|
+
// actually open.
|
|
3
5
|
//
|
|
4
6
|
// `epic:next` counts lane occupancy from the `in-progress` label list; `lane:list` reads the work
|
|
5
7
|
// trees that are actually open. Nothing named the difference, so a session read hand-made signals —
|
|
@@ -69,15 +71,15 @@ function classify(in_progress: ReadonlyArray<number>, lanes: LaneRead): Occupanc
|
|
|
69
71
|
}
|
|
70
72
|
|
|
71
73
|
function stopped_line(issue: number): string {
|
|
72
|
-
return `⚠ ${STOPPED}
|
|
74
|
+
return `⚠ ${STOPPED} ${session_cite.issue(issue)} — carries \`in-progress\` but no lane is open — a stale label. Remove it if the run is done (labels are a person's to change), or reopen the lane.`
|
|
73
75
|
}
|
|
74
76
|
|
|
75
77
|
function unknown_line(issue: number): string {
|
|
76
|
-
return `⚠ ${UNKNOWN}
|
|
78
|
+
return `⚠ ${UNKNOWN} ${session_cite.issue(issue)} — carries \`in-progress\` but the lane listing could not be read, so whether its lane is live is unknown — do not treat it as stopped.`
|
|
77
79
|
}
|
|
78
80
|
|
|
79
81
|
function without_label_line(issue: number): string {
|
|
80
|
-
return `⚠ a lane is open for
|
|
82
|
+
return `⚠ a lane is open for ${session_cite.issue(issue)} but it carries no \`in-progress\` label — another session could claim the same issue. Apply the label or close the lane (a person's, never this command's).`
|
|
81
83
|
}
|
|
82
84
|
|
|
83
85
|
function labelled_lines(labelled: ReadonlyArray<LabelledIssue>): Array<string> {
|
|
@@ -2,6 +2,7 @@ import { mkdirSync, readdirSync, rmSync, writeFileSync } from 'node:fs'
|
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { ENV_FILE_NAME } from '#ports'
|
|
4
4
|
import { git_worktree } from '#scripts/git/git-worktree'
|
|
5
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
5
6
|
import { file_reader } from '#scripts/lib/read-file'
|
|
6
7
|
import { lane_cache } from './lane-cache'
|
|
7
8
|
import { lane_environment } from './lane-environment'
|
|
@@ -12,8 +13,7 @@ import { lane_registry, type LaneInfo } from './lane-registry'
|
|
|
12
13
|
import { lane_seed_policy } from './lane-seed'
|
|
13
14
|
import { lane_start_point } from './lane-start-point'
|
|
14
15
|
|
|
15
|
-
// Opening a lane: one linked work tree, one branch, one port seed, and the dependencies to run in it
|
|
16
|
-
// (joshuafolkken/kit#1490, joshuafolkken/kit#1554).
|
|
16
|
+
// Opening a lane: one linked work tree, one branch, one port seed, and the dependencies to run in it.
|
|
17
17
|
//
|
|
18
18
|
// **The reading side of a linked work tree already worked; only the creating side was missing.**
|
|
19
19
|
// `git_directories()` resolves the tree's own git directory, `run-hold.ts` keys its record on it and
|
|
@@ -41,7 +41,7 @@ const FULL_OUTCOME: OpenOutcome = { kind: 'full' }
|
|
|
41
41
|
// `lane_paths.SEAT_LOCK_DIR`, in the lanes root and clear of the lanes themselves (which are numbered, never dot-prefixed). The claim
|
|
42
42
|
// is what closes the gap between reading the free seats and writing the lane's `.env`: two
|
|
43
43
|
// `lane:open` runs that both saw seat 1 free cannot both create the same lock, so the loser steps to
|
|
44
|
-
// the next free seat
|
|
44
|
+
// the next free seat. The lock is released once the lane's `.env` is on
|
|
45
45
|
// disk and the seat is discoverable — or on any failure — so only a hard crash mid-open can strand
|
|
46
46
|
// one, which removing the lanes-root `.seat-locks` directory clears.
|
|
47
47
|
const SEAT_LOCK_PREFIX = 'seat-'
|
|
@@ -132,8 +132,8 @@ function reserve_seat(root: string, free: ReadonlyArray<number>): SeatReservatio
|
|
|
132
132
|
* collision nothing reports until an E2E run fails somewhere else. Failing here names the lane and
|
|
133
133
|
* what to do about it.
|
|
134
134
|
*
|
|
135
|
-
* **A lane git already lists but whose `.env` is not yet on disk is mid-open, not broken
|
|
136
|
-
*
|
|
135
|
+
* **A lane git already lists but whose `.env` is not yet on disk is mid-open, not broken**.
|
|
136
|
+
* It holds a seat lock from its seat claim until its `.env` write — the
|
|
137
137
|
* whole window in which it reads as unreadable — and that lock keeps its seat off this open's table
|
|
138
138
|
* (`reserve_seat` cannot claim a locked seat), so tolerating it here cannot cause a collision. The
|
|
139
139
|
* count of held locks is the count of opens in flight, so only the unreadable lanes beyond it are
|
|
@@ -145,7 +145,9 @@ function guard_unreadable(root: string, lanes: ReadonlyArray<LaneInfo>): void {
|
|
|
145
145
|
|
|
146
146
|
if (unreadable.length <= open_in_flight_count(root)) return
|
|
147
147
|
|
|
148
|
-
const named = unreadable
|
|
148
|
+
const named = unreadable
|
|
149
|
+
.map((lane) => `${session_cite.issue(lane.issue)} (${lane.directory})`)
|
|
150
|
+
.join(', ')
|
|
149
151
|
|
|
150
152
|
throw new Error(
|
|
151
153
|
`Cannot read the port seed of these open lanes, so a free seat cannot be chosen: ${named}. Restore each lane's ${ENV_FILE_NAME}, or close the lane with \`pnpm josh lane:close <issue-number>\`.`,
|
|
@@ -157,7 +159,7 @@ function guard_unreadable(root: string, lanes: ReadonlyArray<LaneInfo>): void {
|
|
|
157
159
|
*
|
|
158
160
|
* Reported as a success, the caller captures the directory and types the first `pnpm josh …` in it —
|
|
159
161
|
* which fails with `tsx: command not found`, the exact failure the install exists to remove, now
|
|
160
|
-
* with a success line printed above it
|
|
162
|
+
* with a success line printed above it. The work tree is left where it is
|
|
161
163
|
* because both ways out need it there: the install can be run again against it, or `lane:close` can
|
|
162
164
|
* take it away. The child's own output is carried along, since it is the only thing that says which
|
|
163
165
|
* of the two applies.
|
|
@@ -166,7 +168,7 @@ function guard_install(lane: LaneInfo, result: InstallResult): void {
|
|
|
166
168
|
if (result.is_installed) return
|
|
167
169
|
|
|
168
170
|
throw new Error(
|
|
169
|
-
`Opened a lane for
|
|
171
|
+
`Opened a lane for ${session_cite.issue(lane.issue)} at ${lane.directory}, but installing its dependencies failed, so no \`pnpm josh …\` will run there. Finish it with \`pnpm --dir ${lane.directory} install --frozen-lockfile\`, or take it away with \`pnpm josh lane:close ${lane.issue}\`.\n${result.output}`,
|
|
170
172
|
)
|
|
171
173
|
}
|
|
172
174
|
|
|
@@ -196,19 +198,19 @@ function build_plan(
|
|
|
196
198
|
//
|
|
197
199
|
// The start point comes from `lane_start_point` rather than from the default branch's bare name:
|
|
198
200
|
// that name resolves to a local ref nothing advances, and the lane would start without the work
|
|
199
|
-
// merged just before it
|
|
201
|
+
// merged just before it. **It answers `undefined` when a branch of this
|
|
200
202
|
// lane's name already exists**, which puts the work tree on that branch instead of creating one —
|
|
201
|
-
// the only route back to a child that was parked after pushing
|
|
203
|
+
// the only route back to a child that was parked after pushing.
|
|
202
204
|
//
|
|
203
|
-
// **The install is the last step rather than a caller's, because a lane without it is unusable
|
|
204
|
-
//
|
|
205
|
+
// **The install is the last step rather than a caller's, because a lane without it is unusable**.
|
|
206
|
+
// Leaving it to whoever opened the lane made it a step nothing enforced,
|
|
205
207
|
// and every lane opened without it failed on its first `pnpm josh …`. It runs after the `.env`
|
|
206
208
|
// rather than before, so a lane that fails here still carries the seat it was allocated and the
|
|
207
209
|
// failure is recoverable by re-running the install alone.
|
|
208
210
|
//
|
|
209
|
-
// **The gate's verification caches are seeded from the main checkout before the install
|
|
210
|
-
//
|
|
211
|
-
// hook bundles are seeded the same way
|
|
211
|
+
// **The gate's verification caches are seeded from the main checkout before the install**,
|
|
212
|
+
// so the lane's first `josh gate` is warm rather than cold. The pre-built
|
|
213
|
+
// hook bundles are seeded the same way: `dist/hooks/` is git-ignored, so a
|
|
212
214
|
// lane's work tree never carries it and every Claude Code hook drops to the slow `pnpm josh …`
|
|
213
215
|
// fallback without this copy. Both are best-effort and run after the `.env` write for the same reason
|
|
214
216
|
// the install does: a lane whose warming found nothing still carries its seat and is perfectly
|
|
@@ -217,7 +219,7 @@ async function materialize(plan: LanePlan, source_root: string): Promise<void> {
|
|
|
217
219
|
// The seat lock is released the moment the `.env` is on disk — from then the lane is readable and
|
|
218
220
|
// its seat discoverable, so nothing more holds the seat. It must **not** ride the multi-minute
|
|
219
221
|
// install: a lock outlasting the unreadable window would inflate `open_in_flight_count` and mask a
|
|
220
|
-
// genuinely broken lane
|
|
222
|
+
// genuinely broken lane. The `finally` covers a failure before the `.env`
|
|
221
223
|
// is written, where nothing was created that should hold it.
|
|
222
224
|
try {
|
|
223
225
|
mkdirSync(path.dirname(plan.lane.directory), { recursive: true })
|
|
@@ -236,8 +238,7 @@ async function materialize(plan: LanePlan, source_root: string): Promise<void> {
|
|
|
236
238
|
}
|
|
237
239
|
|
|
238
240
|
// Both refusals run before the seat is claimed, so neither leaves a lock behind. A directory at the
|
|
239
|
-
// lane's path that git does not register is `lane_leftover`'s to remove or refuse
|
|
240
|
-
// (joshuafolkken/kit#2857).
|
|
241
|
+
// lane's path that git does not register is `lane_leftover`'s to remove or refuse.
|
|
241
242
|
async function clear_the_way(
|
|
242
243
|
root: string,
|
|
243
244
|
issue: string,
|
|
@@ -257,7 +258,7 @@ async function clear_the_way(
|
|
|
257
258
|
async function open_lane(issue: string): Promise<OpenOutcome> {
|
|
258
259
|
// The main work tree's, never this one's: run from inside a lane, the current root would put the
|
|
259
260
|
// new lane under `<lane>/.<lane>-lanes` and read the lane's own seed as the root's — a lane
|
|
260
|
-
// `list_lanes` cannot see, on ports it never recorded
|
|
261
|
+
// `list_lanes` cannot see, on ports it never recorded.
|
|
261
262
|
const repository_root = await lane_registry.main_repository_root()
|
|
262
263
|
const lanes = await lane_registry.list_lanes()
|
|
263
264
|
const existing = lane_registry.find_lane(lanes, issue)
|
|
@@ -2,12 +2,13 @@ import { writeFileSync } from 'node:fs'
|
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { ENV_FILE_NAME } from '#ports'
|
|
4
4
|
import type { AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
5
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
5
6
|
import { run_liveness } from '#scripts/run/run-liveness'
|
|
6
7
|
import { lane_environment } from './lane-environment'
|
|
7
8
|
import { lane_registry, type LaneInfo } from './lane-registry'
|
|
8
9
|
|
|
9
10
|
// Where the delegated unit running a lane's child writes, recorded in the lane and read back from
|
|
10
|
-
// anywhere
|
|
11
|
+
// anywhere.
|
|
11
12
|
//
|
|
12
13
|
// **This is the one fact about an in-flight lane that only the dispatching session held.** The
|
|
13
14
|
// harness names a unit's output file after that session's own id and the unit's, and neither is
|
|
@@ -106,10 +107,10 @@ function describe_refusal(refusal: Refusal, issue: string): string {
|
|
|
106
107
|
}
|
|
107
108
|
|
|
108
109
|
if (refusal.kind === 'unreadable') {
|
|
109
|
-
return `The lane for
|
|
110
|
+
return `The lane for ${session_cite.issue(issue)} has a ${ENV_FILE_NAME} that cannot be read at ${refusal.lane.directory}. Fix it and run this again — writing a new one would drop the lane's port seat with it.`
|
|
110
111
|
}
|
|
111
112
|
|
|
112
|
-
return `No lane is open for
|
|
113
|
+
return `No lane is open for ${session_cite.issue(issue)}. Run \`pnpm josh lane:list\` to see what is open.`
|
|
113
114
|
}
|
|
114
115
|
|
|
115
116
|
const lane_output = {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import path from 'node:path'
|
|
2
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
2
3
|
|
|
3
|
-
// Where a lane lives on disk, and what its branch is called
|
|
4
|
+
// Where a lane lives on disk, and what its branch is called.
|
|
4
5
|
//
|
|
5
6
|
// **A lane is deliberately not nested inside the repository.** A linked work tree is a second full
|
|
6
7
|
// checkout, so putting it under the main one would hand every path-walking tool in the project a
|
|
@@ -13,7 +14,7 @@ import path from 'node:path'
|
|
|
13
14
|
const LANE_ROOT_KEY = 'JOSH_LANE_ROOT'
|
|
14
15
|
const LANE_DIRECTORY_SUFFIX = '-lanes'
|
|
15
16
|
// **The issue number comes first because `pnpm josh git` will not commit from a branch that starts
|
|
16
|
-
// any other way
|
|
17
|
+
// any other way**. Its `has_same_issue_prefix` reads `/^\d+-/`, so the
|
|
17
18
|
// original `lane/<N>` spelling made every lane a checkout nothing could be committed from — and
|
|
18
19
|
// switching the branch inside the lane is not the way round it, because `lane_registry` identifies a
|
|
19
20
|
// lane *by* this name: the moment it changes, the work tree drops out of `lane:list`, its seat is
|
|
@@ -43,9 +44,6 @@ function lane_directory(root: string, issue: string): string {
|
|
|
43
44
|
return path.join(root, issue)
|
|
44
45
|
}
|
|
45
46
|
|
|
46
|
-
// A lane directory's own name is the issue number, so the number a checkout belongs to is readable
|
|
47
|
-
// from its path alone.
|
|
48
|
-
const LANE_ISSUE_PATTERN = /^\d+$/u
|
|
49
47
|
// Built from the suffix above rather than spelled again, so the two readings of a lane root cannot
|
|
50
48
|
// drift apart. `.kit-lanes` and `.app-kit-lanes` both match; a plain `lanes` does not, because
|
|
51
49
|
// `default_lane_root` always writes the leading dot.
|
|
@@ -62,10 +60,13 @@ function is_lane_root(directory: string, environment: LaneEnvironment): boolean
|
|
|
62
60
|
// **The inverse of `lane_directory`, and the one lane test that needs no git.** `lane_registry`
|
|
63
61
|
// answers the same question authoritatively by parsing `git worktree list`, but that read is
|
|
64
62
|
// asynchronous and a `PreToolUse` guard is synchronous by contract — so a guard that has to know
|
|
65
|
-
// whether the checkout it is running in is a lane reads it off the path instead
|
|
66
|
-
//
|
|
63
|
+
// whether the checkout it is running in is a lane reads it off the path instead.
|
|
64
|
+
// It is deliberately the weaker of the two: it says the directory *sits
|
|
67
65
|
// where a lane sits*, never that a work tree is registered there, so a caller that needs the
|
|
68
66
|
// registration still goes through `lane_registry`.
|
|
67
|
+
//
|
|
68
|
+
// A lane directory's own name is the issue number, so the number a checkout belongs to is readable
|
|
69
|
+
// from its path alone.
|
|
69
70
|
function lane_issue_of(
|
|
70
71
|
directory: string,
|
|
71
72
|
environment: LaneEnvironment = process.env,
|
|
@@ -73,7 +74,7 @@ function lane_issue_of(
|
|
|
73
74
|
const resolved = path.resolve(directory)
|
|
74
75
|
const issue = path.basename(resolved)
|
|
75
76
|
|
|
76
|
-
if (!
|
|
77
|
+
if (!issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue)) return undefined
|
|
77
78
|
|
|
78
79
|
return is_lane_root(path.dirname(resolved), environment) ? issue : undefined
|
|
79
80
|
}
|
|
@@ -83,14 +84,14 @@ function lane_branch(issue: string): string {
|
|
|
83
84
|
}
|
|
84
85
|
|
|
85
86
|
// The lanes root's own bookkeeping, beside the lanes and never one of them: `lane:open` claims a seat
|
|
86
|
-
// by creating a lock directory under it
|
|
87
|
+
// by creating a lock directory under it.
|
|
87
88
|
const SEAT_LOCK_DIR = '.seat-locks'
|
|
88
89
|
|
|
89
90
|
// A name the lane machinery writes into a lanes root: a lane's issue number, or a lanes root of its
|
|
90
91
|
// own — the nested one a lane opened from inside a lane once put there. Anything else in the root
|
|
91
|
-
// was put there by someone else
|
|
92
|
+
// was put there by someone else.
|
|
92
93
|
function is_lane_entry(name: string): boolean {
|
|
93
|
-
return
|
|
94
|
+
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(name) || DEFAULT_LANE_ROOT_PATTERN.test(name)
|
|
94
95
|
}
|
|
95
96
|
|
|
96
97
|
const lane_paths = {
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
2
|
+
import { run_event_plan } from '#scripts/run/event/run-event-plan'
|
|
3
|
+
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
4
|
+
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
5
|
+
import { lane_child_marker, type MarkerSource } from './lane-child-marker'
|
|
6
|
+
|
|
7
|
+
// The `implement` phase a lane child reports to `run:board`. Every other phase
|
|
8
|
+
// is read off an event the run already writes — the launch, the ship stages — but nothing marked the
|
|
9
|
+
// moment the plan turned into code. The first runtime-file edit is that moment, and the Step 0 notice
|
|
10
|
+
// already fires on it once per session, so the pretool hook calls this beside it. The Step 0 work summary
|
|
11
|
+
// is where a plan settles, so the issue's `plan` event is written here first, unless `run:entry` already
|
|
12
|
+
// wrote it for a planned issue.
|
|
13
|
+
//
|
|
14
|
+
// **A dispatched lane child only.** A person's own session, or one carrying a mark leaked from a parent,
|
|
15
|
+
// is not a lane the board draws a row for, so it writes nothing.
|
|
16
|
+
async function mark_implement(
|
|
17
|
+
directory: string = process.cwd(),
|
|
18
|
+
source: MarkerSource = process.env,
|
|
19
|
+
): Promise<void> {
|
|
20
|
+
const issue = lane_child_marker.marked_issue(source)
|
|
21
|
+
|
|
22
|
+
if (issue === undefined || !lane_child_marker.is_child_of(directory, source)) return
|
|
23
|
+
|
|
24
|
+
await run_event_plan.emit_plan(issue)
|
|
25
|
+
await run_event_stream_emit.emit(
|
|
26
|
+
run_event_stream.EVENT_KIND.LANE_PHASE,
|
|
27
|
+
`${issue_cite.plain(issue)} implement`,
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const lane_phase = { mark_implement }
|
|
32
|
+
|
|
33
|
+
export { lane_phase }
|
|
@@ -2,7 +2,7 @@ import { execFileSync } from 'node:child_process'
|
|
|
2
2
|
import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
3
3
|
import { lane_child_invocation } from './lane-child-invocation'
|
|
4
4
|
|
|
5
|
-
// Ending a lane child that did not end itself
|
|
5
|
+
// Ending a lane child that did not end itself.
|
|
6
6
|
//
|
|
7
7
|
// **A detached child is kept alive on purpose and was never ended by anything.** `detached_launch`
|
|
8
8
|
// lets a child outlive its parent's session, and every reader of it — `run:liveness`, the 30-minute
|
|
@@ -89,7 +89,7 @@ function ancestry_of(pid: number, probes: ReapProbes): Set<number> {
|
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
// This process and every process above it. The Stop hook reads it to tell whether the session that
|
|
92
|
-
// declared a carry record's `--owner "$PPID"` is the one it runs under
|
|
92
|
+
// declared a carry record's `--owner "$PPID"` is the one it runs under.
|
|
93
93
|
function own_ancestry(probes: ReapProbes = SYSTEM_PROBES): Set<number> {
|
|
94
94
|
return ancestry_of(process.pid, probes)
|
|
95
95
|
}
|
|
@@ -5,11 +5,12 @@ import type { AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
|
5
5
|
import { repo_discovery } from '#scripts/discovery/repo-discovery'
|
|
6
6
|
import { git_command } from '#scripts/git/git-command'
|
|
7
7
|
import { git_worktree } from '#scripts/git/git-worktree'
|
|
8
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
8
9
|
import { file_reader } from '#scripts/lib/read-file'
|
|
9
10
|
import { lane_environment } from './lane-environment'
|
|
10
11
|
import { lane_paths } from './lane-paths'
|
|
11
12
|
|
|
12
|
-
// The open lanes, read from git and from each lane's own `.env
|
|
13
|
+
// The open lanes, read from git and from each lane's own `.env`.
|
|
13
14
|
//
|
|
14
15
|
// **There is no ledger file, and that is the design rather than an omission.** A lane's seat has to
|
|
15
16
|
// live in its `.env` anyway — that file is what `josh port` and `playwright.config.ts` read inside
|
|
@@ -25,11 +26,11 @@ interface LaneInfo {
|
|
|
25
26
|
directory: string
|
|
26
27
|
// The lane's seat (`JOSH_LANE_SEAT`, 1..9), and the dev/preview ports it resolves to through
|
|
27
28
|
// `ports/index.js` — all `undefined` when the lane's `.env` cannot be read. The seat is what a new
|
|
28
|
-
// lane's allocation has to avoid; the ports are what the report shows
|
|
29
|
+
// lane's allocation has to avoid; the ports are what the report shows.
|
|
29
30
|
seat: number | undefined
|
|
30
31
|
development_port: number | undefined
|
|
31
32
|
preview_port: number | undefined
|
|
32
|
-
// Where the delegated unit running this lane's child writes
|
|
33
|
+
// Where the delegated unit running this lane's child writes, or
|
|
33
34
|
// `undefined` where the lane records none. It is the one thing about a lane that a session which
|
|
34
35
|
// did not open it cannot derive: the harness names a unit's file after the dispatching session
|
|
35
36
|
// and the unit's own id, neither of which is written anywhere else on disk. Recorded here, a
|
|
@@ -43,10 +44,6 @@ interface LaneInfo {
|
|
|
43
44
|
const WORKTREE_PREFIX = 'worktree '
|
|
44
45
|
const BRANCH_PREFIX = 'branch refs/heads/'
|
|
45
46
|
const BLOCK_SEPARATOR = '\n\n'
|
|
46
|
-
// The same shape `lane:open` accepts. Nothing reserves the `-lane` suffix, so a hand-made
|
|
47
|
-
// `spike-lane` branch with a work tree would otherwise be read as a lane — and `lane:close --all`
|
|
48
|
-
// would delete its directory and its branch on an issue number that never existed.
|
|
49
|
-
const ISSUE_PATTERN = /^[1-9]\d*$/u
|
|
50
47
|
|
|
51
48
|
function line_value(lines: ReadonlyArray<string>, prefix: string): string | undefined {
|
|
52
49
|
return lines.find((line) => line.startsWith(prefix))?.slice(prefix.length)
|
|
@@ -101,7 +98,7 @@ function held_seat(content: string | undefined): SeatPorts {
|
|
|
101
98
|
/**
|
|
102
99
|
* The lane's own `.env`, or `undefined` when it cannot be read.
|
|
103
100
|
*
|
|
104
|
-
* One read serves both the seat and the recorded output path
|
|
101
|
+
* One read serves both the seat and the recorded output path. Reading the
|
|
105
102
|
* file twice would let the two disagree about whether it could be read at all, and `unreadable` is
|
|
106
103
|
* a state the report shows rather than a state anything falls back from.
|
|
107
104
|
*/
|
|
@@ -112,12 +109,16 @@ function read_environment(directory: string): string | undefined {
|
|
|
112
109
|
// A lane is identified by its branch rather than by where it sits, so nothing here compares two
|
|
113
110
|
// spellings of one path — git prints the resolved one, and a lane root reached through a symlink
|
|
114
111
|
// would otherwise read as no lane at all.
|
|
112
|
+
//
|
|
113
|
+
// The issue is the same shape `lane:open` accepts. Nothing reserves the `-lane` suffix, so a hand-made
|
|
114
|
+
// `spike-lane` branch with a work tree would otherwise be read as a lane — and `lane:close --all`
|
|
115
|
+
// would delete its directory and its branch on an issue number that never existed.
|
|
115
116
|
function branch_issue(branch: string | undefined): string | undefined {
|
|
116
117
|
if (!branch?.endsWith(lane_paths.LANE_BRANCH_SUFFIX)) return undefined
|
|
117
118
|
|
|
118
119
|
const issue = branch.slice(0, -lane_paths.LANE_BRANCH_SUFFIX.length)
|
|
119
120
|
|
|
120
|
-
return
|
|
121
|
+
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(issue) ? issue : undefined
|
|
121
122
|
}
|
|
122
123
|
|
|
123
124
|
// **Stranded means the work tree is gone from disk, and nothing else.** git also marks a
|
|
@@ -154,8 +155,8 @@ function build_lane(
|
|
|
154
155
|
}
|
|
155
156
|
}
|
|
156
157
|
|
|
157
|
-
// **A lane is its branch *and* its place, and the place is what makes the identification safe
|
|
158
|
-
//
|
|
158
|
+
// **A lane is its branch *and* its place, and the place is what makes the identification safe**.
|
|
159
|
+
// The branch alone is not a namespace anyone stays out of: `pnpm josh git`
|
|
159
160
|
// builds an issue branch as `<N>-<slug of the title>`, so an issue titled "Lane" produces `<N>-lane`
|
|
160
161
|
// — byte for byte the name `lane_paths.lane_branch` builds. Read as a lane, that work tree is
|
|
161
162
|
// whichever checkout the person was working in, and `lane:close --all` would delete it, because
|
|
@@ -194,11 +195,11 @@ async function worktree_blocks(): Promise<Array<string>> {
|
|
|
194
195
|
/**
|
|
195
196
|
* The main work tree's root, whichever work tree this was run in.
|
|
196
197
|
*
|
|
197
|
-
* **Every lane path is derived from here, and `git rev-parse --show-toplevel` is not it
|
|
198
|
-
*
|
|
198
|
+
* **Every lane path is derived from here, and `git rev-parse --show-toplevel` is not it**.
|
|
199
|
+
* That answers the *current* work tree, which inside a lane is the lane
|
|
199
200
|
* itself — so `lane:list` run there would look for lanes under `<lane>/.<lane>-lanes` and report that
|
|
200
201
|
* none are open while six are running. The step from the current work tree to the main one is exactly
|
|
201
|
-
* what `repo_discovery.main_worktree` resolves from the filesystem
|
|
202
|
+
* what `repo_discovery.main_worktree` resolves from the filesystem, so this
|
|
202
203
|
* is a thin async layer over it: `repository_root()` names the current work tree, and the shared
|
|
203
204
|
* resolver walks its `.git`/`commondir` up to the main checkout. Keeping that walk in one place lets
|
|
204
205
|
* the synchronous discovery callers — which cannot await this — share the same answer. For an ordinary
|
|
@@ -252,7 +253,7 @@ function find_lane(lanes: ReadonlyArray<LaneInfo>, issue: string): LaneInfo | un
|
|
|
252
253
|
/**
|
|
253
254
|
* The open lane for one issue, read from the listing every other lane reading goes through.
|
|
254
255
|
*
|
|
255
|
-
* **The listing and the find are one call because every caller needs both
|
|
256
|
+
* **The listing and the find are one call because every caller needs both**.
|
|
256
257
|
* Each one that wrote the pair itself is a place the listing could be read differently — from a cache,
|
|
257
258
|
* from a stale array — and the whole point of reading it live is that the answer is the same in every
|
|
258
259
|
* session, including one that never opened the lane.
|
|
@@ -8,8 +8,8 @@ import type { LaneInfo } from './lane-registry'
|
|
|
8
8
|
|
|
9
9
|
// Relaunching a lane child session into its own lane — a fresh agent process started detached, under
|
|
10
10
|
// the lane's stored profile at the effort of the phase it resumes into, logging to the lane's dispatch
|
|
11
|
-
// log and carrying the dispatch mark afresh. **It was `run:cut`'s alone until a second caller needed it
|
|
12
|
-
//
|
|
11
|
+
// log and carrying the dispatch mark afresh. **It was `run:cut`'s alone until a second caller needed it**:
|
|
12
|
+
// the detached `josh ship` supervisor hands a stopped stage back to an agent
|
|
13
13
|
// the same way the pre-gate cut hands the gate to one, so the launch is shared rather than copied — the
|
|
14
14
|
// copy that drifts is the one that forgets the mark and is read as a person by every guard.
|
|
15
15
|
//
|
|
@@ -38,9 +38,9 @@ function relaunch(
|
|
|
38
38
|
log_path: lane_dispatch_log.default_log_path(lane),
|
|
39
39
|
profile: built.profile,
|
|
40
40
|
// The relaunch keeps the mark, so the resumed child is still a dispatched child to every rule
|
|
41
|
-
// that reads it
|
|
42
|
-
// since the parent-session strip runs on the way in. **The ship supervisor's mark is dropped
|
|
43
|
-
//
|
|
41
|
+
// that reads it; the inherited environment cannot be relied on here,
|
|
42
|
+
// since the parent-session strip runs on the way in. **The ship supervisor's mark is dropped**:
|
|
43
|
+
// a detached supervisor is what relaunches after a stopped stage, and an
|
|
44
44
|
// agent that inherited its mark would read its own in-turn `josh ship` failure as a supervisor's —
|
|
45
45
|
// relaunching a second child into the lane beside itself.
|
|
46
46
|
env: { ...lane_child_marker.env_for(lane.issue), [SUPERVISED_KEY]: undefined },
|
|
@@ -50,14 +50,14 @@ function relaunch(
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
// An OpenAI lane's process is started by its supervisor, never by a relaunch — both `run:cut` and the
|
|
53
|
-
// `run:merge` cut fallback ask this one predicate
|
|
53
|
+
// `run:merge` cut fallback ask this one predicate.
|
|
54
54
|
function is_openai_lane(lane: LaneInfo): boolean {
|
|
55
55
|
return lane.profile?.provider === OPENAI_PROVIDER
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
// The relaunch after a cut: the resume-specific prompt, not the record's bare `fullrun #<N
|
|
59
|
-
//
|
|
60
|
-
// workflow-commands entry documents. Shared by `run:cut` and the `run:merge` fallback
|
|
58
|
+
// The relaunch after a cut: the resume-specific prompt, not the record's bare `fullrun #<N>`,
|
|
59
|
+
// so the successor goes straight to `run:cut --resume` without reading the
|
|
60
|
+
// workflow-commands entry documents. Shared by `run:cut` and the `run:merge` fallback.
|
|
61
61
|
function resume(lane: LaneInfo, phase: string, on_note: (note: string) => void): RelaunchResult {
|
|
62
62
|
return relaunch(lane, lane_child_invocation.resume_invocation(lane.issue), phase, on_note)
|
|
63
63
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { agent_role_profile } from '#scripts/agent/agent-role-profile'
|
|
2
2
|
import { issue_cite, type IssueCiter } from '#scripts/issue/issue-cite'
|
|
3
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
3
4
|
import { run_liveness } from '#scripts/run/run-liveness'
|
|
4
5
|
import type { LaneInfo } from './lane-registry'
|
|
5
6
|
|
|
6
|
-
// What a person reads when they ask what is open
|
|
7
|
+
// What a person reads when they ask what is open.
|
|
7
8
|
//
|
|
8
9
|
// The dev and preview ports are the ones the registry already resolved through `ports/index.js`
|
|
9
10
|
// when it read each lane's `.env`, so the numbers printed here are the same ones `josh port` and
|
|
@@ -31,7 +32,7 @@ function value_or_unknown(value: number | undefined): string {
|
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
// The recorded output path goes last and is labelled, so it is told apart from the directory beside
|
|
34
|
-
// it
|
|
35
|
+
// it. A lane that records none prints `output -` rather than nothing at
|
|
35
36
|
// all: a session that did not open the lane has to be able to see that the record is missing, not
|
|
36
37
|
// read a shorter row as one field it failed to notice.
|
|
37
38
|
function output_column(output: string | undefined): string {
|
|
@@ -52,7 +53,7 @@ function event_column(lane: LaneInfo): string {
|
|
|
52
53
|
// The plain `#N`, for a caller that could not read the repository the issue would link into.
|
|
53
54
|
const PLAIN_CITE: IssueCiter = issue_cite.citer(undefined, new Map())
|
|
54
55
|
|
|
55
|
-
// The issue leads as a citation
|
|
56
|
+
// The issue leads as a citation: a lane status report copies this row, and a
|
|
56
57
|
// bare `#N` copied into it is what the Stop guard sends back.
|
|
57
58
|
function describe_lane(lane: LaneInfo, cite: IssueCiter = PLAIN_CITE): string {
|
|
58
59
|
return [
|
|
@@ -84,7 +85,7 @@ function describe_ports(lane: LaneInfo): string {
|
|
|
84
85
|
// The one-line confirmation a person reads on standard error while standard output carries the
|
|
85
86
|
// directory alone, so `dir=$(pnpm josh lane:open 1490)` stays usable.
|
|
86
87
|
function describe_opened(lane: LaneInfo): string {
|
|
87
|
-
return `Opened a lane for
|
|
88
|
+
return `Opened a lane for ${session_cite.issue(lane.issue)} on ${lane.branch}: ${describe_ports(lane)}.`
|
|
88
89
|
}
|
|
89
90
|
|
|
90
91
|
const lane_report = {
|
|
@@ -3,8 +3,8 @@ import { api_outage } from '#scripts/agent/api-outage'
|
|
|
3
3
|
import type { ClaudeResultEvent } from '#scripts/agent/claude-result-event'
|
|
4
4
|
import { lane_child_invocation } from './lane-child-invocation'
|
|
5
5
|
|
|
6
|
-
// How a lane re-dispatch chooses between resuming the disconnected child's session and starting fresh
|
|
7
|
-
//
|
|
6
|
+
// How a lane re-dispatch chooses between resuming the disconnected child's session and starting fresh.
|
|
7
|
+
// The premise the whole issue rests on: a child that could not reach the API
|
|
8
8
|
// left a `session_id` in its exit record, and re-dispatching it as a bare `fullrun #<N>` threw that
|
|
9
9
|
// context away — a resumed child keeps it and loses only the last round-trip.
|
|
10
10
|
//
|