@joshuafolkken/kit 1.1514.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { git_spawn_sync } from '#scripts/git/git-spawn-sync'
|
|
4
|
+
import { review_tree } from './review-tree'
|
|
5
|
+
|
|
6
|
+
// Round 1's files as git blobs, so round 2 can still name the fix delta after the change base moved
|
|
7
|
+
// (joshuafolkken/kit#4165).
|
|
8
|
+
//
|
|
9
|
+
// **A lane merges the default branch between the rounds**, which moves the base, and the round-1 file
|
|
10
|
+
// map then covers a different set of paths from the one read now. Its digests cannot be carried onto
|
|
11
|
+
// the new base; blobs can. `capture` writes each round-1 path into the object store — nothing else:
|
|
12
|
+
// no index, no commit, no ref. `carried_delta` then carries each path three ways — the old base, round
|
|
13
|
+
// 1, the new base — and names the paths whose carried content differs from the working tree now. A
|
|
14
|
+
// path the default branch alone changed carries to exactly what the merge left, so it drops out; what
|
|
15
|
+
// is left is round 1's fixes.
|
|
16
|
+
//
|
|
17
|
+
// **Every failure answers `undefined`**, which round 2 reads as the moved-base refusal it gave before:
|
|
18
|
+
// no recorded blobs, a carry that conflicts, or a git that cannot run one of the reads.
|
|
19
|
+
|
|
20
|
+
// A path the working tree or a commit does not hold.
|
|
21
|
+
const ABSENT = review_tree.ABSENT_DIGEST
|
|
22
|
+
const SUCCESS_EXIT_CODE = 0
|
|
23
|
+
const NUL = '\0'
|
|
24
|
+
const NEWLINE = '\n'
|
|
25
|
+
const TAB = '\t'
|
|
26
|
+
const SPACE = ' '
|
|
27
|
+
const OID_FIELD = 2
|
|
28
|
+
const WRITE_FLAGS: ReadonlyArray<string> = ['-w']
|
|
29
|
+
const READ_FLAGS: ReadonlyArray<string> = []
|
|
30
|
+
|
|
31
|
+
interface Move {
|
|
32
|
+
// The base round 1 was read against, and the base now.
|
|
33
|
+
from: string | undefined
|
|
34
|
+
to: string | undefined
|
|
35
|
+
// The paths to read: for a carry, those changed against the base now.
|
|
36
|
+
paths: ReadonlyArray<string>
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface CarryInput extends Move {
|
|
40
|
+
// Round 1's blobs, from the snapshot.
|
|
41
|
+
blobs: Record<string, string> | undefined
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
interface Carry {
|
|
45
|
+
blobs: Record<string, string>
|
|
46
|
+
from: string
|
|
47
|
+
to: string
|
|
48
|
+
paths: ReadonlyArray<string>
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
interface Readings {
|
|
52
|
+
blobs: Record<string, string>
|
|
53
|
+
before: Record<string, string>
|
|
54
|
+
after: Record<string, string>
|
|
55
|
+
now: Record<string, string>
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
interface Sides {
|
|
59
|
+
base: string
|
|
60
|
+
round_one: string
|
|
61
|
+
moved: string
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// git's paths are root-relative, so every command runs from the root rather than the caller's cwd.
|
|
65
|
+
function repository_root(): string | undefined {
|
|
66
|
+
return git_spawn_sync.read(['rev-parse', '--show-toplevel'])
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function hash_paths(
|
|
70
|
+
root: string,
|
|
71
|
+
paths: ReadonlyArray<string>,
|
|
72
|
+
flags: ReadonlyArray<string>,
|
|
73
|
+
): Record<string, string> | undefined {
|
|
74
|
+
const present = paths.filter((relative) => existsSync(path.join(root, relative)))
|
|
75
|
+
const output =
|
|
76
|
+
present.length === 0
|
|
77
|
+
? ''
|
|
78
|
+
: git_spawn_sync.read(['hash-object', ...flags, '--', ...present], { cwd: root })
|
|
79
|
+
|
|
80
|
+
if (output === undefined) return undefined
|
|
81
|
+
|
|
82
|
+
const hashes = output.split(NEWLINE)
|
|
83
|
+
const hashed = new Map(present.map((relative, index) => [relative, hashes[index] ?? ABSENT]))
|
|
84
|
+
|
|
85
|
+
return Object.fromEntries(paths.map((relative) => [relative, hashed.get(relative) ?? ABSENT]))
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// `<mode> <type> <oid>\t<path>`.
|
|
89
|
+
function parse_entry(entry: string): [string, string] {
|
|
90
|
+
const tab = entry.indexOf(TAB)
|
|
91
|
+
|
|
92
|
+
return [entry.slice(tab + 1), entry.slice(0, tab).split(SPACE)[OID_FIELD] ?? ABSENT]
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function blobs_at(
|
|
96
|
+
commit: string,
|
|
97
|
+
paths: ReadonlyArray<string>,
|
|
98
|
+
root: string,
|
|
99
|
+
): Record<string, string> | undefined {
|
|
100
|
+
const result = git_spawn_sync.run(['ls-tree', '-r', '-z', commit, '--', ...paths], { cwd: root })
|
|
101
|
+
|
|
102
|
+
if (result.exit_code !== SUCCESS_EXIT_CODE) return undefined
|
|
103
|
+
|
|
104
|
+
return Object.fromEntries(
|
|
105
|
+
result.stdout
|
|
106
|
+
.split(NUL)
|
|
107
|
+
.filter((entry) => entry !== '')
|
|
108
|
+
.map((entry) => parse_entry(entry)),
|
|
109
|
+
)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// `git merge-file` exits with the number of conflicts, so only a clean merge answers an oid.
|
|
113
|
+
function merged_blob({ base, round_one, moved }: Sides, root: string): string | undefined {
|
|
114
|
+
if ([base, round_one, moved].includes(ABSENT)) return undefined
|
|
115
|
+
|
|
116
|
+
return git_spawn_sync.read(['merge-file', '--object-id', round_one, base, moved], { cwd: root })
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function carried_blob(sides: Sides, root: string): string | undefined {
|
|
120
|
+
if (sides.round_one === sides.base) return sides.moved
|
|
121
|
+
if (sides.moved === sides.base || sides.moved === sides.round_one) return sides.round_one
|
|
122
|
+
|
|
123
|
+
return merged_blob(sides, root)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// A path round 1 did not list was unchanged against its base, so round 1 held the base's blob.
|
|
127
|
+
function sides_of(relative: string, readings: Readings): Sides {
|
|
128
|
+
const base = readings.before[relative] ?? ABSENT
|
|
129
|
+
|
|
130
|
+
return {
|
|
131
|
+
base,
|
|
132
|
+
round_one: readings.blobs[relative] ?? base,
|
|
133
|
+
moved: readings.after[relative] ?? ABSENT,
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function differing(
|
|
138
|
+
paths: ReadonlyArray<string>,
|
|
139
|
+
readings: Readings,
|
|
140
|
+
root: string,
|
|
141
|
+
): ReadonlyArray<string> | undefined {
|
|
142
|
+
const carried = paths.map((relative) => carried_blob(sides_of(relative, readings), root))
|
|
143
|
+
|
|
144
|
+
if (carried.includes(undefined)) return undefined
|
|
145
|
+
|
|
146
|
+
return paths.filter((relative, index) => carried[index] !== readings.now[relative])
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function read_readings(
|
|
150
|
+
input: Carry,
|
|
151
|
+
paths: ReadonlyArray<string>,
|
|
152
|
+
root: string,
|
|
153
|
+
): Readings | undefined {
|
|
154
|
+
const before = blobs_at(input.from, paths, root)
|
|
155
|
+
const after = blobs_at(input.to, paths, root)
|
|
156
|
+
const now = hash_paths(root, paths, READ_FLAGS)
|
|
157
|
+
|
|
158
|
+
if (before === undefined || after === undefined || now === undefined) return undefined
|
|
159
|
+
|
|
160
|
+
return { blobs: input.blobs, before, after, now }
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// No paths at all is an empty delta: `ls-tree` given none would list the whole tree.
|
|
164
|
+
function delta_of(input: Carry, root: string): ReadonlyArray<string> | undefined {
|
|
165
|
+
const paths = [...new Set([...Object.keys(input.blobs), ...input.paths])].toSorted(
|
|
166
|
+
(left, right) => left.localeCompare(right),
|
|
167
|
+
)
|
|
168
|
+
const readings = paths.length === 0 ? undefined : read_readings(input, paths, root)
|
|
169
|
+
|
|
170
|
+
if (paths.length === 0) return []
|
|
171
|
+
|
|
172
|
+
return readings === undefined ? undefined : differing(paths, readings, root)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function carried_delta(input: CarryInput): ReadonlyArray<string> | undefined {
|
|
176
|
+
const { blobs, from, to } = input
|
|
177
|
+
const root = repository_root()
|
|
178
|
+
|
|
179
|
+
if (root === undefined || blobs === undefined || from === undefined || to === undefined) {
|
|
180
|
+
return undefined
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return delta_of({ blobs, from, to, paths: input.paths }, root)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function unmoved_between(
|
|
187
|
+
from: string,
|
|
188
|
+
to: string,
|
|
189
|
+
paths: ReadonlyArray<string>,
|
|
190
|
+
root: string,
|
|
191
|
+
): ReadonlyArray<string> | undefined {
|
|
192
|
+
if (from === to || paths.length === 0) return paths
|
|
193
|
+
const before = blobs_at(from, paths, root)
|
|
194
|
+
const after = blobs_at(to, paths, root)
|
|
195
|
+
|
|
196
|
+
if (before === undefined || after === undefined) return undefined
|
|
197
|
+
|
|
198
|
+
return paths.filter((relative) => (before[relative] ?? ABSENT) === (after[relative] ?? ABSENT))
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// The paths the base move left alone: there the carry reproduces round 1's file, so the fix delta on
|
|
202
|
+
// them is round 1 against the working tree, as on an unmoved base. `undefined` when git cannot say.
|
|
203
|
+
function unmoved({ from, to, paths }: Move): ReadonlyArray<string> | undefined {
|
|
204
|
+
const root = repository_root()
|
|
205
|
+
|
|
206
|
+
if (root === undefined || from === undefined || to === undefined) return undefined
|
|
207
|
+
|
|
208
|
+
return unmoved_between(from, to, paths, root)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Each path's blob, written into the object store so a later carry can merge it; `undefined` when git
|
|
212
|
+
// cannot answer, which the record then omits.
|
|
213
|
+
function capture(paths: ReadonlyArray<string>): Record<string, string> | undefined {
|
|
214
|
+
const root = repository_root()
|
|
215
|
+
|
|
216
|
+
return root === undefined ? undefined : hash_paths(root, paths, WRITE_FLAGS)
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const review_round_one_blobs = { capture, carried_delta, unmoved }
|
|
220
|
+
|
|
221
|
+
export { review_round_one_blobs }
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { observation_ledger_home } from '#scripts/observations/observation-ledger-home'
|
|
2
|
+
import { review_finding_ledger, type DisposedLine } from './review-finding-ledger'
|
|
3
|
+
|
|
4
|
+
// Whether round 1's High/Medium findings all closed, read from the issue's own ledger file rather
|
|
5
|
+
// than asserted by the caller (joshuafolkken/kit#5286). Closed means every High/Medium `- rf:` line
|
|
6
|
+
// of the issue carries `fixed` or `false-positive`; a line with no disposition, a filed or deferred
|
|
7
|
+
// one, or no recorded round at all leaves round 1 open, so the answer stays `required`. Only the
|
|
8
|
+
// issue's latest code round is read (joshuafolkken/kit#5359): an earlier round's unfixed lines stay
|
|
9
|
+
// in the append-only ledger after a clean re-run.
|
|
10
|
+
|
|
11
|
+
const BLOCKING_SEVERITIES: ReadonlySet<string> = new Set(['high', 'medium'])
|
|
12
|
+
const NO_RECORD_REASON =
|
|
13
|
+
'no round-1 round is recorded in the ledger for this issue, so its findings cannot be read as closed'
|
|
14
|
+
|
|
15
|
+
const OPEN_REASON_PREFIX =
|
|
16
|
+
'round 1 left High/Medium findings neither fixed nor a false positive in the ledger'
|
|
17
|
+
const NO_DISPOSITION = 'no disposition'
|
|
18
|
+
|
|
19
|
+
interface Closure {
|
|
20
|
+
is_closed: boolean
|
|
21
|
+
reason: string
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const CLOSED: Closure = { is_closed: true, reason: '' }
|
|
25
|
+
|
|
26
|
+
function is_open(line: DisposedLine): boolean {
|
|
27
|
+
return (
|
|
28
|
+
BLOCKING_SEVERITIES.has(line.severity) && !review_finding_ledger.is_closing(line.disposition)
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function open_reason(open: ReadonlyArray<DisposedLine>): string {
|
|
33
|
+
const dispositions = open.map((line) => line.disposition ?? NO_DISPOSITION).join(', ')
|
|
34
|
+
|
|
35
|
+
return `${OPEN_REASON_PREFIX} (${String(open.length)}: ${dispositions}), so the pass that verifies them is due`
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function of_content(content: string | undefined, issue: number): Closure {
|
|
39
|
+
const latest = review_finding_ledger.latest_round(content ?? '', issue)
|
|
40
|
+
const lines = review_finding_ledger.issue_dispositions(latest, issue)
|
|
41
|
+
|
|
42
|
+
if (lines.length === 0) return { is_closed: false, reason: NO_RECORD_REASON }
|
|
43
|
+
|
|
44
|
+
const open = lines.filter((line) => is_open(line))
|
|
45
|
+
|
|
46
|
+
return open.length === 0 ? CLOSED : { is_closed: false, reason: open_reason(open) }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// `undefined` issue — a branch that names none — has no ledger lines to read, so it is open.
|
|
50
|
+
async function read(
|
|
51
|
+
issue: number | undefined,
|
|
52
|
+
root: string = observation_ledger_home.ledger_root(),
|
|
53
|
+
): Promise<Closure> {
|
|
54
|
+
if (issue === undefined) return { is_closed: false, reason: NO_RECORD_REASON }
|
|
55
|
+
|
|
56
|
+
return of_content(await observation_ledger_home.read(root), issue)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const review_round_one_closure = { NO_RECORD_REASON, OPEN_REASON_PREFIX, of_content, read }
|
|
60
|
+
|
|
61
|
+
export type { Closure }
|
|
62
|
+
export { review_round_one_closure }
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { issue_watch_gate } from '#scripts/issue/issue-watch-gate'
|
|
2
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
3
|
+
import { review_record } from './review-record'
|
|
4
|
+
import { review_reviewed_tree } from './review-reviewed-tree'
|
|
5
|
+
|
|
6
|
+
// Whether `josh ship` reuses the recorded round 1 rather than reviewing it again — asked by the ship
|
|
7
|
+
// and by `josh review:record --check`, so a lane resuming on an old record reads the ship's own answer
|
|
8
|
+
// rather than mistaking "recorded" for "reused" (joshuafolkken/kit#4763).
|
|
9
|
+
|
|
10
|
+
// The issue changed after the recorded review was briefed — the refusal `josh followup` would make
|
|
11
|
+
// (joshuafolkken/kit#4221). A read that fails reads as fresh: `josh followup` still refuses a stale
|
|
12
|
+
// review at the merge.
|
|
13
|
+
async function is_stale_here(): Promise<boolean> {
|
|
14
|
+
try {
|
|
15
|
+
return (await issue_watch_gate.review_refusal_here()) !== undefined
|
|
16
|
+
} catch (error) {
|
|
17
|
+
error_text.trace_swallowed('review_round_reuse.is_stale_here', error)
|
|
18
|
+
|
|
19
|
+
return false
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// What the ship does with the recorded round 1: `held` reuses it with nothing left to read; `delta`
|
|
24
|
+
// reuses it and leaves what moved since to round 2; `again` reviews round 1 again.
|
|
25
|
+
const REUSE = { AGAIN: 'again', DELTA: 'delta', HELD: 'held' } as const
|
|
26
|
+
|
|
27
|
+
type Reuse = (typeof REUSE)[keyof typeof REUSE]
|
|
28
|
+
|
|
29
|
+
const { MOVEMENT } = review_reviewed_tree
|
|
30
|
+
|
|
31
|
+
// The reuse, and on `again` why (joshuafolkken/kit#4941): `review:record --check` prints it, so a lane
|
|
32
|
+
// reads which condition re-runs round 1 rather than a list of every condition that could.
|
|
33
|
+
interface ReuseAnswer {
|
|
34
|
+
reuse: Reuse
|
|
35
|
+
cause?: string | undefined
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const STALE_CAUSE = "the issue changed after the recorded round's brief"
|
|
39
|
+
const UNRECORDED_CAUSE = 'no review round is recorded for this issue'
|
|
40
|
+
|
|
41
|
+
async function recorded_answer(issue: number): Promise<ReuseAnswer> {
|
|
42
|
+
const { movement, cause } = await review_reviewed_tree.standing_here()
|
|
43
|
+
|
|
44
|
+
if (movement === MOVEMENT.HELD) return { reuse: REUSE.HELD }
|
|
45
|
+
|
|
46
|
+
const is_delta = movement === MOVEMENT.DELTA || review_reviewed_tree.is_stopped_on(issue)
|
|
47
|
+
|
|
48
|
+
return is_delta ? { reuse: REUSE.DELTA } : { reuse: REUSE.AGAIN, cause }
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// **A recorded round 1 is reused while the tree it was recorded on holds still** — a lane's review
|
|
52
|
+
// before the ship (joshuafolkken/kit#4620) — **or once it moved only where round 2 reads**
|
|
53
|
+
// (joshuafolkken/kit#4878): round 2 reads that delta from the round-1 brief's stamp after the commit, so
|
|
54
|
+
// round 1 run again would read it twice. **The ship's own round 1 that stopped on a finding** is reused
|
|
55
|
+
// however the lane's fix moved the tree, for the same reason. A High-cited file's fix is such a move
|
|
56
|
+
// where round 2's delta holds it (joshuafolkken/kit#4941). Any other move — a doc, a revert — is
|
|
57
|
+
// reviewed again, from that record (`review-reviewed-tree.ts`). An issue that changed after that
|
|
58
|
+
// round's brief is never reused: the recorded round never read it, and `josh followup` refuses the merge on it
|
|
59
|
+
// (joshuafolkken/kit#4221).
|
|
60
|
+
async function answer(issue: number, is_stale: boolean): Promise<ReuseAnswer> {
|
|
61
|
+
if (is_stale) return { reuse: REUSE.AGAIN, cause: STALE_CAUSE }
|
|
62
|
+
|
|
63
|
+
const recorded = await review_record.check(issue)
|
|
64
|
+
|
|
65
|
+
if (recorded.status !== 'ok') return { reuse: REUSE.AGAIN, cause: UNRECORDED_CAUSE }
|
|
66
|
+
|
|
67
|
+
return await recorded_answer(issue)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async function reuse(issue: number, is_stale: boolean): Promise<Reuse> {
|
|
71
|
+
const reused = await answer(issue, is_stale)
|
|
72
|
+
|
|
73
|
+
return reused.reuse
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async function is_reusable(issue: number, is_stale: boolean): Promise<boolean> {
|
|
77
|
+
return (await reuse(issue, is_stale)) !== REUSE.AGAIN
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// The ship's own answer for this checkout, asked before the ship runs; a git failure throws.
|
|
81
|
+
async function answer_here(issue: number): Promise<ReuseAnswer> {
|
|
82
|
+
return await answer(issue, await is_stale_here())
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async function reuse_here(issue: number): Promise<Reuse> {
|
|
86
|
+
const reused = await answer_here(issue)
|
|
87
|
+
|
|
88
|
+
return reused.reuse
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async function is_reusable_here(issue: number): Promise<boolean> {
|
|
92
|
+
return (await reuse_here(issue)) !== REUSE.AGAIN
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const review_round_reuse = {
|
|
96
|
+
REUSE,
|
|
97
|
+
answer,
|
|
98
|
+
answer_here,
|
|
99
|
+
is_reusable,
|
|
100
|
+
is_reusable_here,
|
|
101
|
+
is_stale_here,
|
|
102
|
+
reuse_here,
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export type { Reuse, ReuseAnswer }
|
|
106
|
+
export { review_round_reuse }
|
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
3
|
import { change_base } from '#scripts/git/change-base'
|
|
4
|
+
import { git_branch } from '#scripts/git/git-branch'
|
|
5
|
+
import { git_command } from '#scripts/git/git-command'
|
|
6
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
7
|
+
import type { FileMapStamp } from '#scripts/josh/file-map-stamp'
|
|
4
8
|
import { path_decision } from '#scripts/josh/path-decision'
|
|
5
9
|
import { review_code_tree } from './review-code-tree'
|
|
6
|
-
import {
|
|
10
|
+
import { review_reviewed_tree } from './review-reviewed-tree'
|
|
11
|
+
import { review_round_one_blobs } from './review-round-one-blobs'
|
|
12
|
+
import { review_round_one_closure } from './review-round-one-closure'
|
|
13
|
+
import { review_round2, type RoundTwoAnswer } from './review-round2'
|
|
14
|
+
import { review_round2_skip_comment } from './review-round2-skip-comment'
|
|
7
15
|
import { review_stamps } from './review-stamps'
|
|
8
16
|
import { review_tree } from './review-tree'
|
|
9
17
|
|
|
@@ -16,69 +24,151 @@ import { review_tree } from './review-tree'
|
|
|
16
24
|
// `review-round2.ts`; everything here is the invocation.
|
|
17
25
|
|
|
18
26
|
const ARGV_OFFSET = 2
|
|
19
|
-
const USAGE = 'Usage: josh review:round2 [--
|
|
20
|
-
const JSON_KEY = 'round2'
|
|
27
|
+
const USAGE = 'Usage: josh review:round2 [--record <N>] [--json]'
|
|
21
28
|
const FAILURE_EXIT_CODE = 1
|
|
22
29
|
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
30
|
+
// **Round 1's closure is read from the ledger, not asserted** (joshuafolkken/kit#5286): the flag that
|
|
31
|
+
// once stated it is refused with the one line that names what replaced it.
|
|
32
|
+
const RETIRED_CLOSED_FLAG = '--round-1-closed'
|
|
33
|
+
const RETIRED_CLOSED_LINE =
|
|
34
|
+
'--round-1-closed is retired: review:round2 reads round 1’s closure from the dispositions `review:record` keeps in the ledger — record each finding as `fixed <spec>` or `false-positive <spec>`, and pass --record <N> to name the issue.'
|
|
35
|
+
const RECORD_FLAG = '--record'
|
|
36
|
+
// The flag and its issue number.
|
|
37
|
+
const RECORD_ARGUMENT_COUNT = 2
|
|
38
|
+
const KNOWN_FLAGS: ReadonlyArray<string> = [path_decision.JSON_FLAG]
|
|
29
39
|
|
|
30
40
|
interface Options {
|
|
31
|
-
is_round_one_closed: boolean
|
|
32
41
|
is_json: boolean
|
|
42
|
+
// The issue `--record` names — whose ledger lines are read and where a skip is commented.
|
|
43
|
+
record: number | undefined
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function without_record(argv: ReadonlyArray<string>): ReadonlyArray<string> | undefined {
|
|
47
|
+
const index = argv.indexOf(RECORD_FLAG)
|
|
48
|
+
|
|
49
|
+
if (index === -1) return argv
|
|
50
|
+
|
|
51
|
+
const value = argv[index + 1] ?? ''
|
|
52
|
+
|
|
53
|
+
return issue_number_shape.is_issue_number(value)
|
|
54
|
+
? argv.toSpliced(index, RECORD_ARGUMENT_COUNT)
|
|
55
|
+
: undefined
|
|
33
56
|
}
|
|
34
57
|
|
|
35
58
|
// `undefined` on anything unrecognized rather than a default, through the contract
|
|
36
|
-
// `path_decision.has_unknown_flag` states once for every mechanically-decided command: a
|
|
37
|
-
//
|
|
38
|
-
// is what makes the difference a matter of which flag was fumbled.
|
|
59
|
+
// `path_decision.has_unknown_flag` states once for every mechanically-decided command: a parser that
|
|
60
|
+
// guesses is what makes the answer a matter of which flag was fumbled.
|
|
39
61
|
function parse_options(argv: ReadonlyArray<string>): Options | undefined {
|
|
40
|
-
|
|
62
|
+
const rest = without_record(argv)
|
|
63
|
+
|
|
64
|
+
if (rest === undefined || path_decision.has_unknown_flag(rest, KNOWN_FLAGS)) return undefined
|
|
65
|
+
|
|
66
|
+
const index = argv.indexOf(RECORD_FLAG)
|
|
41
67
|
|
|
42
68
|
return {
|
|
43
|
-
|
|
44
|
-
|
|
69
|
+
is_json: rest.includes(path_decision.JSON_FLAG),
|
|
70
|
+
record: index === -1 ? undefined : Number(argv[index + 1]),
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// The issue whose ledger lines decide round 1's closure: `--record`'s, else the branch's.
|
|
75
|
+
async function issue_of(options: Options): Promise<number | undefined> {
|
|
76
|
+
return options.record ?? git_branch.issue_from_branch(await git_command.branch())
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async function report_record(issue: number, answer: RoundTwoAnswer): Promise<void> {
|
|
80
|
+
const recorded = await review_round2_skip_comment.record(issue, answer)
|
|
81
|
+
|
|
82
|
+
if (recorded === 'posted' || recorded === 'present') {
|
|
83
|
+
console.error(`${review_round2_skip_comment.HEADING}: ${recorded} on issue ${String(issue)}`)
|
|
84
|
+
} else if (recorded !== 'not-skipped') {
|
|
85
|
+
console.error(`${review_round2_skip_comment.HEADING}: not recorded (${recorded})`)
|
|
45
86
|
}
|
|
46
87
|
}
|
|
47
88
|
|
|
48
|
-
// Only the paths the code record covers are re-read, so a run without one parses nothing.
|
|
89
|
+
// Only the paths the code record covers are re-read, so a run without one parses nothing. **A file a
|
|
90
|
+
// recorded High cites is never comment-only** (joshuafolkken/kit#4941): `josh ship` reuses round 1 once
|
|
91
|
+
// that file's fix moved (`review-reviewed-tree.ts`), so a fix written in comments alone is still this
|
|
92
|
+
// round's to verify.
|
|
49
93
|
async function read_comment_only(base: string | undefined): Promise<ReadonlyArray<string>> {
|
|
50
94
|
const snapshot = review_stamps.round_one_code_stamp.read()
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
95
|
+
const paths = Object.keys(snapshot?.files ?? {})
|
|
96
|
+
const tree = await review_code_tree.read(paths)
|
|
97
|
+
const unmoved = review_round_one_blobs.unmoved({ from: snapshot?.base, to: base, paths })
|
|
98
|
+
const cited = new Set(review_reviewed_tree.high_cited())
|
|
99
|
+
|
|
100
|
+
return review_code_tree
|
|
101
|
+
.comment_only(snapshot, tree, base, unmoved)
|
|
102
|
+
.filter((path) => !cited.has(path))
|
|
54
103
|
}
|
|
55
104
|
|
|
56
|
-
|
|
57
|
-
|
|
105
|
+
// The carry over every path changed now, not only round 1's: a file the fix added after the merge is
|
|
106
|
+
// in no round-1 record and has to be named all the same.
|
|
107
|
+
function carried_reader(
|
|
108
|
+
base: string | undefined,
|
|
109
|
+
tree: Record<string, string>,
|
|
110
|
+
): (snapshot: FileMapStamp) => ReadonlyArray<string> | undefined {
|
|
111
|
+
return (snapshot) =>
|
|
112
|
+
review_round_one_blobs.carried_delta({
|
|
113
|
+
blobs: snapshot.blobs,
|
|
114
|
+
from: snapshot.base,
|
|
115
|
+
to: base,
|
|
116
|
+
paths: Object.keys(tree),
|
|
117
|
+
})
|
|
118
|
+
}
|
|
58
119
|
|
|
59
|
-
|
|
60
|
-
|
|
120
|
+
// `--json` carries the reason code as well, the field `josh ship` records in the lane ledger.
|
|
121
|
+
function print(answer: RoundTwoAnswer, is_json: boolean): void {
|
|
122
|
+
if (is_json) {
|
|
123
|
+
console.info(review_round2.to_json(answer))
|
|
61
124
|
|
|
62
|
-
return
|
|
125
|
+
return
|
|
63
126
|
}
|
|
64
127
|
|
|
128
|
+
path_decision.print_decision(review_round2.JSON_KEY, answer.verdict, answer.reason, is_json)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function refusal_of(argv: ReadonlyArray<string>): string {
|
|
132
|
+
return argv.includes(RETIRED_CLOSED_FLAG) ? RETIRED_CLOSED_LINE : USAGE
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async function decide_here(options: Options): Promise<RoundTwoAnswer> {
|
|
136
|
+
const closure = await review_round_one_closure.read(await issue_of(options))
|
|
65
137
|
// The commit the tree below is a diff against, so the snapshot can be refused when it was taken
|
|
66
138
|
// against a different one — and the resolved commit rather than `git_command.change_base`, whose
|
|
67
|
-
// fallback is a ref name that moves and would compare equal to itself.
|
|
68
|
-
|
|
69
|
-
const
|
|
139
|
+
// fallback is a ref name that moves and would compare equal to itself. Read through a merge in
|
|
140
|
+
// progress, as the changed tree below is.
|
|
141
|
+
const base = await change_base.resolved_through_merge()
|
|
142
|
+
// No paths argument: `read_changed_tree` reads them itself, from the one definition of "changed"
|
|
143
|
+
// `josh review:level` and `josh review:brief` all decide from. Passing our own reading would be a
|
|
144
|
+
// second definition, which is the drift that module exists to prevent.
|
|
145
|
+
const tree = await review_tree.read_changed_tree()
|
|
146
|
+
|
|
147
|
+
return review_round2.decide({
|
|
70
148
|
base,
|
|
149
|
+
carried_delta: carried_reader(base, tree),
|
|
71
150
|
comment_only: await read_comment_only(base),
|
|
72
|
-
is_round_one_closed:
|
|
151
|
+
is_round_one_closed: closure.is_closed,
|
|
152
|
+
open_reason: closure.reason,
|
|
73
153
|
snapshot: review_stamps.round_one_stamp.read(),
|
|
74
|
-
|
|
75
|
-
// "changed" `josh review:level` and `josh review:brief` all decide from.
|
|
76
|
-
// Passing our own reading would be a second definition, which is the drift that module exists
|
|
77
|
-
// to prevent.
|
|
78
|
-
tree: await review_tree.read_changed_tree(),
|
|
154
|
+
tree,
|
|
79
155
|
})
|
|
156
|
+
}
|
|
80
157
|
|
|
81
|
-
|
|
158
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
159
|
+
const options = parse_options(argv)
|
|
160
|
+
|
|
161
|
+
if (options === undefined) {
|
|
162
|
+
console.error(refusal_of(argv))
|
|
163
|
+
|
|
164
|
+
return FAILURE_EXIT_CODE
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const decision = await decide_here(options)
|
|
168
|
+
|
|
169
|
+
print(decision, options.is_json)
|
|
170
|
+
|
|
171
|
+
if (options.record !== undefined) await report_record(options.record, decision)
|
|
82
172
|
|
|
83
173
|
return 0
|
|
84
174
|
}
|
|
@@ -87,7 +177,16 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
87
177
|
process.exitCode = await run(argv)
|
|
88
178
|
}
|
|
89
179
|
|
|
90
|
-
const review_round2_cli = {
|
|
180
|
+
const review_round2_cli = {
|
|
181
|
+
carried_reader,
|
|
182
|
+
parse_options,
|
|
183
|
+
print,
|
|
184
|
+
read_comment_only,
|
|
185
|
+
RECORD_FLAG,
|
|
186
|
+
RETIRED_CLOSED_FLAG,
|
|
187
|
+
RETIRED_CLOSED_LINE,
|
|
188
|
+
run,
|
|
189
|
+
}
|
|
91
190
|
|
|
92
191
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
93
192
|
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
2
|
+
import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
|
|
3
|
+
import { issue_read, type IssueComment } from '#scripts/issue/issue-read'
|
|
4
|
+
import { review_round2, type RoundTwoAnswer } from './review-round2'
|
|
5
|
+
|
|
6
|
+
// `josh review:round2 --record <N>` — the `## Round 2 skipped` comment `prompts/review.md` asks for,
|
|
7
|
+
// written by the command rather than assembled by the run (joshuafolkken/kit#5286). It names the arm
|
|
8
|
+
// that fired and quotes the reason line verbatim, so a defect found later can be traced to the delta
|
|
9
|
+
// that went unreviewed. **A re-run writes nothing twice**: a trusted comment already carrying the same
|
|
10
|
+
// heading and reason line is the record.
|
|
11
|
+
|
|
12
|
+
const HEADING = '## Round 2 skipped'
|
|
13
|
+
const ARMS: Readonly<Record<string, string>> = {
|
|
14
|
+
[review_round2.CODE.EMPTY]: 'A — the fix delta is empty',
|
|
15
|
+
[review_round2.CODE.INERT]: 'B — every fixed path leaves what executes unchanged',
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
type SkipRecord = 'posted' | 'present' | 'unreadable' | 'failed' | 'not-skipped'
|
|
19
|
+
|
|
20
|
+
function body_of(answer: RoundTwoAnswer): string {
|
|
21
|
+
return [
|
|
22
|
+
HEADING,
|
|
23
|
+
'',
|
|
24
|
+
`- arm: ${ARMS[answer.code] ?? answer.code}`,
|
|
25
|
+
`- reason: ${answer.reason}`,
|
|
26
|
+
].join('\n')
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function is_recorded(comment: IssueComment, body: string): boolean {
|
|
30
|
+
return comment.is_trusted === true && comment.body.trimStart().startsWith(body)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function read_comments(issue: number): Promise<ReadonlyArray<IssueComment> | undefined> {
|
|
34
|
+
return await issue_read.parse_comments(await git_gh_issue_read.issue_list_comments(String(issue)))
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// `not-skipped` for a `required` answer: only a skip is recorded. An unreadable listing posts nothing
|
|
38
|
+
// rather than risk the duplicate the record exists to avoid.
|
|
39
|
+
async function record(issue: number, answer: RoundTwoAnswer): Promise<SkipRecord> {
|
|
40
|
+
if (answer.verdict !== review_round2.SKIPPED_VERDICT) return 'not-skipped'
|
|
41
|
+
|
|
42
|
+
const body = body_of(answer)
|
|
43
|
+
const comments = await read_comments(issue)
|
|
44
|
+
|
|
45
|
+
if (comments === undefined) return 'unreadable'
|
|
46
|
+
|
|
47
|
+
if (comments.some((comment) => is_recorded(comment, body))) return 'present'
|
|
48
|
+
|
|
49
|
+
return (await git_gh_issue_write.issue_try_comment(String(issue), body)) ? 'posted' : 'failed'
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const review_round2_skip_comment = { body_of, HEADING, record }
|
|
53
|
+
|
|
54
|
+
export type { SkipRecord }
|
|
55
|
+
export { review_round2_skip_comment }
|