@joshuafolkken/kit 1.1229.0 → 1.1370.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +50 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +24 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +27 -16
- package/.claude/skills/workflow-commands/latest-gate.md +18 -29
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.github/workflows/publish.yml +2 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +38 -57
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +213 -197
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -201
- package/dist/josh.js +540 -137
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +16 -10
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +4 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +26 -2
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +162 -0
- package/scripts/gate/core-budget.ts +134 -91
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +103 -35
- package/scripts/gate/gate-report.ts +39 -21
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +313 -0
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +60 -53
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +12 -8
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +35 -0
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +49 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +75 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +14 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +46 -37
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +165 -0
- package/scripts/issue/issue-release.ts +58 -0
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +32 -34
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +33 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +11 -5
- package/scripts/josh/josh-commands-lane.ts +16 -5
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-maintenance.ts +2 -2
- package/scripts/josh/josh-commands-run.ts +20 -6
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +10 -10
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +20 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +44 -30
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +25 -24
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +22 -8
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +27 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +140 -0
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-environment.ts +1 -0
- package/scripts/release/github-release-runs.ts +115 -0
- package/scripts/release/github-release.ts +13 -67
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +5 -6
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +68 -37
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +10 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +172 -43
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +25 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +13 -15
- package/scripts/run/run-step.ts +62 -48
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -33
- package/scripts/run/wake/run-wake-describe.ts +76 -29
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +13 -21
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -328
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +129 -98
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/templates/workflows/github-release.yml +4 -0
- package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -1,46 +1,41 @@
|
|
|
1
1
|
import { backlog_budget_cli } from '#scripts/backlog/backlog-budget-cli'
|
|
2
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
2
3
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
3
|
-
import { run_issue_number } from './run-issue-number'
|
|
4
4
|
|
|
5
5
|
// The grammar of an invocation that can be carried across a session cut, and the only place it is
|
|
6
|
-
// written down
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// `backlogrun`'s named issues are still outstanding. A grammar copied into two files is a grammar
|
|
10
|
-
// kept correct in one, which is the clone `CLAUDE.md` prohibits.
|
|
6
|
+
// written down. Two readers need the same answer — the supervisor, to rebuild the text it wakes with,
|
|
7
|
+
// and `run-carry.ts`, to say which of a `backlogrun`'s named issues are still outstanding. A grammar
|
|
8
|
+
// copied into two files is a grammar kept correct in one, which is the clone `CLAUDE.md` prohibits.
|
|
11
9
|
//
|
|
12
10
|
// **`backlogrun` is the one command that survives a cut, and its invocation is a named-issue list, a
|
|
13
11
|
// budget, or both.** `backlogrun #N1 #N2 …` runs the named issues in the order they were typed and
|
|
14
12
|
// then drains the opted-in backlog; `backlogrun --max 5 --idle 30` names only a budget; the two
|
|
15
|
-
// combine as `backlogrun #N1 #N2 --max 5`.
|
|
16
|
-
// for (joshuafolkken/kit#1984 removed that keyword).
|
|
13
|
+
// combine as `backlogrun #N1 #N2 --max 5`.
|
|
17
14
|
//
|
|
18
15
|
// **The invocation is taken apart and rebuilt, rather than inspected and handed on.** Everything that
|
|
19
16
|
// may reach the operating system is enumerable: one command word, two flag names, and an integer for
|
|
20
17
|
// each argument. Reading the record as tokens and composing a fresh string out of constants and
|
|
21
18
|
// validated integers means the text the record held never reaches `spawn` at all.
|
|
22
19
|
//
|
|
23
|
-
// **A stricter check is not a break in the flow
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
// (joshuafolkken/kit#1719).
|
|
20
|
+
// **A stricter check is not a break in the flow.** Validating the characters, fixing the binary as a
|
|
21
|
+
// constant and matching against a pattern all leave the recorded string flowing into the call; taint
|
|
22
|
+
// tracking follows where a value goes, not how hard it was looked at on the way. Composing the
|
|
23
|
+
// argument from constants is what actually severs it.
|
|
28
24
|
const BACKLOG_COMMAND = 'backlogrun'
|
|
29
25
|
// **The named list is pinned to what was typed.** The record keeps the opening list unchanged across
|
|
30
|
-
// every cut, so `classify_claim`'s character-for-character comparison is untouched and
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
// loosening the comparison to the keyword, is what joshuafolkken/kit#1774 rejected.
|
|
26
|
+
// every cut, so `classify_claim`'s character-for-character comparison is untouched and the
|
|
27
|
+
// single-writer guarantee is not weakened. What shrinks is the *outstanding* set, and that lives in
|
|
28
|
+
// the record's `done` field rather than in the string.
|
|
34
29
|
//
|
|
35
30
|
// The flags this grammar knows how to carry across a session cut. A token is compared against these
|
|
36
31
|
// and the **constant that matched** is what goes into the rebuilt invocation, never the token itself:
|
|
37
32
|
// the two are equal as text and differ in where they came from, and here the origin is the whole point.
|
|
38
33
|
const KNOWN_FLAGS: ReadonlyArray<string> = ['--max', '--idle']
|
|
39
34
|
// `--only` is the one flag that takes no value — it says "run the named list and stop, do not drain the
|
|
40
|
-
// pool"
|
|
35
|
+
// pool". It is carried across a cut like any other part of the invocation, so
|
|
41
36
|
// a resumed session that reads it back does not silently start draining the backlog the person excluded.
|
|
42
37
|
const ONLY_FLAG = '--only'
|
|
43
|
-
// The read itself is `cli_flags`'s
|
|
38
|
+
// The read itself is `cli_flags`'s: strict, so an unknown flag, a flag with
|
|
44
39
|
// no value, `--only=<x>` and a value that is itself a flag are all refused before this file looks.
|
|
45
40
|
const OPTIONS = {
|
|
46
41
|
max: { type: 'string' },
|
|
@@ -71,7 +66,7 @@ interface Invocation {
|
|
|
71
66
|
// A space is the only separator that can survive `detached-launch.ts`'s `is_safe_value`, which has
|
|
72
67
|
// already refused every control character — so the split needs no pattern, and this file is left with
|
|
73
68
|
// no regular expression of its own for a backtracking analysis to find. The one pattern it does use
|
|
74
|
-
// is `
|
|
69
|
+
// is `issue-number-shape.ts`'s, which is anchored and has no alternation.
|
|
75
70
|
function tokens_of(invocation: string): ReadonlyArray<string> {
|
|
76
71
|
return invocation.split(TOKEN_SEPARATOR).filter((token) => token.length > EMPTY_LENGTH)
|
|
77
72
|
}
|
|
@@ -110,7 +105,7 @@ function rendered_options(tokens: ReadonlyArray<ArgumentToken>): ReadonlyArray<s
|
|
|
110
105
|
return rendered
|
|
111
106
|
}
|
|
112
107
|
|
|
113
|
-
// **The issue-number shape is `
|
|
108
|
+
// **The issue-number shape is `issue-number-shape.ts`'s, for the reason the flag value's is
|
|
114
109
|
// `backlog:budget`'s.** It already refuses `0` and a leading zero, which is what keeps `#05` from
|
|
115
110
|
// rebuilding as `#5` and being refused downstream as a rewritten record.
|
|
116
111
|
// **The magnitude bound is here and not in the pattern**, which is anchored on digits and says nothing
|
|
@@ -122,7 +117,7 @@ function issue_of(token: string): number | undefined {
|
|
|
122
117
|
|
|
123
118
|
const digits = token.slice(ISSUE_PREFIX.length)
|
|
124
119
|
|
|
125
|
-
if (!
|
|
120
|
+
if (!issue_number_shape.ISSUE_NUMBER_PATTERN.test(digits)) return undefined
|
|
126
121
|
|
|
127
122
|
const issue = Number(digits)
|
|
128
123
|
|
package/scripts/run/run-label.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { git_followup_label } from '#scripts/followup/git-followup-label'
|
|
2
2
|
import { git_gh_command } from '#scripts/gh/git-gh-command'
|
|
3
3
|
import { IN_PROGRESS_LABEL } from '#scripts/issue/issue-labels'
|
|
4
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
4
5
|
|
|
5
|
-
// **The `in-progress` marker belongs to the commands that open and release a run
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// moment the tree is held and the budget allows the run, and `run:release` takes it back off.
|
|
6
|
+
// **The `in-progress` marker belongs to the commands that open and release a run**, so no manifest
|
|
7
|
+
// spells the label's calls and none can forget it: `run:entry` applies it the moment the tree is held
|
|
8
|
+
// and the budget allows the run, and `run:release` takes it back off.
|
|
9
9
|
//
|
|
10
10
|
// **Neither half ever fails the command it rides on.** The hold is the guard and the label only
|
|
11
11
|
// reports it, so a refused write is warned about by name — with the call that finishes it by hand —
|
|
@@ -15,7 +15,9 @@ const MARK_RECOVERY = "gh api repos/{owner}/{repo}/issues/<N>/labels -f 'labels[
|
|
|
15
15
|
const UNMARK_RECOVERY = 'gh api -X DELETE repos/{owner}/{repo}/issues/<N>/labels/in-progress'
|
|
16
16
|
|
|
17
17
|
function warn(action: string, issue: string, recovery: string): void {
|
|
18
|
-
console.warn(
|
|
18
|
+
console.warn(
|
|
19
|
+
`⚠ could not ${action} \`in-progress\` on ${session_cite.issue(issue)} — run by hand: ${recovery}`,
|
|
20
|
+
)
|
|
19
21
|
}
|
|
20
22
|
|
|
21
23
|
// `issue_add_label` creates the label when the repository lacks it (`lane-dispatch.ts`), so no
|
|
@@ -1,8 +1,9 @@
|
|
|
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 { lane_await } from '#scripts/lane/lane-await'
|
|
3
5
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
4
6
|
import { error_text } from '#scripts/lib/error-message'
|
|
5
|
-
import { run_issue_number } from './run-issue-number'
|
|
6
7
|
import {
|
|
7
8
|
MS_PER_MINUTE,
|
|
8
9
|
MS_PER_SECOND,
|
|
@@ -16,8 +17,8 @@ import {
|
|
|
16
17
|
type ProcessTrace,
|
|
17
18
|
} from './run-liveness'
|
|
18
19
|
|
|
19
|
-
// `josh run:liveness <N> --output <path> --process <alive|none
|
|
20
|
-
// unit running child `<N
|
|
20
|
+
// `josh run:liveness <N> --output <path> [--process <alive|none>]` — one verdict about the delegated
|
|
21
|
+
// unit running child `<N>`.
|
|
21
22
|
//
|
|
22
23
|
// The stdout/stderr split is the contract, as it is for `run:hold`: exactly one
|
|
23
24
|
// verdict token on stdout on every path, the reason and the advice on stderr. `undetermined` exits
|
|
@@ -92,7 +93,7 @@ interface ParsedArguments {
|
|
|
92
93
|
function is_valid_target(parsed: ParsedArguments): boolean {
|
|
93
94
|
return (
|
|
94
95
|
parsed.positionals.length === 1 &&
|
|
95
|
-
|
|
96
|
+
issue_number_shape.ISSUE_NUMBER_PATTERN.test(parsed.positionals[0] ?? '')
|
|
96
97
|
)
|
|
97
98
|
}
|
|
98
99
|
|
|
@@ -120,13 +121,25 @@ function to_optional_fields(values: ParsedValues): Partial<LivenessRequest> {
|
|
|
120
121
|
}
|
|
121
122
|
}
|
|
122
123
|
|
|
124
|
+
// Left out, the process trace is read here with the probe `lane:await` polls on — the child's
|
|
125
|
+
// invocation or its detached ship — so no caller runs `pgrep` by hand; a
|
|
126
|
+
// probe that could not look answers `unknown`, never `none`. A given `--process` still wins: it is
|
|
127
|
+
// the answer for a unit this probe does not know, such as one whose checkout the caller scanned itself.
|
|
128
|
+
function process_trace_of(values: ParsedValues, issue: string): ProcessTrace {
|
|
129
|
+
if (values.process !== undefined) return to_process_trace(values.process) ?? PROCESS_UNKNOWN
|
|
130
|
+
|
|
131
|
+
return lane_await.process_trace_default(issue)
|
|
132
|
+
}
|
|
133
|
+
|
|
123
134
|
// Reached only through `is_valid`, so the fallbacks below are unreachable defaults rather than
|
|
124
135
|
// behavior: the alternative is a type assertion, which this codebase restricts.
|
|
125
136
|
function to_request(parsed: ParsedArguments): LivenessRequest {
|
|
137
|
+
const issue = parsed.positionals[0] ?? ''
|
|
138
|
+
|
|
126
139
|
return {
|
|
127
|
-
issue
|
|
140
|
+
issue,
|
|
128
141
|
output_path: parsed.values.output ?? '',
|
|
129
|
-
process_trace:
|
|
142
|
+
process_trace: process_trace_of(parsed.values, issue),
|
|
130
143
|
...to_optional_fields(parsed.values),
|
|
131
144
|
}
|
|
132
145
|
}
|
|
@@ -5,28 +5,21 @@ import { setTimeout as sleep } from 'node:timers/promises'
|
|
|
5
5
|
import { agent_event, type AgentEventState } from '#scripts/agent/agent-event'
|
|
6
6
|
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
7
7
|
import { ALREADY_DONE_LABEL, NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
|
|
8
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
8
9
|
import { issue_state } from '#scripts/issue/issue-state'
|
|
9
10
|
import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
|
|
10
11
|
import { run_hold } from '#scripts/run/hold/run-hold'
|
|
11
|
-
import { run_issue_number } from './run-issue-number'
|
|
12
12
|
|
|
13
13
|
// `josh run:liveness <N>` — whether the delegated unit running child `<N>` is still working, or
|
|
14
|
-
// stopped without reporting
|
|
15
|
-
//
|
|
16
|
-
// joshuafolkken/kit#1212 wrote the detection as a conjunction of four traces an agent read by hand,
|
|
17
|
-
// and it could not fire for the stop that actually happened. Its second trace required a **dirty**
|
|
18
|
-
// checkout, justified by "a unit that died mid-implementation leaves exactly this" — so a unit that
|
|
19
|
-
// died *before* implementing, while it was still reading the skill and the issue, left a clean tree
|
|
20
|
-
// and the conjunction stayed false forever. Measured on 2026-09-06: the unit for
|
|
21
|
-
// joshuafolkken/kit#1169 stopped seven minutes in, three of the four traces held, and the parent
|
|
22
|
-
// went on calling the child in progress for 42 minutes until a person asked.
|
|
14
|
+
// stopped without reporting.
|
|
23
15
|
//
|
|
24
16
|
// **Two traces decide it, and neither depends on whether implementation started**: the unit's output
|
|
25
|
-
// has stopped growing, and no process of the child's is alive in that checkout.
|
|
26
|
-
//
|
|
27
|
-
// which is a different question from whether the unit
|
|
28
|
-
//
|
|
29
|
-
// yet, and the branch-and-pull-request question
|
|
17
|
+
// has stopped growing, and no process of the child's is alive in that checkout. A unit can die before
|
|
18
|
+
// implementing and leave a clean tree, so the dirty tree is an input of the recovery, not of the test
|
|
19
|
+
// — it says whether there is anything to stash, which is a different question from whether the unit
|
|
20
|
+
// is alive. "Nothing was ever opened for the child" is not a trace either: it is also the normal
|
|
21
|
+
// state of a unit that has not reached its commit yet, and the branch-and-pull-request question
|
|
22
|
+
// already has an owner in `josh run:hold`'s preflight check.
|
|
30
23
|
//
|
|
31
24
|
// **The binding constraint is the direction of the error.** A live unit booked as stopped has its
|
|
32
25
|
// working work killed; a stopped unit booked as alive costs waiting. So the ladder reads the one
|
|
@@ -37,9 +30,8 @@ import { run_issue_number } from './run-issue-number'
|
|
|
37
30
|
// **The output read follows the link.** The path a unit writes its transcript to is a symbolic link, and
|
|
38
31
|
// the link's own modification time never changes after it is created — read with the shell's `stat`,
|
|
39
32
|
// which does not follow by default on macOS, the file looks frozen whether the unit is alive or
|
|
40
|
-
// dead.
|
|
41
|
-
//
|
|
42
|
-
// modification time, because it is the two-sample size comparison that actually proved liveness.
|
|
33
|
+
// dead. `statSync` follows the link, and the size is compared as well as the modification time,
|
|
34
|
+
// because it is the two-sample size comparison that actually proves liveness.
|
|
43
35
|
|
|
44
36
|
const ALIVE_VERDICT = 'alive'
|
|
45
37
|
const SETTLED_VERDICT = 'settled'
|
|
@@ -52,11 +44,10 @@ type LivenessVerdict =
|
|
|
52
44
|
| typeof STOPPED_VERDICT
|
|
53
45
|
| typeof UNDETERMINED_VERDICT
|
|
54
46
|
|
|
55
|
-
// The one trace this
|
|
47
|
+
// The one trace this module does not read for itself. A process scan that matched too little would
|
|
56
48
|
// book a live unit as stopped, and one that matched too much would never detect anything — so the
|
|
57
|
-
//
|
|
58
|
-
//
|
|
59
|
-
// an answer of "no process".
|
|
49
|
+
// CLI reads it with `lane:await`'s probe, or takes what the caller passed. `unknown` is what a
|
|
50
|
+
// request carries when nobody read it, an unasked question rather than an answer of "no process".
|
|
60
51
|
const PROCESS_ALIVE = 'alive'
|
|
61
52
|
const PROCESS_NONE = 'none'
|
|
62
53
|
const PROCESS_UNKNOWN = 'unknown'
|
|
@@ -116,8 +107,8 @@ const ALIVE_ADVICE = 'Keep polling; do not touch the child.'
|
|
|
116
107
|
const SETTLED_ADVICE =
|
|
117
108
|
'Read the child with `pnpm josh issue:state <N>` and take the branch its state says.'
|
|
118
109
|
// The unit stopped, but *why* it stopped — abandoned mid-implementation, or dead because it could not
|
|
119
|
-
// reach the API — is `run:ending`'s question, not this one's
|
|
120
|
-
//
|
|
110
|
+
// reach the API — is `run:ending`'s question, not this one's. Booking every stop as a failure would
|
|
111
|
+
// park an API-outage child that should be re-dispatched, so the recovery is
|
|
121
112
|
// routed through `run:merge --output`, the same composite a returned child takes: it reads the exit
|
|
122
113
|
// record without waiting for the unit to return, re-dispatches an outage child (counting the outage,
|
|
123
114
|
// and stopping the run on the environment guard once a run of them trips it), and parks an abandoned
|
|
@@ -127,7 +118,7 @@ const STOPPED_CLEAN_ADVICE =
|
|
|
127
118
|
const STOPPED_DIRTY_ADVICE =
|
|
128
119
|
'Stash the half-finished work with `git stash push -u -m "backlogrun: stopped unit for #<N>"` and record it on the Issue, then classify how the unit ended with `pnpm josh run:merge <N> --output <path>` (add `--epic <E> --repo <owner/repo> --owner "$PPID"` for a named epic): it re-dispatches an API-outage child (counting the outage; a run of them trips the environment guard) and parks an abandoned child with `needs-decision` against the consecutive-failure guard, without waiting for the unit to return.'
|
|
129
120
|
const UNDETERMINED_ADVICE =
|
|
130
|
-
'Read the trace that failed and ask again. Where the process trace was
|
|
121
|
+
'Read the trace that failed and ask again. Where the process trace was given as `unknown`, leave `--process` out so the command reads it. Two of these in a row is a fault in the check itself rather than a slow unit: stop polling and report it.'
|
|
131
122
|
|
|
132
123
|
// Output that moved is a unit that is writing, and it is asked before anything else — it is the one
|
|
133
124
|
// reading that needs no other trace to mean what it says.
|
|
@@ -153,8 +144,8 @@ function definitive_verdict(traces: Traces): LivenessVerdict | undefined {
|
|
|
153
144
|
|
|
154
145
|
// A live process is a unit inside a long check — a `pnpm josh followup` waiting on CI writes
|
|
155
146
|
// nothing for up to 32 minutes, which is longer than the silent window and is exactly the false
|
|
156
|
-
// positive this trace exists to stop. **It is asked after the unreadable check rather than before it
|
|
157
|
-
//
|
|
147
|
+
// positive this trace exists to stop. **It is asked after the unreadable check rather than before it**:
|
|
148
|
+
// a `pgrep` scoped a shade too wide answers `alive` on a
|
|
158
149
|
// machine running several kit projects at once, and read ahead of an output path that resolves to
|
|
159
150
|
// nothing it would answer `alive` on every poll forever — the unbounded stall this command exists to
|
|
160
151
|
// remove, reappearing where nothing would ever count it.
|
|
@@ -220,9 +211,8 @@ function to_resolved_root(root: string): string {
|
|
|
220
211
|
// **Every root is listed in both spellings, and that is load-bearing rather than defensive.** `/tmp`
|
|
221
212
|
// is a symbolic link to `/private/tmp` on macOS and `/var` one to `/private/var`, so a containment
|
|
222
213
|
// test against one spelling rejects a transcript whose path was written as the other — `path.relative`
|
|
223
|
-
// resolves no link
|
|
224
|
-
//
|
|
225
|
-
// unbounded stall this command exists to remove, reappearing inside its own path check. Resolving the
|
|
214
|
+
// resolves no link — and a refused transcript makes every poll answer `undetermined`, the unbounded
|
|
215
|
+
// stall this command exists to remove, reappearing inside its own path check. Resolving the
|
|
226
216
|
// *candidate* would not do instead: it does not exist yet in the "resolves to nothing" case, which has
|
|
227
217
|
// to stay unreadable rather than throw.
|
|
228
218
|
const ALLOWED_ROOTS: ReadonlyArray<string> = [
|
|
@@ -251,9 +241,8 @@ function to_safe_path(output_path: string): string | undefined {
|
|
|
251
241
|
}
|
|
252
242
|
|
|
253
243
|
// `statSync` follows a symbolic link; `lstatSync` and the shell's bare `stat` do not. That difference is
|
|
254
|
-
//
|
|
255
|
-
//
|
|
256
|
-
// unreadable rather than frozen.
|
|
244
|
+
// load-bearing, so it is stated here rather than left to a reader to know. A path that resolves to
|
|
245
|
+
// nothing, or to something that is not a regular file, is unreadable rather than frozen.
|
|
257
246
|
function sample_output(output_path: string): OutputSample | undefined {
|
|
258
247
|
const safe_path = to_safe_path(output_path)
|
|
259
248
|
|
|
@@ -324,7 +313,7 @@ function carries_label(labels: ReadonlyArray<string>, wanted: string): boolean {
|
|
|
324
313
|
|
|
325
314
|
// The labels that say a unit stopped on purpose. `needs-decision` is the park branch; `already-done`
|
|
326
315
|
// is the exit a child takes when it verifies its Issue's work is already merged
|
|
327
|
-
//
|
|
316
|
+
// — it comments the evidence, applies the label and stops with the checkout
|
|
328
317
|
// clean, which is settled by the same reasoning. Left out, this command reports a child that
|
|
329
318
|
// finished correctly as `stopped` and a supervisor restarts the investigation it just completed.
|
|
330
319
|
const SETTLED_LABELS: ReadonlyArray<string> = [NEEDS_DECISION_LABEL, ALREADY_DONE_LABEL]
|
|
@@ -336,8 +325,8 @@ function carries_settled_label(labels: ReadonlyArray<string>): boolean {
|
|
|
336
325
|
// Settled needs positive evidence that the child is done with: it closed, or the unit parked it and
|
|
337
326
|
// then stopped, which the loop's park branch already owns. **An open child that is not parked is not settled
|
|
338
327
|
// even without `in-progress`** — that label is applied by the unit itself, after it reads the issue,
|
|
339
|
-
// so a unit that died before applying it would otherwise be reported as a child needing nothing
|
|
340
|
-
//
|
|
328
|
+
// so a unit that died before applying it would otherwise be reported as a child needing nothing.
|
|
329
|
+
// Read that way, the stop this command exists for goes
|
|
341
330
|
// undetected.
|
|
342
331
|
async function read_child_settled(issue: string, repo?: string): Promise<boolean | undefined> {
|
|
343
332
|
const json = await git_gh_issue_read.issue_view_json(issue, STATE_FIELDS, repo)
|
|
@@ -386,7 +375,7 @@ async function read_traces(request: LivenessRequest): Promise<Traces> {
|
|
|
386
375
|
}
|
|
387
376
|
|
|
388
377
|
async function check(request: LivenessRequest): Promise<LivenessDecision> {
|
|
389
|
-
|
|
378
|
+
issue_number_shape.require_issue_number(request.issue)
|
|
390
379
|
|
|
391
380
|
return decide(await read_traces(request))
|
|
392
381
|
}
|
|
@@ -394,7 +383,7 @@ async function check(request: LivenessRequest): Promise<LivenessDecision> {
|
|
|
394
383
|
// The constants are exported by name rather than through the namespace: read back off a namespace
|
|
395
384
|
// object their literal types widen to `string`, and `ProcessTrace` would then admit anything.
|
|
396
385
|
// `to_safe_path` is on the namespace because `josh lane:output` refuses a path this command could
|
|
397
|
-
// not read
|
|
386
|
+
// not read. Recorded, such a path makes every poll answer `undetermined`
|
|
398
387
|
// for ever — so the two have to agree, and agreeing means one function rather than two.
|
|
399
388
|
const run_liveness = {
|
|
400
389
|
check,
|
|
@@ -3,15 +3,11 @@ import { fileURLToPath } from 'node:url'
|
|
|
3
3
|
import { run_next } from './run-next'
|
|
4
4
|
import { run_prep_cli } from './run-prep-cli'
|
|
5
5
|
|
|
6
|
-
// `josh run:next <N>` — print the next step a `fullrun` takes, from the run's state
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
// **It is the consumer `run:prep` was built to have.** joshuafolkken/kit#1978 bundled the reads;
|
|
13
|
-
// joshuafolkken/kit#2165 added the read-only glance; this one prints the decision those reads support,
|
|
14
|
-
// which is the trim epic #2166 is after — prose a reader interprets replaced by a computed answer.
|
|
6
|
+
// `josh run:next <N>` — print the next step a `fullrun` takes, from the run's state.
|
|
7
|
+
// It reads exactly what `run:prep` reads — the issue state, the `human_review` line and the dependency
|
|
8
|
+
// scope — by calling `run:prep`'s own gather, so the two never answer from different facts, and hands
|
|
9
|
+
// the assembled parts to the state → step mapping in `run-next.ts`. It prints the decision those reads
|
|
10
|
+
// support — prose a reader interprets replaced by a computed answer.
|
|
15
11
|
|
|
16
12
|
const SUCCESS_EXIT_CODE = 0
|
|
17
13
|
const FAILURE_EXIT_CODE = 1
|
package/scripts/run/run-next.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import type { PrepParts } from './run-prep'
|
|
2
2
|
import { run_step, type PreVerdict } from './run-step'
|
|
3
3
|
|
|
4
|
-
// `josh run:next <N>` — the next step a `fullrun` takes, printed from the run's state
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// state `run:prep` already gathered, so the answer is computed rather than judged.
|
|
4
|
+
// `josh run:next <N>` — the next step a `fullrun` takes, printed from the run's state.
|
|
5
|
+
// It replaces prose that a reader has to interpret with a command that answers "what now" from the
|
|
6
|
+
// same state `run:prep` already gathered, so the answer is computed rather than judged.
|
|
8
7
|
//
|
|
9
|
-
// **It is
|
|
8
|
+
// **It is the degenerate form of `run:step`.** `run:step` computes a run's
|
|
10
9
|
// position from the event stream, the carry record and the issue state; a `fullrun` with nothing emitted
|
|
11
10
|
// yet is at its pre-implementation position, which is exactly what this prints. The state → step mapping
|
|
12
11
|
// lives once, in `run-step.ts`'s `pre_verdict`, and this maps each verdict to the prose sentence a
|
|
@@ -5,19 +5,18 @@ import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
|
|
|
5
5
|
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
6
6
|
import { error_text } from '#scripts/lib/error-message'
|
|
7
7
|
import { implementation_cut_verdict } from '#scripts/rules/implementation-cut-verdict'
|
|
8
|
-
import {
|
|
8
|
+
import type { RunCarry } from '#scripts/run/carry/run-carry'
|
|
9
9
|
import { run_headless } from './run-headless'
|
|
10
10
|
import { run_watcher_hook } from './run-watcher-hook'
|
|
11
11
|
|
|
12
|
-
// The `backlogrun` parent's hand-off, delivered at the call it binds on
|
|
12
|
+
// The `backlogrun` parent's hand-off, delivered at the call it binds on.
|
|
13
13
|
//
|
|
14
|
-
// **
|
|
15
|
-
// orchestrator never implements,
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
// taken at the next call.
|
|
14
|
+
// **A hand-off asked only at a merge goes unread while the context grows between merges.** The
|
|
15
|
+
// orchestrator never implements, but `pnpm josh cost --cut` is read after each child's merge
|
|
16
|
+
// (`backlogrun-progress.md` → "The hand-off"), and a long wait or a lane-failure investigation between
|
|
17
|
+
// two merges is where the context grows past the shared threshold. This is the lesson
|
|
18
|
+
// `implementation-cut.ts` records for a lane child, one session up — a check carried as a step is
|
|
19
|
+
// taken late, a `PreToolUse` refusal is taken at the next call.
|
|
21
20
|
//
|
|
22
21
|
// **The same statistic and the same threshold, never a second measurement.** The verdict is
|
|
23
22
|
// `cost_cli.session_verdict` — what `pnpm josh cost --cut` prints — read through the implementation cut's
|
|
@@ -33,8 +32,7 @@ const STAMP_PREFIX = 'josh-parent-cut-guard-'
|
|
|
33
32
|
// **One refusal, then a quiet window long enough to finish the hand-off in.** The hand-off is several
|
|
34
33
|
// calls — `lane:list`, `lane:output`, `run:carry --cut`, `run:wake`, the progress comment — and a guard
|
|
35
34
|
// refusing each of them would wedge the very procedure it asks for. A parent that could not cut (a lane
|
|
36
|
-
// nobody can poll) is asked again once the window has passed
|
|
37
|
-
// seam used to be.
|
|
35
|
+
// nobody can poll) is asked again once the window has passed.
|
|
38
36
|
const QUIET_WINDOW_MS = 600_000
|
|
39
37
|
|
|
40
38
|
// What the decision has to know about the world, passed in so it is testable without a carry record or
|
|
@@ -73,7 +71,7 @@ const PARENT_CUT_REASON =
|
|
|
73
71
|
async function is_due(state: ParentCutState): Promise<boolean> {
|
|
74
72
|
const carry = await state.carry()
|
|
75
73
|
|
|
76
|
-
if (carry === undefined ||
|
|
74
|
+
if (carry === undefined || run_headless.is_cut_capped(carry)) return false
|
|
77
75
|
|
|
78
76
|
return state.verdict() === cost_verdict.OVER_VERDICT
|
|
79
77
|
}
|
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
import { git_gh_pr_read } from '#scripts/gh/git-gh-pr-read'
|
|
2
2
|
import { git_command } from '#scripts/git/git-command'
|
|
3
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
4
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
3
5
|
import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
|
|
6
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
4
7
|
import { run_hold } from '#scripts/run/hold/run-hold'
|
|
5
8
|
import { z } from 'zod'
|
|
6
|
-
import { run_issue_number } from './run-issue-number'
|
|
7
9
|
|
|
8
10
|
// The preflight check — what an interrupted run left in this working tree, and what the rule says to
|
|
9
|
-
// do about it before the next child starts
|
|
10
|
-
//
|
|
11
|
-
// before it claims the tree, so this module is the shared logic behind that claim and behind
|
|
12
|
-
// `run:progress`, and no longer a command of its own.
|
|
11
|
+
// do about it before the next child starts. `run:hold` runs it before it claims the tree, so this
|
|
12
|
+
// module is the shared logic behind that claim and behind `run:progress`, not a command of its own.
|
|
13
13
|
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
// `git stash` on its own judgement, so the batch could not recover without a person.
|
|
14
|
+
// It is about the run that never said anything again: an unattended run ends abnormally — a crash, a
|
|
15
|
+
// Ctrl-C, a laptop asleep, an expired token — and leaves its feature branch, its open pull request and
|
|
16
|
+
// its uncommitted changes behind. The next child's checkout refuses over a dirty tree, and an agent
|
|
17
|
+
// may not reach for `git stash` on its own judgement, so without this check the batch cannot
|
|
18
|
+
// recover unattended.
|
|
20
19
|
//
|
|
21
20
|
// **The rule answers, so the run does not judge.** "There is a branch already, I will carry on from
|
|
22
21
|
// it" and "there is a branch already, I had better stop" are both defensible in the moment, which is
|
|
23
22
|
// exactly why the choice is not left to the moment — the same reason `josh delegate` and
|
|
24
23
|
// `josh review:level` refuse to leave their answers to an agent.
|
|
25
24
|
//
|
|
26
|
-
// **The check is re-askable,
|
|
27
|
-
//
|
|
25
|
+
// **The check is re-askable, and so is the claim it now gates — but only by the same run.** A claim
|
|
26
|
+
// asked again for the issue the record names answers `hold`; for any other
|
|
27
|
+
// issue it answers `busy`, because that ask is a second run. This check reads state and writes nothing,
|
|
28
28
|
// so the reclaim recovery ends by asking `run:hold` again on the tree it just cleaned.
|
|
29
29
|
|
|
30
30
|
const CLEAN_VERDICT = 'clean'
|
|
@@ -88,8 +88,8 @@ const STASH_LABEL_PREFIX = 'run:hold reclaimed before #'
|
|
|
88
88
|
// The issue number reaches the advice inside a double-quoted shell command a caller is told to paste,
|
|
89
89
|
// so the shape it may take is pinned beside the interpolation rather than only in the CLI that
|
|
90
90
|
// happens to be today's single caller. `run:liveness` interpolates it the same way, so the pattern
|
|
91
|
-
// and the refusal live in one module both read
|
|
92
|
-
const { require_issue_number } =
|
|
91
|
+
// and the refusal live in one module both read.
|
|
92
|
+
const { require_issue_number } = issue_number_shape
|
|
93
93
|
const UNREADABLE_PR_MESSAGE = 'The pull request could not be read for branch '
|
|
94
94
|
|
|
95
95
|
function needs_reclaim(tree: TreeState): boolean {
|
|
@@ -156,7 +156,7 @@ function to_reason(verdict: PreflightVerdict, tree: TreeState, child: ChildState
|
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
// **`-u` is not optional.** What an interrupted run leaves almost always includes a new `*.test.ts`,
|
|
159
|
-
// which is untracked, and a stash without it leaves exactly those files for the
|
|
159
|
+
// which is untracked, and a stash without it leaves exactly those files for the checkout that
|
|
160
160
|
// follows to refuse over. **And the stash is recorded rather than popped**, which is what sets this
|
|
161
161
|
// stash apart from every other sanctioned one: the work belongs to a run that is gone, so the Issue
|
|
162
162
|
// comment is the only thing that can ever bring it back.
|
|
@@ -169,14 +169,14 @@ function reclaim_steps(tree: TreeState, issue: string): Array<string> {
|
|
|
169
169
|
|
|
170
170
|
return [
|
|
171
171
|
`git stash push -u -m "${STASH_LABEL_PREFIX}${issue}"`,
|
|
172
|
-
`Record the stash on
|
|
172
|
+
`Record the stash on ${session_cite.issue(issue)} — the comment is what gets it popped; nothing pops it for you.`,
|
|
173
173
|
]
|
|
174
174
|
}
|
|
175
175
|
|
|
176
176
|
function reclaim_advice(tree: TreeState, issue: string): string {
|
|
177
177
|
return [
|
|
178
178
|
...reclaim_steps(tree, issue),
|
|
179
|
-
|
|
179
|
+
'pnpm josh ms',
|
|
180
180
|
'Then ask this command again: it is re-askable, and the clean tree gets its own answer.',
|
|
181
181
|
].join('\n')
|
|
182
182
|
}
|
|
@@ -202,11 +202,7 @@ function decide(tree: TreeState, child: ChildState, issue: string): PreflightDec
|
|
|
202
202
|
}
|
|
203
203
|
|
|
204
204
|
function read_pr_field(raw: string): string | undefined {
|
|
205
|
-
|
|
206
|
-
return pr_info_schema.parse(JSON.parse(raw)).state
|
|
207
|
-
} catch {
|
|
208
|
-
return undefined
|
|
209
|
-
}
|
|
205
|
+
return json_value.parse_with(raw, pr_info_schema)?.state
|
|
210
206
|
}
|
|
211
207
|
|
|
212
208
|
function to_pr_state(raw: string): PrState {
|
|
@@ -227,11 +223,11 @@ async function read_tree_state(): Promise<TreeState> {
|
|
|
227
223
|
|
|
228
224
|
// **An unreadable `gh` is not an absent pull request.** `pr_view` folds both into `''` and cannot tell
|
|
229
225
|
// them apart, so the existence question is asked through `pr_exists`, which throws on a lookup it
|
|
230
|
-
// could not complete
|
|
226
|
+
// could not complete. That throw reaches the CLI as `unknown`; without it a
|
|
231
227
|
// rate-limited or logged-out `gh` turns a **merged** pull request into `resume`, and the run commits
|
|
232
228
|
// on top of work somebody already landed — the exact hazard `park` exists for.
|
|
233
|
-
// **The second half of the same guard.** `pr_view` throws on a read it could not complete
|
|
234
|
-
//
|
|
229
|
+
// **The second half of the same guard.** `pr_view` throws on a read it could not complete,
|
|
230
|
+
// but the two are separate round trips, so a lookup that answers empty
|
|
235
231
|
// between them would still put a **merged** pull request back through `NO_PR` and out as `resume`.
|
|
236
232
|
// An empty answer for a branch `pr_exists` has just confirmed is therefore a failed read by
|
|
237
233
|
// construction, and it throws rather than answering.
|
|
@@ -335,9 +331,9 @@ interface CandidateContext {
|
|
|
335
331
|
}
|
|
336
332
|
|
|
337
333
|
// **A branch with no pull request, no commit beyond the default branch and no uncommitted change in
|
|
338
|
-
// its lane holds no work
|
|
339
|
-
//
|
|
340
|
-
//
|
|
334
|
+
// its lane holds no work**. A lane that ended before implementing — an operational issue with no code
|
|
335
|
+
// change — leaves exactly that behind, and reading its mere existence as a partial implementation
|
|
336
|
+
// would send the next `fullrun #N` to `resume` over nothing. A branch with a
|
|
341
337
|
// pull request is never counted: whatever its commits, the pull request is the state the verdict is
|
|
342
338
|
// decided on.
|
|
343
339
|
async function read_candidate(
|