@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,5 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
4
|
+
import { run_cli_fault } from '#scripts/run/run-cli-fault'
|
|
3
5
|
import { run_halfrun_resume } from '#scripts/run/run-halfrun-resume'
|
|
4
6
|
import { run_label } from '#scripts/run/run-label'
|
|
5
7
|
import { run_preflight, type PreflightDecision } from '#scripts/run/run-preflight'
|
|
@@ -8,32 +10,28 @@ import { run_tidy_cli } from '#scripts/run/tidy/run-tidy-cli'
|
|
|
8
10
|
import { run_hold, type HoldRead, type RunHold } from './run-hold'
|
|
9
11
|
|
|
10
12
|
// `josh run:hold [<N>]` and `josh run:release [<N> | --force]` — the working-tree guard the typed
|
|
11
|
-
// entry points ask before they start
|
|
13
|
+
// entry points ask before they start.
|
|
12
14
|
//
|
|
13
|
-
// **A numbered claim asks the preflight question first
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
// written, and the read-only check stays re-askable — clean up what it named, ask `run:hold` again.
|
|
18
|
-
// The decision logic itself lives on in `run-preflight.ts` for `run:progress` to reuse; only its CLI
|
|
19
|
-
// went away.
|
|
15
|
+
// **A numbered claim asks the preflight question first**: the claim runs the check itself and hands
|
|
16
|
+
// back a hold only on a `clean` tree. A `reclaim` / `resume` / `park` tree is returned as that verdict
|
|
17
|
+
// without a record being written, and the read-only check stays re-askable — clean up what it named,
|
|
18
|
+
// ask `run:hold` again. The decision logic lives in `run-preflight.ts` for `run:progress` to reuse.
|
|
20
19
|
//
|
|
21
|
-
// **A release names the run it belongs to, exactly as the claim did
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
// live run's tree: the incident of 2026-08-30, reached through the guard meant to prevent it.
|
|
20
|
+
// **A release names the run it belongs to, exactly as the claim did.** The `busy` stop message tells
|
|
21
|
+
// a person to release when they judge a record stale — a judgement made from outside the run that
|
|
22
|
+
// wrote it — so an unowned release would make the guard's own recovery instruction a way to free a
|
|
23
|
+
// live run's tree.
|
|
26
24
|
//
|
|
27
25
|
// **It answers, so the entry point does not judge.** "This one is a small change, it will be fine" is
|
|
28
|
-
//
|
|
29
|
-
//
|
|
26
|
+
// a judgement made under time pressure, and it is the same shape `delegation-policy.ts` refuses to
|
|
27
|
+
// leave to an agent. A token on standard output is what the entry
|
|
30
28
|
// point obeys.
|
|
31
29
|
//
|
|
32
30
|
// The contract is `epic:next`'s: **standard output carries exactly one token** — `hold`, `busy` or
|
|
33
31
|
// `unknown` — and every explanation goes to standard error, so `answer=$(pnpm josh run:hold 1091)`
|
|
34
32
|
// captures something a loop can branch on.
|
|
35
33
|
//
|
|
36
|
-
// **A successful claim then sweeps merged residue** — `run:tidy
|
|
34
|
+
// **A successful claim then sweeps merged residue** — `run:tidy`. After the
|
|
37
35
|
// claim rather than before it: the sweep may append to the primary checkout's observation ledger, and
|
|
38
36
|
// doing that ahead of the preflight would turn a clean primary checkout into a `reclaim`.
|
|
39
37
|
|
|
@@ -41,23 +39,23 @@ const SUCCESS_EXIT_CODE = 0
|
|
|
41
39
|
const FAILURE_EXIT_CODE = 1
|
|
42
40
|
const ARGV_OFFSET = 2
|
|
43
41
|
const RELEASE_FLAG = '--release'
|
|
44
|
-
// What removes a record this run did not write. **
|
|
45
|
-
//
|
|
46
|
-
//
|
|
47
|
-
// typing the ordinary command.
|
|
42
|
+
// What removes a record this run did not write. **Deliberate friction**: every release names the run
|
|
43
|
+
// it belongs to, and the one act that cannot — clearing a record somebody else left behind — is
|
|
44
|
+
// spelled out rather than reached by typing the ordinary command.
|
|
48
45
|
const FORCE_FLAG = '--force'
|
|
49
46
|
// What `fullrun #N`'s entry claims with, so the record says the run is a `fullrun` — the one run whose
|
|
50
|
-
// implementation cut outside a lane resumes as `fullrun #N
|
|
47
|
+
// implementation cut outside a lane resumes as `fullrun #N`.
|
|
51
48
|
const FULLRUN_FLAG = '--fullrun'
|
|
52
49
|
const HALFRUN_STOP_FLAG = '--halfrun-stop'
|
|
53
|
-
// A `prrun`'s stop before merge
|
|
50
|
+
// A `prrun`'s stop before merge: its record keeps the commit it stopped on.
|
|
54
51
|
const PRRUN_STOP_FLAG = '--prrun-stop'
|
|
55
52
|
// The most a claim reads: the issue number and the one flag after it.
|
|
56
53
|
const MAX_CLAIM_ARGUMENTS = 2
|
|
57
|
-
const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
58
54
|
const USAGE =
|
|
59
55
|
'Usage: josh run:hold [<issue-number> [--fullrun | --halfrun-stop | --prrun-stop]] | josh run:release [<issue-number> | --force]'
|
|
60
56
|
|
|
57
|
+
const COMMAND = 'run:hold'
|
|
58
|
+
|
|
61
59
|
const HOLD_VERDICT = 'hold'
|
|
62
60
|
const BUSY_VERDICT = 'busy'
|
|
63
61
|
const UNKNOWN_VERDICT = 'unknown'
|
|
@@ -121,7 +119,9 @@ function parse_claim(argv: ReadonlyArray<string>): HoldRequest | undefined {
|
|
|
121
119
|
|
|
122
120
|
if (first === undefined) return { kind: 'claim', issue: run_hold.UNNUMBERED_ISSUE }
|
|
123
121
|
|
|
124
|
-
if (argv.length > MAX_CLAIM_ARGUMENTS || !ISSUE_NUMBER_PATTERN.test(first))
|
|
122
|
+
if (argv.length > MAX_CLAIM_ARGUMENTS || !issue_number_shape.ISSUE_NUMBER_PATTERN.test(first)) {
|
|
123
|
+
return undefined
|
|
124
|
+
}
|
|
125
125
|
|
|
126
126
|
return numbered_claim(first, flag)
|
|
127
127
|
}
|
|
@@ -129,7 +129,7 @@ function parse_claim(argv: ReadonlyArray<string>): HoldRequest | undefined {
|
|
|
129
129
|
function parse_release_argument(first: string): HoldRequest | undefined {
|
|
130
130
|
if (first === FORCE_FLAG) return FORCE_RELEASE_REQUEST
|
|
131
131
|
|
|
132
|
-
return ISSUE_NUMBER_PATTERN.test(first) ? release_request(first) : undefined
|
|
132
|
+
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(first) ? release_request(first) : undefined
|
|
133
133
|
}
|
|
134
134
|
|
|
135
135
|
// **A bare `run:release` is the unnumbered run's release, not a release of whatever is there.** It
|
|
@@ -171,8 +171,13 @@ function report_hold(): number {
|
|
|
171
171
|
// that wrote it is the one whose uncommitted work would be trampled, so a record that cannot be
|
|
172
172
|
// parsed is never read as an idle tree. **And an expired record still stops it while the tree is
|
|
173
173
|
// dirty** — that is a run which stopped for a person, and the work is right there in the tree.
|
|
174
|
-
|
|
175
|
-
|
|
174
|
+
// **A live record stops every claim but its own run's.**
|
|
175
|
+
function held_block(hold: RunHold, issue: string): string | undefined {
|
|
176
|
+
return run_hold.is_reentry(hold, issue) ? undefined : run_hold.held_message(hold)
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
async function blocking_message(read: HoldRead, issue: string): Promise<string | undefined> {
|
|
180
|
+
if (read.kind === 'held') return held_block(read.hold, issue)
|
|
176
181
|
|
|
177
182
|
if (read.kind === 'unreadable') return run_hold.unreadable_message()
|
|
178
183
|
|
|
@@ -193,7 +198,7 @@ function take_free_tree(target: string, request: ClaimRequest): number {
|
|
|
193
198
|
|
|
194
199
|
// **The stale path takes the tree the same exclusive way the free path does.** Replacing an expired
|
|
195
200
|
// record with a plain write would tell two sessions that both found it expired that they both won —
|
|
196
|
-
// the race the free path
|
|
201
|
+
// the race the free path guards against. Removing it first is what
|
|
197
202
|
// turns the expired record into a free tree; the create is what decides between the two claimants.
|
|
198
203
|
function replace_stale(target: string, request: ClaimRequest, hold: RunHold): number {
|
|
199
204
|
console.error(run_hold.stale_message(hold))
|
|
@@ -202,9 +207,19 @@ function replace_stale(target: string, request: ClaimRequest, hold: RunHold): nu
|
|
|
202
207
|
return take_free_tree(target, request)
|
|
203
208
|
}
|
|
204
209
|
|
|
210
|
+
// The claim on a tree nothing blocks. A `held` record that got this far is the run's own, so it is
|
|
211
|
+
// kept as written — its stop marks included — and answered `hold`.
|
|
212
|
+
function take_tree(target: string, request: ClaimRequest, read: HoldRead): number {
|
|
213
|
+
if (read.kind === 'held') return report_hold()
|
|
214
|
+
|
|
215
|
+
return read.kind === 'stale'
|
|
216
|
+
? replace_stale(target, request, read.hold)
|
|
217
|
+
: take_free_tree(target, request)
|
|
218
|
+
}
|
|
219
|
+
|
|
205
220
|
// A non-clean preflight verdict is not an error: it is an answer a loop branches on, exactly as
|
|
206
221
|
// `busy` is, so it prints the reason and advice the check composed and exits zero. Only an unreadable
|
|
207
|
-
// tree is `unknown`, and that reaches `report_unknown` through `
|
|
222
|
+
// tree is `unknown`, and that reaches `report_unknown` through `answer`'s directory read.
|
|
208
223
|
function report_preflight(decision: PreflightDecision): number {
|
|
209
224
|
console.error(`${decision.reason}\n${decision.advice}`)
|
|
210
225
|
console.info(decision.verdict)
|
|
@@ -232,14 +247,11 @@ async function claim(target: string, request: ClaimRequest, is_linked: boolean):
|
|
|
232
247
|
if (gate !== undefined) return gate
|
|
233
248
|
|
|
234
249
|
const read = run_hold.read_hold(target)
|
|
235
|
-
const blocked = await blocking_message(read)
|
|
250
|
+
const blocked = await blocking_message(read, request.issue)
|
|
236
251
|
|
|
237
252
|
if (blocked !== undefined) return report_busy(blocked)
|
|
238
253
|
|
|
239
|
-
const code =
|
|
240
|
-
read.kind === 'stale'
|
|
241
|
-
? replace_stale(target, request, read.hold)
|
|
242
|
-
: take_free_tree(target, request)
|
|
254
|
+
const code = take_tree(target, request, read)
|
|
243
255
|
|
|
244
256
|
if (code === SUCCESS_EXIT_CODE) await run_tidy_cli.sweep()
|
|
245
257
|
|
|
@@ -257,30 +269,28 @@ function report_held(hold: RunHold): number {
|
|
|
257
269
|
return report(run_hold.foreign_release_message(hold), HELD_VERDICT, FAILURE_EXIT_CODE)
|
|
258
270
|
}
|
|
259
271
|
|
|
260
|
-
// A record nothing can parse names no run, so no claimant can match it — and removing it
|
|
261
|
-
//
|
|
272
|
+
// A record nothing can parse names no run, so no claimant can match it — and removing it, or marking
|
|
273
|
+
// a stop on it, is what these paths refuse. It answers `unknown` for the reason every other
|
|
262
274
|
// unreadable state here does: nothing was established, so nothing may be concluded.
|
|
263
|
-
function
|
|
275
|
+
function report_unreadable_record(): number {
|
|
264
276
|
return report(run_hold.unreadable_message(), UNKNOWN_VERDICT, FAILURE_EXIT_CODE)
|
|
265
277
|
}
|
|
266
278
|
|
|
267
|
-
// **A release removes the record only where the record names the run asking
|
|
268
|
-
//
|
|
269
|
-
// a record they had judged stale from outside the run that wrote it — so the guard's own recovery
|
|
270
|
-
// instruction was a way to free a live run's tree, which is the incident it was written after.
|
|
279
|
+
// **A release removes the record only where the record names the run asking**, so the `busy` stop
|
|
280
|
+
// message's recovery instruction cannot free a live run's tree.
|
|
271
281
|
function release_record(target: string, claimant: string): number {
|
|
272
282
|
const read = run_hold.read_hold(target)
|
|
273
283
|
|
|
274
284
|
if (read.kind === 'free') return remove_record(target, false)
|
|
275
285
|
|
|
276
|
-
if (read.kind === 'unreadable') return
|
|
286
|
+
if (read.kind === 'unreadable') return report_unreadable_record()
|
|
277
287
|
|
|
278
288
|
if (!run_hold.is_own_hold(read.hold, claimant)) return report_held(read.hold)
|
|
279
289
|
|
|
280
290
|
return remove_record(target, true)
|
|
281
291
|
}
|
|
282
292
|
|
|
283
|
-
// **A numbered run's own release takes its `in-progress` marker back off
|
|
293
|
+
// **A numbered run's own release takes its `in-progress` marker back off**,
|
|
284
294
|
// whether or not a record was still there — the stop that releases is the run ending its hold on the
|
|
285
295
|
// issue. A refused release (another run's record, an unreadable one) touches no label, and an
|
|
286
296
|
// unnumbered run names no issue to touch.
|
|
@@ -318,17 +328,9 @@ function report_usage(): number {
|
|
|
318
328
|
return FAILURE_EXIT_CODE
|
|
319
329
|
}
|
|
320
330
|
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
} catch {
|
|
325
|
-
return undefined
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
// **A `halfrun` stop marks its own record** (joshuafolkken/kit#2796) — the positive "this run has ended
|
|
330
|
-
// over its verified diff" that `run:entry` adopts on `fullrun #N`. Another run's record is left alone.
|
|
331
|
-
// A `prrun` stop marks its record the same way, with the commit it stopped on (joshuafolkken/kit#3023).
|
|
331
|
+
// **A `halfrun` stop marks its own record** — the positive "this run has ended over its verified diff"
|
|
332
|
+
// that `run:entry` adopts on `fullrun #N`. Another run's record is left alone. A `prrun` stop marks
|
|
333
|
+
// its record the same way, with the commit it stopped on.
|
|
332
334
|
async function mark_stop(target: string, request: StopRequest): Promise<number> {
|
|
333
335
|
const mark =
|
|
334
336
|
request.kind === PRRUN_STOP_KIND
|
|
@@ -337,7 +339,7 @@ async function mark_stop(target: string, request: StopRequest): Promise<number>
|
|
|
337
339
|
|
|
338
340
|
if (mark === run_halfrun_resume.MARKED) return report_hold()
|
|
339
341
|
|
|
340
|
-
if (mark === run_halfrun_resume.UNREADABLE) return
|
|
342
|
+
if (mark === run_halfrun_resume.UNREADABLE) return report_unreadable_record()
|
|
341
343
|
|
|
342
344
|
return report_busy(run_hold.race_message(run_hold.read_hold(target), target))
|
|
343
345
|
}
|
|
@@ -353,7 +355,7 @@ async function dispatch(request: HoldRequest, target: string, is_linked: boolean
|
|
|
353
355
|
}
|
|
354
356
|
|
|
355
357
|
async function answer(request: HoldRequest): Promise<number> {
|
|
356
|
-
const directory = await
|
|
358
|
+
const directory = await run_cli_fault.directory_of(COMMAND, run_hold.worktree_directory)
|
|
357
359
|
|
|
358
360
|
if (directory === undefined) return report_unknown()
|
|
359
361
|
|
|
@@ -362,10 +364,11 @@ async function answer(request: HoldRequest): Promise<number> {
|
|
|
362
364
|
return await dispatch(request, run_hold.hold_path(directory), is_linked)
|
|
363
365
|
}
|
|
364
366
|
|
|
365
|
-
// **Every path out of here prints exactly one token**, including the ones nobody planned
|
|
366
|
-
// error on the record, or a git binary that is not there
|
|
367
|
-
//
|
|
368
|
-
//
|
|
367
|
+
// **Every path out of here prints exactly one token**, including the ones nobody planned — a
|
|
368
|
+
// permission error on the record, or a git binary that is not there: an empty `$answer` matches none
|
|
369
|
+
// of the three tokens, which an entry point would read as "not busy" and walk straight past the guard.
|
|
370
|
+
// The token stays `unknown`, and the failure says what it was rather than borrowing the
|
|
371
|
+
// unreadable-git-directory message.
|
|
369
372
|
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
370
373
|
const request = parse_request(argv)
|
|
371
374
|
|
|
@@ -373,8 +376,8 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
373
376
|
|
|
374
377
|
try {
|
|
375
378
|
return await answer(request)
|
|
376
|
-
} catch {
|
|
377
|
-
return
|
|
379
|
+
} catch (error) {
|
|
380
|
+
return report(run_cli_fault.message(COMMAND, error), UNKNOWN_VERDICT, FAILURE_EXIT_CODE)
|
|
378
381
|
}
|
|
379
382
|
}
|
|
380
383
|
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import { git_command } from '#scripts/git/git-command'
|
|
2
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
3
|
+
import { agent_session_environment } from '#scripts/josh/agent-session-environment'
|
|
4
|
+
import { process_identity } from '#scripts/josh/process-identity'
|
|
2
5
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
6
|
+
import { stamp_record } from '#scripts/josh/stamp-record'
|
|
3
7
|
import { error_text } from '#scripts/lib/error-message'
|
|
8
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
4
9
|
import { z } from 'zod'
|
|
5
10
|
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
// onto the first one's branch.
|
|
11
|
+
// One run at a time per working tree. The entry points a person types — `fullrun`, `halfrun`,
|
|
12
|
+
// `kickoff` — never reach `epic-busy.ts`'s guard, because they do not go through `epic:next`, so
|
|
13
|
+
// without this two sessions could implement two issues in one checkout and commit onto each other's
|
|
14
|
+
// branch.
|
|
11
15
|
//
|
|
12
16
|
// **The unit is the working tree, not the repository.** What these entries contend for is one branch,
|
|
13
17
|
// one index and one uncommitted diff; a linked work tree has its own three, so a second run there is
|
|
@@ -30,11 +34,9 @@ const MILLISECONDS_PER_HOUR = 3_600_000
|
|
|
30
34
|
const HOLD_MAX_AGE_MS = HOLD_MAX_AGE_HOURS * MILLISECONDS_PER_HOUR
|
|
31
35
|
|
|
32
36
|
const RELEASE_COMMAND = 'pnpm josh run:release'
|
|
33
|
-
// The spelling that removes a record this run did not write
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
// run's record just as readily, which is the incident this guard was written after, reached through
|
|
37
|
-
// the guard's own recovery instruction.
|
|
37
|
+
// The spelling that removes a record this run did not write. **It is a separate spelling rather than
|
|
38
|
+
// the same one** because a stop message has to name something a person can type when a record really
|
|
39
|
+
// has been abandoned, without the plain release removing a *live* run's record just as readily.
|
|
38
40
|
const FORCE_RELEASE_COMMAND = `${RELEASE_COMMAND} --force`
|
|
39
41
|
// The sentence `epic-busy.ts` prints for the same reason: a guard that cannot read its record has not
|
|
40
42
|
// established that the tree is free, and reporting it as free is the one failure that matters here.
|
|
@@ -44,19 +46,25 @@ interface RunHold {
|
|
|
44
46
|
issue: string
|
|
45
47
|
taken_at: string
|
|
46
48
|
pid: number
|
|
47
|
-
// Set only by `fullrun #N`'s entry (`run:entry` claims with `--fullrun
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
-
//
|
|
49
|
+
// Set only by `fullrun #N`'s entry (`run:entry` claims with `--fullrun`). The implementation cut
|
|
50
|
+
// outside a lane resumes as `fullrun #N`, so a `halfrun` or an in-session `backlogrun` child — which
|
|
51
|
+
// hold the tree just the same — must not be read as one. Optional and `| undefined` because a record
|
|
52
|
+
// without this field is simply not a `fullrun`'s.
|
|
51
53
|
is_fullrun?: boolean | undefined
|
|
52
|
-
// Set only at a `halfrun`'s stop before commit (`run:hold <N> --halfrun-stop
|
|
53
|
-
//
|
|
54
|
-
//
|
|
54
|
+
// Set only at a `halfrun`'s stop before commit (`run:hold <N> --halfrun-stop`): the positive record
|
|
55
|
+
// that the run has *ended* over its verified diff, which is what lets `fullrun #N` adopt the hold. A
|
|
56
|
+
// running `halfrun` or a `backlogrun` child never carries it.
|
|
55
57
|
is_halfrun_stop?: boolean | undefined
|
|
56
|
-
// Set only at a `prrun`'s stop before merge (`run:hold <N> --prrun-stop
|
|
57
|
-
//
|
|
58
|
-
//
|
|
58
|
+
// Set only at a `prrun`'s stop before merge (`run:hold <N> --prrun-stop`): the commit the green pull
|
|
59
|
+
// request stood on, so `fullrun #N` can tell an untouched branch — merge it — from one that moved
|
|
60
|
+
// since and has to pass the gate and the review again.
|
|
59
61
|
prrun_stop_head?: string | undefined
|
|
62
|
+
// The agent session the claim ran under — `pid` is the short-lived `josh run:hold` itself, gone
|
|
63
|
+
// before anything reads it back, so it can never say whether the run is still there. The pair with
|
|
64
|
+
// its start time is the identity `process-identity.ts` defines. Optional for a record without these
|
|
65
|
+
// fields, or by a claim made outside an agent session.
|
|
66
|
+
owner_pid?: number | undefined
|
|
67
|
+
owner_start?: string | undefined
|
|
60
68
|
}
|
|
61
69
|
|
|
62
70
|
type HoldRead =
|
|
@@ -83,8 +91,7 @@ async function worktree_directory(): Promise<string | undefined> {
|
|
|
83
91
|
// A linked work tree — a lane — reports its own git directory as the first path and the common
|
|
84
92
|
// directory every work tree of the repository shares as the second; the primary checkout reports one
|
|
85
93
|
// path for both. Comparing the two detects a lane without assuming the git directory is named `.git`:
|
|
86
|
-
// a `--separate-git-dir` clone or a bare repository defeats any `.git`-segment match
|
|
87
|
-
// (joshuafolkken/kit#1106).
|
|
94
|
+
// a `--separate-git-dir` clone or a bare repository defeats any `.git`-segment match.
|
|
88
95
|
async function is_linked_worktree(): Promise<boolean> {
|
|
89
96
|
const directories = await git_command.git_directories()
|
|
90
97
|
|
|
@@ -98,18 +105,14 @@ const run_hold_schema = z.object({
|
|
|
98
105
|
is_fullrun: z.boolean().optional(),
|
|
99
106
|
is_halfrun_stop: z.boolean().optional(),
|
|
100
107
|
prrun_stop_head: z.string().optional(),
|
|
108
|
+
owner_pid: z.number().optional(),
|
|
109
|
+
owner_start: z.string().optional(),
|
|
101
110
|
})
|
|
102
111
|
|
|
103
112
|
// `undefined` for anything that is not a well-formed record, so the caller decides what a broken one
|
|
104
113
|
// means. It means blocked, not free — see `classify`.
|
|
105
114
|
function parse_hold(raw: string): RunHold | undefined {
|
|
106
|
-
|
|
107
|
-
const parsed = run_hold_schema.safeParse(JSON.parse(raw))
|
|
108
|
-
|
|
109
|
-
return parsed.success ? parsed.data : undefined
|
|
110
|
-
} catch {
|
|
111
|
-
return undefined
|
|
112
|
-
}
|
|
115
|
+
return json_value.parse_with(raw, run_hold_schema)
|
|
113
116
|
}
|
|
114
117
|
|
|
115
118
|
// **A `taken_at` that is not a date is stale, not current.** It passes the schema — it is a string —
|
|
@@ -117,12 +120,25 @@ function parse_hold(raw: string): RunHold | undefined {
|
|
|
117
120
|
// state the expiry exists to make impossible. Fail-closed is still the answer for the *tree*: a stale
|
|
118
121
|
// record only lets a claim through once `run-hold-cli.ts`'s `blocking_message` has also found the
|
|
119
122
|
// tree clean.
|
|
120
|
-
function
|
|
121
|
-
|
|
123
|
+
function is_expired(hold: RunHold, now: Date): boolean {
|
|
124
|
+
return stamp_record.is_older_than(hold.taken_at, HOLD_MAX_AGE_MS, now)
|
|
125
|
+
}
|
|
122
126
|
|
|
123
|
-
|
|
127
|
+
// **A record whose session has ended is stale before its age says so**: the run
|
|
128
|
+
// that wrote it cannot release it any more, so waiting out the eight hours only stops the next run for
|
|
129
|
+
// nothing. Only a recorded session that is provably gone counts — no owner, or a live pid whose start
|
|
130
|
+
// cannot be read, leaves the age as the whole test. **A stop-marked record is exempt**: a `halfrun` or
|
|
131
|
+
// `prrun` stop is held across a person's latency on purpose, long after its session ends.
|
|
132
|
+
function is_owner_gone(hold: RunHold): boolean {
|
|
133
|
+
const is_stop_mark = hold.is_halfrun_stop === true || hold.prrun_stop_head !== undefined
|
|
124
134
|
|
|
125
|
-
|
|
135
|
+
if (is_stop_mark || hold.owner_pid === undefined) return false
|
|
136
|
+
|
|
137
|
+
return process_identity.is_same_process(hold.owner_pid, hold.owner_start) === false
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function is_stale(hold: RunHold, now: Date): boolean {
|
|
141
|
+
return is_expired(hold, now) || is_owner_gone(hold)
|
|
126
142
|
}
|
|
127
143
|
|
|
128
144
|
// **A record that cannot be read is `unreadable`, never `free`.** Absent is free; present and
|
|
@@ -142,8 +158,22 @@ function read_hold(target: string, now: Date = new Date()): HoldRead {
|
|
|
142
158
|
return classify(stamp_file.read_stamp_text(target), now)
|
|
143
159
|
}
|
|
144
160
|
|
|
161
|
+
type Environment = Readonly<Record<string, string | undefined>>
|
|
162
|
+
type SessionOwner = Pick<RunHold, 'owner_pid' | 'owner_start'>
|
|
163
|
+
|
|
164
|
+
// The agent session's own process, which Claude Code exports to every command it runs. Absent or
|
|
165
|
+
// malformed is no owner at all, never a guess at an ancestor: a wrong owner read as gone frees a live
|
|
166
|
+
// run's tree, which is the one failure this guard exists to prevent.
|
|
167
|
+
function session_owner(environment: Environment = process.env): SessionOwner {
|
|
168
|
+
const pid = Number(environment[agent_session_environment.AGENT_PID_KEY])
|
|
169
|
+
|
|
170
|
+
if (!Number.isSafeInteger(pid) || pid <= 0) return {}
|
|
171
|
+
|
|
172
|
+
return { owner_pid: pid, owner_start: process_identity.read_start(pid) }
|
|
173
|
+
}
|
|
174
|
+
|
|
145
175
|
function build_hold(issue: string, now: Date, is_fullrun?: boolean): RunHold {
|
|
146
|
-
return { issue, taken_at: now.toISOString(), pid: process.pid, is_fullrun }
|
|
176
|
+
return { issue, taken_at: now.toISOString(), pid: process.pid, is_fullrun, ...session_owner() }
|
|
147
177
|
}
|
|
148
178
|
|
|
149
179
|
function write_hold(target: string, issue: string, now: Date = new Date()): RunHold {
|
|
@@ -155,9 +185,8 @@ function write_hold(target: string, issue: string, now: Date = new Date()): RunH
|
|
|
155
185
|
}
|
|
156
186
|
|
|
157
187
|
// The claim on a tree that read as free. **Exclusive rather than a plain write**: two sessions typing
|
|
158
|
-
// an entry point in the same second both read `free`, and a write would tell both of them they won
|
|
159
|
-
//
|
|
160
|
-
// the other one got there first.
|
|
188
|
+
// an entry point in the same second both read `free`, and a write would tell both of them they won.
|
|
189
|
+
// `false` means the other one got there first.
|
|
161
190
|
function create_hold(
|
|
162
191
|
target: string,
|
|
163
192
|
issue: string,
|
|
@@ -168,7 +197,7 @@ function create_hold(
|
|
|
168
197
|
}
|
|
169
198
|
|
|
170
199
|
// What a stopped run's record carries on top of the claim: the `halfrun` stop's flag, or the commit a
|
|
171
|
-
// `prrun` stop stood on
|
|
200
|
+
// `prrun` stop stood on.
|
|
172
201
|
type StopMarkFields = Pick<RunHold, 'is_halfrun_stop' | 'prrun_stop_head'>
|
|
173
202
|
|
|
174
203
|
const HALFRUN_STOP_FIELDS: StopMarkFields = { is_halfrun_stop: true }
|
|
@@ -208,14 +237,15 @@ function release_hold(target: string): void {
|
|
|
208
237
|
stamp_file.remove_stamp(target)
|
|
209
238
|
}
|
|
210
239
|
|
|
211
|
-
// The pid is
|
|
212
|
-
//
|
|
213
|
-
//
|
|
214
|
-
//
|
|
240
|
+
// The pid named is the session's where the record has one: the claiming `josh run:hold` has exited by
|
|
241
|
+
// the time anything reads the record back, so its own pid tells a person nothing. Age or an ended
|
|
242
|
+
// session is what expires a record; `pnpm josh run:release --force` is what clears somebody else's
|
|
243
|
+
// early, and `pnpm josh run:release <N>` what the run that wrote it types.
|
|
215
244
|
function describe_holder(hold: RunHold): string {
|
|
216
|
-
const holder =
|
|
245
|
+
const holder =
|
|
246
|
+
hold.issue === UNNUMBERED_ISSUE ? 'an unnumbered run' : session_cite.issue(hold.issue)
|
|
217
247
|
|
|
218
|
-
return `${holder}, recorded ${hold.taken_at} (pid ${String(hold.pid)})`
|
|
248
|
+
return `${holder}, recorded ${hold.taken_at} (pid ${String(hold.owner_pid ?? hold.pid)})`
|
|
219
249
|
}
|
|
220
250
|
|
|
221
251
|
// The command the run that *wrote* a record types to remove it — the claim's own spelling, mirrored,
|
|
@@ -232,6 +262,13 @@ function is_own_hold(hold: RunHold, claimant: string): boolean {
|
|
|
232
262
|
return hold.issue === claimant
|
|
233
263
|
}
|
|
234
264
|
|
|
265
|
+
// **A claim for the issue the record already names is the same run asking again** — a second
|
|
266
|
+
// `run:entry` in one session must not answer `busy` to its own hold. The unnumbered `new` claim names
|
|
267
|
+
// no run, so two of them are still two runs.
|
|
268
|
+
function is_reentry(hold: RunHold, claimant: string): boolean {
|
|
269
|
+
return claimant !== UNNUMBERED_ISSUE && is_own_hold(hold, claimant)
|
|
270
|
+
}
|
|
271
|
+
|
|
235
272
|
function held_message(hold: RunHold): string {
|
|
236
273
|
return `This working tree is already held by ${describe_holder(hold)}. One run at a time per working tree: a second run here commits its files onto the other run's branch. If that record is stale, run \`${FORCE_RELEASE_COMMAND}\` in this working tree — it removes a record this run did not write, so be sure the run that did has ended — and ask again.`
|
|
237
274
|
}
|
|
@@ -252,11 +289,15 @@ function unreadable_message(): string {
|
|
|
252
289
|
}
|
|
253
290
|
|
|
254
291
|
function stale_message(hold: RunHold): string {
|
|
255
|
-
|
|
292
|
+
const why = is_owner_gone(hold)
|
|
293
|
+
? 'the session that wrote it has ended'
|
|
294
|
+
: `older than ${String(HOLD_MAX_AGE_HOURS)} hours`
|
|
295
|
+
|
|
296
|
+
return `Replaced a stale run record held by ${describe_holder(hold)}: ${why}, so the run that wrote it has ended without releasing it.`
|
|
256
297
|
}
|
|
257
298
|
|
|
258
299
|
function uncommitted_message(hold: RunHold): string {
|
|
259
|
-
return `This working tree still has uncommitted changes, and its run record — held by ${describe_holder(hold)} — has expired. That is a run which stopped for a person rather than one that finished, so the tree is not free: commit or stash the work, or run \`${own_release_command(hold.issue)}\` once you are done with it, then ask again.`
|
|
300
|
+
return `This working tree still has uncommitted changes, and its run record — held by ${describe_holder(hold)} — has expired or outlived its session. That is a run which stopped for a person rather than one that finished, so the tree is not free: commit or stash the work, or run \`${own_release_command(hold.issue)}\` once you are done with it, then ask again.`
|
|
260
301
|
}
|
|
261
302
|
|
|
262
303
|
// The exclusive claim lost: another process wrote the record between this one's read and its write.
|
|
@@ -292,6 +333,7 @@ const run_hold = {
|
|
|
292
333
|
hold_path,
|
|
293
334
|
is_linked_worktree,
|
|
294
335
|
is_own_hold,
|
|
336
|
+
is_reentry,
|
|
295
337
|
is_tree_dirty,
|
|
296
338
|
own_release_command,
|
|
297
339
|
race_message,
|