@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
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { file_map_stamp, type FileMapStamp } from '#scripts/josh/file-map-stamp'
|
|
2
2
|
import { path_decision } from '#scripts/josh/path-decision'
|
|
3
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
4
|
+
import { release_approval_prune } from '#scripts/release/release-approval-prune'
|
|
5
|
+
import { z } from 'zod'
|
|
3
6
|
import { review_level } from './review-level'
|
|
4
7
|
|
|
5
8
|
// Whether the second review round runs at all.
|
|
@@ -11,7 +14,8 @@ import { review_level } from './review-level'
|
|
|
11
14
|
// because round 1's *fix code* is unreviewed, and that is structural. Arm A applies where there is no fix code — the findings closed without an edit — so
|
|
12
15
|
// the premise is absent rather than overridden. Arm B applies where the fix leaves what executes
|
|
13
16
|
// unchanged: `review-level.ts`'s inert set, documentation under `docs/` and the root `README.md`,
|
|
14
|
-
// `prompts/`, and source files whose only change is in comments
|
|
17
|
+
// `prompts/`, `josh metrics` approvals, and source files whose only change is in comments
|
|
18
|
+
// (`review-code-tree.ts`).
|
|
15
19
|
//
|
|
16
20
|
// **Arm B is wider than the review level's inert set, on purpose** (joshuafolkken/kit#3787). Round 1
|
|
17
21
|
// still reviews a documentation or prompt change in full, and the fix to its findings is still made;
|
|
@@ -22,24 +26,46 @@ type RoundTwoVerdict = 'required' | 'skip'
|
|
|
22
26
|
|
|
23
27
|
const REQUIRED_VERDICT: RoundTwoVerdict = 'required'
|
|
24
28
|
const SKIPPED_VERDICT: RoundTwoVerdict = 'skip'
|
|
29
|
+
const VERDICTS = [REQUIRED_VERDICT, SKIPPED_VERDICT] as const
|
|
30
|
+
|
|
31
|
+
// One stable code per branch of `decide`, so a decision can be counted by why it fell where it did —
|
|
32
|
+
// the reason sentences carry paths and timestamps and cannot be (joshuafolkken/kit#4064).
|
|
33
|
+
const CODE = {
|
|
34
|
+
EMPTY: 'empty',
|
|
35
|
+
INERT: 'inert',
|
|
36
|
+
OPEN_FINDING: 'open-finding',
|
|
37
|
+
NO_SNAPSHOT: 'no-snapshot',
|
|
38
|
+
BASE_MOVED: 'base-moved',
|
|
39
|
+
LIVE: 'live',
|
|
40
|
+
} as const
|
|
41
|
+
|
|
42
|
+
type RoundTwoCode = (typeof CODE)[keyof typeof CODE]
|
|
43
|
+
|
|
44
|
+
// The key `josh review:round2 --json` prints its verdict under, read back by `josh ship`.
|
|
45
|
+
const JSON_KEY = 'round2'
|
|
46
|
+
const json_schema = z.object({
|
|
47
|
+
[JSON_KEY]: z.enum(VERDICTS),
|
|
48
|
+
code: z.enum(Object.values(CODE)),
|
|
49
|
+
reason: z.string(),
|
|
50
|
+
})
|
|
25
51
|
|
|
26
52
|
// **The default is `required`, and every uncertainty resolves to it.** A command that answered `skip`
|
|
27
53
|
// on a missing record would be the cheapest possible run and the most dangerous — the direction
|
|
28
54
|
// `review-brief.ts` already takes when it widens a round-2 target it cannot name.
|
|
29
55
|
const OPEN_FINDING_REASON =
|
|
30
|
-
'the
|
|
56
|
+
'the ledger does not show every round-1 High/Medium finding closed, so the pass that verifies them is due'
|
|
31
57
|
const NO_SNAPSHOT_REASON =
|
|
32
58
|
'no round-1 snapshot was recorded, so the fix delta cannot be named — the round runs rather than assuming it is empty'
|
|
33
59
|
const EMPTY_DELTA_REASON_PREFIX =
|
|
34
60
|
'the fix delta is empty: round 1 wrote no fix code, so there is no unreviewed fix for a verification pass to read'
|
|
35
61
|
const INERT_DELTA_REASON_PREFIX =
|
|
36
|
-
'every path round 1 fixed leaves what executes unchanged — inert, documentation, a prompt, or a comment-only edit'
|
|
62
|
+
'every path round 1 fixed leaves what executes unchanged — inert, documentation, a prompt, a metrics approval, or a comment-only edit'
|
|
37
63
|
const README_PATH = 'README.md'
|
|
38
64
|
const DOCUMENTATION_PREFIX = 'docs/'
|
|
39
65
|
const MARKDOWN_EXTENSION = '.md'
|
|
40
66
|
const PROMPTS_PREFIX = 'prompts/'
|
|
41
67
|
const BASE_MOVED_REASON =
|
|
42
|
-
|
|
68
|
+
"the change base moved since round 1 was recorded and round 1's tree could not be carried onto the new one — no recorded round-1 blobs, or the carry conflicts — so the fix delta cannot be named and the round runs"
|
|
43
69
|
|
|
44
70
|
interface RoundTwoInput {
|
|
45
71
|
// **The commit the tree above is a diff against**. This decision reads the
|
|
@@ -49,20 +75,28 @@ interface RoundTwoInput {
|
|
|
49
75
|
// a `skip`, which is worse than a mistargeted read — nothing gets read at all.
|
|
50
76
|
// `undefined` where it could not be resolved to a commit, which is refused exactly like a mismatch.
|
|
51
77
|
base: string | undefined
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
// pressure — and its absence is the safe answer, so a caller that forgets it pays a round.
|
|
78
|
+
// Read from the issue's ledger, where `review:record` keeps each finding's disposition
|
|
79
|
+
// (`review-round-one-closure.ts`), not asserted by the caller (joshuafolkken/kit#5286).
|
|
55
80
|
is_round_one_closed: boolean
|
|
81
|
+
// Why round 1 is open, quoted into the `required` answer. Absent falls back to the generic reason.
|
|
82
|
+
open_reason?: string
|
|
56
83
|
snapshot: FileMapStamp | undefined
|
|
57
84
|
tree: Record<string, string>
|
|
58
85
|
// The paths whose code round 1's fixes left as it was (`review_code_tree.comment_only`). Absent is
|
|
59
86
|
// none, which is what a run without a code record pays.
|
|
60
87
|
comment_only?: ReadonlyArray<string>
|
|
88
|
+
// Asked only when the base moved: round 1's tree carried onto the current base, diffed against the
|
|
89
|
+
// tree now (`review-round-one-blobs.ts`). `undefined`, or no reader at all, is the moved-base refusal.
|
|
90
|
+
carried_delta?: (snapshot: FileMapStamp) => ReadonlyArray<string> | undefined
|
|
61
91
|
}
|
|
62
92
|
|
|
63
|
-
interface
|
|
93
|
+
interface RoundTwoAnswer {
|
|
64
94
|
verdict: RoundTwoVerdict
|
|
95
|
+
code: RoundTwoCode
|
|
65
96
|
reason: string
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
interface RoundTwoDecision extends RoundTwoAnswer {
|
|
66
100
|
// The paths round 1's fixes changed. Returned even on `required` so the caller can name them, and
|
|
67
101
|
// on a `skip` so the record the run leaves behind says what went unreviewed.
|
|
68
102
|
delta: ReadonlyArray<string>
|
|
@@ -99,8 +133,17 @@ function is_documentation(relative: string): boolean {
|
|
|
99
133
|
return relative.startsWith(DOCUMENTATION_PREFIX) && relative.endsWith(MARKDOWN_EXTENSION)
|
|
100
134
|
}
|
|
101
135
|
|
|
136
|
+
// **A `josh metrics` approval is data, not code** (joshuafolkken/kit#4842): the ship's pre-detach
|
|
137
|
+
// re-record rewrites it after round 1, and the gate's own metrics step checks it — the same reason
|
|
138
|
+
// `review-reviewed-tree.ts` reads it as no move.
|
|
102
139
|
function is_unexecuted(relative: string, comment_only: ReadonlyArray<string>): boolean {
|
|
103
|
-
if (
|
|
140
|
+
if (
|
|
141
|
+
review_level.is_inert(relative) ||
|
|
142
|
+
is_documentation(relative) ||
|
|
143
|
+
release_approval_prune.is_approval(relative)
|
|
144
|
+
) {
|
|
145
|
+
return true
|
|
146
|
+
}
|
|
104
147
|
|
|
105
148
|
return comment_only.includes(relative)
|
|
106
149
|
}
|
|
@@ -109,43 +152,84 @@ function verdict_for_delta(
|
|
|
109
152
|
delta: ReadonlyArray<string>,
|
|
110
153
|
taken_at: string,
|
|
111
154
|
comment_only: ReadonlyArray<string> = [],
|
|
112
|
-
):
|
|
113
|
-
if (delta.length === 0)
|
|
155
|
+
): RoundTwoAnswer {
|
|
156
|
+
if (delta.length === 0) {
|
|
157
|
+
return { verdict: SKIPPED_VERDICT, code: CODE.EMPTY, reason: empty_reason(taken_at) }
|
|
158
|
+
}
|
|
114
159
|
|
|
115
160
|
const deciding = delta.filter((relative) => !is_unexecuted(relative, comment_only))
|
|
116
161
|
|
|
117
|
-
if (deciding.length === 0)
|
|
162
|
+
if (deciding.length === 0) {
|
|
163
|
+
return { verdict: SKIPPED_VERDICT, code: CODE.INERT, reason: inert_reason(delta) }
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return { verdict: REQUIRED_VERDICT, code: CODE.LIVE, reason: live_reason(deciding) }
|
|
167
|
+
}
|
|
118
168
|
|
|
119
|
-
|
|
169
|
+
function required(code: RoundTwoCode, reason: string): RoundTwoDecision {
|
|
170
|
+
return { verdict: REQUIRED_VERDICT, code, reason, delta: [] }
|
|
120
171
|
}
|
|
121
172
|
|
|
122
|
-
|
|
123
|
-
|
|
173
|
+
// On a moved base the digest comparison is a set difference, not the fix delta, so the carried
|
|
174
|
+
// reading replaces it and every later rule is the same one an unmoved base gets.
|
|
175
|
+
function fix_delta(
|
|
176
|
+
input: RoundTwoInput,
|
|
177
|
+
snapshot: FileMapStamp,
|
|
178
|
+
): ReadonlyArray<string> | undefined {
|
|
179
|
+
if (file_map_stamp.describes_base(snapshot, input.base)) {
|
|
180
|
+
return file_map_stamp.changed_since(snapshot, input.tree)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return input.carried_delta?.(snapshot)
|
|
124
184
|
}
|
|
125
185
|
|
|
126
186
|
function decide(input: RoundTwoInput): RoundTwoDecision {
|
|
127
|
-
if (!input.is_round_one_closed)
|
|
128
|
-
|
|
129
|
-
|
|
187
|
+
if (!input.is_round_one_closed) {
|
|
188
|
+
return required(CODE.OPEN_FINDING, input.open_reason ?? OPEN_FINDING_REASON)
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (input.snapshot === undefined) return required(CODE.NO_SNAPSHOT, NO_SNAPSHOT_REASON)
|
|
192
|
+
|
|
193
|
+
const delta = fix_delta(input, input.snapshot)
|
|
130
194
|
|
|
131
|
-
|
|
195
|
+
if (delta === undefined) return required(CODE.BASE_MOVED, BASE_MOVED_REASON)
|
|
132
196
|
|
|
133
197
|
return { ...verdict_for_delta(delta, input.snapshot.taken_at, input.comment_only), delta }
|
|
134
198
|
}
|
|
135
199
|
|
|
200
|
+
function to_json(answer: RoundTwoAnswer): string {
|
|
201
|
+
return JSON.stringify({ [JSON_KEY]: answer.verdict, code: answer.code, reason: answer.reason })
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// The answer `to_json` printed, or `undefined` for any other output — read by the one caller that
|
|
205
|
+
// records it, which must not guess a verdict from text it cannot parse.
|
|
206
|
+
function parse_json(text: string): RoundTwoAnswer | undefined {
|
|
207
|
+
const parsed = json_schema.safeParse(json_value.parse_or_undefined(text.trim())).data
|
|
208
|
+
|
|
209
|
+
return parsed === undefined
|
|
210
|
+
? undefined
|
|
211
|
+
: { verdict: parsed[JSON_KEY], code: parsed.code, reason: parsed.reason }
|
|
212
|
+
}
|
|
213
|
+
|
|
136
214
|
const review_round2 = {
|
|
137
215
|
BASE_MOVED_REASON,
|
|
216
|
+
CODE,
|
|
138
217
|
decide,
|
|
139
218
|
EMPTY_DELTA_REASON_PREFIX,
|
|
140
219
|
empty_reason,
|
|
141
220
|
INERT_DELTA_REASON_PREFIX,
|
|
142
221
|
inert_reason,
|
|
222
|
+
is_unexecuted,
|
|
223
|
+
JSON_KEY,
|
|
143
224
|
live_reason,
|
|
144
225
|
NO_SNAPSHOT_REASON,
|
|
145
226
|
OPEN_FINDING_REASON,
|
|
227
|
+
parse_json,
|
|
146
228
|
REQUIRED_VERDICT,
|
|
147
229
|
SKIPPED_VERDICT,
|
|
230
|
+
to_json,
|
|
148
231
|
verdict_for_delta,
|
|
149
232
|
}
|
|
150
233
|
|
|
234
|
+
export type { RoundTwoAnswer, RoundTwoCode, RoundTwoVerdict }
|
|
151
235
|
export { review_round2 }
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { gate_labels } from '#scripts/gate/gate-labels'
|
|
2
|
+
import { verification_inputs } from '#scripts/gate/verification-inputs'
|
|
1
3
|
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
2
4
|
import { file_map_stamp, type FileMapStampAccess } from '#scripts/josh/file-map-stamp'
|
|
3
5
|
|
|
@@ -9,14 +11,27 @@ import { file_map_stamp, type FileMapStampAccess } from '#scripts/josh/file-map-
|
|
|
9
11
|
// The scoped stamps claim less than the gate stamp (changed files, two checks), so they stay separate.
|
|
10
12
|
const LINT_RELATED_PREFIX = 'josh-lint-related-stamp-'
|
|
11
13
|
const TEST_RELATED_PREFIX = 'josh-test-related-stamp-'
|
|
14
|
+
// `josh test:e2e` answered green — a run or a printed skip — on this tree (`test-e2e-stamp.ts`).
|
|
15
|
+
const E2E_PREFIX = 'josh-e2e-stamp-'
|
|
12
16
|
|
|
13
17
|
const GATE_PREFIX = 'josh-gate-stamp-'
|
|
14
18
|
const IN_FLIGHT_PREFIX = 'josh-gate-running-'
|
|
15
19
|
const ROUND_ONE_PREFIX = 'josh-review-round1-'
|
|
16
20
|
const ROUND_ONE_CODE_PREFIX = 'josh-review-round1-code-'
|
|
17
21
|
const BRIEFED_PREFIX = 'josh-review-briefed-'
|
|
22
|
+
const REVIEWED_PREFIX = 'josh-review-recorded-'
|
|
18
23
|
|
|
19
|
-
|
|
24
|
+
// The records that vouch for a check carry the fingerprint of its declared inputs
|
|
25
|
+
// (`verification-inputs.ts`): the gate's every declared check, a scoped record its own.
|
|
26
|
+
function inputs_of(labels: ReadonlyArray<string>): () => string {
|
|
27
|
+
return () => verification_inputs.fingerprint(labels)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const gate_stamp: FileMapStampAccess = file_map_stamp.create(
|
|
31
|
+
GATE_PREFIX,
|
|
32
|
+
PROJECT_ROOT,
|
|
33
|
+
inputs_of(verification_inputs.DECLARED_LABELS),
|
|
34
|
+
)
|
|
20
35
|
const in_flight_stamp: FileMapStampAccess = file_map_stamp.create(IN_FLIGHT_PREFIX, PROJECT_ROOT)
|
|
21
36
|
const round_one_stamp: FileMapStampAccess = file_map_stamp.create(ROUND_ONE_PREFIX, PROJECT_ROOT)
|
|
22
37
|
// Written beside the round-1 snapshot: the comment-free digest of each source file (`review-code-tree.ts`).
|
|
@@ -26,14 +41,19 @@ const round_one_code_stamp: FileMapStampAccess = file_map_stamp.create(
|
|
|
26
41
|
)
|
|
27
42
|
// Retaken on every brief: the round-1 snapshot is not the tree a later review read.
|
|
28
43
|
const briefed_stamp: FileMapStampAccess = file_map_stamp.create(BRIEFED_PREFIX, PROJECT_ROOT)
|
|
44
|
+
// Retaken on every recorded round: the tree that round's verdict stands for, its fixes included.
|
|
45
|
+
const reviewed_stamp: FileMapStampAccess = file_map_stamp.create(REVIEWED_PREFIX, PROJECT_ROOT)
|
|
29
46
|
const lint_related_stamp: FileMapStampAccess = file_map_stamp.create(
|
|
30
47
|
LINT_RELATED_PREFIX,
|
|
31
48
|
PROJECT_ROOT,
|
|
49
|
+
inputs_of([gate_labels.LINT_LABEL]),
|
|
32
50
|
)
|
|
33
51
|
const test_related_stamp: FileMapStampAccess = file_map_stamp.create(
|
|
34
52
|
TEST_RELATED_PREFIX,
|
|
35
53
|
PROJECT_ROOT,
|
|
54
|
+
inputs_of([gate_labels.UNIT_LABEL]),
|
|
36
55
|
)
|
|
56
|
+
const e2e_stamp: FileMapStampAccess = file_map_stamp.create(E2E_PREFIX, PROJECT_ROOT)
|
|
37
57
|
|
|
38
58
|
// Swallowed: a code record left behind only ever sits beside an older snapshot, which the next
|
|
39
59
|
// round-1 brief replaces together with it.
|
|
@@ -61,6 +81,7 @@ const review_stamps = {
|
|
|
61
81
|
briefed_stamp,
|
|
62
82
|
clear_round_one,
|
|
63
83
|
clear_round_one_code,
|
|
84
|
+
e2e_stamp,
|
|
64
85
|
GATE_PREFIX,
|
|
65
86
|
gate_stamp,
|
|
66
87
|
IN_FLIGHT_PREFIX,
|
|
@@ -70,6 +91,7 @@ const review_stamps = {
|
|
|
70
91
|
round_one_code_stamp,
|
|
71
92
|
ROUND_ONE_PREFIX,
|
|
72
93
|
round_one_stamp,
|
|
94
|
+
reviewed_stamp,
|
|
73
95
|
test_related_stamp,
|
|
74
96
|
}
|
|
75
97
|
|
|
@@ -0,0 +1,110 @@
|
|
|
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 { stamp_file } from '#scripts/josh/stamp-file'
|
|
5
|
+
import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
|
|
6
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
7
|
+
import type { StopFinding } from '#scripts/run/ship/run-ship-review'
|
|
8
|
+
import { z } from 'zod'
|
|
9
|
+
|
|
10
|
+
// The durable record of every review finding that stopped a `josh ship` — one JSON line per finding,
|
|
11
|
+
// with its kind, the `<file>[:<line>]` it cites and its first sentence, read back by
|
|
12
|
+
// `josh review:stops` (joshuafolkken/kit#4519). The findings a round did not stop on — a ship round's
|
|
13
|
+
// fixes made in place, and a `review:record` round's findings written with a reason
|
|
14
|
+
// (joshuafolkken/kit#4817) — are in it too, marked fixed, which `review:stops` leaves out. The lane ledger's stop line keeps only the kinds, and
|
|
15
|
+
// the finding's text was only in the ship log in the temp root, which a reboot clears.
|
|
16
|
+
//
|
|
17
|
+
// **It lives in the git common directory**, beside the test-read map: every lane worktree of one clone
|
|
18
|
+
// appends to the same file, and a reboot keeps it. Appended with the lane ledger's `append`, so
|
|
19
|
+
// concurrent lanes never lose each other's lines.
|
|
20
|
+
//
|
|
21
|
+
// **A test run writes nothing** unless it passes its own path, the lane ledger's rule: the writer sits on
|
|
22
|
+
// the ship's stop path, which many suites exercise.
|
|
23
|
+
|
|
24
|
+
const LOG_FILE = 'review-stops.jsonl'
|
|
25
|
+
const LINE_SEPARATOR = '\n'
|
|
26
|
+
|
|
27
|
+
const stop_line_schema = z.object({
|
|
28
|
+
at: z.string(),
|
|
29
|
+
issue: z.number(),
|
|
30
|
+
stage: z.string(),
|
|
31
|
+
kind: z.string(),
|
|
32
|
+
location: z.string(),
|
|
33
|
+
sentence: z.string(),
|
|
34
|
+
fixed: z.boolean().optional(),
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
type StopLine = z.infer<typeof stop_line_schema>
|
|
38
|
+
|
|
39
|
+
// One stopped review: the issue, the stage that stopped and the findings that decided it. A round that
|
|
40
|
+
// passed on fixes made in place is recorded too, marked `is_fixed`, so the lane's next review still sees
|
|
41
|
+
// the constraint each fix met (joshuafolkken/kit#4780); `review:stops` leaves those lines out.
|
|
42
|
+
interface ReviewStop {
|
|
43
|
+
issue: number
|
|
44
|
+
stage: string
|
|
45
|
+
findings: ReadonlyArray<StopFinding>
|
|
46
|
+
is_fixed?: boolean
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function target(): string | undefined {
|
|
50
|
+
if (process.env['VITEST'] !== undefined) return undefined
|
|
51
|
+
|
|
52
|
+
const common = git_common_directory.repository()
|
|
53
|
+
|
|
54
|
+
return common === undefined
|
|
55
|
+
? undefined
|
|
56
|
+
: path.join(common, git_common_directory.STATE_DIRECTORY, LOG_FILE)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function write(destination: string, stop: ReviewStop): void {
|
|
60
|
+
const at = new Date().toISOString()
|
|
61
|
+
const mark = stop.is_fixed === true ? { fixed: true } : {}
|
|
62
|
+
|
|
63
|
+
mkdirSync(path.dirname(destination), { recursive: true })
|
|
64
|
+
|
|
65
|
+
for (const finding of stop.findings) {
|
|
66
|
+
lane_ledger_write.append(destination, {
|
|
67
|
+
at,
|
|
68
|
+
issue: stop.issue,
|
|
69
|
+
stage: stop.stage,
|
|
70
|
+
...finding,
|
|
71
|
+
...mark,
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Best-effort, as the lane ledger is: a record must never fail the stop it records.
|
|
77
|
+
function record(stop: ReviewStop, log_path: string | undefined = target()): void {
|
|
78
|
+
if (log_path === undefined || stop.findings.length === 0) return
|
|
79
|
+
|
|
80
|
+
try {
|
|
81
|
+
write(log_path, stop)
|
|
82
|
+
} catch {
|
|
83
|
+
// Recording is best-effort: a failed append is dropped rather than raised into the ship's stop.
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function parse_line(line: string): StopLine | undefined {
|
|
88
|
+
return stop_line_schema.safeParse(json_value.parse_or_undefined(line)).data
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function is_present(line: StopLine | undefined): line is StopLine {
|
|
92
|
+
return line !== undefined
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Every recorded finding, oldest first; a malformed line — a write cut short — is skipped.
|
|
96
|
+
function read(log_path: string | undefined = target()): ReadonlyArray<StopLine> {
|
|
97
|
+
const raw = log_path === undefined ? undefined : stamp_file.read_stamp_text(log_path)
|
|
98
|
+
|
|
99
|
+
if (raw === undefined) return []
|
|
100
|
+
|
|
101
|
+
return raw
|
|
102
|
+
.split(LINE_SEPARATOR)
|
|
103
|
+
.map((line) => parse_line(line.trim()))
|
|
104
|
+
.filter(is_present)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const review_stop_log = { read, record, target }
|
|
108
|
+
|
|
109
|
+
export type { ReviewStop, StopLine }
|
|
110
|
+
export { review_stop_log }
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
4
|
+
import { lane_stats } from '#scripts/lane/lane-stats'
|
|
5
|
+
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
6
|
+
import { review_stop_log, type StopLine } from './review-stop-log'
|
|
7
|
+
|
|
8
|
+
// `josh review:stops [--period <days>]` — every review finding that stopped a `josh ship` in the last
|
|
9
|
+
// `<days>` (7 by default), one line each, ordered by kind and then file so the findings of one kind and
|
|
10
|
+
// one place sit together for classification (joshuafolkken/kit#4519). The write half is
|
|
11
|
+
// `review-stop-log.ts`, called on every ship stop.
|
|
12
|
+
|
|
13
|
+
const OPTIONS = { period: { type: 'string' } } as const
|
|
14
|
+
const DEFAULT_PERIOD_DAYS = 7
|
|
15
|
+
const USAGE = 'usage: josh review:stops [--period <days>]'
|
|
16
|
+
const NO_SENTENCE = '(no sentence)'
|
|
17
|
+
const DATE_LENGTH = 10
|
|
18
|
+
// `process.argv` holds the runtime and the script before the command's own arguments.
|
|
19
|
+
const FIRST_ARGUMENT = 2
|
|
20
|
+
|
|
21
|
+
interface StopsContext {
|
|
22
|
+
log_path?: string | undefined
|
|
23
|
+
now_ms?: number
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// An unknown flag or a period that is not a positive whole number of days is refused, never defaulted.
|
|
27
|
+
function period_of(argv: ReadonlyArray<string>): number | undefined {
|
|
28
|
+
const values = cli_flags.values_of(argv, OPTIONS)
|
|
29
|
+
|
|
30
|
+
if (values === undefined) return undefined
|
|
31
|
+
|
|
32
|
+
return cli_flags.to_positive(values.period ?? String(DEFAULT_PERIOD_DAYS))
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function compare(left: StopLine, right: StopLine): number {
|
|
36
|
+
const by_kind = left.kind.localeCompare(right.kind)
|
|
37
|
+
|
|
38
|
+
if (by_kind !== 0) return by_kind
|
|
39
|
+
|
|
40
|
+
return left.location.localeCompare(right.location) || left.at.localeCompare(right.at)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function line_of(stop: StopLine): string {
|
|
44
|
+
const sentence = stop.sentence === '' ? NO_SENTENCE : stop.sentence
|
|
45
|
+
const where = `${session_cite.issue(stop.issue)} ${stop.stage} ${stop.at.slice(0, DATE_LENGTH)}`
|
|
46
|
+
|
|
47
|
+
return `${stop.kind} ${stop.location} ${where} — ${sentence}`
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function format_report(stops: ReadonlyArray<StopLine>, period_days: number): string {
|
|
51
|
+
const period = `the last ${String(period_days)} day(s)`
|
|
52
|
+
|
|
53
|
+
if (stops.length === 0) return `no review stop findings recorded in ${period}`
|
|
54
|
+
|
|
55
|
+
const body = stops.toSorted(compare).map((stop) => line_of(stop))
|
|
56
|
+
|
|
57
|
+
return [`review stop findings in ${period} (${String(stops.length)}):`, ...body].join('\n')
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function run(argv: ReadonlyArray<string>, context: StopsContext = {}): number {
|
|
61
|
+
const period_days = period_of(argv)
|
|
62
|
+
|
|
63
|
+
if (period_days === undefined) {
|
|
64
|
+
console.error(USAGE)
|
|
65
|
+
|
|
66
|
+
return 1
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const window = lane_stats.window_of(period_days, context.now_ms ?? Date.now())
|
|
70
|
+
const stopped = review_stop_log.read(context.log_path).filter((line) => line.fixed !== true)
|
|
71
|
+
const stops = lane_stats.in_window(stopped, window)
|
|
72
|
+
|
|
73
|
+
console.info(format_report(stops, period_days))
|
|
74
|
+
|
|
75
|
+
return 0
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function main(): void {
|
|
79
|
+
process.exitCode = run(process.argv.slice(FIRST_ARGUMENT))
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const review_stops_cli = { format_report, run }
|
|
83
|
+
|
|
84
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) main()
|
|
85
|
+
|
|
86
|
+
export { review_stops_cli }
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { text } from 'node:stream/consumers'
|
|
3
|
+
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
5
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
6
|
+
import { lane_session_broker } from '#scripts/lane/lane-session-broker'
|
|
7
|
+
import { run_ship_review } from '#scripts/run/ship/run-ship-review'
|
|
8
|
+
import { review_attest, type ReviewSlot } from './review-attest'
|
|
9
|
+
|
|
10
|
+
// `josh review:submit` — the one write path for a ship reviewer's findings (joshuafolkken/kit#4799).
|
|
11
|
+
// The reviewer pipes its findings here on stdin, and this command writes them to the slot's findings
|
|
12
|
+
// file under the same key the supervisor reads it by (`run-ship-reviewer.ts`), so no path is ever
|
|
13
|
+
// copied out of a prompt. A line outside the `review:record` grammar is refused before anything is
|
|
14
|
+
// written, while the reviewer can still fix it.
|
|
15
|
+
//
|
|
16
|
+
// **A clean review is said with `--none`, never with empty stdin**: a reviewer that forgot the pipe,
|
|
17
|
+
// or ran on a terminal, sends nothing, and reading that as clean would lose every finding it had.
|
|
18
|
+
|
|
19
|
+
const ARGV_OFFSET = 2
|
|
20
|
+
const INTERACTION_FLAG = '--interaction'
|
|
21
|
+
const NONE_FLAG = '--none'
|
|
22
|
+
const FLAGS: ReadonlySet<string> = new Set([INTERACTION_FLAG, NONE_FLAG])
|
|
23
|
+
const USAGE =
|
|
24
|
+
'Usage: josh review:submit [--interaction] < findings | josh review:submit [--interaction] --none'
|
|
25
|
+
const EMPTY_NOTE = `nothing written — no findings on stdin; a review with none passes ${NONE_FLAG}`
|
|
26
|
+
const NONE_WITH_FINDINGS_NOTE = `nothing written — ${NONE_FLAG} was passed with findings on stdin`
|
|
27
|
+
const SUCCESS_EXIT_CODE = 0
|
|
28
|
+
const FAILURE_EXIT_CODE = 1
|
|
29
|
+
|
|
30
|
+
interface Submission {
|
|
31
|
+
slot: ReviewSlot
|
|
32
|
+
is_none: boolean
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function submission_of(argv: ReadonlyArray<string>): Submission | undefined {
|
|
36
|
+
const is_valid = argv.every((flag) => FLAGS.has(flag)) && new Set(argv).size === argv.length
|
|
37
|
+
|
|
38
|
+
if (!is_valid) return undefined
|
|
39
|
+
|
|
40
|
+
const { CODE, INTERACTION } = review_attest.REVIEW_SLOT
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
slot: argv.includes(INTERACTION_FLAG) ? INTERACTION : CODE,
|
|
44
|
+
is_none: argv.includes(NONE_FLAG),
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function grammar_refusal(findings: string): string | undefined {
|
|
49
|
+
const verdict = run_ship_review.read_verdict(findings)
|
|
50
|
+
|
|
51
|
+
return verdict.kind === run_ship_review.VERDICT.INVALID
|
|
52
|
+
? `nothing written — ${verdict.note}`
|
|
53
|
+
: undefined
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// The refusal for stdin that does not match the flags, or for a line outside the grammar.
|
|
57
|
+
function refusal_of(submission: Submission, findings: string): string | undefined {
|
|
58
|
+
const is_empty = findings.trim() === ''
|
|
59
|
+
|
|
60
|
+
if (submission.is_none) return is_empty ? undefined : NONE_WITH_FINDINGS_NOTE
|
|
61
|
+
|
|
62
|
+
return is_empty ? EMPTY_NOTE : grammar_refusal(findings)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function write(submission: Submission, findings: string): string {
|
|
66
|
+
const { slot, is_none } = submission
|
|
67
|
+
const target = lane_session_broker.review_paths(PROJECT_ROOT, slot).findings
|
|
68
|
+
|
|
69
|
+
stamp_file.write_text_stamp(target, is_none ? '' : findings)
|
|
70
|
+
|
|
71
|
+
return is_none
|
|
72
|
+
? `the ${slot} review is submitted with no findings.`
|
|
73
|
+
: `the ${slot} review's findings are submitted.`
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function run(argv: ReadonlyArray<string>, findings: string): number {
|
|
77
|
+
const submission = submission_of(argv)
|
|
78
|
+
const refusal = submission === undefined ? USAGE : refusal_of(submission, findings)
|
|
79
|
+
|
|
80
|
+
if (submission === undefined || refusal !== undefined) {
|
|
81
|
+
console.error(refusal)
|
|
82
|
+
|
|
83
|
+
return FAILURE_EXIT_CODE
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
console.info(write(submission, findings))
|
|
87
|
+
|
|
88
|
+
return SUCCESS_EXIT_CODE
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async function main(): Promise<void> {
|
|
92
|
+
const findings = process.stdin.isTTY ? '' : await text(process.stdin)
|
|
93
|
+
|
|
94
|
+
process.exitCode = run(process.argv.slice(ARGV_OFFSET), findings)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
|
|
98
|
+
|
|
99
|
+
const review_submit_cli = { EMPTY_NOTE, USAGE, run }
|
|
100
|
+
|
|
101
|
+
export { review_submit_cli }
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import path from 'node:path'
|
|
1
|
+
import { input_fingerprint } from '#scripts/gate/input-fingerprint'
|
|
3
2
|
import { changed_paths } from '#scripts/git/changed-paths'
|
|
4
3
|
import { git_command } from '#scripts/git/git-command'
|
|
5
|
-
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
6
4
|
import { observation_ledger } from '#scripts/observations/observation-ledger'
|
|
7
5
|
|
|
8
6
|
// The tree `josh review:brief` records: every path the change touches, and the digest of its content.
|
|
@@ -18,15 +16,7 @@ import { observation_ledger } from '#scripts/observations/observation-ledger'
|
|
|
18
16
|
// A path the change lists but the working tree does not hold — deleted, or renamed away. Recorded
|
|
19
17
|
// rather than dropped: a delete applied by a fix is part of the fix delta, and a dropped entry would
|
|
20
18
|
// read as "unchanged" on the comparison.
|
|
21
|
-
const ABSENT_DIGEST =
|
|
22
|
-
|
|
23
|
-
function digest_of(root: string, relative: string): string {
|
|
24
|
-
try {
|
|
25
|
-
return stamp_file.digest(readFileSync(path.join(root, relative)))
|
|
26
|
-
} catch {
|
|
27
|
-
return ABSENT_DIGEST
|
|
28
|
-
}
|
|
29
|
-
}
|
|
19
|
+
const ABSENT_DIGEST = input_fingerprint.ABSENT
|
|
30
20
|
|
|
31
21
|
// Sorted so two readings of one tree produce the same record byte for byte, which is what lets a
|
|
32
22
|
// stored stamp be compared against a fresh reading without a normalization step in between.
|
|
@@ -39,11 +29,10 @@ function digest_of(root: string, relative: string): string {
|
|
|
39
29
|
// undo then moved the tree under both. Filtered here, every reader of the map
|
|
40
30
|
// — the gate's record, both hooks, the brief and the round-2 fix delta — agrees on it.
|
|
41
31
|
function tree_of(root: string, paths: ReadonlyArray<string>): Record<string, string> {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
.
|
|
45
|
-
|
|
46
|
-
return Object.fromEntries(sorted.map((relative) => [relative, digest_of(root, relative)]))
|
|
32
|
+
return input_fingerprint.of_files(
|
|
33
|
+
root,
|
|
34
|
+
paths.filter((relative) => !observation_ledger.is_ledger_path(relative)),
|
|
35
|
+
)
|
|
47
36
|
}
|
|
48
37
|
|
|
49
38
|
// **The root is asked of git, never taken from `process.cwd()` — nor from `PROJECT_ROOT`, which is
|