@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
|
@@ -3,8 +3,8 @@ import { fileURLToPath } from 'node:url'
|
|
|
3
3
|
import { backlog_stalled } from './backlog-stalled'
|
|
4
4
|
import { backlog_stalled_detect } from './backlog-stalled-detect'
|
|
5
5
|
|
|
6
|
-
// `josh backlog:stalled` — read the three conditions once and print the verdict
|
|
7
|
-
//
|
|
6
|
+
// `josh backlog:stalled` — read the three conditions once and print the verdict.
|
|
7
|
+
// This is the manual and testable face of the detector `stop-guard.ts` runs
|
|
8
8
|
// on every stop; both call the one `detect_and_report`, so the command and the hook can never drift.
|
|
9
9
|
//
|
|
10
10
|
// **It reports, it never stops.** The exit code is always success — a stall is a state to surface, not
|
|
@@ -4,7 +4,7 @@ import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
|
4
4
|
import { backlog_ready, type ReadyPorts } from './backlog-ready'
|
|
5
5
|
import { backlog_stalled, type StallReading, type StallVerdict } from './backlog-stalled'
|
|
6
6
|
|
|
7
|
-
// The I/O half of the stall detector
|
|
7
|
+
// The I/O half of the stall detector: it gathers the three counts the pure
|
|
8
8
|
// judge in `backlog-stalled.ts` weighs, then — on a stall — leaves the marker and sends the one
|
|
9
9
|
// notification. `stop-guard.ts` wires it into the Stop hook, so it runs at each loop boundary; the CLI
|
|
10
10
|
// exposes the same call for a person to run by hand.
|
|
@@ -37,8 +37,8 @@ interface DetectPorts {
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
// The free-lane and runnable-issue reads are `backlog-ready.ts`'s — the watcher's ready line reads the
|
|
40
|
-
// same two, so they live once there
|
|
41
|
-
// this check hands its own ports in, so the two share one reading
|
|
40
|
+
// same two, so they live once there — and a caller that reads them again after
|
|
41
|
+
// this check hands its own ports in, so the two share one reading.
|
|
42
42
|
function ready_count_of(ready: ReadyPorts): () => Promise<number> {
|
|
43
43
|
return async function (): Promise<number> {
|
|
44
44
|
const issues = await ready.ready_issues()
|
|
@@ -48,7 +48,7 @@ function ready_count_of(ready: ReadyPorts): () => Promise<number> {
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
// One stall per episode, and the episode ends at a dispatch rather than at whatever event lands next
|
|
51
|
-
//
|
|
51
|
+
// — every parallel lane appends to this stream, so a newest-event dedup re-fired.
|
|
52
52
|
async function real_emit_stall(text: string): Promise<boolean> {
|
|
53
53
|
const { STALL, CHILD_LAUNCH } = run_event_stream.EVENT_KIND
|
|
54
54
|
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { epic_triage } from '#scripts/epic/epic-triage'
|
|
2
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
2
3
|
import { run_event_stream, type RunEvent } from '#scripts/run/event/run-event-stream'
|
|
3
4
|
|
|
4
|
-
// When ready backlog work sits undispatched while lanes are free, nobody notices until a person asks
|
|
5
|
-
//
|
|
5
|
+
// When ready backlog work sits undispatched while lanes are free, nobody notices until a person asks.
|
|
6
|
+
// This is the mechanical judge of that state: three facts read, never
|
|
6
7
|
// weighed — is there runnable work, is there a free lane, and has nothing been dispatched for a while.
|
|
7
8
|
// The verdict is a report, not a stop: a false positive costs one notification, never a halted run.
|
|
8
9
|
//
|
|
@@ -86,8 +87,6 @@ function describe(reading: StallReading): string {
|
|
|
86
87
|
return `${String(reading.ready_count)} ready, ${String(reading.free_lanes)} free lane(s), ${String(minutes)}m since the last dispatch`
|
|
87
88
|
}
|
|
88
89
|
|
|
89
|
-
const NUMERIC_TOKEN = /^\d+$/u
|
|
90
|
-
|
|
91
90
|
// The runnable issue numbers `backlog:next` printed: one token per line, a bare number per runnable
|
|
92
91
|
// issue and a verdict word (`wait`, `stop`, …) when there is none — so the numeric lines are the ready
|
|
93
92
|
// issues.
|
|
@@ -95,14 +94,14 @@ function ready_tokens(out: string): ReadonlyArray<string> {
|
|
|
95
94
|
return out
|
|
96
95
|
.split('\n')
|
|
97
96
|
.map((token) => token.trim())
|
|
98
|
-
.filter((token) =>
|
|
97
|
+
.filter((token) => issue_number_shape.is_issue_number(token))
|
|
99
98
|
}
|
|
100
99
|
|
|
101
100
|
function count_ready_tokens(out: string): number {
|
|
102
101
|
return ready_tokens(out).length
|
|
103
102
|
}
|
|
104
103
|
|
|
105
|
-
// Whether `backlog:next` answered `triage
|
|
104
|
+
// Whether `backlog:next` answered `triage`: no number is runnable, yet a session
|
|
106
105
|
// has work — judging the untriaged issues — so a reader of the numeric lines alone would take it for an
|
|
107
106
|
// empty pool.
|
|
108
107
|
function needs_triage(out: string): boolean {
|
|
@@ -12,16 +12,16 @@ import {
|
|
|
12
12
|
import { backlog_plan, type PlanContext } from './backlog-plan'
|
|
13
13
|
import { backlog_rank, type GateScope } from './backlog-rank'
|
|
14
14
|
|
|
15
|
-
// The order a `backlogrun` takes, wave by wave, before it starts
|
|
15
|
+
// The order a `backlogrun` takes, wave by wave, before it starts.
|
|
16
16
|
//
|
|
17
17
|
// `backlog:next` answers one ask — what may start now — and `backlog:plan` shows the pool that ask is
|
|
18
18
|
// made from, so the order past the first answer was left for a person to work out by hand. This plays
|
|
19
19
|
// the asks forward under one assumption: **every issue of a wave merges before the next wave starts**.
|
|
20
20
|
//
|
|
21
21
|
// **No rule is written twice.** The first wave is `backlog_rank.select` — rank, `run:solo` gate,
|
|
22
|
-
//
|
|
22
|
+
// overlap separation, cap —
|
|
23
23
|
// over the very candidates `backlog:next` resolves, asked of an idle repository — so it is what
|
|
24
|
-
// `backlog:next` prints when nothing is running
|
|
24
|
+
// `backlog:next` prints when nothing is running. Each later wave marks the earlier waves closed and re-classifies the same pool
|
|
25
25
|
// through `epic_classify.classify_children` with the resolver `epic:next` sorted it with the first
|
|
26
26
|
// time — `epic_cross_repo.resolve_cross_repo`, so a blocker in another repository still waits for its
|
|
27
27
|
// release rather than counting as done on close — then puts the runnable set through
|
|
@@ -109,7 +109,7 @@ function next_wave(pool: WavePool, done: ReadonlySet<string>): ReadonlyArray<Epi
|
|
|
109
109
|
|
|
110
110
|
// Each wave is closed before the next is asked for; a wave that offers nothing ends the plan, which
|
|
111
111
|
// the pool's size bounds because every wave closes at least one child. `scope` names the rows the
|
|
112
|
-
// offer's cap bounds and the paths each issue
|
|
112
|
+
// offer's cap bounds and the paths each issue declares; left empty, no wave is capped or separated.
|
|
113
113
|
function build(result: EpicNextResult, repo: string, scope: GateScope = EMPTY_SCOPE): WavePlan {
|
|
114
114
|
const pool = pool_of(result, repo, scope)
|
|
115
115
|
const done = new Set<string>()
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { AgentProvider } from '#scripts/agent/agent-role-profile'
|
|
2
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
3
|
+
import { run_invocation } from '#scripts/run/run-invocation'
|
|
4
|
+
|
|
5
|
+
// `josh backlogrun`'s arguments. `--agent claude|codex` picks the agent the run
|
|
6
|
+
// is started in; everything else is the `backlogrun` invocation itself, read by `run-invocation.ts`'s
|
|
7
|
+
// grammar — the one the carry record and the woken session read — so the launcher accepts exactly what a
|
|
8
|
+
// typed `backlogrun` would carry, and the text the agent is handed is the grammar's rebuild of it.
|
|
9
|
+
//
|
|
10
|
+
// **A bare number is an issue.** A shell reads an unquoted `#3437` as a comment, so `3437` in the named
|
|
11
|
+
// list is taken as `#3437`; a number after the first flag is that flag's value and is left alone.
|
|
12
|
+
|
|
13
|
+
const AGENT_FLAG = '--agent'
|
|
14
|
+
const BACKLOG_COMMAND = 'backlogrun'
|
|
15
|
+
const ISSUE_PREFIX = '#'
|
|
16
|
+
const FLAG_PREFIX = '-'
|
|
17
|
+
const NOT_FOUND = -1
|
|
18
|
+
const FLAG_AND_VALUE = 2
|
|
19
|
+
const AGENTS: Readonly<Record<string, AgentProvider>> = { claude: 'anthropic', codex: 'openai' }
|
|
20
|
+
const DEFAULT_AGENT = 'claude'
|
|
21
|
+
|
|
22
|
+
interface BacklogrunArguments {
|
|
23
|
+
provider: AgentProvider
|
|
24
|
+
// The canonical `backlogrun …` text the agent is started with.
|
|
25
|
+
invocation: string
|
|
26
|
+
issues: ReadonlyArray<number>
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
type ArgumentsResult = { kind: 'args'; args: BacklogrunArguments } | { kind: 'refused' }
|
|
30
|
+
|
|
31
|
+
interface AgentSplit {
|
|
32
|
+
agent: string | undefined
|
|
33
|
+
rest: ReadonlyArray<string>
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// `--agent` and its value out of the list; a second `--agent` stays in and the grammar refuses it.
|
|
37
|
+
function split_agent(argv: ReadonlyArray<string>): AgentSplit {
|
|
38
|
+
const at = argv.indexOf(AGENT_FLAG)
|
|
39
|
+
|
|
40
|
+
if (at === NOT_FOUND) return { agent: DEFAULT_AGENT, rest: argv }
|
|
41
|
+
|
|
42
|
+
const after = at + FLAG_AND_VALUE
|
|
43
|
+
|
|
44
|
+
return { agent: argv[at + 1], rest: [...argv.slice(0, at), ...argv.slice(after)] }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function issue_token(token: string): string {
|
|
48
|
+
return issue_number_shape.ISSUE_NUMBER_PATTERN.test(token) ? `${ISSUE_PREFIX}${token}` : token
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// The named list is the leading block before the first flag, as the grammar reads it.
|
|
52
|
+
function normalized(rest: ReadonlyArray<string>): Array<string> {
|
|
53
|
+
const stop = rest.findIndex((token) => token.startsWith(FLAG_PREFIX))
|
|
54
|
+
const split_at = stop === NOT_FOUND ? rest.length : stop
|
|
55
|
+
|
|
56
|
+
return [...rest.slice(0, split_at).map((token) => issue_token(token)), ...rest.slice(split_at)]
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function parse(argv: ReadonlyArray<string>): ArgumentsResult {
|
|
60
|
+
const { agent, rest } = split_agent(argv)
|
|
61
|
+
const provider = agent === undefined ? undefined : AGENTS[agent]
|
|
62
|
+
const invocation = run_invocation.rebuild([BACKLOG_COMMAND, ...normalized(rest)].join(' '))
|
|
63
|
+
|
|
64
|
+
if (provider === undefined || invocation === undefined) return { kind: 'refused' }
|
|
65
|
+
|
|
66
|
+
const issues = run_invocation.issue_numbers(invocation) ?? []
|
|
67
|
+
|
|
68
|
+
return { kind: 'args', args: { provider, invocation, issues } }
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const backlogrun_args = { parse }
|
|
72
|
+
|
|
73
|
+
export type { BacklogrunArguments }
|
|
74
|
+
export { backlogrun_args }
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { josh_environment_file } from '#scripts/josh/josh-environment-file'
|
|
5
|
+
import { run_board_cli } from '#scripts/run/board/run-board-cli'
|
|
6
|
+
import { run_carry } from '#scripts/run/carry/run-carry'
|
|
7
|
+
import { backlogrun_args, type BacklogrunArguments } from './backlogrun-args'
|
|
8
|
+
import { backlogrun_launch, type LaunchTarget, type StartResult } from './backlogrun-launch'
|
|
9
|
+
|
|
10
|
+
// `josh backlogrun` — start a `backlogrun` from the terminal and watch it. A
|
|
11
|
+
// run already going is never joined by a second one: the board is shown, and any issue named is pointed
|
|
12
|
+
// at `run:add` rather than added behind the person's back. Otherwise the agent is started in the
|
|
13
|
+
// background, its output to a log file, and the board takes over the terminal at once. Closing the
|
|
14
|
+
// board closes only the board.
|
|
15
|
+
|
|
16
|
+
const ARGV_OFFSET = 2
|
|
17
|
+
const FAILURE_EXIT_CODE = 1
|
|
18
|
+
const USAGE =
|
|
19
|
+
'Usage: josh backlogrun [#<n>...] [--only] [--max <n>] [--idle <minutes>] [--agent claude|codex]'
|
|
20
|
+
|
|
21
|
+
interface BacklogrunPorts {
|
|
22
|
+
repository_directory: () => Promise<string | undefined>
|
|
23
|
+
is_running: (git_directory: string) => boolean
|
|
24
|
+
start: (args: BacklogrunArguments, target: LaunchTarget) => StartResult
|
|
25
|
+
show_board: () => Promise<number>
|
|
26
|
+
write: (line: string) => void
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const LIVE_PORTS: BacklogrunPorts = {
|
|
30
|
+
repository_directory: run_carry.repository_directory,
|
|
31
|
+
is_running: backlogrun_launch.is_running,
|
|
32
|
+
start: (args, target) => backlogrun_launch.start(args.invocation, args.provider, target),
|
|
33
|
+
show_board: async () => await run_board_cli.run([]),
|
|
34
|
+
write: (line) => process.stdout.write(`${line}\n`),
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function running_notes(issues: ReadonlyArray<number>): Array<string> {
|
|
38
|
+
const additions = issues.map((issue) => ` pnpm josh run:add ${String(issue)}`)
|
|
39
|
+
const guidance = additions.length > 0 ? ['To add the named issues to it:', ...additions] : []
|
|
40
|
+
|
|
41
|
+
return ['backlogrun: a run is already going; showing its board.', ...guidance]
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function launched_note(result: Extract<StartResult, { kind: 'launched' }>): string {
|
|
45
|
+
const { pid, session, log_path } = result.launched
|
|
46
|
+
const session_part = session === undefined ? '' : `, session ${session}`
|
|
47
|
+
|
|
48
|
+
return `backlogrun: started (pid ${String(pid)}${session_part}); log ${log_path}`
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// The agent starts in the main checkout, the parent of the common git directory every record is keyed on.
|
|
52
|
+
function target_of(git_directory: string): LaunchTarget {
|
|
53
|
+
return { worktree: path.dirname(git_directory), git_directory }
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function begin(
|
|
57
|
+
args: BacklogrunArguments,
|
|
58
|
+
git_directory: string,
|
|
59
|
+
ports: BacklogrunPorts,
|
|
60
|
+
): Promise<number> {
|
|
61
|
+
if (ports.is_running(git_directory)) {
|
|
62
|
+
for (const note of running_notes(args.issues)) ports.write(note)
|
|
63
|
+
|
|
64
|
+
return await ports.show_board()
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const result = ports.start(args, target_of(git_directory))
|
|
68
|
+
|
|
69
|
+
if (result.kind === 'failed') {
|
|
70
|
+
ports.write(`backlogrun: could not start: ${result.note}`)
|
|
71
|
+
|
|
72
|
+
return FAILURE_EXIT_CODE
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
ports.write(launched_note(result))
|
|
76
|
+
|
|
77
|
+
return await ports.show_board()
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async function run(
|
|
81
|
+
argv: ReadonlyArray<string>,
|
|
82
|
+
ports: BacklogrunPorts = LIVE_PORTS,
|
|
83
|
+
): Promise<number> {
|
|
84
|
+
const parsed = backlogrun_args.parse(argv)
|
|
85
|
+
|
|
86
|
+
if (parsed.kind === 'refused') {
|
|
87
|
+
ports.write(USAGE)
|
|
88
|
+
|
|
89
|
+
return FAILURE_EXIT_CODE
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const git_directory = await ports.repository_directory()
|
|
93
|
+
|
|
94
|
+
if (git_directory === undefined) {
|
|
95
|
+
ports.write('backlogrun: not inside a git repository')
|
|
96
|
+
|
|
97
|
+
return FAILURE_EXIT_CODE
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return await begin(parsed.args, git_directory, ports)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const backlogrun_cli = { run }
|
|
104
|
+
|
|
105
|
+
// `.env` is read inside the guard, as `run:board` reads it, so the board draws in the person's
|
|
106
|
+
// `JOSH_SESSION_LANG` while the unit tests see no developer's `.env`.
|
|
107
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
108
|
+
josh_environment_file.load_environment_file()
|
|
109
|
+
process.exitCode = await run(process.argv.slice(ARGV_OFFSET))
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export type { BacklogrunPorts }
|
|
113
|
+
export { backlogrun_cli }
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto'
|
|
2
|
+
import { agent_argv, type AgentArgvResult } from '#scripts/agent/agent-argv'
|
|
3
|
+
import {
|
|
4
|
+
agent_role_profile,
|
|
5
|
+
type AgentEnvironment,
|
|
6
|
+
type AgentProvider,
|
|
7
|
+
} from '#scripts/agent/agent-role-profile'
|
|
8
|
+
import { agent_session_environment } from '#scripts/josh/agent-session-environment'
|
|
9
|
+
import { process_identity } from '#scripts/josh/process-identity'
|
|
10
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
11
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
12
|
+
import { run_carry, type CarryRead } from '#scripts/run/carry/run-carry'
|
|
13
|
+
import { detached_launch, type LaunchResult } from '#scripts/run/detached-launch'
|
|
14
|
+
import { run_headless } from '#scripts/run/run-headless'
|
|
15
|
+
import { z } from 'zod'
|
|
16
|
+
|
|
17
|
+
// How `josh backlogrun` starts a `backlogrun` parent in the background, and how
|
|
18
|
+
// it tells one is already running so a second is never started beside it.
|
|
19
|
+
//
|
|
20
|
+
// **Running is two records, not one.** A parent claims the carry record a little after it starts, so
|
|
21
|
+
// between the launch and the claim only the launch record this file writes says a run is coming; once
|
|
22
|
+
// the claim is made the carry record's owner is what answers. Either one live is a run.
|
|
23
|
+
//
|
|
24
|
+
// **The agent is the person's choice, not the shell's.** The provider is resolved from an environment
|
|
25
|
+
// with every agent-session key cleared and the choice handed in, so a command typed inside a Claude Code
|
|
26
|
+
// session can still start a Codex parent. The same choice is handed to the parent as
|
|
27
|
+
// `JOSH_AGENT_PROVIDER`, the key a detached child with no session of its own resolves from.
|
|
28
|
+
|
|
29
|
+
const LAUNCH_PREFIX = 'josh-backlogrun-launch-'
|
|
30
|
+
const LOG_PREFIX = 'josh-backlogrun-log-'
|
|
31
|
+
const LOG_SUFFIX = '.log'
|
|
32
|
+
|
|
33
|
+
const launch_schema = z.object({
|
|
34
|
+
pid: z.number(),
|
|
35
|
+
start: z.string().optional(),
|
|
36
|
+
session: z.string().optional(),
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
type LaunchRecord = z.infer<typeof launch_schema>
|
|
40
|
+
|
|
41
|
+
interface LaunchTarget {
|
|
42
|
+
// The checkout the parent runs in, and its common git directory the records are keyed on.
|
|
43
|
+
worktree: string
|
|
44
|
+
git_directory: string
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
interface Launched {
|
|
48
|
+
pid: number
|
|
49
|
+
session: string | undefined
|
|
50
|
+
log_path: string
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
type StartResult = { kind: 'launched'; launched: Launched } | { kind: 'failed'; note: string }
|
|
54
|
+
|
|
55
|
+
function launch_path(git_directory: string): string {
|
|
56
|
+
return stamp_file.stamp_path(LAUNCH_PREFIX, git_directory)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function log_path(git_directory: string): string {
|
|
60
|
+
return stamp_file.stamp_path(LOG_PREFIX, git_directory, LOG_SUFFIX)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function read_launch(target: string): LaunchRecord | undefined {
|
|
64
|
+
return json_value.parse_with(stamp_file.read_stamp_text(target) ?? '', launch_schema)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// The launched parent is still the process it was: a pid reused by another process is not a run.
|
|
68
|
+
function is_launch_live(record: LaunchRecord | undefined): boolean {
|
|
69
|
+
if (record === undefined) return false
|
|
70
|
+
|
|
71
|
+
return process_identity.is_same_process(record.pid, record.start) !== false
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function is_carry_live(read: CarryRead): boolean {
|
|
75
|
+
return read.kind === 'carried' && run_carry.is_owner_live(read.carry)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function is_running(git_directory: string): boolean {
|
|
79
|
+
if (is_carry_live(run_carry.read_carry(run_carry.carry_path(git_directory)))) return true
|
|
80
|
+
|
|
81
|
+
return is_launch_live(read_launch(launch_path(git_directory)))
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// The environment the chosen provider resolves from, whatever session this command was typed in.
|
|
85
|
+
function chosen_environment(
|
|
86
|
+
provider: AgentProvider,
|
|
87
|
+
environment: AgentEnvironment = process.env,
|
|
88
|
+
): AgentEnvironment {
|
|
89
|
+
return {
|
|
90
|
+
...environment,
|
|
91
|
+
...agent_session_environment.removed_environment(environment),
|
|
92
|
+
[agent_role_profile.CODEX_SESSION_KEY]: undefined,
|
|
93
|
+
[agent_role_profile.HANDED_PROVIDER_KEY]: provider,
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Only a Claude parent takes a forced session id, so only it can be resumed by one later.
|
|
98
|
+
function session_for(provider: AgentProvider): string | undefined {
|
|
99
|
+
return provider === 'anthropic' ? randomUUID() : undefined
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function argv_of(
|
|
103
|
+
invocation: string,
|
|
104
|
+
provider: AgentProvider,
|
|
105
|
+
worktree: string,
|
|
106
|
+
session: string | undefined,
|
|
107
|
+
): AgentArgvResult {
|
|
108
|
+
const environment = chosen_environment(provider)
|
|
109
|
+
const resolved = agent_role_profile.resolve(agent_role_profile.SCHEDULER, environment)
|
|
110
|
+
|
|
111
|
+
if (resolved.kind === 'rejected') return resolved
|
|
112
|
+
|
|
113
|
+
return agent_argv.with_profile_in(invocation, resolved.profile, worktree, session)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function note_to_stderr(note: string): void {
|
|
117
|
+
console.error(`backlogrun: ${note}`)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function record_launch(git_directory: string, pid: number, session: string | undefined): void {
|
|
121
|
+
const started = process_identity.read_start(pid)
|
|
122
|
+
|
|
123
|
+
stamp_file.replace_stamp(launch_path(git_directory), { pid, start: started, session })
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// The headless mark holds the parent's turn open while its lanes run, as `run:wake`'s does. The launch
|
|
127
|
+
// strips only Claude's session keys, so a Codex session this was typed in is cleared here too — inherited,
|
|
128
|
+
// it would make the parent's own `josh` commands resolve the wrong provider.
|
|
129
|
+
function spawn_parent(
|
|
130
|
+
argv: Extract<AgentArgvResult, { kind: 'argv' }>,
|
|
131
|
+
provider: AgentProvider,
|
|
132
|
+
target: LaunchTarget,
|
|
133
|
+
): LaunchResult {
|
|
134
|
+
const environment = {
|
|
135
|
+
...run_headless.environment(),
|
|
136
|
+
[agent_role_profile.CODEX_SESSION_KEY]: undefined,
|
|
137
|
+
[agent_role_profile.HANDED_PROVIDER_KEY]: provider,
|
|
138
|
+
}
|
|
139
|
+
const log = log_path(target.git_directory)
|
|
140
|
+
|
|
141
|
+
return detached_launch.launch(
|
|
142
|
+
{
|
|
143
|
+
argv: argv.argv,
|
|
144
|
+
cwd: target.worktree,
|
|
145
|
+
env: environment,
|
|
146
|
+
log_path: log,
|
|
147
|
+
profile: argv.profile,
|
|
148
|
+
},
|
|
149
|
+
note_to_stderr,
|
|
150
|
+
)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function start(invocation: string, provider: AgentProvider, target: LaunchTarget): StartResult {
|
|
154
|
+
const session = session_for(provider)
|
|
155
|
+
const built = argv_of(invocation, provider, target.worktree, session)
|
|
156
|
+
|
|
157
|
+
if (built.kind === 'rejected') return { kind: 'failed', note: built.note }
|
|
158
|
+
|
|
159
|
+
const result = spawn_parent(built, provider, target)
|
|
160
|
+
|
|
161
|
+
if (result.kind === 'failed') return result
|
|
162
|
+
|
|
163
|
+
record_launch(target.git_directory, result.pid, session)
|
|
164
|
+
|
|
165
|
+
const launched = { pid: result.pid, session, log_path: log_path(target.git_directory) }
|
|
166
|
+
|
|
167
|
+
return { kind: 'launched', launched }
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const backlogrun_launch = {
|
|
171
|
+
argv_of,
|
|
172
|
+
chosen_environment,
|
|
173
|
+
is_running,
|
|
174
|
+
start,
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export type { Launched, LaunchTarget, StartResult }
|
|
178
|
+
export { backlogrun_launch }
|
|
@@ -4,15 +4,13 @@ import {
|
|
|
4
4
|
} from '#scripts/time-runtime/time-transcript-line'
|
|
5
5
|
|
|
6
6
|
// Verifying an agent's behavior against the transcripts every run already writes, with no live
|
|
7
|
-
// Claude session and no model call
|
|
7
|
+
// Claude session and no model call.
|
|
8
8
|
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// agent *behaves*. This is the half worth keeping, separated from the half worth removing: an
|
|
15
|
-
// assertion read off a recorded transcript is deterministic, re-runnable and never calls a model.
|
|
9
|
+
// **`josh eval`'s scenarios stay out of the completion gate for being slow rather than for being
|
|
10
|
+
// wrong**: each starts a real Claude session. Without them the gate would prove only that the
|
|
11
|
+
// *machinery* works and nothing at all that the agent *behaves*. This module is the half of eval
|
|
12
|
+
// worth keeping: an assertion read off a recorded transcript is deterministic, re-runnable and never
|
|
13
|
+
// calls a model.
|
|
16
14
|
//
|
|
17
15
|
// **The reading is single-sourced, not re-implemented.** One transcript line is parsed by
|
|
18
16
|
// `time-transcript-line.ts` — the reader the span walk and the guards already use — and the files are
|
|
@@ -6,7 +6,7 @@ import { behavior_assertion, type Violation } from './behavior-assertion'
|
|
|
6
6
|
import { behavior_rules } from './behavior-rules'
|
|
7
7
|
|
|
8
8
|
// `josh behavior` — check the current run's recorded transcript against the behavior assertions and
|
|
9
|
-
// report where any broke
|
|
9
|
+
// report where any broke. It runs inside `pnpm josh gate`, calls no model,
|
|
10
10
|
// and reads one file: the session it is running in.
|
|
11
11
|
//
|
|
12
12
|
// **The scope is the current run, not the whole corpus.** The store holds thousands of transcripts
|
|
@@ -3,7 +3,7 @@ import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
|
3
3
|
import type { Block, TranscriptLine } from '#scripts/time-runtime/time-transcript-line'
|
|
4
4
|
import type { Assertion, Finding } from './behavior-assertion'
|
|
5
5
|
|
|
6
|
-
// The behavior assertions checked against recorded transcripts
|
|
6
|
+
// The behavior assertions checked against recorded transcripts. This is the
|
|
7
7
|
// **seed set** — the issue's own plan is to land one rule that is green across the recorded corpus,
|
|
8
8
|
// then add more one at a time, each verified green before it joins. Starting with many would land a
|
|
9
9
|
// wall of red that says nothing about which behavior actually regressed.
|
|
@@ -14,7 +14,7 @@ const COMMAND_KEY = 'command'
|
|
|
14
14
|
const FIRST_POSITION_OFFSET = 1
|
|
15
15
|
const TOOL_RESULT = 'tool_result'
|
|
16
16
|
// The openings of the two results that mean a Bash call never ran: the permission layer's refusal,
|
|
17
|
-
// and a PreToolUse hook's block
|
|
17
|
+
// and a PreToolUse hook's block. A PostToolUse hook error is deliberately
|
|
18
18
|
// absent — that hook fires after the command has already run.
|
|
19
19
|
const DENIED_BASH_PREFIXES = [
|
|
20
20
|
'Permission to use Bash with command ',
|
|
@@ -65,7 +65,7 @@ function command_of(block: Block): string | undefined {
|
|
|
65
65
|
// subcommand and is not a dry run. Each `;`/`&&`/`|`-separated segment is judged on its own, so a
|
|
66
66
|
// mutation anywhere in a chain is caught while a mention inside another command's argument is not.
|
|
67
67
|
//
|
|
68
|
-
// Quoted spans are removed before the split
|
|
68
|
+
// Quoted spans are removed before the split: a `|` inside a quoted pattern —
|
|
69
69
|
// `grep -E "commit|git add" file` — is not a separator, and cutting there synthesized a segment that
|
|
70
70
|
// began with `git add` out of a read-only search. `unquoted` honors escapes and heredoc bodies, so a
|
|
71
71
|
// stray `it's` cannot pair with a later quote and erase the real `git add` between them.
|
|
@@ -11,9 +11,9 @@ const BASIC_CLAUDE_FILENAME = 'CLAUDE.basic.md'
|
|
|
11
11
|
const SOURCE_CLAUDE_MD = path.join(REPO_ROOT, 'CLAUDE.md')
|
|
12
12
|
const DIST_CLAUDE_MD = path.join(DIST_ROOT, 'CLAUDE.md')
|
|
13
13
|
const SOURCE_BASIC_CLAUDE_MD = path.join(REPO_ROOT, 'templates', BASIC_CLAUDE_FILENAME)
|
|
14
|
-
// A basic project's `CLAUDE.md` imports the rules from dist/.
|
|
15
|
-
//
|
|
16
|
-
//
|
|
14
|
+
// A basic project's `CLAUDE.md` imports the rules from dist/. An older one imports them under the
|
|
15
|
+
// profile's old name until `josh init` is re-run and migrates that import, so the same rules ship
|
|
16
|
+
// under both names.
|
|
17
17
|
const DIST_BASIC_CLAUDE_MDS: ReadonlyArray<string> = [
|
|
18
18
|
path.join(DIST_ROOT, BASIC_CLAUDE_FILENAME),
|
|
19
19
|
path.join(DIST_ROOT, 'CLAUDE.static.md'),
|
|
@@ -21,7 +21,7 @@ const DIST_BASIC_CLAUDE_MDS: ReadonlyArray<string> = [
|
|
|
21
21
|
|
|
22
22
|
// Read kit's own CLAUDE.md and apply the distribution path transform. kit's source keeps relative
|
|
23
23
|
// paths so it resolves inside the kit repository; the published copy rewrites them so every backtick
|
|
24
|
-
// reference resolves in a consumer too
|
|
24
|
+
// reference resolves in a consumer too. Pure — the guard test asserts the
|
|
25
25
|
// result carries no reference a consumer cannot open.
|
|
26
26
|
function generate_distributed_claude_md(): string {
|
|
27
27
|
return init_logic.transform_distributed_paths(readFileSync(SOURCE_CLAUDE_MD, 'utf8'))
|
|
@@ -8,10 +8,10 @@ const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..
|
|
|
8
8
|
const CLAUDE_SETTINGS = path.join(REPO_ROOT, '.claude', 'settings.json')
|
|
9
9
|
const CODEX_HOOKS = path.join(REPO_ROOT, '.codex', 'hooks.json')
|
|
10
10
|
|
|
11
|
-
// Regenerate `.codex/hooks.json` from `.claude/settings.json
|
|
11
|
+
// Regenerate `.codex/hooks.json` from `.claude/settings.json`. The output is
|
|
12
12
|
// committed rather than gitignored: Codex reads it straight from a fresh clone of kit, before any
|
|
13
13
|
// build has run, and `josh init` / `josh sync` copy it to consumers from the package. It is run by
|
|
14
|
-
// hand, never from `pnpm build`, so a build never rewrites a committed file
|
|
14
|
+
// hand, never from `pnpm build`, so a build never rewrites a committed file:
|
|
15
15
|
// `codex-project-config.test.ts` fails the gate when the committed copy has drifted.
|
|
16
16
|
function build_codex_hooks(): string {
|
|
17
17
|
writeFileSync(CODEX_HOOKS, codex_hooks.codex_hooks_text(readFileSync(CLAUDE_SETTINGS, 'utf8')))
|
|
@@ -12,7 +12,7 @@ const OUT_DIR = path.join(PACKAGE_DIR, BUNDLED_COMMAND_DIRECTORY)
|
|
|
12
12
|
|
|
13
13
|
// Each `is_bundled` command is pre-built to its own `dist/commands/<script basename>.js`, so a
|
|
14
14
|
// consumer's `dist/josh.js` imports it under plain node instead of spawning tsx for its `.ts`
|
|
15
|
-
// (
|
|
15
|
+
// (`docs/maintainers/runtime-bundling.md`).
|
|
16
16
|
//
|
|
17
17
|
// **No code splitting, and that is why the import closure is checked.** Every entry is one
|
|
18
18
|
// self-contained file, so every module it imports shares the entry's `import.meta.url`; a second
|
|
@@ -25,7 +25,7 @@ const ANY_PATH = /.*/
|
|
|
25
25
|
|
|
26
26
|
// Each Claude Code hook is bundled to its own `dist/hooks/<name>.js`, so a consumer (and kit itself)
|
|
27
27
|
// invokes `node dist/hooks/<name>.js` directly — no `pnpm` launch and no `tsx` re-spawn from the
|
|
28
|
-
// `dist/josh.js` dispatcher
|
|
28
|
+
// `dist/josh.js` dispatcher.
|
|
29
29
|
//
|
|
30
30
|
// **`splitting: true` is load-bearing, not an optimization.** Every hook module decides whether to
|
|
31
31
|
// run its main from `process.argv[1] === fileURLToPath(import.meta.url)`. A single-file bundle would
|
|
@@ -35,7 +35,7 @@ const ANY_PATH = /.*/
|
|
|
35
35
|
// splitting keeps every entry in its own file with its own `import.meta.url`, so an imported guard's
|
|
36
36
|
// `import.meta.url` never equals `argv[1]` and only the file actually launched runs its main.
|
|
37
37
|
//
|
|
38
|
-
// **The flip side: an entry another entry imports loses its main
|
|
38
|
+
// **The flip side: an entry another entry imports loses its main**. Splitting
|
|
39
39
|
// moves a module two entries share into a chunk, so a launched hook whose own module is imported
|
|
40
40
|
// elsewhere becomes a re-export stub that runs nothing. Each launched hook is therefore a `*-cli.ts`
|
|
41
41
|
// file holding only the self-invoke, which no other module imports.
|
|
@@ -136,12 +136,12 @@ function place_build(out_directory: string, files: ReadonlyArray<OutputFile>, st
|
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
// With `splitting: true` every build emits freshly hashed `chunk-*.js` files, so without a cleanup
|
|
139
|
-
// the chunks of every earlier build pile up beside the live ones and ship in any local pack
|
|
140
|
-
//
|
|
139
|
+
// the chunks of every earlier build pile up beside the live ones and ship in any local pack.
|
|
140
|
+
// The cleanup runs after the new files are in place rather than emptying
|
|
141
141
|
// the directory first: this checkout's own settings.json launches `node dist/hooks/<name>.js` on
|
|
142
142
|
// every tool call, and an emptied directory would make a hook launched mid-build fail to load and its
|
|
143
143
|
// guard fail open. The source digest is placed last (`hook-bundle-stamp.ts`), so a launch only reads
|
|
144
|
-
// the bundles as fresh once every one of them is in place
|
|
144
|
+
// the bundles as fresh once every one of them is in place.
|
|
145
145
|
async function build_hooks(out_directory: string = OUT_DIR): Promise<void> {
|
|
146
146
|
const sources = new Map<string, Uint8Array>()
|
|
147
147
|
const { outputFiles: files } = await build({
|
package/scripts/build/build.ts
CHANGED
|
@@ -34,7 +34,7 @@ async function claude_md_step(): Promise<string> {
|
|
|
34
34
|
return build_claude_md()
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
// Every step `pnpm build` runs
|
|
37
|
+
// Every step `pnpm build` runs. The steps write disjoint paths under
|
|
38
38
|
// `dist/`, so they run concurrently from this one entry instead of eight serial `tsx` launches.
|
|
39
39
|
// Nothing here writes a git-tracked file: `.codex/hooks.json` is regenerated by hand with
|
|
40
40
|
// `tsx scripts/build/build-codex-hooks.ts`, and `codex-project-config.test.ts` fails the gate when
|