@joshuafolkken/kit 1.1240.0 → 1.1373.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +52 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +19 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +26 -16
- package/.claude/skills/workflow-commands/latest-gate.md +17 -28
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +23 -66
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +43 -11
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-7UBFU3CL.js} +18 -20
- package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-7WKYHEGU.js} +8 -44
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-AKGCP4LX.js} +285 -363
- package/dist/hooks/{chunk-QVSWU24O.js → chunk-BZMPVFDY.js} +7 -5
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-XZYKEM6J.js → chunk-JCRDBQXB.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-JGW24KKM.js} +4 -4
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-SLSFIWTX.js} +550 -875
- package/dist/hooks/chunk-UTHMB4O2.js +1590 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-V4TKZHER.js} +4 -4
- package/dist/hooks/chunk-YLBBSSTF.js +3705 -0
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +195 -181
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -187
- package/dist/josh.js +282 -95
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +17 -11
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +3 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +30 -5
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +2 -2
- package/scripts/gate/core-budget.ts +15 -26
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +70 -35
- package/scripts/gate/gate-report.ts +14 -15
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +168 -30
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +53 -51
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +7 -7
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +1 -1
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +24 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +52 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +9 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +34 -38
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +17 -7
- package/scripts/issue/issue-release.ts +3 -3
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +30 -35
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +25 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +4 -5
- package/scripts/josh/josh-commands-lane.ts +14 -4
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-run.ts +21 -7
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +6 -7
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +12 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +2 -2
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +20 -19
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +12 -11
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +16 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +1 -1
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cross-file-recheck.ts +155 -0
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +35 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-runs.ts +1 -1
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +6 -7
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +54 -36
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +9 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +171 -46
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +26 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +64 -18
- package/scripts/run/run-step.ts +107 -51
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -32
- package/scripts/run/wake/run-wake-describe.ts +24 -28
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +9 -9
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -279
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +26 -26
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { backlogrun_launch } from '#scripts/backlog/backlogrun-launch'
|
|
4
|
+
import { run_carry } from '#scripts/run/carry/run-carry'
|
|
3
5
|
import { josh_environment_file } from './josh-environment-file'
|
|
4
6
|
import { session_language, type Resolution } from './session-language'
|
|
5
7
|
|
|
6
8
|
// `josh session:lang` — say, on stdout, which language this session writes in, so a
|
|
7
|
-
// `SessionStart` / `UserPromptSubmit` hook injects the resolved value into context every turn
|
|
8
|
-
//
|
|
9
|
+
// `SessionStart` / `UserPromptSubmit` hook injects the resolved value into context every turn.
|
|
10
|
+
// Before this, `JOSH_SESSION_LANG` lived only in `.env` — a personal,
|
|
9
11
|
// non-committed file the harness never loads into the process environment — so the value was
|
|
10
12
|
// invisible unless the agent read the file itself, and a one-word prompt like `diag` had nothing to
|
|
11
13
|
// infer a language from and drifted to the surrounding English.
|
|
@@ -18,32 +20,72 @@ import { session_language, type Resolution } from './session-language'
|
|
|
18
20
|
// The line itself is a script-fixed string, so it stays English by the same rule that pins the
|
|
19
21
|
// Telegram header labels and the `--notify-message` default (`CLAUDE.md` → "Output language").
|
|
20
22
|
|
|
23
|
+
//
|
|
24
|
+
// **The same hook carries the board rule while a `backlogrun` is live.** The rule
|
|
25
|
+
// that a progress question is answered with `run:board --chat` is read only by the session driving a
|
|
26
|
+
// run, so a session asked from the side never met it. The prompt is the one moment every session
|
|
27
|
+
// shares, and the line is gated on the run being live, so a repository with no run pays nothing for
|
|
28
|
+
// it. Live is `backlogrun_launch.is_running`'s answer, not a second reading of the records.
|
|
29
|
+
|
|
21
30
|
const { DEFAULT_SESSION_LANG, ENV_KEY, resolve_session_lang } = session_language
|
|
22
|
-
|
|
31
|
+
|
|
32
|
+
const BOARD_LINE =
|
|
33
|
+
'A backlogrun is live here: answer a progress question with `pnpm josh run:board --chat`, verbatim in one code block.'
|
|
34
|
+
|
|
35
|
+
interface LivePorts {
|
|
36
|
+
// The common git directory the run's records are keyed on; `undefined` outside a repository.
|
|
37
|
+
repository_directory: () => Promise<string | undefined>
|
|
38
|
+
is_running: (git_directory: string) => boolean
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const LIVE_PORTS: LivePorts = {
|
|
42
|
+
repository_directory: run_carry.repository_directory,
|
|
43
|
+
is_running: backlogrun_launch.is_running,
|
|
44
|
+
}
|
|
23
45
|
|
|
24
46
|
// The file load happens in `main`, on the command path only; the resolver reads the environment.
|
|
25
47
|
// The line carries the value alone: what the language covers is `CLAUDE.md` → "Output language",
|
|
26
|
-
// already in context every turn, so repeating it here only spent context on each prompt.
|
|
48
|
+
// already in context every turn, so repeating it here only spent context on each prompt. The default
|
|
49
|
+
// prints nothing — that resident line already names `ja`.
|
|
27
50
|
function format_line(resolution: Resolution): string {
|
|
28
|
-
|
|
29
|
-
? ` (default; set ${ENV_KEY}=${ENGLISH_OPT_IN_LANG} for English)`
|
|
30
|
-
: ''
|
|
51
|
+
if (resolution.is_default) return ''
|
|
31
52
|
|
|
32
|
-
return `Session language (${ENV_KEY}): ${resolution.lang}
|
|
53
|
+
return `Session language (${ENV_KEY}): ${resolution.lang}`
|
|
33
54
|
}
|
|
34
55
|
|
|
35
|
-
|
|
56
|
+
// A throw is answered `false`: a hook that failed here would cost the prompt its language line too.
|
|
57
|
+
async function is_run_live(ports: LivePorts = LIVE_PORTS): Promise<boolean> {
|
|
58
|
+
try {
|
|
59
|
+
const git_directory = await ports.repository_directory()
|
|
60
|
+
|
|
61
|
+
return git_directory !== undefined && ports.is_running(git_directory)
|
|
62
|
+
} catch {
|
|
63
|
+
return false
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function prompt_lines(resolution: Resolution, is_live: boolean): Array<string> {
|
|
68
|
+
return [format_line(resolution), is_live ? BOARD_LINE : ''].filter((line) => line !== '')
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async function main(): Promise<void> {
|
|
36
72
|
josh_environment_file.load_environment_file()
|
|
37
|
-
|
|
73
|
+
const lines = prompt_lines(resolve_session_lang(), await is_run_live())
|
|
74
|
+
|
|
75
|
+
for (const line of lines) console.info(line)
|
|
38
76
|
}
|
|
39
77
|
|
|
40
78
|
const session_language_cli = {
|
|
79
|
+
BOARD_LINE,
|
|
41
80
|
DEFAULT_SESSION_LANG,
|
|
42
81
|
ENV_KEY,
|
|
43
82
|
format_line,
|
|
83
|
+
is_run_live,
|
|
84
|
+
prompt_lines,
|
|
44
85
|
resolve_session_lang,
|
|
45
86
|
}
|
|
46
87
|
|
|
47
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) main()
|
|
88
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
|
|
48
89
|
|
|
90
|
+
export type { LivePorts }
|
|
49
91
|
export { session_language_cli }
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// prints nothing (`build-hooks.ts` → "`splitting: true` is load-bearing").
|
|
6
6
|
//
|
|
7
7
|
// Unset and empty resolve to `ja`, because a worktree without a `.env`, a cloud session and a
|
|
8
|
-
// consumer repository are exactly where the drift recurs
|
|
8
|
+
// consumer repository are exactly where the drift recurs.
|
|
9
9
|
|
|
10
10
|
const ENV_KEY = 'JOSH_SESSION_LANG'
|
|
11
11
|
const DEFAULT_SESSION_LANG = 'ja'
|
|
@@ -6,8 +6,8 @@ import { PLATFORM_TEMP_ROOT } from './platform-temporary'
|
|
|
6
6
|
|
|
7
7
|
// A small record one josh command writes and another reads, kept per checkout in the temp directory.
|
|
8
8
|
//
|
|
9
|
-
// Extracted from `scripts/eval/eval-stamp.ts` when `josh latest:scope` needed the same handoff
|
|
10
|
-
//
|
|
9
|
+
// Extracted from `scripts/eval/eval-stamp.ts` when `josh latest:scope` needed the same handoff.
|
|
10
|
+
// The mechanics below are not boilerplate — the symlink defense on the
|
|
11
11
|
// write, the ownership check on the read, and the deterministic per-checkout path are each load
|
|
12
12
|
// bearing — so a second copy of them is the clone `CLAUDE.md` prohibits. What differs between the
|
|
13
13
|
// two records is their *payload* and the question asked of it, and that is all either module keeps.
|
|
@@ -42,7 +42,7 @@ function digest(content: Buffer | string): string {
|
|
|
42
42
|
// without this two accounts would name one file — and the second one's unlink of a file the first owns
|
|
43
43
|
// fails on the sticky directory, ending its command. Folding the account in keeps accidental
|
|
44
44
|
// collisions apart; a hostile local account can still pre-create a predictable name, which fails the
|
|
45
|
-
// write rather than redirecting it
|
|
45
|
+
// write rather than redirecting it. Windows has no `getuid` and keeps the
|
|
46
46
|
// per-user `os.tmpdir()`, so it contributes an empty account.
|
|
47
47
|
function account_key(): string {
|
|
48
48
|
return String(process.getuid?.() ?? '')
|
|
@@ -56,17 +56,17 @@ function account_key(): string {
|
|
|
56
56
|
// `TMPDIR`.** A record this module keeps is read by a *different* process than wrote it — the second
|
|
57
57
|
// half of a handoff — and `os.tmpdir()` honors each process's own `TMPDIR`, so a session a
|
|
58
58
|
// `run:wake` or a `lane:dispatch` launched resolves a different directory than its launcher and the
|
|
59
|
-
// handoff is lost
|
|
59
|
+
// handoff is lost. The keyed digest below already keeps one checkout apart
|
|
60
60
|
// from another; the root is what has to stop moving per process, which `platform-temporary.ts` pins.
|
|
61
61
|
//
|
|
62
62
|
// **`root` is what the record is keyed to, and the right answer differs per caller.** `PACKAGE_DIR`
|
|
63
63
|
// is the default because `josh eval` measures the kit package's own files. A record about the
|
|
64
64
|
// *project* must key on `PROJECT_ROOT` instead: a globally installed `josh` has one `PACKAGE_DIR`
|
|
65
65
|
// for every project on the machine, so keying on it would let a run in one project answer for
|
|
66
|
-
// another
|
|
66
|
+
// another.
|
|
67
67
|
//
|
|
68
68
|
// **`suffix` is what the file is, not decoration.** Every record here was JSON until `josh gate`
|
|
69
|
-
// needed to keep another tool's output verbatim
|
|
69
|
+
// needed to keep another tool's output verbatim, and a log named `.json`
|
|
70
70
|
// tells every reader — a person, an editor, a `less` — that it is something it is not.
|
|
71
71
|
function stamp_path(
|
|
72
72
|
prefix: string,
|
|
@@ -95,17 +95,46 @@ function write_stamp(target: string, payload: unknown): string {
|
|
|
95
95
|
return write_exclusively(target, JSON.stringify(payload))
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
+
// The read side of the write's problem. A record is trusted to say something is still current, so a
|
|
99
|
+
// planted one suppresses the work the check exists to force. `lstatSync` reports the link rather than
|
|
100
|
+
// what it points at, and it throws where the path is simply absent — both of which are "no record".
|
|
101
|
+
// `getuid` is missing on Windows, where a shared temp directory is not the same hazard; the check
|
|
102
|
+
// reduces to "is it a regular file" there.
|
|
103
|
+
function is_own_regular_file(source: string): boolean {
|
|
104
|
+
const stats = lstatSync(source)
|
|
105
|
+
|
|
106
|
+
if (!stats.isFile()) return false
|
|
107
|
+
|
|
108
|
+
const uid = process.getuid?.()
|
|
109
|
+
|
|
110
|
+
return uid === undefined || stats.uid === uid
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// A regular file at `target` that another account owns. An absent path or a symlink is not one: the
|
|
114
|
+
// replace below swaps either out without following it.
|
|
115
|
+
function is_foreign_file(target: string): boolean {
|
|
116
|
+
try {
|
|
117
|
+
return lstatSync(target).isFile() && !is_own_regular_file(target)
|
|
118
|
+
} catch {
|
|
119
|
+
return false
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
98
123
|
// Mutable coordination state cannot disappear between an unlink and its replacement: a reader that
|
|
99
124
|
// mistakes that gap for "no child" can start the same generation twice. The temporary file lives
|
|
100
125
|
// beside the target, uses the same exclusive/symlink-safe create, and rename publishes it atomically.
|
|
101
|
-
|
|
126
|
+
// `rename` replaces the path itself rather than following a symlink planted there, so the write still
|
|
127
|
+
// never lands somewhere else; a regular file another account owns is refused before it is replaced,
|
|
128
|
+
// the same answer the unlink gives on a sticky temp directory.
|
|
129
|
+
function replace_text_stamp(target: string, text: string): string {
|
|
130
|
+
if (is_foreign_file(target)) {
|
|
131
|
+
throw new Error(`refusing to replace another account's file: ${target}`)
|
|
132
|
+
}
|
|
133
|
+
|
|
102
134
|
const temporary = `${target}.${String(process.pid)}.${randomUUID()}`
|
|
103
135
|
|
|
104
136
|
try {
|
|
105
|
-
writeFileSync(temporary,
|
|
106
|
-
flag: STAMP_CREATE_FLAG,
|
|
107
|
-
mode: STAMP_FILE_MODE,
|
|
108
|
-
})
|
|
137
|
+
writeFileSync(temporary, text, { flag: STAMP_CREATE_FLAG, mode: STAMP_FILE_MODE })
|
|
109
138
|
renameSync(temporary, target)
|
|
110
139
|
|
|
111
140
|
return target
|
|
@@ -114,8 +143,12 @@ function replace_stamp(target: string, payload: unknown): string {
|
|
|
114
143
|
}
|
|
115
144
|
}
|
|
116
145
|
|
|
146
|
+
function replace_stamp(target: string, payload: unknown): string {
|
|
147
|
+
return replace_text_stamp(target, JSON.stringify(payload))
|
|
148
|
+
}
|
|
149
|
+
|
|
117
150
|
// The same write for a payload that is already text. `josh gate`'s log is another tool's output read
|
|
118
|
-
// by a person or by an agent's `tail
|
|
151
|
+
// by a person or by an agent's `tail`, and JSON-encoding it would put `\n`
|
|
119
152
|
// escapes between the reader and the thing they came to read. **It shares the body above rather than
|
|
120
153
|
// repeating it**: the unlink-then-create-exclusively pair is the symlink defense, and a second copy
|
|
121
154
|
// of it is the clone `CLAUDE.md` prohibits.
|
|
@@ -124,7 +157,7 @@ function write_text_stamp(target: string, text: string): string {
|
|
|
124
157
|
}
|
|
125
158
|
|
|
126
159
|
// `write_stamp` for a record whose *absence* is what the caller checked, and which two processes may
|
|
127
|
-
// therefore try to create at once
|
|
160
|
+
// therefore try to create at once. It does **not** unlink first, so `wx` is
|
|
128
161
|
// doing the job it exists for: the second writer loses and is told so, rather than both being told
|
|
129
162
|
// they won. `false` is that loss and never an error, because "someone else got here first" is an
|
|
130
163
|
// answer; anything else still throws, since a record that could not be written for another reason
|
|
@@ -145,28 +178,13 @@ function create_stamp(target: string, payload: unknown): boolean {
|
|
|
145
178
|
}
|
|
146
179
|
|
|
147
180
|
// The counterpart to `write_stamp`, for a record that means something only while it exists — the
|
|
148
|
-
// in-flight gate marker `josh gate` clears when its checks finish
|
|
181
|
+
// in-flight gate marker `josh gate` clears when its checks finish. `force`
|
|
149
182
|
// makes an absent path a success, because "there is no record" is the state the caller wanted; and
|
|
150
183
|
// `rmSync` removes a symlink rather than following it, the same reason the write unlinks first.
|
|
151
184
|
function remove_stamp(target: string): void {
|
|
152
185
|
rmSync(target, { force: true })
|
|
153
186
|
}
|
|
154
187
|
|
|
155
|
-
// The read side of the write's problem. A record is trusted to say something is still current, so a
|
|
156
|
-
// planted one suppresses the work the check exists to force. `lstatSync` reports the link rather than
|
|
157
|
-
// what it points at, and it throws where the path is simply absent — both of which are "no record".
|
|
158
|
-
// `getuid` is missing on Windows, where a shared temp directory is not the same hazard; the check
|
|
159
|
-
// reduces to "is it a regular file" there.
|
|
160
|
-
function is_own_regular_file(source: string): boolean {
|
|
161
|
-
const stats = lstatSync(source)
|
|
162
|
-
|
|
163
|
-
if (!stats.isFile()) return false
|
|
164
|
-
|
|
165
|
-
const uid = process.getuid?.()
|
|
166
|
-
|
|
167
|
-
return uid === undefined || stats.uid === uid
|
|
168
|
-
}
|
|
169
|
-
|
|
170
188
|
// `undefined` rather than a throw or an empty string: "there is no record" and "the record says
|
|
171
189
|
// nothing has to be done" are two different answers, and only the first of them is a reason to act.
|
|
172
190
|
function read_stamp_text(source: string): string | undefined {
|
|
@@ -185,6 +203,7 @@ const stamp_file = {
|
|
|
185
203
|
is_own_regular_file,
|
|
186
204
|
read_stamp_text,
|
|
187
205
|
replace_stamp,
|
|
206
|
+
replace_text_stamp,
|
|
188
207
|
remove_stamp,
|
|
189
208
|
stamp_path,
|
|
190
209
|
write_stamp,
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// What every aged record `stamp-file.ts` keeps is asked on the read: is it there, can it be read, and
|
|
2
|
+
// has its bound run out.
|
|
3
|
+
//
|
|
4
|
+
// `run-carry.ts`, `run-cut.ts` and `run-hold.ts` each carried the expiry below, and the first two the
|
|
5
|
+
// classification as well. What an unparsable or a future time means is one decision, so it is made
|
|
6
|
+
// here once; what differs between the records is their payload, their timestamp field and their bound,
|
|
7
|
+
// and that is all a `StampRecordSpec` names.
|
|
8
|
+
|
|
9
|
+
interface StampRecordSpec<T> {
|
|
10
|
+
parse: (raw: string) => T | undefined
|
|
11
|
+
timestamp_of: (record: T) => string
|
|
12
|
+
max_age_ms: number
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
type StampRecordRead<T> =
|
|
16
|
+
| { kind: 'none' }
|
|
17
|
+
| { kind: 'carried'; record: T }
|
|
18
|
+
| { kind: 'expired'; record: T }
|
|
19
|
+
| { kind: 'unreadable' }
|
|
20
|
+
|
|
21
|
+
const NONE_READ = { kind: 'none' } as const
|
|
22
|
+
const UNREADABLE_READ = { kind: 'unreadable' } as const
|
|
23
|
+
|
|
24
|
+
// **A time that is not a date is older than any bound, not current.** It passes a schema — it is a
|
|
25
|
+
// string — so reading it as current would leave a record nothing can ever expire, which is the one
|
|
26
|
+
// state a bound exists to make impossible. A time ahead of `now` (a skewed clock) has a negative age
|
|
27
|
+
// and is not older; the bound is exclusive, so a record exactly at it is still current.
|
|
28
|
+
function is_older_than(iso: string, max_age_ms: number, now: Date): boolean {
|
|
29
|
+
const at = Date.parse(iso)
|
|
30
|
+
|
|
31
|
+
if (Number.isNaN(at)) return true
|
|
32
|
+
|
|
33
|
+
return now.getTime() - at > max_age_ms
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// **A record that cannot be read is `unreadable`, never `none`.** Absent is none; present and
|
|
37
|
+
// unparseable is the state a guard must not fall open on.
|
|
38
|
+
function classify<T>(
|
|
39
|
+
raw: string | undefined,
|
|
40
|
+
spec: StampRecordSpec<T>,
|
|
41
|
+
now: Date,
|
|
42
|
+
): StampRecordRead<T> {
|
|
43
|
+
if (raw === undefined) return NONE_READ
|
|
44
|
+
|
|
45
|
+
const record = spec.parse(raw)
|
|
46
|
+
|
|
47
|
+
if (record === undefined) return UNREADABLE_READ
|
|
48
|
+
|
|
49
|
+
const is_expired = is_older_than(spec.timestamp_of(record), spec.max_age_ms, now)
|
|
50
|
+
|
|
51
|
+
return { kind: is_expired ? 'expired' : 'carried', record }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const stamp_record = { classify, is_older_than }
|
|
55
|
+
|
|
56
|
+
export { stamp_record }
|
|
57
|
+
export type { StampRecordRead, StampRecordSpec }
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import { spawnSync } from 'node:child_process'
|
|
2
2
|
import { setTimeout as sleep } from 'node:timers/promises'
|
|
3
3
|
import { parseArgs } from 'node:util'
|
|
4
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
4
5
|
import { PROBE_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
5
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
PROCESS_ALIVE,
|
|
8
|
+
PROCESS_NONE,
|
|
9
|
+
PROCESS_UNKNOWN,
|
|
10
|
+
run_liveness,
|
|
11
|
+
type ProcessTrace,
|
|
12
|
+
} from '#scripts/run/run-liveness'
|
|
6
13
|
import { lane_child_invocation } from './lane-child-invocation'
|
|
7
14
|
import { lane_handoff } from './lane-handoff'
|
|
8
15
|
|
|
9
16
|
// Detached lane children are not harness-tracked processes, so their completion fires no
|
|
10
17
|
// re-invocation event in the parent's session. Without a blocking wait the parent notices only
|
|
11
|
-
// on the next heartbeat interval -- up to 15 minutes after the fact
|
|
12
|
-
// (joshuafolkken/kit#2113).
|
|
18
|
+
// on the next heartbeat interval -- up to 15 minutes after the fact.
|
|
13
19
|
//
|
|
14
20
|
// **The re-confirm delay is the one value the caller must not be left to choose.** A process that
|
|
15
21
|
// disappears briefly and reappears (the pre-gate boundary cut, where one process exits and a
|
|
@@ -22,12 +28,12 @@ const RECONFIRM_MS = 15_000
|
|
|
22
28
|
const DEFAULT_POLL_MS = 5000
|
|
23
29
|
const NEVER_APPEARED_TIMEOUT_MS = 600_000
|
|
24
30
|
const MS_PER_SECOND = 1000
|
|
25
|
-
const ISSUE_PATTERN = /^[1-9]\d*$/u
|
|
26
31
|
const PROCESS_FOUND = 0
|
|
32
|
+
const PROCESS_NOT_FOUND = 1
|
|
27
33
|
|
|
28
34
|
// `is_settled` is read once, when the wait starts: a child that ended between two `lane:await` calls
|
|
29
35
|
// never appears in the second one, and only its settled issue tells it apart from one not yet
|
|
30
|
-
// launched
|
|
36
|
+
// launched.
|
|
31
37
|
interface AwaitState {
|
|
32
38
|
appeared: boolean
|
|
33
39
|
disappeared_at: number | undefined
|
|
@@ -52,6 +58,8 @@ interface AwaitOptions {
|
|
|
52
58
|
poll_ms?: number
|
|
53
59
|
reconfirm_ms?: number
|
|
54
60
|
never_appeared_timeout_ms?: number
|
|
61
|
+
now?: () => number
|
|
62
|
+
sleep?: (ms: number) => Promise<void>
|
|
55
63
|
}
|
|
56
64
|
|
|
57
65
|
interface CheckConfig {
|
|
@@ -63,18 +71,28 @@ interface CheckConfig {
|
|
|
63
71
|
interface RunConfig extends CheckConfig {
|
|
64
72
|
is_settled: (issue: string) => Promise<boolean>
|
|
65
73
|
poll_ms: number
|
|
74
|
+
now: () => number
|
|
75
|
+
sleep: (ms: number) => Promise<void>
|
|
66
76
|
}
|
|
67
77
|
|
|
68
|
-
|
|
78
|
+
// Three answers, not two: only pgrep's own "no match" exit is `none`. A pgrep that failed or hit its
|
|
79
|
+
// timeout never looked, and `run:liveness` answers `undetermined` for it rather than booking a live
|
|
80
|
+
// child as stopped.
|
|
81
|
+
function process_trace_default(issue: string): ProcessTrace {
|
|
69
82
|
const pattern = lane_child_invocation.process_pattern(issue)
|
|
70
83
|
const result = spawnSync('pgrep', ['-f', pattern], {
|
|
71
84
|
encoding: 'utf8',
|
|
72
85
|
timeout: PROBE_TIMEOUT_MS,
|
|
73
86
|
})
|
|
74
87
|
|
|
75
|
-
if (result.status === PROCESS_FOUND) return
|
|
88
|
+
if (result.status === PROCESS_FOUND) return PROCESS_ALIVE
|
|
89
|
+
if (lane_handoff.is_ship_running(issue, process.cwd())) return PROCESS_ALIVE
|
|
90
|
+
|
|
91
|
+
return result.status === PROCESS_NOT_FOUND ? PROCESS_NONE : PROCESS_UNKNOWN
|
|
92
|
+
}
|
|
76
93
|
|
|
77
|
-
|
|
94
|
+
function is_process_running_default(issue: string): boolean {
|
|
95
|
+
return process_trace_default(issue) === PROCESS_ALIVE
|
|
78
96
|
}
|
|
79
97
|
|
|
80
98
|
// The same positive evidence `run:liveness` answers `settled` on: the issue closed, or it was parked.
|
|
@@ -101,7 +119,10 @@ function is_valid(raw: RawAwaitArguments): boolean {
|
|
|
101
119
|
const { owner } = raw.values
|
|
102
120
|
const numbers = owner === undefined ? raw.positionals : [...raw.positionals, owner]
|
|
103
121
|
|
|
104
|
-
return
|
|
122
|
+
return (
|
|
123
|
+
raw.positionals.length > 0 &&
|
|
124
|
+
numbers.every((value) => issue_number_shape.is_issue_number(value))
|
|
125
|
+
)
|
|
105
126
|
}
|
|
106
127
|
|
|
107
128
|
// The issues to wait on and the waiting session's pid, or `undefined` for anything else.
|
|
@@ -142,6 +163,8 @@ function resolve_options(options: AwaitOptions): RunConfig {
|
|
|
142
163
|
return {
|
|
143
164
|
is_running: options.is_running ?? is_process_running_default,
|
|
144
165
|
is_settled: options.is_settled ?? is_settled_default,
|
|
166
|
+
now: options.now ?? Date.now,
|
|
167
|
+
sleep: options.sleep ?? sleep,
|
|
145
168
|
...resolve_timing(options),
|
|
146
169
|
}
|
|
147
170
|
}
|
|
@@ -225,12 +248,12 @@ async function wait_for_any(
|
|
|
225
248
|
const states = await make_states(issues, config.is_settled)
|
|
226
249
|
|
|
227
250
|
for (;;) {
|
|
228
|
-
const completed = check_any(states,
|
|
251
|
+
const completed = check_any(states, config.now(), config)
|
|
229
252
|
|
|
230
253
|
if (completed !== undefined) return completed
|
|
231
254
|
|
|
232
255
|
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
233
|
-
await sleep(config.poll_ms)
|
|
256
|
+
await config.sleep(config.poll_ms)
|
|
234
257
|
}
|
|
235
258
|
}
|
|
236
259
|
|
|
@@ -240,6 +263,7 @@ const lane_await = {
|
|
|
240
263
|
check_issue,
|
|
241
264
|
is_process_running_default,
|
|
242
265
|
parse_arguments,
|
|
266
|
+
process_trace_default,
|
|
243
267
|
wait_for_any,
|
|
244
268
|
}
|
|
245
269
|
|
|
@@ -8,15 +8,15 @@ import {
|
|
|
8
8
|
type GateCacheSpec,
|
|
9
9
|
} from '#scripts/josh/josh-command-types'
|
|
10
10
|
|
|
11
|
-
// Warming a fresh lane's verification caches from the main checkout
|
|
11
|
+
// Warming a fresh lane's verification caches from the main checkout.
|
|
12
12
|
//
|
|
13
13
|
// `git worktree add` writes a checkout and nothing beside it, and the three caches the gate reads —
|
|
14
14
|
// `.eslintcache`, `.tsbuildinfo`, `.cspellcache` — are all git-ignored, so a new lane has none of
|
|
15
|
-
// them and only its *first* `josh gate` runs fully cold (
|
|
16
|
-
//
|
|
17
|
-
//
|
|
15
|
+
// them and only its *first* `josh gate` runs fully cold (several minutes against well under a minute
|
|
16
|
+
// warm). The initial seed warms that run; the per-tool sync below keeps the portable ESLint and
|
|
17
|
+
// CSpell caches current afterwards.
|
|
18
18
|
//
|
|
19
|
-
// Content hashes make stale entries safe, but do not by themselves make a cache portable
|
|
19
|
+
// Content hashes make stale entries safe, but do not by themselves make a cache portable.
|
|
20
20
|
// ESLint keys entries by absolute file path, so its JSON is rebased while cspell's relative keys and
|
|
21
21
|
// TypeScript's build info move raw. The spec in `josh-command-types.ts` is the one declaration of
|
|
22
22
|
// which treatment and which continuous sharing each gate cache receives.
|
|
@@ -103,7 +103,7 @@ function seed_caches(source_root: string, destination: string): void {
|
|
|
103
103
|
/**
|
|
104
104
|
* Copy the pre-built hook bundles (`dist/hooks/`) from `source_root` into `destination`, so a fresh
|
|
105
105
|
* lane's child runs each Claude Code hook off `node dist/hooks/<name>.js` rather than the slower
|
|
106
|
-
* `pnpm josh …` fallback
|
|
106
|
+
* `pnpm josh …` fallback. The bundles are git-ignored, so a lane's work tree
|
|
107
107
|
* never carries them and every hook falls back without this seed.
|
|
108
108
|
*
|
|
109
109
|
* Best-effort, exactly like `seed_caches`: a source with no bundles (a checkout that never ran
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
+
import { lane_limit_override } from './lane-limit-override'
|
|
1
2
|
import type { LaneEnvironment } from './lane-paths'
|
|
2
3
|
import { lane_seed_policy } from './lane-seed'
|
|
3
4
|
|
|
4
|
-
// How many lanes one repository may run at once, and how many of them are free
|
|
5
|
-
// (joshuafolkken/kit#1491).
|
|
5
|
+
// How many lanes one repository may run at once, and how many of them are free.
|
|
6
6
|
//
|
|
7
7
|
// **Nothing here knows what a lane holds.** The limit is a number, the occupancy is a number, and
|
|
8
8
|
// the answer is a number — so the same pool serves an epic's children, several epics' children at
|
|
9
9
|
// once, or anything else a scheduler decides to put in a lane. Threading an epic through this module
|
|
10
|
-
// is what would have to be undone the first time two epics run together,
|
|
11
|
-
//
|
|
10
|
+
// is what would have to be undone the first time two epics run together, which is why the scheduler
|
|
11
|
+
// is epic-free.
|
|
12
12
|
//
|
|
13
13
|
// **It is a ceiling, not a prediction.** Six lanes does not say six children will run at once; it
|
|
14
14
|
// says a seventh will not start. What actually runs is bounded by what is runnable, by the port
|
|
@@ -33,40 +33,55 @@ type LimitChoice = { kind: 'limit'; limit: number } | { kind: 'problem'; problem
|
|
|
33
33
|
//
|
|
34
34
|
// Blank is unset, not invalid: an `.env` line left as `JOSH_LANE_LIMIT=` is a variable nobody
|
|
35
35
|
// configured, exactly as `lane_paths.lane_root` reads a blank root.
|
|
36
|
-
|
|
36
|
+
//
|
|
37
|
+
// `name` is what the problem names: `josh lane:limit` reads its argument by the same rule.
|
|
38
|
+
function read_limit(raw: string | undefined, name: string): LimitChoice {
|
|
37
39
|
const trimmed = raw?.trim() ?? ''
|
|
38
40
|
|
|
39
41
|
if (trimmed === '') return { kind: 'limit', limit: DEFAULT_LANE_LIMIT }
|
|
40
42
|
|
|
41
43
|
if (!POSITIVE_INTEGER.test(trimmed)) {
|
|
42
|
-
return {
|
|
43
|
-
kind: 'problem',
|
|
44
|
-
problem: `${LANE_LIMIT_KEY} must be a positive integer, not "${trimmed}"`,
|
|
45
|
-
}
|
|
44
|
+
return { kind: 'problem', problem: `${name} must be a positive integer, not "${trimmed}"` }
|
|
46
45
|
}
|
|
47
46
|
|
|
48
47
|
return { kind: 'limit', limit: Number(trimmed) }
|
|
49
48
|
}
|
|
50
49
|
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
// **A live run's `lane:limit` override outranks the environment**: a running
|
|
51
|
+
// parent keeps the environment it started with, so the override is the only way its limit moves. This
|
|
52
|
+
// stays the one place the limit is read; the override reader is injected so a test reads none.
|
|
53
|
+
async function lane_limit(
|
|
54
|
+
environment: LaneEnvironment = process.env,
|
|
55
|
+
read_override: () => Promise<number | undefined> = lane_limit_override.read_override,
|
|
56
|
+
): Promise<LimitChoice> {
|
|
57
|
+
const override = await read_override()
|
|
58
|
+
|
|
59
|
+
if (override !== undefined) return { kind: 'limit', limit: override }
|
|
60
|
+
|
|
61
|
+
return read_limit(environment[LANE_LIMIT_KEY], LANE_LIMIT_KEY)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// **A limit above the seat count is capped at the seats**. `lane:open` refuses
|
|
65
|
+
// a tenth lane however high the limit is set, so a limit past the seats offers launches bound to be
|
|
66
|
+
// refused.
|
|
67
|
+
function seated_limit(limit: number): number {
|
|
68
|
+
return Math.min(limit, lane_seed_policy.LAST_LANE_SEAT)
|
|
53
69
|
}
|
|
54
70
|
|
|
55
71
|
// Never negative: a repository holding more `in-progress` issues than the limit allows — the limit
|
|
56
72
|
// was lowered, or a stale label outlived its run — has no free lane, and a negative count read as
|
|
57
73
|
// "how many to offer" would be a slice nobody meant.
|
|
58
|
-
//
|
|
59
|
-
// **A limit above the seat count is capped at the seats** (joshuafolkken/kit#3027). `lane:open` refuses
|
|
60
|
-
// a tenth lane however high `JOSH_LANE_LIMIT` is set, so counting free lanes past the seats offers a
|
|
61
|
-
// launch that is bound to be refused.
|
|
62
74
|
function free_lanes(limit: number, occupied: number): number {
|
|
63
|
-
return Math.max(NO_LANES,
|
|
75
|
+
return Math.max(NO_LANES, seated_limit(limit) - occupied)
|
|
64
76
|
}
|
|
65
77
|
|
|
66
78
|
const lane_capacity = {
|
|
67
79
|
LANE_LIMIT_KEY,
|
|
68
|
-
lane_limit,
|
|
69
80
|
free_lanes,
|
|
81
|
+
lane_limit,
|
|
82
|
+
read_limit,
|
|
83
|
+
seated_limit,
|
|
70
84
|
}
|
|
71
85
|
|
|
86
|
+
export type { LimitChoice }
|
|
72
87
|
export { lane_capacity }
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
2
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
2
3
|
import { run_ship_next, type ShipResume } from '#scripts/run/ship/run-ship-next'
|
|
3
4
|
import type { Stage } from '#scripts/run/ship/run-ship-stage'
|
|
4
5
|
|
|
@@ -8,7 +9,7 @@ interface ShipStop extends ShipResume {
|
|
|
8
9
|
|
|
9
10
|
const CHILD_INVOCATION = 'fullrun'
|
|
10
11
|
const RESUME_GUIDE = '.claude/skills/workflow-commands/pre-gate-cut.md'
|
|
11
|
-
// What a detached `josh ship --detach` supervisor's command line carries
|
|
12
|
+
// What a detached `josh ship --detach` supervisor's command line carries. It ends
|
|
12
13
|
// with the `"<title> #<N>"` title on purpose, so the liveness pattern below finds it by the same trailing
|
|
13
14
|
// anchor it finds a child by. **The script path alone is not enough**: where the dispatcher is TypeScript
|
|
14
15
|
// (kit itself) `josh ship` runs in-process, so no process ever carries `run-ship-cli.ts` — the `pnpm josh
|
|
@@ -16,57 +17,58 @@ const RESUME_GUIDE = '.claude/skills/workflow-commands/pre-gate-cut.md'
|
|
|
16
17
|
const SHIP_PROCESS = String.raw`(josh(\.[jt]s)? ship|run-ship-cli\.ts)`
|
|
17
18
|
|
|
18
19
|
function child_invocation(issue: string): string {
|
|
19
|
-
|
|
20
|
+
issue_number_shape.require_issue_number(issue)
|
|
20
21
|
|
|
21
|
-
return `${CHILD_INVOCATION}
|
|
22
|
+
return `${CHILD_INVOCATION} ${issue_cite.plain(issue)}`
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
// The `pgrep -f` pattern that finds a running child: the invocation is always the last argument of
|
|
25
26
|
// its command line — the resume prompts below end with it on purpose — so the anchor matches every
|
|
26
|
-
// launch of `#<N>` and never `#<N>0
|
|
27
|
+
// launch of `#<N>` and never `#<N>0`.
|
|
27
28
|
//
|
|
28
|
-
// **A detached ship supervisor counts as the child
|
|
29
|
+
// **A detached ship supervisor counts as the child**. The agent ends once it has
|
|
29
30
|
// handed the post-implementation region to `josh ship --detach`, and the parent books a lane whose
|
|
30
31
|
// pattern stopped matching as finished — parking an issue that was still shipping. The supervisor's
|
|
31
32
|
// command line ends with its `#<N>` title, so the one extended pattern covers both, and the wait, the
|
|
32
33
|
// liveness read and the reaper keep searching with a single pattern.
|
|
33
34
|
function process_pattern(issue: string): string {
|
|
34
|
-
|
|
35
|
+
issue_number_shape.require_issue_number(issue)
|
|
35
36
|
|
|
36
|
-
return `(${CHILD_INVOCATION}|${SHIP_PROCESS} .*)
|
|
37
|
+
return `(${CHILD_INVOCATION}|${SHIP_PROCESS} .*) ${issue_cite.plain(issue)}$`
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
function resume_invocation(issue: string): string {
|
|
40
|
-
const preamble = `Resuming the lane child for issue
|
|
41
|
+
const preamble = `Resuming the lane child for issue ${issue_cite.plain(issue)} — do not re-read the workflow-commands entry documents (SKILL.md, fullrun.md). Run \`pnpm josh run:cut --resume ${issue}\` before anything else and follow the matching verdict in ${RESUME_GUIDE}: \`resume\` goes to the gate, \`resume-impl\` continues implementation. Only on \`fresh\` proceed as an ordinary`
|
|
41
42
|
|
|
42
43
|
return `${preamble} ${child_invocation(issue)}`
|
|
43
44
|
}
|
|
44
45
|
|
|
45
|
-
// The prompt an `outage` re-dispatch gives a resumed child
|
|
46
|
+
// The prompt an `outage` re-dispatch gives a resumed child. Its session was
|
|
46
47
|
// relaunched with `--resume`, so its full context is already loaded — the preamble tells it not to
|
|
47
48
|
// re-read the entry documents and to find where it stopped with `run:step`, redoing only the last
|
|
48
49
|
// action if it did not complete.
|
|
49
50
|
//
|
|
50
51
|
// **It ends with `child_invocation` on purpose, not as decoration** — for the same reason
|
|
51
|
-
// `resume_invocation` does: the parent's liveness
|
|
52
|
+
// `resume_invocation` does: the parent's liveness read (`run:liveness`, `lane:await`) matches
|
|
53
|
+
// `process_pattern` against the command line, so the trailing
|
|
52
54
|
// `fullrun #<N>` keeps the relaunched process matching, and it is the ordinary run the child carries on.
|
|
53
55
|
function outage_resume_invocation(issue: string): string {
|
|
54
|
-
const preamble = `Resuming the lane child for issue
|
|
56
|
+
const preamble = `Resuming the lane child for issue ${issue_cite.plain(issue)} after an API disconnection — your session was restored with its full context, so do not re-read the workflow-commands entry documents (SKILL.md, fullrun.md). Continue the run from where it stopped: run \`pnpm josh run:step ${issue}\` to find the next action, redoing only the last step if it did not complete.`
|
|
55
57
|
|
|
56
58
|
return `${preamble} ${child_invocation(issue)}`
|
|
57
59
|
}
|
|
58
60
|
|
|
59
61
|
// The prompt a lane child is relaunched with when its detached ship supervisor stopped at a failed
|
|
60
|
-
// stage
|
|
62
|
+
// stage — a red gate, a High/Medium review, a failed push or red CI. The agent
|
|
61
63
|
// ended at the hand-off, so this is how control comes back to one: it reads the stopped report, fixes it
|
|
62
64
|
// and hands the region back. It ends with `child_invocation` for the reason `resume_invocation` does —
|
|
63
65
|
// the parent's poll keeps matching the relaunched process.
|
|
64
66
|
//
|
|
65
|
-
// **A known stage puts the next command in the prompt
|
|
67
|
+
// **A known stage puts the next command in the prompt**, so the relaunched
|
|
66
68
|
// session runs it rather than re-deriving it from `chain-rule.md`. An OpenAI lane's supervisor sees only
|
|
67
69
|
// that the ship failed, not where, so without a stage the prompt points at `run:step` as before.
|
|
68
70
|
function ship_stop_invocation(issue: string, stop?: ShipStop): string {
|
|
69
|
-
const opening = `Resuming the lane child for issue
|
|
71
|
+
const opening = `Resuming the lane child for issue ${issue_cite.plain(issue)} after its detached ship supervisor stopped at a failed stage — do not re-read the workflow-commands entry documents (SKILL.md, fullrun.md).`
|
|
70
72
|
const next =
|
|
71
73
|
stop === undefined
|
|
72
74
|
? `Run \`pnpm josh run:step ${issue}\` and read the stopped report it names, fix what stopped the ship, then hand the region back per chain-rule.md.`
|