@joshuafolkken/kit 1.1514.0 → 1.2114.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 -1
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -25,7 +25,7 @@ import type { CarryOwner, RunCarry } from './run-carry'
|
|
|
25
25
|
// How long after its last write a conversation whose process has gone still counts as continuing. It
|
|
26
26
|
// bridges a restart and a resume — measured at eighteen seconds — with room for a person reopening a
|
|
27
27
|
// window, and it is the order of the wake grace window, so a genuine crash is recovered no later than
|
|
28
|
-
// a lost wake would be retried.
|
|
28
|
+
// a lost wake would be retried. A headless owner is not given it (`run-carry.ts` → `is_owner_live`).
|
|
29
29
|
const CONVERSATION_QUIET_MS = 600_000
|
|
30
30
|
|
|
31
31
|
type Environment = Readonly<Record<string, string | undefined>>
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import path from 'node:path'
|
|
2
|
+
import { durable_state } from '#scripts/josh/durable-state'
|
|
2
3
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
3
4
|
import { json_value } from '#scripts/lib/json-value'
|
|
4
5
|
import { z } from 'zod'
|
|
@@ -17,7 +18,7 @@ import type { CarryRead } from './run-carry'
|
|
|
17
18
|
// **One record, overwritten by the next `--end`**: the board keeps only the run before the next one, and
|
|
18
19
|
// a run that begins replaces nothing here — its carry record is what the board reads while it runs.
|
|
19
20
|
|
|
20
|
-
const ENDED_PREFIX =
|
|
21
|
+
const ENDED_PREFIX = durable_state.PREFIX.ENDED
|
|
21
22
|
const TRANSCRIPT_SUFFIX = '.jsonl'
|
|
22
23
|
|
|
23
24
|
const ended_run_schema = z.object({
|
|
@@ -32,7 +33,7 @@ type EndedRun = z.infer<typeof ended_run_schema>
|
|
|
32
33
|
|
|
33
34
|
// Keyed on the common git directory, as the carry record is, so every lane reads the same one.
|
|
34
35
|
function ended_path(git_directory: string): string {
|
|
35
|
-
return
|
|
36
|
+
return durable_state.path(ENDED_PREFIX, git_directory)
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
function session_of(transcript: string | undefined): string | undefined {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { git_command } from '#scripts/git/git-command'
|
|
2
|
+
import { durable_state } from '#scripts/josh/durable-state'
|
|
2
3
|
import { process_identity } from '#scripts/josh/process-identity'
|
|
3
4
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
4
5
|
import { json_value } from '#scripts/lib/json-value'
|
|
@@ -35,7 +36,7 @@ import { run_carry_conversation } from './run-carry-conversation'
|
|
|
35
36
|
// reaches, so only a cut the run itself took is carried without anyone deciding. Everything else is
|
|
36
37
|
// an explicit carry-or-discard: `--resume` adopts the standing record, `--end` discards it.
|
|
37
38
|
|
|
38
|
-
const CARRY_PREFIX =
|
|
39
|
+
const CARRY_PREFIX = durable_state.PREFIX.CARRY
|
|
39
40
|
const REPOSITORY_DIRECTORY_INDEX = 1
|
|
40
41
|
const NO_INCREMENT = 0
|
|
41
42
|
|
|
@@ -212,7 +213,7 @@ const run_carry_schema = z.object({
|
|
|
212
213
|
})
|
|
213
214
|
|
|
214
215
|
function carry_path(git_directory: string): string {
|
|
215
|
-
return
|
|
216
|
+
return durable_state.path(CARRY_PREFIX, git_directory)
|
|
216
217
|
}
|
|
217
218
|
|
|
218
219
|
// The common git directory: `.git` in the main work tree and the same `.git` from inside a lane, so
|
|
@@ -323,11 +324,16 @@ function adopt_carry(
|
|
|
323
324
|
// A live pid with no readable start token is conservatively held rather than replaced. The command
|
|
324
325
|
// cannot prove its generation inside that sandbox, but a false `busy` stops for a person while a
|
|
325
326
|
// false `standing` can put two parents on one budget. A record with no pid still resolves false.
|
|
326
|
-
// A gone process whose conversation is still being continued is live (`run-carry-conversation.ts`)
|
|
327
|
-
|
|
328
|
-
|
|
327
|
+
// A gone process whose conversation is still being continued is live (`run-carry-conversation.ts`);
|
|
328
|
+
// a headless owner is never resumed into a new process, so its gone process is a gone owner.
|
|
329
|
+
function is_owner_live(
|
|
330
|
+
carry: RunCarry,
|
|
331
|
+
now: Date = new Date(),
|
|
332
|
+
same_process: typeof process_identity.is_same_process = process_identity.is_same_process,
|
|
333
|
+
): boolean {
|
|
334
|
+
if (same_process(carry.owner_pid, carry.owner_start) !== false) return true
|
|
329
335
|
|
|
330
|
-
return run_carry_conversation.is_conversation_live(carry, now)
|
|
336
|
+
return carry.is_owner_headless !== true && run_carry_conversation.is_conversation_live(carry, now)
|
|
331
337
|
}
|
|
332
338
|
|
|
333
339
|
function is_owned_by(carry: RunCarry, owner: CarryOwner): boolean {
|
|
@@ -4,19 +4,22 @@ import { agent_session_role } from '#scripts/agent/agent-session-role'
|
|
|
4
4
|
import { cost_cli } from '#scripts/cost-runtime/cost-cli'
|
|
5
5
|
import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
|
|
6
6
|
import { issue_cite } from '#scripts/issue/issue-cite'
|
|
7
|
-
import { session_cite } from '#scripts/issue/session-cite'
|
|
8
7
|
import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
|
|
9
8
|
import { lane_relaunch } from '#scripts/lane/lane-relaunch'
|
|
10
9
|
import { openai_lane_supervisor } from '#scripts/lane/openai-lane-supervisor'
|
|
11
10
|
import { run_event_stream } from '#scripts/run/event/run-event-stream'
|
|
12
11
|
import { run_event_stream_emit } from '#scripts/run/event/run-event-stream-emit'
|
|
13
12
|
import { run_cli_fault } from '#scripts/run/run-cli-fault'
|
|
14
|
-
import {
|
|
13
|
+
import { split_resolution } from '#scripts/split/split-resolution'
|
|
14
|
+
import { run_cut } from './run-cut'
|
|
15
15
|
import { run_cut_args, type Request } from './run-cut-args'
|
|
16
16
|
import { run_cut_decline } from './run-cut-decline'
|
|
17
|
+
import { run_cut_digest } from './run-cut-digest'
|
|
17
18
|
import { run_cut_handoff } from './run-cut-handoff'
|
|
18
19
|
import { run_cut_ready } from './run-cut-ready'
|
|
19
20
|
import { run_cut_report } from './run-cut-report'
|
|
21
|
+
import { run_cut_resume } from './run-cut-resume'
|
|
22
|
+
import { run_cut_review } from './run-cut-review'
|
|
20
23
|
|
|
21
24
|
// `josh run:cut` — the record that lets a lane child end its process before the gate and a fresh one
|
|
22
25
|
// resume from it. `run:cut <N>` writes the record and relaunches a fresh
|
|
@@ -40,15 +43,13 @@ const {
|
|
|
40
43
|
FAILED_VERDICT,
|
|
41
44
|
FAILURE_EXIT_CODE,
|
|
42
45
|
FRESH_VERDICT,
|
|
43
|
-
HANDED_OFF_VERDICT,
|
|
44
46
|
HANDOFF_MISSING_NOTE,
|
|
45
47
|
HANDOFF_OVERFLOW_NOTE,
|
|
46
|
-
INCOMPLETE_VERDICT,
|
|
47
48
|
NOT_A_LANE_VERDICT,
|
|
48
49
|
OVER_VERDICT,
|
|
49
50
|
RESUME_IMPL_VERDICT,
|
|
50
51
|
RESUME_VERDICT,
|
|
51
|
-
|
|
52
|
+
SPLIT_UNRESOLVED_VERDICT,
|
|
52
53
|
SUCCESS_EXIT_CODE,
|
|
53
54
|
UNDER_THRESHOLD_VERDICT,
|
|
54
55
|
UNREADY_VERDICT,
|
|
@@ -57,27 +58,33 @@ const {
|
|
|
57
58
|
report_bad_handoff,
|
|
58
59
|
report_busy,
|
|
59
60
|
report_fault,
|
|
60
|
-
report_handed_off,
|
|
61
61
|
report_held_cut,
|
|
62
|
-
|
|
63
|
-
report_over,
|
|
62
|
+
report_missing_supervisor,
|
|
64
63
|
report_relaunched_cut,
|
|
65
64
|
report_reviewer,
|
|
66
|
-
|
|
65
|
+
report_split_unresolved,
|
|
67
66
|
report_under_threshold,
|
|
68
67
|
report_unknown,
|
|
69
|
-
report_unreadable,
|
|
70
68
|
} = run_cut_report
|
|
71
69
|
|
|
72
70
|
// **The pre-gate cut is conditional on the same statistic the implementation-phase cut reads**.
|
|
73
|
-
// `cost_cli.session_verdict` prices the newest request against `
|
|
71
|
+
// `cost_cli.session_verdict` prices the newest request against the `--cut` break-even, so no second
|
|
74
72
|
// threshold is introduced — an `under` session skips the cut, and an unmeasurable one still cuts as
|
|
75
73
|
// the safety net. Only the pre-gate phase is checked here; the implementation-phase caller gates its own
|
|
76
74
|
// `--impl` cut on `pnpm josh cost --cut` before it is ever issued.
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
//
|
|
76
|
+
// **A noticed Issue answers the split notice first** (joshuafolkken/kit#4695): the pre-gate cut is the
|
|
77
|
+
// boundary the notice names, so a lane that neither split nor recorded why is refused whether or not
|
|
78
|
+
// the cut itself would be taken. Returns the answer given without cutting, or `undefined`.
|
|
79
|
+
async function pre_gate_answer(issue: string, phase: string): Promise<number | undefined> {
|
|
80
|
+
if (phase !== run_cut.PRE_GATE_PHASE) return undefined
|
|
81
|
+
const split_note = await split_resolution.ledger_refusal(Number(issue))
|
|
82
|
+
|
|
83
|
+
if (split_note !== undefined) return report_split_unresolved(split_note)
|
|
79
84
|
|
|
80
85
|
return cost_cli.session_verdict() === cost_verdict.UNDER_VERDICT
|
|
86
|
+
? report_under_threshold()
|
|
87
|
+
: undefined
|
|
81
88
|
}
|
|
82
89
|
|
|
83
90
|
// The exclusive create lost, so a cut is already in flight for this tree — the double-cut guard. The
|
|
@@ -103,18 +110,11 @@ function report_relaunch_failure(target: string, note: string): number {
|
|
|
103
110
|
return report(FAILED_VERDICT, FAILURE_EXIT_CODE)
|
|
104
111
|
}
|
|
105
112
|
|
|
106
|
-
function report_missing_supervisor(issue: string): number {
|
|
107
|
-
console.error(
|
|
108
|
-
`The OpenAI supervisor for ${session_cite.issue(issue)} is not live, so this nested process was not cut and can continue. Re-dispatch the lane to recover the supervisor.`,
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
return report(FAILED_VERDICT, FAILURE_EXIT_CODE)
|
|
112
|
-
}
|
|
113
|
-
|
|
114
113
|
// **The relaunched child is started at the effort of the phase it is resuming into**.
|
|
115
114
|
// A pre-gate resume drives the gate, commit, PR and merge — the mechanical
|
|
116
115
|
// ship/bookkeeping region, lowered — while an implementation resume keeps the role default. The
|
|
117
|
-
// phase-aware profile is `agent_argv.resume_argv`'s; a person's `JOSH_WORKER_EFFORT` still wins over it
|
|
116
|
+
// phase-aware profile is `agent_argv.resume_argv`'s; a person's `JOSH_WORKER_EFFORT` still wins over it,
|
|
117
|
+
// and a pre-gate resume moves to `JOSH_WORKER_SHIP_MODEL` when that is set.
|
|
118
118
|
function relaunch(target: string, lane: LaneInfo, phase: string): number {
|
|
119
119
|
const notes: Array<string> = []
|
|
120
120
|
const result = lane_relaunch.resume(lane, phase, (note) => {
|
|
@@ -177,14 +177,18 @@ async function write_cut(target: string, request: CutRequest): Promise<number |
|
|
|
177
177
|
const loaded = run_cut_handoff.load_handoff(request.handoff_path, run_cut.MAX_HANDOFF_BYTES)
|
|
178
178
|
if (loaded.kind === 'bad') return report_bad_handoff(loaded.note)
|
|
179
179
|
|
|
180
|
-
const
|
|
180
|
+
const base = {
|
|
181
181
|
issue: request.issue,
|
|
182
182
|
branch: request.branch,
|
|
183
183
|
phase: request.phase,
|
|
184
184
|
handoff: loaded.handoff,
|
|
185
185
|
}
|
|
186
|
+
// The checkout, not `target`: the record lives in the temp root, and the transcript is filed by checkout.
|
|
187
|
+
const checkout = await run_cut.worktree_directory()
|
|
188
|
+
const spec = run_cut.with_digest(base, () => run_cut_digest.own_digest(checkout))
|
|
186
189
|
|
|
187
|
-
const spec_note =
|
|
190
|
+
const spec_note =
|
|
191
|
+
spec_refusal(spec) ?? (await run_cut_review.unrecorded_refusal(request, loaded.handoff))
|
|
188
192
|
|
|
189
193
|
if (spec_note !== undefined) return report_bad_handoff(spec_note)
|
|
190
194
|
if (run_cut.begin_cut(target, spec) === undefined) return report_cut_exists(target)
|
|
@@ -247,7 +251,9 @@ async function cut(
|
|
|
247
251
|
return await declined({ issue, phase }, state, refuse_unready(state))
|
|
248
252
|
}
|
|
249
253
|
|
|
250
|
-
|
|
254
|
+
const answered = await pre_gate_answer(issue, phase)
|
|
255
|
+
|
|
256
|
+
if (answered !== undefined) return answered
|
|
251
257
|
|
|
252
258
|
clear_expired(target)
|
|
253
259
|
if (!has_matching_supervisor(lane, issue)) return report_missing_supervisor(issue)
|
|
@@ -255,111 +261,6 @@ async function cut(
|
|
|
255
261
|
return await finish_cut(target, lane, { issue, branch: state.branch, phase, handoff_path })
|
|
256
262
|
}
|
|
257
263
|
|
|
258
|
-
// **The adoption is the resume-uniqueness guarantee**: it removes and creates exclusively, so of two
|
|
259
|
-
// racing resumes only one wins the create and the loser is answered `busy`.
|
|
260
|
-
// An implementation cut resumes back into implementation; a pre-gate one into the gate. The resuming
|
|
261
|
-
// child is told which by the verdict rather than reconstructing it from the record.
|
|
262
|
-
function resume_verdict_for(cut_record: RunCut): string {
|
|
263
|
-
return run_cut.resumes_into_implementation(cut_record.phase)
|
|
264
|
-
? RESUME_IMPL_VERDICT
|
|
265
|
-
: RESUME_VERDICT
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// **An implementation resume removes the record; a pre-gate one marks it handed off**.
|
|
269
|
-
// The cuts have different multiplicities sharing one record: the pre-gate cut fires once per lane, so
|
|
270
|
-
// its record must survive to answer a second resume `handed-off`; the implementation cut is guarded by the run's
|
|
271
|
-
// event stream rather than the cut record, so its record is cleared on resume — a lingering record
|
|
272
|
-
// would keep the pre-gate guard, which reads `carried_cut_sync`, silent for the rest of the run. A double
|
|
273
|
-
// cut stays impossible either way: `begin_cut`'s exclusive create is what prevents it.
|
|
274
|
-
function take_over(target: string, cut_record: RunCut): RunCut | undefined {
|
|
275
|
-
if (!run_cut.resumes_into_implementation(cut_record.phase)) {
|
|
276
|
-
return run_cut.adopt_cut(target, cut_record)
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
run_cut.end_cut(target)
|
|
280
|
-
|
|
281
|
-
return cut_record
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// The carried instruction and work state, printed to standard error so the resumed session continues
|
|
285
|
-
// on what the run was told to do rather than on the tree alone. The record is cleared
|
|
286
|
-
// on adoption, so this is where it reaches the fresh process.
|
|
287
|
-
function announce_handoff(cut_record: RunCut): void {
|
|
288
|
-
if (cut_record.handoff !== undefined) {
|
|
289
|
-
console.error(run_cut_handoff.describe_handoff(cut_record.handoff))
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
// **An implementation resume appends a `resume` event**. It clears the record
|
|
294
|
-
// the `cut` event stood for, so the stream is what moves `run:step` back to implementation; a pre-gate
|
|
295
|
-
// resume keeps its record and appends nothing. Best-effort, as the cut's own append is.
|
|
296
|
-
async function emit_resume_event(issue: string, verdict: string): Promise<void> {
|
|
297
|
-
if (verdict !== RESUME_IMPL_VERDICT) return
|
|
298
|
-
|
|
299
|
-
await run_event_stream_emit.emit(
|
|
300
|
-
run_event_stream.EVENT_KIND.RESUME,
|
|
301
|
-
`${issue_cite.plain(issue)} resumed`,
|
|
302
|
-
)
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
async function adopt(target: string, cut_record: RunCut): Promise<number> {
|
|
306
|
-
const taken = take_over(target, cut_record)
|
|
307
|
-
|
|
308
|
-
if (taken === undefined) return report_busy(cut_record)
|
|
309
|
-
|
|
310
|
-
announce_handoff(cut_record)
|
|
311
|
-
|
|
312
|
-
const verdict = resume_verdict_for(cut_record)
|
|
313
|
-
|
|
314
|
-
await emit_resume_event(cut_record.issue, verdict)
|
|
315
|
-
|
|
316
|
-
return report(verdict, SUCCESS_EXIT_CODE)
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
// A relaunched lane child and a fresh session both measure `under`, so only the session that took an
|
|
320
|
-
// implementation cut resumes over the threshold; unmeasurable is not refused.
|
|
321
|
-
function is_over_threshold_resume(cut_record: RunCut): boolean {
|
|
322
|
-
if (!run_cut.resumes_into_implementation(cut_record.phase)) return false
|
|
323
|
-
|
|
324
|
-
return cost_cli.session_verdict() === cost_verdict.OVER_VERDICT
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
async function verify_and_adopt(
|
|
328
|
-
target: string,
|
|
329
|
-
cut_record: RunCut,
|
|
330
|
-
issue: string,
|
|
331
|
-
): Promise<number> {
|
|
332
|
-
const state = await run_cut.current_state()
|
|
333
|
-
const verdict = run_cut.classify_resume(cut_record, {
|
|
334
|
-
issue,
|
|
335
|
-
current_branch: state.branch,
|
|
336
|
-
is_dirty: state.is_dirty,
|
|
337
|
-
is_held: state.is_held,
|
|
338
|
-
})
|
|
339
|
-
|
|
340
|
-
if (verdict === HANDED_OFF_VERDICT) return report_handed_off(cut_record)
|
|
341
|
-
|
|
342
|
-
if (verdict === 'stale') return report_stale(cut_record)
|
|
343
|
-
|
|
344
|
-
if (verdict === INCOMPLETE_VERDICT) return report_incomplete(cut_record)
|
|
345
|
-
|
|
346
|
-
if (is_over_threshold_resume(cut_record)) return report_over()
|
|
347
|
-
|
|
348
|
-
return await adopt(target, cut_record)
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
async function resume(target: string, issue: string): Promise<number> {
|
|
352
|
-
const read = run_cut.read_cut(target)
|
|
353
|
-
|
|
354
|
-
if (read.kind === 'none') return report(FRESH_VERDICT, SUCCESS_EXIT_CODE)
|
|
355
|
-
|
|
356
|
-
if (read.kind === 'unreadable') return report_unreadable()
|
|
357
|
-
|
|
358
|
-
if (read.kind === 'expired') return report_stale(read.cut)
|
|
359
|
-
|
|
360
|
-
return await verify_and_adopt(target, read.cut, issue)
|
|
361
|
-
}
|
|
362
|
-
|
|
363
264
|
function read_json(target: string): number {
|
|
364
265
|
const read = run_cut.read_cut(target)
|
|
365
266
|
const cut_record = read.kind === 'carried' || read.kind === 'expired' ? read.cut : undefined
|
|
@@ -395,7 +296,7 @@ async function take_cut(target: string, request: CutCommand): Promise<number> {
|
|
|
395
296
|
async function act(target: string, request: Request): Promise<number> {
|
|
396
297
|
if (request.kind === 'cut') return await take_cut(target, request)
|
|
397
298
|
|
|
398
|
-
if (request.kind === 'resume') return await resume(target, request.issue)
|
|
299
|
+
if (request.kind === 'resume') return await run_cut_resume.resume(target, request.issue)
|
|
399
300
|
|
|
400
301
|
if (request.kind === 'read') return read_json(target)
|
|
401
302
|
|
|
@@ -447,12 +348,11 @@ const run_cut_cli = {
|
|
|
447
348
|
ENDED_VERDICT,
|
|
448
349
|
FAILED_VERDICT,
|
|
449
350
|
FRESH_VERDICT,
|
|
450
|
-
HANDED_OFF_VERDICT,
|
|
451
351
|
NOT_A_LANE_VERDICT,
|
|
452
352
|
OVER_VERDICT,
|
|
453
353
|
RESUME_IMPL_VERDICT,
|
|
454
354
|
RESUME_VERDICT,
|
|
455
|
-
|
|
355
|
+
SPLIT_UNRESOLVED_VERDICT,
|
|
456
356
|
UNDER_THRESHOLD_VERDICT,
|
|
457
357
|
UNREADY_VERDICT,
|
|
458
358
|
run,
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import path from 'node:path'
|
|
2
|
+
import { cost_transcript } from '#scripts/cost-runtime/cost-transcript'
|
|
3
|
+
import { own_session } from '#scripts/cost-runtime/own-session'
|
|
4
|
+
import { duplicate_reads } from '#scripts/delegation/duplicate-read-guard'
|
|
5
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
6
|
+
import { transcript_record, type TranscriptRecord } from '#scripts/lib/transcript-record'
|
|
7
|
+
import { time_spans } from '#scripts/time-runtime/time-spans'
|
|
8
|
+
import { z } from 'zod'
|
|
9
|
+
|
|
10
|
+
// What the cut session already read and decided, derived from its own transcript so the resumed
|
|
11
|
+
// process does not spend minutes re-reading to rebuild it (joshuafolkken/kit#5040).
|
|
12
|
+
//
|
|
13
|
+
// **Derived, not written by the agent.** The reads are tool calls and the decisions are the
|
|
14
|
+
// `Auto-decided:` lines the session already logs (`CLAUDE.md` → "Decision autonomy") — in its reply,
|
|
15
|
+
// or in the Issue comment a tool call posts — so the cut takes both from the transcript: nothing to
|
|
16
|
+
// forget, and no handoff key the refusal has to spell out.
|
|
17
|
+
|
|
18
|
+
interface SessionDigest {
|
|
19
|
+
read: ReadonlyArray<string>
|
|
20
|
+
decisions: ReadonlyArray<string>
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const session_digest_schema = z.object({
|
|
24
|
+
read: z.array(z.string()),
|
|
25
|
+
decisions: z.array(z.string()),
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
// The newest entries are kept: the record has a byte bound, and the last reads are the ones the
|
|
29
|
+
// resumed work continues from.
|
|
30
|
+
const MAX_READ_ENTRIES = 40
|
|
31
|
+
const MAX_DECISIONS = 12
|
|
32
|
+
const MAX_DECISION_CHARS = 240
|
|
33
|
+
const DECISION_PREFIX = 'Auto-decided:'
|
|
34
|
+
// A logged decision wherever it starts a line or follows a quote or `body=`; the space after the colon
|
|
35
|
+
// keeps out the bare prefix a source file spells.
|
|
36
|
+
const DECISION_LINE = /(?:^|[\s'"=])(Auto-decided: [^\n]+)/gu
|
|
37
|
+
// The quote closing a `body='…'` argument.
|
|
38
|
+
const TRAILING_QUOTES = /['"]$/u
|
|
39
|
+
const ASSISTANT = 'assistant'
|
|
40
|
+
const READ_LABEL = 'Already read before the cut — re-read only the lines you need'
|
|
41
|
+
const DECISIONS_LABEL = 'Decided before the cut — do not reopen'
|
|
42
|
+
|
|
43
|
+
function shown_path(target: string, cwd: string): string {
|
|
44
|
+
const relative = path.relative(cwd, path.resolve(cwd, target))
|
|
45
|
+
|
|
46
|
+
return relative.startsWith('..') ? target : relative
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function newest_unique(entries: ReadonlyArray<string>, limit: number): Array<string> {
|
|
50
|
+
const unique = [...new Set(entries.toReversed())].toReversed()
|
|
51
|
+
|
|
52
|
+
return unique.slice(-limit)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function read_files_of(text: string, cwd: string): Array<string> {
|
|
56
|
+
const reads = time_spans
|
|
57
|
+
.parse_timeline(text)
|
|
58
|
+
.spans.filter((span) => duplicate_reads.is_successful_read(span))
|
|
59
|
+
.flatMap((span) => span.targets.map((target) => shown_path(target, cwd)))
|
|
60
|
+
|
|
61
|
+
return newest_unique(reads, MAX_READ_ENTRIES)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Where a tool call carries an Issue comment: the Bash command posting it, or the body file a `Write`
|
|
65
|
+
// prepared for it. An `Edit`'s strings are source text, so they are not read.
|
|
66
|
+
const COMMENT_INPUT_KEYS = ['command', 'content']
|
|
67
|
+
|
|
68
|
+
function input_strings(input: unknown): Array<string> {
|
|
69
|
+
if (!json_value.is_record(input)) return []
|
|
70
|
+
|
|
71
|
+
return COMMENT_INPUT_KEYS.map((key) => input[key]).filter((value) => typeof value === 'string')
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// What the session wrote: its reply text and the inputs of its tool calls, where an Issue workflow's
|
|
75
|
+
// decision comment travels.
|
|
76
|
+
function assistant_texts(record: TranscriptRecord | undefined): Array<string> {
|
|
77
|
+
if (record?.type !== ASSISTANT) return []
|
|
78
|
+
|
|
79
|
+
return transcript_record
|
|
80
|
+
.blocks_of(record)
|
|
81
|
+
.flatMap((block) => [block.text ?? '', ...input_strings(block.input)])
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function decisions_of(text: string): Array<string> {
|
|
85
|
+
const decisions = text
|
|
86
|
+
.split('\n')
|
|
87
|
+
.flatMap((line) => assistant_texts(transcript_record.parse(line)))
|
|
88
|
+
.flatMap((written) => [...written.matchAll(DECISION_LINE)].map((match) => match[1] ?? ''))
|
|
89
|
+
.map((line) => line.replace(TRAILING_QUOTES, '').slice(0, MAX_DECISION_CHARS))
|
|
90
|
+
|
|
91
|
+
return newest_unique(decisions, MAX_DECISIONS)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function digest_of(text: string, cwd: string): SessionDigest {
|
|
95
|
+
return { read: read_files_of(text, cwd), decisions: decisions_of(text) }
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// The running session's own transcript, or `undefined`. Only a session that names itself is read: the
|
|
99
|
+
// newest-file fallback could pick another session filed under the checkout (a Codex lane's reviewer).
|
|
100
|
+
function own_transcript(cwd: string, environment: NodeJS.ProcessEnv): string | undefined {
|
|
101
|
+
if (own_session.session_id_of(environment) === undefined) return undefined
|
|
102
|
+
|
|
103
|
+
const files = cost_transcript.list_sessions_across(cost_transcript.transcript_directories(cwd))
|
|
104
|
+
const selection = own_session.select_own_session(files, environment)
|
|
105
|
+
if (selection.kind === 'absent') return undefined
|
|
106
|
+
|
|
107
|
+
const file = files[selection.index]
|
|
108
|
+
|
|
109
|
+
return file === undefined ? undefined : cost_transcript.read_optional(file)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// The running session's own digest, or `undefined` when its transcript cannot be found — a cut is
|
|
113
|
+
// never refused for want of one.
|
|
114
|
+
function own_digest(
|
|
115
|
+
cwd: string = process.cwd(),
|
|
116
|
+
environment: NodeJS.ProcessEnv = process.env,
|
|
117
|
+
): SessionDigest | undefined {
|
|
118
|
+
const text = own_transcript(cwd, environment)
|
|
119
|
+
|
|
120
|
+
return text === undefined ? undefined : digest_of(text, cwd)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function describe_list(label: string, entries: ReadonlyArray<string>): Array<string> {
|
|
124
|
+
if (entries.length === 0) return []
|
|
125
|
+
|
|
126
|
+
const bullets = entries.map((entry) => ` - ${entry}`).join('\n')
|
|
127
|
+
|
|
128
|
+
return [`${label}:\n${bullets}`]
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// The block the resume prints; nothing for a digest with neither list.
|
|
132
|
+
function describe_digest(digest: SessionDigest | undefined): string | undefined {
|
|
133
|
+
if (digest === undefined) return undefined
|
|
134
|
+
|
|
135
|
+
const blocks = [
|
|
136
|
+
...describe_list(READ_LABEL, digest.read),
|
|
137
|
+
...describe_list(DECISIONS_LABEL, digest.decisions),
|
|
138
|
+
]
|
|
139
|
+
|
|
140
|
+
return blocks.length === 0 ? undefined : blocks.join('\n\n')
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const run_cut_digest = {
|
|
144
|
+
DECISION_PREFIX,
|
|
145
|
+
describe_digest,
|
|
146
|
+
digest_of,
|
|
147
|
+
own_digest,
|
|
148
|
+
session_digest_schema,
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export type { SessionDigest }
|
|
152
|
+
export { run_cut_digest }
|
|
@@ -25,6 +25,9 @@ interface Handoff {
|
|
|
25
25
|
completed: ReadonlyArray<string>
|
|
26
26
|
remaining: ReadonlyArray<string>
|
|
27
27
|
untouched: ReadonlyArray<string>
|
|
28
|
+
// An attested review round's findings not yet `review:record`ed — the conversation that held them is
|
|
29
|
+
// what the cut drops, so without this the resumed run reruns round 1 (joshuafolkken/kit#4868).
|
|
30
|
+
findings?: ReadonlyArray<string> | undefined
|
|
28
31
|
}
|
|
29
32
|
|
|
30
33
|
const handoff_schema = z.object({
|
|
@@ -32,6 +35,7 @@ const handoff_schema = z.object({
|
|
|
32
35
|
completed: z.array(z.string()),
|
|
33
36
|
remaining: z.array(z.string()),
|
|
34
37
|
untouched: z.array(z.string()),
|
|
38
|
+
findings: z.array(z.string()).optional(),
|
|
35
39
|
})
|
|
36
40
|
|
|
37
41
|
// The label each list is printed under when the handoff is shown to the resumed session, kept beside
|
|
@@ -40,23 +44,34 @@ const COMPLETED_LABEL = 'Completed'
|
|
|
40
44
|
const REMAINING_LABEL = 'Remaining'
|
|
41
45
|
const UNTOUCHED_LABEL = 'Deliberately untouched'
|
|
42
46
|
const INSTRUCTION_LABEL = 'Instruction (verbatim)'
|
|
47
|
+
const FINDINGS_LABEL =
|
|
48
|
+
'Round-1 findings, attested but not recorded — do not rerun round 1: fix them, then record them with `pnpm josh review:record --issue <N>`'
|
|
43
49
|
const EMPTY_LIST_NOTE = '(none)'
|
|
44
50
|
|
|
45
51
|
type HandoffKey = keyof Handoff
|
|
46
52
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
53
|
+
// The placeholders each example value is drawn with; `findings`' says which round it carries. They
|
|
54
|
+
// parse, so a copied example is read as entries — `carried_findings` drops them, or a copied
|
|
55
|
+
// `findings` would pass the unrecorded-round refusal.
|
|
56
|
+
const PLACEHOLDER = '…'
|
|
57
|
+
const FINDINGS_PLACEHOLDER = 'unrecorded'
|
|
58
|
+
const EXAMPLE_LIST = `["${PLACEHOLDER}"]`
|
|
59
|
+
|
|
60
|
+
const EXAMPLE_VALUES: Readonly<Record<HandoffKey, string>> = {
|
|
61
|
+
instruction: `"${PLACEHOLDER}"`,
|
|
62
|
+
completed: EXAMPLE_LIST,
|
|
63
|
+
remaining: EXAMPLE_LIST,
|
|
64
|
+
untouched: EXAMPLE_LIST,
|
|
65
|
+
findings: `["${FINDINGS_PLACEHOLDER}"]`,
|
|
51
66
|
}
|
|
52
67
|
|
|
53
|
-
// The shape a handoff file must have,
|
|
68
|
+
// The shape a handoff file must have, keyed from `handoff_schema` so the refusal that asks for the file
|
|
54
69
|
// and the error that rejects it can never name a key the parser does not read — a refusal listing the
|
|
55
70
|
// items in prose invites Markdown, which `parse_handoff` rejects.
|
|
56
|
-
const HANDOFF_FORMAT = `
|
|
71
|
+
const HANDOFF_FORMAT = `{${handoff_schema
|
|
57
72
|
.keyof()
|
|
58
|
-
.options.map((key) =>
|
|
59
|
-
.join(',
|
|
73
|
+
.options.map((key) => `"${key}":${EXAMPLE_VALUES[key]}`)
|
|
74
|
+
.join(',')}}`
|
|
60
75
|
|
|
61
76
|
function parse_handoff(raw: string): Handoff | undefined {
|
|
62
77
|
return json_value.parse_with(raw, handoff_schema)
|
|
@@ -115,6 +130,25 @@ function describe_list(label: string, items: ReadonlyArray<string>): string {
|
|
|
115
130
|
return `${label}:\n${bullets}`
|
|
116
131
|
}
|
|
117
132
|
|
|
133
|
+
// The findings a handoff really carries: a blank entry or an example placeholder is no finding.
|
|
134
|
+
function carried_findings(handoff: Handoff | undefined): ReadonlyArray<string> {
|
|
135
|
+
const findings = handoff?.findings ?? []
|
|
136
|
+
|
|
137
|
+
return findings.filter(
|
|
138
|
+
(finding) => ![PLACEHOLDER, FINDINGS_PLACEHOLDER, ''].includes(finding.trim()),
|
|
139
|
+
)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Carried findings are printed only when there are some — a handoff cut before any review says nothing
|
|
143
|
+
// about one.
|
|
144
|
+
function describe_findings(handoff: Handoff): ReadonlyArray<string> {
|
|
145
|
+
const findings = carried_findings(handoff)
|
|
146
|
+
|
|
147
|
+
if (findings.length === 0) return []
|
|
148
|
+
|
|
149
|
+
return [describe_list(FINDINGS_LABEL, findings)]
|
|
150
|
+
}
|
|
151
|
+
|
|
118
152
|
// The block the resume prints to standard error so the fresh process continues on the original
|
|
119
153
|
// instruction rather than the tree alone.
|
|
120
154
|
function describe_handoff(handoff: Handoff): string {
|
|
@@ -123,17 +157,27 @@ function describe_handoff(handoff: Handoff): string {
|
|
|
123
157
|
describe_list(COMPLETED_LABEL, handoff.completed),
|
|
124
158
|
describe_list(REMAINING_LABEL, handoff.remaining),
|
|
125
159
|
describe_list(UNTOUCHED_LABEL, handoff.untouched),
|
|
160
|
+
...describe_findings(handoff),
|
|
126
161
|
].join('\n\n')
|
|
127
162
|
}
|
|
128
163
|
|
|
129
|
-
// Where a handoff file is written: `.
|
|
164
|
+
// Where a handoff file is written: `.josh/tmp/` is ignored, so `josh git`, which stages every
|
|
130
165
|
// untracked non-ignored file, cannot commit the note with the code. A refusal that asked for "a file"
|
|
131
166
|
// and named no place got one written beside the code and committed (joshuafolkken/kit#3603).
|
|
132
|
-
const HANDOFF_PATH = '.
|
|
167
|
+
const HANDOFF_PATH = '.josh/tmp/handoff-<N>.json'
|
|
168
|
+
const ISSUE_PLACEHOLDER = '<N>'
|
|
169
|
+
|
|
170
|
+
// The handoff path for one issue, relative to the checkout — the path `HANDOFF_PATH` tells the run
|
|
171
|
+
// to write, so the implementation-cut guard can let that one write through.
|
|
172
|
+
function handoff_path_of(issue: string): string {
|
|
173
|
+
return HANDOFF_PATH.replace(ISSUE_PLACEHOLDER, () => issue)
|
|
174
|
+
}
|
|
133
175
|
|
|
134
176
|
const run_cut_handoff = {
|
|
135
177
|
HANDOFF_FORMAT,
|
|
136
178
|
HANDOFF_PATH,
|
|
179
|
+
handoff_path_of,
|
|
180
|
+
carried_findings,
|
|
137
181
|
describe_handoff,
|
|
138
182
|
handoff_schema,
|
|
139
183
|
is_complete_handoff,
|