@joshuafolkken/kit 1.1240.0 → 1.1370.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +50 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +19 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +26 -16
- package/.claude/skills/workflow-commands/latest-gate.md +17 -28
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +29 -47
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-XZYKEM6J.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-QVSWU24O.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-TLJYAGZK.js} +549 -874
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +216 -202
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -187
- package/dist/josh.js +281 -94
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +16 -10
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +3 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +26 -2
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +2 -2
- package/scripts/gate/core-budget.ts +15 -26
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +70 -35
- package/scripts/gate/gate-report.ts +14 -15
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +168 -30
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +53 -51
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +7 -7
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +1 -1
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +24 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +52 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +9 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +34 -38
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +17 -7
- package/scripts/issue/issue-release.ts +3 -3
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +30 -35
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +25 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +4 -5
- package/scripts/josh/josh-commands-lane.ts +14 -4
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-run.ts +20 -6
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +6 -7
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +12 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +2 -2
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +20 -19
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +12 -11
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +16 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +1 -1
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-runs.ts +1 -1
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +5 -6
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +54 -36
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +9 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +171 -46
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +25 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +13 -15
- package/scripts/run/run-step.ts +58 -47
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -32
- package/scripts/run/wake/run-wake-describe.ts +24 -28
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +9 -9
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -279
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +26 -26
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
2
2
|
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
3
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
3
4
|
import { run_progress_read } from '#scripts/run/progress/run-progress-read'
|
|
4
5
|
import { z } from 'zod'
|
|
5
6
|
import { run_watcher_guard } from './run-watcher-guard'
|
|
6
7
|
|
|
7
8
|
// The `PreToolUse` adapter that turns `run_watcher_guard`'s verdict into a deny reason, so the guard
|
|
8
|
-
// the CLI already carries is
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
// entry, so the consolidation invariant holds; the detection itself is unchanged.
|
|
9
|
+
// the CLI already carries is *called* on every tool call rather than left to prose asking the run to
|
|
10
|
+
// call it. It is composed into `pretool-guard.ts` — the one PreToolUse hook — rather than added as a
|
|
11
|
+
// second `.claude/settings.json` entry, so the consolidation invariant holds.
|
|
12
12
|
//
|
|
13
13
|
// **It fires once per run, for the same reason every guard here stamps.** A stale watcher would other-
|
|
14
14
|
// wise refuse *every* tool call, including the `pnpm josh run:progress --wait` that fixes it — a wedge.
|
|
@@ -24,13 +24,7 @@ const STAMP_PREFIX = 'josh-watcher-guard-'
|
|
|
24
24
|
const payload_schema = z.object({ transcript_path: z.string().min(1) })
|
|
25
25
|
|
|
26
26
|
function transcript_of(raw_payload: string): string | undefined {
|
|
27
|
-
|
|
28
|
-
const parsed = payload_schema.safeParse(JSON.parse(raw_payload))
|
|
29
|
-
|
|
30
|
-
return parsed.success ? parsed.data.transcript_path : undefined
|
|
31
|
-
} catch {
|
|
32
|
-
return undefined
|
|
33
|
-
}
|
|
27
|
+
return json_value.parse_with(raw_payload, payload_schema)?.transcript_path
|
|
34
28
|
}
|
|
35
29
|
|
|
36
30
|
// The once-per-run arm: refuse only when nothing has been recorded yet, and record before returning so
|
|
@@ -56,7 +50,7 @@ function is_active(): boolean {
|
|
|
56
50
|
|
|
57
51
|
// The guard's note when the watcher is stale and this call is the once-per-run one that refuses, or
|
|
58
52
|
// `undefined` when the watcher is fresh (or the refusal was already spent this run). No session is asked
|
|
59
|
-
// to relay the run's stream
|
|
53
|
+
// to relay the run's stream — the watch pane does.
|
|
60
54
|
async function stale_reason(transcript: string, now_ms: number): Promise<string | undefined> {
|
|
61
55
|
const result = await run_watcher_guard.check(await run_progress_read.live_target())
|
|
62
56
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
3
4
|
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
5
|
+
import { lane_ledger } from '#scripts/lane/lane-ledger'
|
|
4
6
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
5
7
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
6
8
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
@@ -13,28 +15,27 @@ import { run_ship_return } from './run-ship-return'
|
|
|
13
15
|
import { run_ship_stage, type Phase, type ShipState, type Stage } from './run-ship-stage'
|
|
14
16
|
import { run_ship_steps, type ShipArguments, type Step } from './run-ship-steps'
|
|
15
17
|
|
|
16
|
-
// `josh ship "<title> #<N>"` — one call for the fixed commit-to-report region a run ships a change on
|
|
17
|
-
//
|
|
18
|
-
// and
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
// the four would have printed on their own.
|
|
18
|
+
// `josh ship "<title> #<N>"` — one call for the fixed commit-to-report region a run ships a change on.
|
|
19
|
+
// It runs `gate`, `git -y`, `followup` and `run:tail` internally, so no round trip re-bills a lane's
|
|
20
|
+
// full context, and prints one composite report, the same way `run:tail` folds the post-merge
|
|
21
|
+
// bookkeeping. Each step's stderr is forwarded, so the reader still sees every explanation — a red
|
|
22
|
+
// check, a CI wait, a refusal — the four would have printed on their own.
|
|
22
23
|
//
|
|
23
24
|
// It stops at the first failed step: the gate must be green before the commit, the commit before the
|
|
24
25
|
// merge. The report ends at the failure and names the stopped step, so the run reads only that one.
|
|
25
26
|
//
|
|
26
|
-
// **Re-running it resumes rather than restarts
|
|
27
|
+
// **Re-running it resumes rather than restarts**. Each stage's completion is
|
|
27
28
|
// kept in a per-issue record, and the repository's actual state — committed, pushed, merged — is read
|
|
28
29
|
// before the first stage, so a ship that died mid-way passes over what already happened and never
|
|
29
30
|
// commits, pushes or merges twice. Each stage's start, success, failure or skip goes onto the run's
|
|
30
31
|
// event stream. `run-ship-stage.ts` carries which stage may be passed over, and why the gate never is
|
|
31
32
|
// on the record's word alone.
|
|
32
33
|
//
|
|
33
|
-
// **`--review` owns the round-1 review too
|
|
34
|
+
// **`--review` owns the round-1 review too**: a `review` stage in front of the
|
|
34
35
|
// gate launches the same-strength reviewer beside it and joins, attests and records the round without
|
|
35
36
|
// an agent turn (`run-ship-review-steps.ts`); a High or Medium finding, or any failed join, stops there.
|
|
36
37
|
//
|
|
37
|
-
// **`--detach` hands the whole region to a supervisor that outlives the agent
|
|
38
|
+
// **`--detach` hands the whole region to a supervisor that outlives the agent**:
|
|
38
39
|
// the agent ends at the hand-off instead of relaunching itself for the gate, a supervised ship that stops
|
|
39
40
|
// hands the stage back (`run-ship-return.ts`), and `--log <N>` prints the report it stopped on.
|
|
40
41
|
//
|
|
@@ -54,13 +55,10 @@ const EXTRA_CITE_START = 1
|
|
|
54
55
|
// The issue reference at the tail of the title — `git -y` and `followup` read the whole string, and
|
|
55
56
|
// `run:tail` needs the number alone.
|
|
56
57
|
const TRAILING_ISSUE_PATTERN = /#([1-9]\d*)\s*$/u
|
|
57
|
-
// A follow-up citation passed as a trailing positional — a bare issue number, so a stray flag is
|
|
58
|
-
// refused rather than forwarded to the wrong step.
|
|
59
|
-
const CITE_PATTERN = /^[1-9]\d*$/u
|
|
60
58
|
// Both body forms `followup` documents, forwarded verbatim: the inline `--notify-message` and the
|
|
61
59
|
// shell-body-safe `--notify-message-file` a body naming a command or path must use (`followup.md`).
|
|
62
60
|
const NOTIFY_OPTIONS = ['notify-message', 'notify-message-file'] as const
|
|
63
|
-
//
|
|
61
|
+
// The PR body carrying the live-execution evidence `followup` gates the merge
|
|
64
62
|
// on, forwarded to `git -y` as a path because it holds commands and their output.
|
|
65
63
|
const BODY_FILE_OPTION = 'body-file'
|
|
66
64
|
const USAGE =
|
|
@@ -76,7 +74,7 @@ const OPTIONS = {
|
|
|
76
74
|
[NOTIFY_OPTIONS[1]]: { type: 'string' },
|
|
77
75
|
[BODY_FILE_OPTION]: { type: 'string' },
|
|
78
76
|
review: { type: 'boolean' },
|
|
79
|
-
//
|
|
77
|
+
// Hand the region to a detached supervisor (`run-ship-detach.ts`), print the
|
|
80
78
|
// report a stopped supervisor left, and carry follow-up citations as options so the supervisor's
|
|
81
79
|
// command line still ends with its title.
|
|
82
80
|
detach: { type: 'boolean' },
|
|
@@ -88,10 +86,13 @@ type ShipCommand = { kind: 'ship'; args: ShipArguments } | { kind: 'log'; number
|
|
|
88
86
|
|
|
89
87
|
// What a resumed ship knows before its first stage: the record's path (absent outside a repository),
|
|
90
88
|
// the stages it says completed, and the repository's actual state (`run-ship-stage.ts` decides from it).
|
|
89
|
+
// `started` opens with the stages the record says this attempt started — a supervisor that ended
|
|
90
|
+
// without a stop leaves them — and grows as each stage starts; every stage line carries it.
|
|
91
91
|
interface ShipContext {
|
|
92
92
|
target: string | undefined
|
|
93
93
|
done: ReadonlySet<string>
|
|
94
94
|
state: ShipState
|
|
95
|
+
started: Array<string>
|
|
95
96
|
}
|
|
96
97
|
|
|
97
98
|
// The notify tail `followup` takes — whichever body form the caller composed, forwarded unchanged so a
|
|
@@ -122,6 +123,8 @@ interface ParsedValues extends NotifyValues {
|
|
|
122
123
|
cite?: Array<string>
|
|
123
124
|
}
|
|
124
125
|
|
|
126
|
+
// A follow-up citation passed as a trailing positional is a bare issue number, so a stray flag is
|
|
127
|
+
// refused rather than forwarded to the wrong step.
|
|
125
128
|
function ship_args(
|
|
126
129
|
title: string,
|
|
127
130
|
rest: ReadonlyArray<string>,
|
|
@@ -130,7 +133,9 @@ function ship_args(
|
|
|
130
133
|
const number = issue_number(title)
|
|
131
134
|
const cites = [...rest, ...(values.cite ?? [])]
|
|
132
135
|
|
|
133
|
-
if (number === undefined || cites.some((token) => !
|
|
136
|
+
if (number === undefined || cites.some((token) => !issue_number_shape.is_issue_number(token))) {
|
|
137
|
+
return undefined
|
|
138
|
+
}
|
|
134
139
|
|
|
135
140
|
return {
|
|
136
141
|
title,
|
|
@@ -146,7 +151,9 @@ function ship_args(
|
|
|
146
151
|
|
|
147
152
|
// `--log <N>` stands alone: a bare issue number and nothing to ship.
|
|
148
153
|
function log_command(number: string, positionals: ReadonlyArray<string>): ShipCommand | undefined {
|
|
149
|
-
return
|
|
154
|
+
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(number) && positionals.length === 0
|
|
155
|
+
? { kind: 'log', number }
|
|
156
|
+
: undefined
|
|
150
157
|
}
|
|
151
158
|
|
|
152
159
|
function command_of(
|
|
@@ -170,15 +177,34 @@ function parse(argv: ReadonlyArray<string>): ShipCommand | undefined {
|
|
|
170
177
|
return parsed === undefined ? undefined : command_of(parsed.values, parsed.positionals)
|
|
171
178
|
}
|
|
172
179
|
|
|
180
|
+
// Every stage that ran is timed into the lane ledger, failed ones included — a stage that stopped the
|
|
181
|
+
// ship cost the lane its time as well. The append is local and best-effort, so it adds no wait.
|
|
182
|
+
//
|
|
183
|
+
// **A stage that found nothing to do is not timed**: a round 2 that was not due, a round 1 already
|
|
184
|
+
// recorded, or a gate that reused its tree's green record would otherwise read as a run that took a
|
|
185
|
+
// second and pull the stage's median to zero.
|
|
186
|
+
async function record_timed(step: Step, issue: string, elapsed_ms: number): Promise<void> {
|
|
187
|
+
await lane_ledger.record_stage({ stage: step.stage, elapsed_ms, issue: Number(issue) })
|
|
188
|
+
}
|
|
189
|
+
|
|
173
190
|
async function run_step(step: Step, args: ShipArguments, state: ShipState): Promise<ShipSection> {
|
|
191
|
+
const started_ms = performance.now()
|
|
174
192
|
const result = await step.run(args, state)
|
|
193
|
+
const elapsed_ms = performance.now() - started_ms
|
|
194
|
+
|
|
195
|
+
if (result.is_skipped !== true) await record_timed(step, args.number, elapsed_ms)
|
|
175
196
|
const section = { header: step.header, body: result.out, code: result.code }
|
|
176
197
|
|
|
177
198
|
return result.conflicts === undefined ? section : { ...section, conflicts: result.conflicts }
|
|
178
199
|
}
|
|
179
200
|
|
|
180
|
-
async function emit_phase(
|
|
181
|
-
|
|
201
|
+
async function emit_phase(
|
|
202
|
+
args: ShipArguments,
|
|
203
|
+
context: ShipContext,
|
|
204
|
+
stage: Stage,
|
|
205
|
+
phase: Phase,
|
|
206
|
+
): Promise<void> {
|
|
207
|
+
const text = run_ship_stage.event_text(args.number, stage, phase, context.started)
|
|
182
208
|
|
|
183
209
|
await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.SHIP_STAGE, text)
|
|
184
210
|
}
|
|
@@ -203,7 +229,7 @@ async function settle(
|
|
|
203
229
|
): Promise<void> {
|
|
204
230
|
const is_green = code === SUCCESS_EXIT_CODE
|
|
205
231
|
|
|
206
|
-
await emit_phase(args, step.stage, is_green ? PHASE.DONE : PHASE.FAILED)
|
|
232
|
+
await emit_phase(args, context, step.stage, is_green ? PHASE.DONE : PHASE.FAILED)
|
|
207
233
|
|
|
208
234
|
if (!is_green) return
|
|
209
235
|
|
|
@@ -219,12 +245,16 @@ async function run_stage(
|
|
|
219
245
|
context: ShipContext,
|
|
220
246
|
): Promise<ShipSection> {
|
|
221
247
|
if (run_ship_stage.is_done(step.stage, context.done, context.state, args.body.length > 0)) {
|
|
222
|
-
await emit_phase(args, step.stage, PHASE.SKIPPED)
|
|
248
|
+
await emit_phase(args, context, step.stage, PHASE.SKIPPED)
|
|
223
249
|
|
|
224
250
|
return { header: step.header, body: run_ship.SKIPPED_BODY, code: SUCCESS_EXIT_CODE }
|
|
225
251
|
}
|
|
226
252
|
|
|
227
|
-
|
|
253
|
+
context.started.push(step.stage)
|
|
254
|
+
record(context.target, (path) => {
|
|
255
|
+
run_ship_stage.mark_started(path, step.stage)
|
|
256
|
+
})
|
|
257
|
+
await emit_phase(args, context, step.stage, PHASE.START)
|
|
228
258
|
const section = await run_step(step, args, context.state)
|
|
229
259
|
|
|
230
260
|
await settle(step, args, context, section.code)
|
|
@@ -239,24 +269,28 @@ async function open_context(args: ShipArguments): Promise<ShipContext> {
|
|
|
239
269
|
])
|
|
240
270
|
|
|
241
271
|
const done = target === undefined ? new Set<string>() : run_ship_stage.read_done(target)
|
|
272
|
+
const started = target === undefined ? [] : [...run_ship_stage.read_started(target)]
|
|
242
273
|
|
|
243
|
-
return { target, done, state }
|
|
274
|
+
return { target, done, state, started }
|
|
244
275
|
}
|
|
245
276
|
|
|
246
|
-
// A detached supervisor hands the stopped stage back (`run-ship-return.ts
|
|
247
|
-
// ship in an agent's own turn has its report in front of that agent already.
|
|
277
|
+
// A detached supervisor hands the stopped stage back (`run-ship-return.ts`); a
|
|
278
|
+
// ship in an agent's own turn has its report in front of that agent already. The `ship-stop` ends the
|
|
279
|
+
// attempt, so the record's started stages go with it.
|
|
248
280
|
async function stopped(
|
|
249
281
|
sections: ReadonlyArray<ShipSection>,
|
|
250
282
|
args: ShipArguments,
|
|
251
|
-
|
|
283
|
+
step: Step,
|
|
284
|
+
context: ShipContext,
|
|
252
285
|
): Promise<ReadonlyArray<ShipSection>> {
|
|
253
286
|
if (run_ship_detach.is_supervised()) {
|
|
254
287
|
const conflicts = sections.at(-1)?.conflicts
|
|
255
288
|
const resume = run_ship_next.resume_of(args)
|
|
256
289
|
|
|
290
|
+
record(context.target, run_ship_stage.end_attempt)
|
|
257
291
|
await run_ship_return.return_control(
|
|
258
292
|
args.number,
|
|
259
|
-
stage,
|
|
293
|
+
step.stage,
|
|
260
294
|
conflicts === undefined ? resume : { ...resume, conflicts },
|
|
261
295
|
)
|
|
262
296
|
}
|
|
@@ -278,7 +312,7 @@ async function ship(args: ShipArguments): Promise<ReadonlyArray<ShipSection>> {
|
|
|
278
312
|
sections.push(section)
|
|
279
313
|
|
|
280
314
|
// eslint-disable-next-line no-await-in-loop -- stages run in order and the first failure stops the ship
|
|
281
|
-
if (section.code !== SUCCESS_EXIT_CODE) return await stopped(sections, args, step
|
|
315
|
+
if (section.code !== SUCCESS_EXIT_CODE) return await stopped(sections, args, step, context)
|
|
282
316
|
}
|
|
283
317
|
|
|
284
318
|
record(context.target, (path) => {
|
|
@@ -321,7 +355,7 @@ async function detach(args: ShipArguments): Promise<number> {
|
|
|
321
355
|
return result.verdict === run_ship_detach.LAUNCHED ? SUCCESS_EXIT_CODE : FAILURE_EXIT_CODE
|
|
322
356
|
}
|
|
323
357
|
|
|
324
|
-
//
|
|
358
|
+
// A headless lane child's turn ending kills a ship it left in its own process,
|
|
325
359
|
// so inside a lane child the region always goes to the supervisor, flag or not. The supervisor itself
|
|
326
360
|
// inherits the lane mark, and is the one ship that must run the stages here.
|
|
327
361
|
function should_detach(args: ShipArguments): boolean {
|
|
@@ -330,11 +364,11 @@ function should_detach(args: ShipArguments): boolean {
|
|
|
330
364
|
return !run_ship_detach.is_supervised() && lane_child_marker.is_child_of(process.cwd())
|
|
331
365
|
}
|
|
332
366
|
|
|
333
|
-
//
|
|
334
|
-
//
|
|
335
|
-
//
|
|
336
|
-
//
|
|
337
|
-
//
|
|
367
|
+
// The preflight is deterministic and fast, so it runs here, in the agent's own turn, before the
|
|
368
|
+
// hand-off — a stop it finds is fixed by the same session instead of relaunching one from the
|
|
369
|
+
// supervisor. Only the slow stages go to the supervisor, which re-asks the preflight itself. The type
|
|
370
|
+
// check and the document tests follow it here for the same reason; they are not a stage, so the
|
|
371
|
+
// supervisor's gate runs them again rather than passing over them.
|
|
338
372
|
async function pre_detach_sections(args: ShipArguments): Promise<ReadonlyArray<ShipSection>> {
|
|
339
373
|
const preflight = await run_stage(run_ship_steps.PREFLIGHT_STEP, args, await open_context(args))
|
|
340
374
|
if (preflight.code !== SUCCESS_EXIT_CODE) return [preflight]
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto'
|
|
2
2
|
import { setTimeout as sleep } from 'node:timers/promises'
|
|
3
3
|
import { agent_role_profile } from '#scripts/agent/agent-role-profile'
|
|
4
|
+
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
5
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
4
6
|
import { process_identity } from '#scripts/josh/process-identity'
|
|
5
7
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
8
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
6
9
|
import { detached_launch, type LaunchArgv } from '#scripts/run/detached-launch'
|
|
7
10
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
8
11
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
9
12
|
import { z } from 'zod'
|
|
10
13
|
|
|
11
|
-
// `josh ship --detach` — hand the post-implementation region to a supervisor that outlives the agent
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// and the wake role it billed was 59.8% of a run's wall time. This starts `josh ship` itself as a
|
|
15
|
-
// detached process instead, so the agent ends at the hand-off and nothing but the mechanical region runs.
|
|
14
|
+
// `josh ship --detach` — hand the post-implementation region to a supervisor that outlives the agent.
|
|
15
|
+
// This starts `josh ship` itself as a detached process, so the agent ends at the hand-off and nothing
|
|
16
|
+
// but the mechanical region runs.
|
|
16
17
|
//
|
|
17
18
|
// **The supervisor's command line ends with the `"<title> #<N>"` title**, which is what the parent's
|
|
18
19
|
// liveness pattern (`lane-child-invocation.ts`) anchors on — so a lane whose agent has ended is still
|
|
@@ -24,7 +25,7 @@ import { z } from 'zod'
|
|
|
24
25
|
// while that process is alive is refused `busy`: two supervisors would race each other's commit and
|
|
25
26
|
// merge, which the resume record (`run-ship-stage.ts`) orders but cannot serialize.
|
|
26
27
|
//
|
|
27
|
-
// **The supervisor names itself once it starts
|
|
28
|
+
// **The supervisor names itself once it starts**. The launcher reads the child's
|
|
28
29
|
// start time from outside, which a sandbox that refuses `ps` cannot answer; a pid with no start time
|
|
29
30
|
// would then be believed for as long as any process holds that number. The supervisor therefore claims
|
|
30
31
|
// the record with its own identity — whose socket beacon answers where `ps` cannot — and a record still
|
|
@@ -114,11 +115,8 @@ function result_path(repository: string, number: string): string {
|
|
|
114
115
|
function read_record(repository: string, number: string): ShipRecord | undefined {
|
|
115
116
|
try {
|
|
116
117
|
const raw = stamp_file.read_stamp_text(result_path(repository, number))
|
|
117
|
-
if (raw === undefined) return undefined
|
|
118
|
-
const value: unknown = JSON.parse(raw)
|
|
119
|
-
const parsed = ship_record_schema.safeParse(value)
|
|
120
118
|
|
|
121
|
-
return
|
|
119
|
+
return raw === undefined ? undefined : json_value.parse_with(raw, ship_record_schema)
|
|
122
120
|
} catch {
|
|
123
121
|
return undefined
|
|
124
122
|
}
|
|
@@ -291,7 +289,7 @@ function launch(request: DetachRequest): DetachResult {
|
|
|
291
289
|
cwd: request.cwd,
|
|
292
290
|
log_path: log,
|
|
293
291
|
// The provider travels as a mark because the launch strips the session keys that name it, and
|
|
294
|
-
// `ship --review` resolves its reviewer from it
|
|
292
|
+
// `ship --review` resolves its reviewer from it.
|
|
295
293
|
env: supervisor_environment(launch_id),
|
|
296
294
|
},
|
|
297
295
|
(note) => {
|
|
@@ -299,6 +297,7 @@ function launch(request: DetachRequest): DetachResult {
|
|
|
299
297
|
},
|
|
300
298
|
)
|
|
301
299
|
|
|
300
|
+
agent_role_profile.warn_of_default()
|
|
302
301
|
if (result.kind === 'failed') return failed_launch(request, result.note)
|
|
303
302
|
|
|
304
303
|
record_launch(request, result.pid, launch_id)
|
|
@@ -311,7 +310,10 @@ function launch(request: DetachRequest): DetachResult {
|
|
|
311
310
|
|
|
312
311
|
async function detach(request: DetachRequest): Promise<DetachResult> {
|
|
313
312
|
if (read_result(request.repository, request.number)?.result === 'running') {
|
|
314
|
-
return {
|
|
313
|
+
return {
|
|
314
|
+
verdict: BUSY,
|
|
315
|
+
note: `a ship supervisor for ${session_cite.issue(request.number)} is already running`,
|
|
316
|
+
}
|
|
315
317
|
}
|
|
316
318
|
|
|
317
319
|
const result = launch(request)
|
|
@@ -319,7 +321,7 @@ async function detach(request: DetachRequest): Promise<DetachResult> {
|
|
|
319
321
|
if (result.verdict === LAUNCHED) {
|
|
320
322
|
await run_event_stream_emit.emit(
|
|
321
323
|
run_event_stream.EVENT_KIND.SHIP_LAUNCH,
|
|
322
|
-
|
|
324
|
+
`${issue_cite.plain(request.number)} ship supervisor launched`,
|
|
323
325
|
)
|
|
324
326
|
}
|
|
325
327
|
|
|
@@ -4,7 +4,7 @@ import { stripVTControlCharacters } from 'node:util'
|
|
|
4
4
|
import { buffered_process } from '#scripts/lib/buffered-process'
|
|
5
5
|
import { INSTALL_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
6
6
|
|
|
7
|
-
// A lock file that no longer matches its inputs, asked before the gate
|
|
7
|
+
// A lock file that no longer matches its inputs, asked before the gate.
|
|
8
8
|
//
|
|
9
9
|
// The pre-push hook's setup runs `pnpm install`, which rewrites a lock that has drifted — a
|
|
10
10
|
// `.pnpmfile.mjs` edit moves `pnpmfileChecksum` — and so leaves the working tree dirty under the push.
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { run_ship_stage, type Stage } from './run-ship-stage'
|
|
2
2
|
import type { ShipArguments } from './run-ship-steps'
|
|
3
3
|
|
|
4
|
-
// The command a relaunched lane child runs once it has fixed what stopped its detached ship
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// procedure; `ship-stop-prompt-document-rule.test.ts` holds every command below to it.
|
|
4
|
+
// The command a relaunched lane child runs once it has fixed what stopped its detached ship.
|
|
5
|
+
// The stopped stage decides the command mechanically, so it is decided here, once, and the prompt
|
|
6
|
+
// carries it rather than each relaunched session re-deriving it. `chain-rule.md` step 0 stays the
|
|
7
|
+
// single source of the procedure; `ship-stop-prompt-document-rule.test.ts` holds every command below
|
|
8
|
+
// to it.
|
|
10
9
|
//
|
|
11
10
|
// The fix is left uncommitted on purpose: a dirty tree reads as not committed
|
|
12
11
|
// (`run-ship-probe.ts`), so a re-detached ship runs the gate and the commit again on the fixed tree
|
|
@@ -42,7 +41,7 @@ interface ShipResume {
|
|
|
42
41
|
title: string
|
|
43
42
|
flags: ReadonlyArray<string>
|
|
44
43
|
is_review: boolean
|
|
45
|
-
// The paths a merge of the default branch left unmerged
|
|
44
|
+
// The paths a merge of the default branch left unmerged.
|
|
46
45
|
conflicts?: ReadonlyArray<string>
|
|
47
46
|
}
|
|
48
47
|
|
|
@@ -99,7 +98,7 @@ const AFTER_FIX: Record<Stage, (resume: ShipResume) => string> = {
|
|
|
99
98
|
[STAGE.REPORT]: detach_again,
|
|
100
99
|
}
|
|
101
100
|
|
|
102
|
-
// A conflict names its paths
|
|
101
|
+
// A conflict names its paths, so the resumed session resolves them without
|
|
103
102
|
// reading the report or asking git which files are unmerged.
|
|
104
103
|
function conflict_step(conflicts: ReadonlyArray<string>): string {
|
|
105
104
|
return `Resolve the conflict with origin/main in ${conflicts.join(', ')} (the merge is left in progress: remove the conflict markers in those files), then`
|
|
@@ -1,24 +1,30 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
|
+
import { project_checks } from '#scripts/gate/project-checks'
|
|
3
4
|
import { type_check_step } from '#scripts/gate/type-check-step'
|
|
4
5
|
import type { JoshResult } from '#scripts/josh/josh-run'
|
|
5
6
|
import { buffered_process, type BufferedProcessResult } from '#scripts/lib/buffered-process'
|
|
6
7
|
|
|
7
8
|
// The fast checks a detached `josh ship` runs in the agent's own turn, after the preflight and before
|
|
8
|
-
// the hand-off
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
// stage still runs every check, these included.
|
|
9
|
+
// the hand-off: a type error in a file the related-only checks never touched, or a document test (a
|
|
10
|
+
// SKILL.md pointer, a byte budget, the command list) that only the full suite runs, would otherwise
|
|
11
|
+
// first surface after the detach and cost a relaunched session. These two answer in seconds, so the
|
|
12
|
+
// same session fixes what they find and ships again. **Nothing moves out of the gate**: the
|
|
13
|
+
// supervised gate stage still runs every check, these included.
|
|
14
14
|
//
|
|
15
|
-
// The test targets are the directories
|
|
15
|
+
// The test targets are the directories such failures land in. A consumer has none of them, so only
|
|
16
16
|
// the ones present run, and a consumer meets the type check alone.
|
|
17
|
+
//
|
|
18
|
+
// In kit the metrics ratchet's totals join them: a feature grows a total almost every time, and here
|
|
19
|
+
// the session that grew the total writes the reason itself rather than a relaunched one. The
|
|
20
|
+
// durations are left out: they read the gate ledger, stale before the detach, so they stay with the
|
|
21
|
+
// supervised gate.
|
|
17
22
|
|
|
18
23
|
const SUCCESS_EXIT_CODE = 0
|
|
19
24
|
const FAILURE_EXIT_CODE = 1
|
|
20
25
|
const SECTION_SEPARATOR = '\n\n'
|
|
21
|
-
const PASSED = '
|
|
26
|
+
const PASSED = 'pre-detach checks passed'
|
|
27
|
+
const METRICS_TOTALS_COMMAND: ReadonlyArray<string> = ['josh', 'metrics', '--totals-only']
|
|
22
28
|
const DOCUMENT_TEST_TARGETS: ReadonlyArray<string> = [
|
|
23
29
|
'scripts/document',
|
|
24
30
|
'scripts/claude',
|
|
@@ -33,11 +39,21 @@ function present_targets(directory: string): ReadonlyArray<string> {
|
|
|
33
39
|
return DOCUMENT_TEST_TARGETS.filter((target) => existsSync(path.join(directory, target)))
|
|
34
40
|
}
|
|
35
41
|
|
|
42
|
+
function document_tests(directory: string): Array<ReadonlyArray<string>> {
|
|
43
|
+
const targets = present_targets(directory)
|
|
44
|
+
|
|
45
|
+
return targets.length === 0 ? [] : [[...DOCUMENT_TEST_COMMAND, ...targets]]
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// The same kit-only rule as the gate's `is_kit_only` step: a consumer's kit has no `josh metrics`.
|
|
49
|
+
function kit_only(directory: string): Array<ReadonlyArray<string>> {
|
|
50
|
+
return project_checks.is_kit_repository(directory) ? [METRICS_TOTALS_COMMAND] : []
|
|
51
|
+
}
|
|
52
|
+
|
|
36
53
|
async function command_lists(directory: string): Promise<Array<ReadonlyArray<string>>> {
|
|
37
54
|
const type_check = await type_check_step.resolve_type_check_args(directory)
|
|
38
|
-
const targets = present_targets(directory)
|
|
39
55
|
|
|
40
|
-
return
|
|
56
|
+
return [type_check, ...document_tests(directory), ...kit_only(directory)]
|
|
41
57
|
}
|
|
42
58
|
|
|
43
59
|
async function run_in(
|
|
@@ -61,6 +77,6 @@ async function checks(directory: string = process.cwd()): Promise<JoshResult> {
|
|
|
61
77
|
}
|
|
62
78
|
}
|
|
63
79
|
|
|
64
|
-
const run_ship_pre_detach = { DOCUMENT_TEST_TARGETS, PASSED, checks }
|
|
80
|
+
const run_ship_pre_detach = { DOCUMENT_TEST_TARGETS, METRICS_TOTALS_COMMAND, PASSED, checks }
|
|
65
81
|
|
|
66
82
|
export { run_ship_pre_detach }
|
|
@@ -10,11 +10,10 @@ import { live_evidence } from '#scripts/review/live-evidence'
|
|
|
10
10
|
import { run_ship_lock } from './run-ship-lock'
|
|
11
11
|
import { run_ship_scoped } from './run-ship-scoped'
|
|
12
12
|
|
|
13
|
-
// `josh ship`'s first stage
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
// and all of them are reported at once.** No check is new: the classification, issue and branch answers
|
|
13
|
+
// `josh ship`'s first stage. The commit stage (`git -y`'s preflight) and the merge (`followup`'s
|
|
14
|
+
// live-evidence refusal) run after the review and the gate, so a stop there would repeat them.
|
|
15
|
+
// **Every precondition decidable before the review is asked here, and all of them are reported at
|
|
16
|
+
// once.** No check is new: the classification, issue and branch answers
|
|
18
17
|
// are `git_preflight.problems_of`, and the evidence answer is `live_evidence.verdict_for` over the same
|
|
19
18
|
// changed paths and the body this ship will deliver — `--body-file` when given, else the open PR's.
|
|
20
19
|
//
|
|
@@ -23,8 +22,8 @@ import { run_ship_scoped } from './run-ship-scoped'
|
|
|
23
22
|
|
|
24
23
|
const SUCCESS_EXIT_CODE = 0
|
|
25
24
|
const FAILURE_EXIT_CODE = 1
|
|
26
|
-
const EVIDENCE_PROBLEM = `This change touches runtime code, but the PR body has no ${live_evidence.EVIDENCE_HEADING} section: run the acceptance criteria for real and pass the body with --body-file <path
|
|
27
|
-
const EVIDENCE_PENDING = `This change touches runtime code and no PR is open yet: write the ${live_evidence.EVIDENCE_HEADING} section to a file and hand it to josh ship with --body-file <path>, or the ship refuses
|
|
25
|
+
const EVIDENCE_PROBLEM = `This change touches runtime code, but the PR body has no ${live_evidence.EVIDENCE_HEADING} section: run the acceptance criteria for real and pass the body with --body-file <path>. Write it ${live_evidence.EVIDENCE_FORMAT}`
|
|
26
|
+
const EVIDENCE_PENDING = `This change touches runtime code and no PR is open yet: write the ${live_evidence.EVIDENCE_HEADING} section to a file and hand it to josh ship with --body-file <path>, or the ship refuses. Write it ${live_evidence.EVIDENCE_FORMAT}`
|
|
28
27
|
|
|
29
28
|
interface PreflightRequest {
|
|
30
29
|
title: string
|
|
@@ -72,7 +71,7 @@ async function caught(problems: Promise<Array<string>>): Promise<Array<string>>
|
|
|
72
71
|
}
|
|
73
72
|
}
|
|
74
73
|
|
|
75
|
-
// The lock file is asked here too
|
|
74
|
+
// The lock file is asked here too, so a drift stops the ship before the gate
|
|
76
75
|
// rather than being rewritten by the pre-push hook's install under the push.
|
|
77
76
|
async function asked_problems(request: PreflightRequest): Promise<Array<string>> {
|
|
78
77
|
const [preflight, evidence, lock] = await Promise.all([
|
|
@@ -100,9 +99,9 @@ async function classification_problems(issue_number: string): Promise<Array<stri
|
|
|
100
99
|
return []
|
|
101
100
|
}
|
|
102
101
|
|
|
103
|
-
// **The same two refusals, asked before the ship rather than by it
|
|
104
|
-
//
|
|
105
|
-
//
|
|
102
|
+
// **The same two refusals, asked before the ship rather than by it**: a missing
|
|
103
|
+
// classification or missing evidence is known long before the ship, yet refused there at the run's
|
|
104
|
+
// largest context. `run:prep` (and so `run:entry`)
|
|
106
105
|
// and `run:step` print this, so the Issue body and the evidence are met while they are cheap. Nothing
|
|
107
106
|
// here replaces `stage`: the ship and `followup` still refuse on both. Before the PR exists the evidence
|
|
108
107
|
// can only live in the file the ship will be handed, so it is asked for as that file, not reported as a
|
|
@@ -5,9 +5,9 @@ import { run_hold } from '#scripts/run/hold/run-hold'
|
|
|
5
5
|
import { run_preflight } from '#scripts/run/run-preflight'
|
|
6
6
|
import { run_ship_stage, type ShipState } from './run-ship-stage'
|
|
7
7
|
|
|
8
|
-
// The read side of a resumed `josh ship
|
|
9
|
-
//
|
|
10
|
-
//
|
|
8
|
+
// The read side of a resumed `josh ship`: the repository's actual state, asked before any stage runs,
|
|
9
|
+
// and where the stage record lives. `run-ship-stage.ts` decides from what this reads; this module
|
|
10
|
+
// only reads.
|
|
11
11
|
//
|
|
12
12
|
// **Every read that cannot complete answers `false`** — "not done yet" — so the stage runs and its own
|
|
13
13
|
// guard answers instead: `git -y` refuses an empty commit, a push of a commit origin already holds
|
|
@@ -82,7 +82,7 @@ async function read_state(): Promise<ShipState> {
|
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
// The common git directory every lane of the repository shares — what the stage record, the detached
|
|
85
|
-
// supervisor's log and its pid are keyed on
|
|
85
|
+
// supervisor's log and its pid are keyed on — or `undefined` outside one.
|
|
86
86
|
async function repository_directory(): Promise<string | undefined> {
|
|
87
87
|
try {
|
|
88
88
|
const directories = await git_command.git_directories()
|
|
@@ -9,7 +9,7 @@ import type { ShipResume } from './run-ship-next'
|
|
|
9
9
|
import { run_ship_stage, type Stage } from './run-ship-stage'
|
|
10
10
|
import { run_ship_stop_text } from './run-ship-stop-text'
|
|
11
11
|
|
|
12
|
-
// How a detached `josh ship` supervisor hands a stopped stage back
|
|
12
|
+
// How a detached `josh ship` supervisor hands a stopped stage back. The agent
|
|
13
13
|
// ended when it handed the region over, so a red gate, a High/Medium review, a failed push or red CI has
|
|
14
14
|
// nobody to read it — this is what gives it one, in two halves:
|
|
15
15
|
//
|