@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
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { split_assess, type SizeMeasurement } from '#scripts/split/split-assess'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
import { SPLIT_ROUTE_LABEL } from './issue-labels'
|
|
4
|
+
import { markdown_section } from './markdown-section'
|
|
5
|
+
|
|
6
|
+
// joshuafolkken/kit#4675: a request clearly over the split guide reached a lane as one Issue because
|
|
7
|
+
// nothing asked for its size when it was filed, and a split is cheapest at filing time. Every filing
|
|
8
|
+
// declares its estimate under the background heading, so it stays on the Issue; one over the guide is
|
|
9
|
+
// refused unless it is filed as a split or says why it stays one Issue.
|
|
10
|
+
//
|
|
11
|
+
// **The guide is `split_assess`'s, never a copy** — the measured diff and the declared estimate are
|
|
12
|
+
// judged by one `verdict_for`. An epic (a body carrying `## Split rationale`) declares no estimate:
|
|
13
|
+
// its children do.
|
|
14
|
+
|
|
15
|
+
const BACKGROUND_HEADING = '## 背景'
|
|
16
|
+
const EPIC_HEADING = '## Split rationale'
|
|
17
|
+
const PREFIX = '- 規模見積もり:'
|
|
18
|
+
const { REASON_PREFIX } = split_assess
|
|
19
|
+
const DECLARATION = `${PREFIX} 約 <N> ファイル / <M> 行(テスト除く)`
|
|
20
|
+
// Full- or half-width parentheses alike: the two read the same to the person typing the line.
|
|
21
|
+
const VALUE_PATTERN =
|
|
22
|
+
/^約\s*(?<files>\d+)\s*ファイル\s*\/\s*(?<lines>\d+)\s*行\s*[((]テスト除く[))]$/u
|
|
23
|
+
const MISSING = `missing size estimate: declare \`${DECLARATION}\` under ${BACKGROUND_HEADING}`
|
|
24
|
+
// The refusal ends in a line ready to paste (joshuafolkken/kit#5225).
|
|
25
|
+
const EXAMPLE = `${PREFIX} 約 3 ファイル / 60 行(テスト除く)`
|
|
26
|
+
const MALFORMED = `\`${PREFIX}\` must be written ${DECLARATION}\n${EXAMPLE}`
|
|
27
|
+
const estimate_schema = z.object({ files: z.coerce.number(), lines: z.coerce.number() })
|
|
28
|
+
|
|
29
|
+
function declared(body: string, prefix: string): string | undefined {
|
|
30
|
+
const background = markdown_section.section_lines(body, BACKGROUND_HEADING).join('\n')
|
|
31
|
+
const line = markdown_section
|
|
32
|
+
.unfenced_lines(background)
|
|
33
|
+
.map((text) => text.trim())
|
|
34
|
+
.find((text) => text.startsWith(prefix))
|
|
35
|
+
|
|
36
|
+
return line?.slice(prefix.length).trim()
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function is_epic(body: string): boolean {
|
|
40
|
+
return markdown_section.has_line(body, EPIC_HEADING)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// The declared estimate judged against the guide, or `undefined` when there is none or it does not parse.
|
|
44
|
+
function parse(body: string): SizeMeasurement | undefined {
|
|
45
|
+
const read = estimate_schema.safeParse(VALUE_PATTERN.exec(declared(body, PREFIX) ?? '')?.groups)
|
|
46
|
+
|
|
47
|
+
if (!read.success) return undefined
|
|
48
|
+
const { files, lines } = read.data
|
|
49
|
+
|
|
50
|
+
return { files, lines, verdict: split_assess.verdict_for(files, lines) }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// The shape check `issue:lint` makes: the declaration is there and parses. The guide needs the route,
|
|
54
|
+
// which only `issue:file` knows, so it is `guide_problem`'s.
|
|
55
|
+
function problems(body: string): ReadonlyArray<string> {
|
|
56
|
+
if (is_epic(body)) return []
|
|
57
|
+
if (declared(body, PREFIX) === undefined) return [MISSING]
|
|
58
|
+
|
|
59
|
+
return parse(body) === undefined ? [MALFORMED] : []
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// A split filing, or one that declares why it stays one Issue, passes over the guide.
|
|
63
|
+
function is_excused(body: string, route: string | undefined): boolean {
|
|
64
|
+
return route === SPLIT_ROUTE_LABEL || (declared(body, REASON_PREFIX) ?? '') !== ''
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function refusal(estimate: SizeMeasurement): string {
|
|
68
|
+
const counted = `size estimate ${String(estimate.files)} file(s) / ${String(estimate.lines)} line(s) exceeds the guide (${String(split_assess.FILE_GUIDE)} files / ${String(split_assess.LINE_GUIDE)} lines)`
|
|
69
|
+
|
|
70
|
+
return `${counted} — file it split (\`--route split\`) or declare \`${REASON_PREFIX} <理由>\`; split-assessment.md → "${split_assess.QUESTION_SECTION}"`
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// The filing refusal for an estimate over the guide; `undefined` under it, on a split filing, or with
|
|
74
|
+
// the reason declared. A missing or malformed estimate is `problems`' refusal, not this one.
|
|
75
|
+
function guide_problem(body: string, route: string | undefined): string | undefined {
|
|
76
|
+
const estimate = parse(body)
|
|
77
|
+
|
|
78
|
+
if (estimate?.verdict !== split_assess.SPLIT_VERDICT) return undefined
|
|
79
|
+
|
|
80
|
+
return is_excused(body, route) ? undefined : refusal(estimate)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// The declared file count, or `undefined` when there is no estimate or it does not parse.
|
|
84
|
+
function declared_files(body: string): number | undefined {
|
|
85
|
+
return parse(body)?.files
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const size_estimate = { declared_files, guide_problem, problems }
|
|
89
|
+
|
|
90
|
+
export { size_estimate }
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process'
|
|
2
|
+
import { gh_author_association } from '#scripts/gh/gh-author-association'
|
|
3
|
+
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
4
|
+
import { parse_json_object_or_undefined } from '#scripts/git/parse-json-array'
|
|
5
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
6
|
+
import { z } from 'zod'
|
|
7
|
+
import { session_cite } from './session-cite'
|
|
8
|
+
|
|
9
|
+
// Running a command an Issue body names — `josh measure:rerun`'s baselines and the drive's measurement
|
|
10
|
+
// declaration (`measure-declaration.ts`) alike.
|
|
11
|
+
//
|
|
12
|
+
// **The command is shell, and the body is written by whoever filed the Issue**.
|
|
13
|
+
// A baseline needs pipes and loops (`git log … | wc -l`, `for d in $(ls …)`), so an allow-list of
|
|
14
|
+
// commands cannot make it safe; what can is who wrote it. The input is therefore the Issue number, not
|
|
15
|
+
// a file, so the author's `author_association` arrives with the body from the same REST read, and only
|
|
16
|
+
// a body written by someone with write access to the repository is run.
|
|
17
|
+
|
|
18
|
+
const ISSUE_FIELDS = `body,${gh_author_association.AUTHOR_FIELDS}`
|
|
19
|
+
const UNKNOWN_ASSOCIATION = 'unknown'
|
|
20
|
+
// One command's budget — the same minute `josh-harness.ts` gives one command it spawns. A measurement
|
|
21
|
+
// is a count or a digest that answers in seconds, so a command still running after a minute is stuck,
|
|
22
|
+
// and without a bound it would hold the whole re-measurement open with nothing printed.
|
|
23
|
+
const MEASURE_TIMEOUT_MS = 60_000
|
|
24
|
+
const issue_schema = z.object({
|
|
25
|
+
body: z.string().nullish(),
|
|
26
|
+
...gh_author_association.author_fields_schema,
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
type IssueFields = z.infer<typeof issue_schema>
|
|
30
|
+
type BodyRead = { kind: 'trusted'; body: string } | { kind: 'refused'; reason: string }
|
|
31
|
+
type CommandRun = { kind: 'ok'; output: string } | { kind: 'failed'; message: string }
|
|
32
|
+
|
|
33
|
+
// The command's stdout, trimmed, or the message a failing or timed-out command threw.
|
|
34
|
+
function run_command(command: string): CommandRun {
|
|
35
|
+
try {
|
|
36
|
+
return {
|
|
37
|
+
kind: 'ok',
|
|
38
|
+
output: execSync(command, { encoding: 'utf8', timeout: MEASURE_TIMEOUT_MS }).trim(),
|
|
39
|
+
}
|
|
40
|
+
} catch (error) {
|
|
41
|
+
return { kind: 'failed', message: error_text.message_of(error) }
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// The run as one printable value: a failure is spelled in place of the output.
|
|
46
|
+
function text_of(run: CommandRun): string {
|
|
47
|
+
return run.kind === 'ok' ? run.output : `(command failed: ${run.message})`
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function read_issue(issue_number: string): Promise<IssueFields | undefined> {
|
|
51
|
+
const json = await git_gh_issue_read.issue_view_json(issue_number, ISSUE_FIELDS)
|
|
52
|
+
|
|
53
|
+
return json === undefined ? undefined : parse_json_object_or_undefined(json, issue_schema)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function untrusted(issue_number: string, issue: IssueFields): BodyRead {
|
|
57
|
+
const association = issue.author_association ?? UNKNOWN_ASSOCIATION
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
kind: 'refused',
|
|
61
|
+
reason: `refusing to run the baseline of ${session_cite.issue(issue_number)}: its author (${association}) is not ${gh_author_association.TRUSTED_LIST}`,
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// The body, only when its author can write to the repository. A read that fails is refused as well:
|
|
66
|
+
// an unknown author is not a trusted one.
|
|
67
|
+
async function read_trusted_body(issue_number: string): Promise<BodyRead> {
|
|
68
|
+
const issue = await read_issue(issue_number)
|
|
69
|
+
|
|
70
|
+
if (issue === undefined) {
|
|
71
|
+
return { kind: 'refused', reason: `could not read issue ${session_cite.issue(issue_number)}` }
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (!(await gh_author_association.is_trusted(gh_author_association.author_of(issue)))) {
|
|
75
|
+
return untrusted(issue_number, issue)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return { kind: 'trusted', body: issue.body ?? '' }
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const trusted_measure = { read_trusted_body, run_command, text_of }
|
|
82
|
+
|
|
83
|
+
export type { BodyRead, CommandRun }
|
|
84
|
+
export { trusted_measure }
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// The environment variables that name the **parent** agent session, and which a child session must
|
|
2
2
|
// not inherit.
|
|
3
3
|
//
|
|
4
|
-
// `
|
|
4
|
+
// `tools/eval/eval-session.ts` and `josh run:wake` both launch a headless session. Two copies of
|
|
5
5
|
// this list is the clone `CLAUDE.md`
|
|
6
6
|
// prohibits, and this is the shape of clone that fails silently: the copy that drifts does not throw
|
|
7
7
|
// or lint — the child dials the parent's private socket, is refused, and the session dies as
|
|
@@ -1,36 +1,18 @@
|
|
|
1
|
-
import { canonical_command
|
|
1
|
+
import { canonical_command } from './josh-aliases'
|
|
2
|
+
import { COMMAND_MAP } from './josh-command-map'
|
|
2
3
|
import type { CommandUsage } from './josh-command-types'
|
|
3
|
-
import { AUTOMATION_USAGE } from './josh-usage-automation'
|
|
4
|
-
import { BACKLOG_USAGE } from './josh-usage-backlog'
|
|
5
|
-
import { DEVELOPER_USAGE } from './josh-usage-developer'
|
|
6
|
-
import { HOOK_USAGE } from './josh-usage-hooks'
|
|
7
|
-
import { ISSUE_USAGE } from './josh-usage-issue'
|
|
8
|
-
import { REVIEW_USAGE } from './josh-usage-review'
|
|
9
|
-
import { RUN_USAGE } from './josh-usage-run'
|
|
10
|
-
import { SESSION_USAGE } from './josh-usage-session'
|
|
11
|
-
import { WORKFLOW_USAGE } from './josh-usage-workflow'
|
|
12
4
|
|
|
13
5
|
// The single renderer of a command's usage. `josh help <command>` prints it and
|
|
14
|
-
// `
|
|
15
|
-
// so the terminal and the page are one text (#3932).
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
'docs/josh-commands-run.md': [RUN_USAGE, SESSION_USAGE],
|
|
25
|
-
'docs/josh-commands-backlog.md': [ISSUE_USAGE, BACKLOG_USAGE, REVIEW_USAGE],
|
|
26
|
-
'docs/josh-commands-automation.md': [AUTOMATION_USAGE, WORKFLOW_USAGE, HOOK_USAGE],
|
|
27
|
-
}
|
|
28
|
-
/* eslint-enable @typescript-eslint/naming-convention */
|
|
29
|
-
const COMMAND_USAGE: UsageTable = Object.fromEntries(
|
|
30
|
-
Object.values(USAGE_PAGE_TABLES)
|
|
31
|
-
.flat()
|
|
32
|
-
.flatMap((table) => Object.entries(table)),
|
|
33
|
-
)
|
|
6
|
+
// `josh command:derive` writes it between a reference page's usage markers,
|
|
7
|
+
// so the terminal and the page are one text (#3932). The usage itself sits on each command's entry
|
|
8
|
+
// (#4185); which page renders it is the page's own `<!-- usage: <command> -->` span.
|
|
9
|
+
|
|
10
|
+
const USAGE_PAGES: ReadonlyArray<string> = [
|
|
11
|
+
'docs/josh-commands.md',
|
|
12
|
+
'docs/josh-commands-run.md',
|
|
13
|
+
'docs/josh-commands-backlog.md',
|
|
14
|
+
'docs/josh-commands-automation.md',
|
|
15
|
+
]
|
|
34
16
|
const NOTE_GAP = 3
|
|
35
17
|
|
|
36
18
|
interface ExampleLine {
|
|
@@ -39,7 +21,7 @@ interface ExampleLine {
|
|
|
39
21
|
}
|
|
40
22
|
|
|
41
23
|
function usage_for(name: string): CommandUsage | undefined {
|
|
42
|
-
return Object.hasOwn(
|
|
24
|
+
return Object.hasOwn(COMMAND_MAP, name) ? COMMAND_MAP[name]?.usage : undefined
|
|
43
25
|
}
|
|
44
26
|
|
|
45
27
|
function example_line(name: string, example: CommandUsage['examples'][number]): ExampleLine {
|
|
@@ -80,31 +62,22 @@ function format_usage(name: string): string | undefined {
|
|
|
80
62
|
return [format_examples(name, usage), ...flags].join('\n\n')
|
|
81
63
|
}
|
|
82
64
|
|
|
83
|
-
// `josh help <command>`: the synopsis line, the description, then the usage block
|
|
84
|
-
//
|
|
65
|
+
// `josh help <command>`: the synopsis line, the description, then the usage block. An alias
|
|
66
|
+
// resolves to its command; a name that is neither answers `undefined`.
|
|
85
67
|
function format_command_help(input: string): string | undefined {
|
|
86
68
|
const name = canonical_command(input)
|
|
87
69
|
const entry = Object.hasOwn(COMMAND_MAP, name) ? COMMAND_MAP[name] : undefined
|
|
88
70
|
if (entry === undefined) return undefined
|
|
89
71
|
const [synopsis] = entry.reference
|
|
90
72
|
const head = synopsis ? `josh ${name} ${synopsis}` : `josh ${name}`
|
|
91
|
-
const usage = format_usage(name)
|
|
92
|
-
|
|
93
|
-
return [head, '', entry.description, ...(usage === undefined ? [] : ['', usage])].join('\n')
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// The commands whose usage blocks a reference page renders — the keys of the tables tied to it.
|
|
97
|
-
function page_commands(page: string): Array<string> {
|
|
98
|
-
const tables = Object.hasOwn(USAGE_PAGE_TABLES, page) ? USAGE_PAGE_TABLES[page] : undefined
|
|
99
73
|
|
|
100
|
-
return
|
|
74
|
+
return [head, '', entry.description, '', format_usage(name)].join('\n')
|
|
101
75
|
}
|
|
102
76
|
|
|
103
77
|
const command_usage = {
|
|
104
|
-
USAGE_PAGES
|
|
78
|
+
USAGE_PAGES,
|
|
105
79
|
format_command_help,
|
|
106
80
|
format_usage,
|
|
107
|
-
page_commands,
|
|
108
81
|
}
|
|
109
82
|
|
|
110
83
|
export { command_usage }
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { constants, copyFileSync, lstatSync, readdirSync, rmSync, writeFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
4
|
+
|
|
5
|
+
// The two upkeep jobs of the durable run-state directory (`durable-state.ts`), each run at most once
|
|
6
|
+
// per process per directory rather than on every record lookup.
|
|
7
|
+
//
|
|
8
|
+
// **A legacy record is copied once per directory.** A run that is going when
|
|
9
|
+
// this lands wrote its records to `/tmp`, and reading only the new place would end it as a reboot
|
|
10
|
+
// did. Copying on every lookup instead brought back a record a run removed on purpose — an ended
|
|
11
|
+
// carry, a stopped launch, a failed ship's result — from the `/tmp` original. The original is left
|
|
12
|
+
// in place: a lane or parent still on the code before this change reads `/tmp` until it merges main.
|
|
13
|
+
// A copy rather than a rename because `/tmp` is often another filesystem. A record an old-code
|
|
14
|
+
// process writes to `/tmp` after the copy is not picked up.
|
|
15
|
+
//
|
|
16
|
+
// **A log not written for two weeks is removed.** `/tmp` used to clear them on every boot; the common
|
|
17
|
+
// git directory never does, and a log is the only record here that grows without an owner ending it.
|
|
18
|
+
|
|
19
|
+
const COPIED_MARKER = '.legacy-copied'
|
|
20
|
+
const MARKER_MODE = 0o600
|
|
21
|
+
const LOG_RETENTION_DAYS = 14
|
|
22
|
+
const DAY_MS = 86_400_000
|
|
23
|
+
const LOG_SUFFIX = '.log'
|
|
24
|
+
// What a record is. A lock or a staged write beside a record carries its prefix but means nothing
|
|
25
|
+
// past the process that made it.
|
|
26
|
+
const RECORD_SUFFIXES = ['.json', '.jsonl', LOG_SUFFIX] as const
|
|
27
|
+
|
|
28
|
+
function is_record_name(name: string, prefixes: ReadonlyArray<string>): boolean {
|
|
29
|
+
const has_prefix = prefixes.some((prefix) => name.startsWith(prefix))
|
|
30
|
+
|
|
31
|
+
return has_prefix && RECORD_SUFFIXES.some((suffix) => name.endsWith(suffix))
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function list_names(directory: string): Array<string> {
|
|
35
|
+
try {
|
|
36
|
+
return readdirSync(directory)
|
|
37
|
+
} catch {
|
|
38
|
+
return []
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function copy_record(from: string, to: string): void {
|
|
43
|
+
try {
|
|
44
|
+
if (!stamp_file.is_own_regular_file(from)) return
|
|
45
|
+
|
|
46
|
+
copyFileSync(from, to, constants.COPYFILE_EXCL)
|
|
47
|
+
} catch {
|
|
48
|
+
// Another process wrote it first, or the copy failed; either way nothing is overwritten.
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function copy_legacy(from: string, to: string, prefixes: ReadonlyArray<string>): void {
|
|
53
|
+
if (from === to) return
|
|
54
|
+
|
|
55
|
+
for (const name of list_names(from)) {
|
|
56
|
+
if (is_record_name(name, prefixes)) copy_record(path.join(from, name), path.join(to, name))
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// The marker is created exclusively, so one process wins the copy. A marker rather than whether
|
|
61
|
+
// `mkdirSync` made the directory: a lane on this code can create the shared directory before the run
|
|
62
|
+
// that owns the `/tmp` records switches over, and that run still needs its copy.
|
|
63
|
+
function claim_copy(directory: string): boolean {
|
|
64
|
+
try {
|
|
65
|
+
writeFileSync(path.join(directory, COPIED_MARKER), '', { flag: 'wx', mode: MARKER_MODE })
|
|
66
|
+
|
|
67
|
+
return true
|
|
68
|
+
} catch {
|
|
69
|
+
return false
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function copy_once(from: string, to: string, prefixes: ReadonlyArray<string>): void {
|
|
74
|
+
if (claim_copy(to)) copy_legacy(from, to, prefixes)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function is_stale(target: string, now_ms: number): boolean {
|
|
78
|
+
const age_ms = now_ms - lstatSync(target).mtimeMs
|
|
79
|
+
|
|
80
|
+
return age_ms > LOG_RETENTION_DAYS * DAY_MS && stamp_file.is_own_regular_file(target)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function prune_log(target: string, now_ms: number): void {
|
|
84
|
+
try {
|
|
85
|
+
if (is_stale(target, now_ms)) rmSync(target, { force: true })
|
|
86
|
+
} catch {
|
|
87
|
+
// Gone already, or not ours to remove.
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function prune_stale_logs(
|
|
92
|
+
directory: string,
|
|
93
|
+
prefixes: ReadonlyArray<string>,
|
|
94
|
+
now_ms: number,
|
|
95
|
+
): void {
|
|
96
|
+
for (const name of list_names(directory)) {
|
|
97
|
+
if (name.endsWith(LOG_SUFFIX) && is_record_name(name, prefixes)) {
|
|
98
|
+
prune_log(path.join(directory, name), now_ms)
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const durable_state_migrate = { LOG_RETENTION_DAYS, copy_once, is_record_name, prune_stale_logs }
|
|
104
|
+
|
|
105
|
+
export { durable_state_migrate }
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { mkdirSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
4
|
+
import { durable_state_migrate } from '#scripts/josh/durable-state-migrate'
|
|
5
|
+
import { PLATFORM_TEMP_ROOT, platform_temporary } from '#scripts/josh/platform-temporary'
|
|
6
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
7
|
+
|
|
8
|
+
// **Which record goes where — the one place this is decided.** A record a run has to read again after
|
|
9
|
+
// the machine restarts lives here, in the common git directory: the carry and ended records, the event
|
|
10
|
+
// stream, the lane state and ledger, the wake log, the backlogrun launch record and log, the detached
|
|
11
|
+
// ship's log and result, and a lane child's dispatch log. macOS empties `/tmp` on every boot, and losing them
|
|
12
|
+
// there left the open lanes stateless, the merge statistics empty and a parked ship's failure
|
|
13
|
+
// unreadable. Everything that means nothing past the process that wrote it — a lock, a pid, a socket,
|
|
14
|
+
// a per-process cache — stays in `PLATFORM_TEMP_ROOT`, where a reboot clearing it is the right answer.
|
|
15
|
+
//
|
|
16
|
+
// **The common git directory rather than the home directory**, because a Codex lane's sandbox reads
|
|
17
|
+
// `$HOME` but may write the common git directory (`codex-agent-argv.ts`), and every lane of one
|
|
18
|
+
// repository shares it. A repository's own clone is also where `review-stops.jsonl` already lives.
|
|
19
|
+
// Outside a repository there is no such directory, and the record falls back to the temp root.
|
|
20
|
+
//
|
|
21
|
+
// **Records a run left in `/tmp` are copied in once per directory, and a log not written for two
|
|
22
|
+
// weeks is removed** (`durable-state-migrate.ts`).
|
|
23
|
+
//
|
|
24
|
+
// **`JOSH_TEMP_ROOT` moves this root too**, into a directory of its own beneath the override, so the unit
|
|
25
|
+
// suite's network guard keeps every record of a test run out of the live one exactly as before.
|
|
26
|
+
const RUN_STATE_DIRECTORY = 'run-state'
|
|
27
|
+
const OVERRIDE_STATE_DIRECTORY = 'josh-state'
|
|
28
|
+
const STATE_DIRECTORY_MODE = 0o700
|
|
29
|
+
|
|
30
|
+
function state_root(override: string | undefined, common: string | undefined): string {
|
|
31
|
+
if (override !== undefined && override !== '') {
|
|
32
|
+
return path.join(override, OVERRIDE_STATE_DIRECTORY)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (common === undefined) return PLATFORM_TEMP_ROOT
|
|
36
|
+
|
|
37
|
+
return path.join(common, git_common_directory.STATE_DIRECTORY, RUN_STATE_DIRECTORY)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Read once at import, as `PLATFORM_TEMP_ROOT` is, so both roots answer for the same override.
|
|
41
|
+
const STATE_ROOT_OVERRIDE = process.env[platform_temporary.TEMP_ROOT_KEY]
|
|
42
|
+
|
|
43
|
+
// The root for a named common git directory — what a launcher grants a sandboxed child before it runs.
|
|
44
|
+
function root_for(common: string | undefined): string {
|
|
45
|
+
return state_root(STATE_ROOT_OVERRIDE, common)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function root(): string {
|
|
49
|
+
return root_for(git_common_directory.repository())
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Every record kept here, by the prefix of its file name — the list the one-time copy from `/tmp`
|
|
53
|
+
// walks, so a record added here is carried over with the rest.
|
|
54
|
+
const PREFIX = {
|
|
55
|
+
CARRY: 'josh-run-carry-',
|
|
56
|
+
ENDED: 'josh-run-ended-',
|
|
57
|
+
EVENTS: 'josh-run-events-',
|
|
58
|
+
LANE_STATE: 'josh-lane-state-',
|
|
59
|
+
LANE_LEDGER: 'josh-lane-ledger-',
|
|
60
|
+
WAKE_LOG: 'josh-run-wake-log-',
|
|
61
|
+
BACKLOGRUN_LAUNCH: 'josh-backlogrun-launch-',
|
|
62
|
+
BACKLOGRUN_LOG: 'josh-backlogrun-log-',
|
|
63
|
+
SHIP_LOG: 'josh-ship-log-',
|
|
64
|
+
SHIP_RESULT: 'josh-ship-result-',
|
|
65
|
+
LANE_DISPATCH: 'josh-lane-dispatch-',
|
|
66
|
+
LANE_PLAN: 'josh-lane-plan-',
|
|
67
|
+
} as const
|
|
68
|
+
|
|
69
|
+
const PREFIXES: ReadonlyArray<string> = Object.values(PREFIX)
|
|
70
|
+
|
|
71
|
+
// Directories this process has already made ready, so the upkeep runs once rather than per lookup.
|
|
72
|
+
const ensured = new Set<string>()
|
|
73
|
+
|
|
74
|
+
function prepare(directory: string): void {
|
|
75
|
+
mkdirSync(directory, { recursive: true, mode: STATE_DIRECTORY_MODE })
|
|
76
|
+
durable_state_migrate.copy_once(PLATFORM_TEMP_ROOT, directory, PREFIXES)
|
|
77
|
+
durable_state_migrate.prune_stale_logs(directory, PREFIXES, Date.now())
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// **A directory that cannot be created answers the temp root rather than throwing** — a sandbox that
|
|
81
|
+
// may not write the common git directory still runs, with the records `/tmp` always held.
|
|
82
|
+
function ensure(directory: string): string {
|
|
83
|
+
if (ensured.has(directory)) return directory
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
prepare(directory)
|
|
87
|
+
} catch {
|
|
88
|
+
return PLATFORM_TEMP_ROOT
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
ensured.add(directory)
|
|
92
|
+
|
|
93
|
+
return directory
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// The durable counterpart of `stamp_file.stamp_path`: the same per-account, per-key file name, in the
|
|
97
|
+
// directory above. The directory is created on the way, private to the account.
|
|
98
|
+
function durable_path(prefix: string, key_root: string, suffix?: string): string {
|
|
99
|
+
return path.join(ensure(root()), stamp_file.stamp_name(prefix, key_root, suffix))
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const durable_state = {
|
|
103
|
+
PREFIX,
|
|
104
|
+
STATE_DIRECTORY_MODE,
|
|
105
|
+
ensure,
|
|
106
|
+
path: durable_path,
|
|
107
|
+
root,
|
|
108
|
+
root_for,
|
|
109
|
+
state_root,
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export { durable_state }
|
|
@@ -3,7 +3,7 @@ import { stamp_file } from './stamp-file'
|
|
|
3
3
|
|
|
4
4
|
// A stamp whose payload is "when this was taken, and the digest of every file it covers".
|
|
5
5
|
//
|
|
6
|
-
// `
|
|
6
|
+
// `tools/eval/eval-stamp.ts` was the only holder of this shape. `josh review:brief` needs two more
|
|
7
7
|
// records of exactly the same kind — the gate's result, and the snapshot round 1 takes so round 2
|
|
8
8
|
// can name the fix delta — and copying the payload type, its validation, the guarded read and the
|
|
9
9
|
// comparison into a second module is the clone `CLAUDE.md` prohibits. What genuinely differs between
|
|
@@ -48,6 +48,14 @@ interface FileMapStamp {
|
|
|
48
48
|
// reads it and the two `josh review:brief` records, which assert a completed past fact by
|
|
49
49
|
// existing at all, neither write nor read it.
|
|
50
50
|
completed_at?: string
|
|
51
|
+
// The git blob of each mapped path as it was read — written only by the round-1 review snapshot
|
|
52
|
+
// (`review-round-one-blobs.ts`). When `base` moves, round 2 carries these onto the new base and
|
|
53
|
+
// measures the fix delta from there; a record without them falls back to the moved-base refusal.
|
|
54
|
+
blobs?: Record<string, string>
|
|
55
|
+
// The fingerprint of what the vouched check reads beside the files — its tools' versions and its
|
|
56
|
+
// environment (`verification-inputs.ts`, joshuafolkken/kit#4495). Written by a record created with an
|
|
57
|
+
// `inputs` source; a reader of such a record refuses one whose fingerprint is absent or differs.
|
|
58
|
+
inputs?: string
|
|
51
59
|
}
|
|
52
60
|
|
|
53
61
|
// Takes `unknown` rather than the declared field type, because the declared type is an assertion
|
|
@@ -64,28 +72,38 @@ function is_file_map(value: unknown): value is Record<string, string> {
|
|
|
64
72
|
// reader treats an absent field as the safe answer — "not running" for a `pid`, "cannot be reused"
|
|
65
73
|
// for a `base`. Spread rather than assigned, because `exactOptionalPropertyTypes` makes an explicit
|
|
66
74
|
// `undefined` a different thing from an absent key.
|
|
67
|
-
function
|
|
68
|
-
pid: unknown,
|
|
69
|
-
base: unknown,
|
|
70
|
-
completed_at: unknown,
|
|
71
|
-
process_start: unknown,
|
|
72
|
-
): Partial<FileMapStamp> {
|
|
75
|
+
function identity_fields({ pid, process_start }: Partial<FileMapStamp>): Partial<FileMapStamp> {
|
|
73
76
|
return {
|
|
74
77
|
...(typeof pid === 'number' && { pid }),
|
|
78
|
+
...(typeof process_start === 'string' && { process_start }),
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function tree_fields({ base, completed_at, blobs }: Partial<FileMapStamp>): Partial<FileMapStamp> {
|
|
83
|
+
return {
|
|
75
84
|
...(typeof base === 'string' && { base }),
|
|
76
85
|
...(typeof completed_at === 'string' && { completed_at }),
|
|
77
|
-
...(
|
|
86
|
+
...(is_file_map(blobs) && { blobs }),
|
|
78
87
|
}
|
|
79
88
|
}
|
|
80
89
|
|
|
90
|
+
function input_fields({ inputs }: Partial<FileMapStamp>): Partial<FileMapStamp> {
|
|
91
|
+
return typeof inputs === 'string' ? { inputs } : {}
|
|
92
|
+
}
|
|
93
|
+
|
|
81
94
|
function parse_stamp(raw: string): FileMapStamp | undefined {
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
) as Partial<FileMapStamp>
|
|
95
|
+
const parsed = JSON.parse(raw) as Partial<FileMapStamp>
|
|
96
|
+
const { taken_at, files } = parsed
|
|
85
97
|
|
|
86
98
|
if (typeof taken_at !== 'string' || !is_file_map(files)) return undefined
|
|
87
99
|
|
|
88
|
-
return {
|
|
100
|
+
return {
|
|
101
|
+
taken_at,
|
|
102
|
+
files,
|
|
103
|
+
...identity_fields(parsed),
|
|
104
|
+
...tree_fields(parsed),
|
|
105
|
+
...input_fields(parsed),
|
|
106
|
+
}
|
|
89
107
|
}
|
|
90
108
|
|
|
91
109
|
// Whether the process that wrote this record is still running. It takes the
|
|
@@ -152,14 +170,22 @@ function changed_since(stamp: FileMapStamp, tree: Record<string, string>): Reado
|
|
|
152
170
|
interface FileMapStampAccess {
|
|
153
171
|
stamp_path: () => string
|
|
154
172
|
// `base` is written by the one record that is acted on rather than merely reported — the
|
|
155
|
-
// green-gate reuse. The others omit it and are unaffected.
|
|
156
|
-
write: (
|
|
173
|
+
// green-gate reuse. The others omit it and are unaffected. `blobs` is the round-1 snapshot's alone.
|
|
174
|
+
write: (
|
|
175
|
+
files: Record<string, string>,
|
|
176
|
+
target?: string,
|
|
177
|
+
base?: string,
|
|
178
|
+
blobs?: Record<string, string>,
|
|
179
|
+
) => string
|
|
157
180
|
// Marks an existing record as belonging to a run that finished. It
|
|
158
181
|
// amends rather than rewrites, and answers `undefined` where there is no record to amend: a run
|
|
159
182
|
// whose record never got written has nothing to assert a completion about, and inventing one here
|
|
160
183
|
// would manufacture the very vouching the field exists to withhold.
|
|
161
184
|
complete: (target?: string) => string | undefined
|
|
162
185
|
read: (source?: string) => FileMapStamp | undefined
|
|
186
|
+
// Whether `stamp` was written under the inputs fingerprint read now; always `true` for a record
|
|
187
|
+
// created without an `inputs` source, which never vouches for a check.
|
|
188
|
+
describes_inputs: (stamp: FileMapStamp) => boolean
|
|
163
189
|
// For a record whose meaning is its existence rather than its contents — the in-flight gate marker.
|
|
164
190
|
// A record nobody removes would go on asserting a gate that ended.
|
|
165
191
|
remove: (target?: string) => void
|
|
@@ -219,7 +245,11 @@ function complete_at(target: string): string | undefined {
|
|
|
219
245
|
// The destination is a parameter on both sides so a test can exercise the round trip without
|
|
220
246
|
// overwriting the record a real run may be relying on — two commands share one path by design, and a
|
|
221
247
|
// suite that wrote to it would be a second writer nobody declared.
|
|
222
|
-
|
|
248
|
+
//
|
|
249
|
+
// `inputs` answers the fingerprint of what the record vouches for beside its files
|
|
250
|
+
// (`verification-inputs.ts`); it is read at each write and each comparison, so a tool reinstalled or an
|
|
251
|
+
// environment variable changed between them leaves the record standing for nobody.
|
|
252
|
+
function create(prefix: string, root?: string, inputs?: () => string): FileMapStampAccess {
|
|
223
253
|
function resolve(): string {
|
|
224
254
|
return stamp_file.stamp_path(prefix, root)
|
|
225
255
|
}
|
|
@@ -229,15 +259,18 @@ function create(prefix: string, root?: string): FileMapStampAccess {
|
|
|
229
259
|
// `base` goes into the payload undefined and all — `JSON.stringify` drops an undefined value,
|
|
230
260
|
// so a caller that has no base writes exactly the record it wrote before this field existed.
|
|
231
261
|
// `own_fields` is what writes the pid, and the writing process's start time beside it — assembled in one place so no record can carry half an identity.
|
|
232
|
-
write: (files, target = resolve(), base?: string) =>
|
|
262
|
+
write: (files, target = resolve(), base?: string, blobs?: Record<string, string>) =>
|
|
233
263
|
stamp_file.write_stamp(target, {
|
|
234
264
|
taken_at: new Date().toISOString(),
|
|
235
265
|
files,
|
|
236
266
|
...process_identity.own_fields(),
|
|
237
267
|
base,
|
|
268
|
+
blobs,
|
|
269
|
+
inputs: inputs?.(),
|
|
238
270
|
}),
|
|
239
271
|
complete: (target = resolve()) => complete_at(target),
|
|
240
272
|
read: (source = resolve()) => read_at(source),
|
|
273
|
+
describes_inputs: (stamp) => inputs === undefined || stamp.inputs === inputs(),
|
|
241
274
|
remove: (target = resolve()) => {
|
|
242
275
|
stamp_file.remove_stamp(target)
|
|
243
276
|
},
|