@joshuafolkken/kit 1.1514.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
2
3
|
import { gh_author_association } from '#scripts/gh/gh-author-association'
|
|
3
4
|
import { git_gh_exec } from '#scripts/gh/git-gh-exec'
|
|
4
5
|
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
5
6
|
import { parse_json, parse_json_array_safe } from '#scripts/git/parse-json-array'
|
|
6
7
|
import { session_cite } from '#scripts/issue/session-cite'
|
|
7
8
|
import { observation_ledger_home } from '#scripts/observations/observation-ledger-home'
|
|
9
|
+
import { observation_ledger_line } from '#scripts/observations/observation-ledger-line'
|
|
8
10
|
import { z } from 'zod'
|
|
9
11
|
import { review_finding_ledger } from './review-finding-ledger'
|
|
10
12
|
|
|
@@ -13,87 +15,158 @@ import { review_finding_ledger } from './review-finding-ledger'
|
|
|
13
15
|
// a ledger line written then would be pushed onto the open pull request and restart its CI — and so
|
|
14
16
|
// nothing that reads the ledger (`review:findings`, the retrospective) ever saw it.
|
|
15
17
|
//
|
|
16
|
-
// **The next run that records a round carries it.** Once an issue
|
|
17
|
-
// so `review:record` copies each closed issue's comment rounds not yet carried into
|
|
18
|
+
// **The next run outside a lane that records a round carries it, or the next flush.** Once an issue
|
|
19
|
+
// is closed no round is added to it, so `review:record` copies each closed issue's comment rounds not yet carried into
|
|
18
20
|
// `<issue>-comment-rounds.md` in the ledger, and the lines ride that run's own commit: the ledger stays
|
|
19
21
|
// the one place a reader looks, and no push restarts any CI. **The file is the carried mark** — an
|
|
20
|
-
// issue whose file exists is never read again
|
|
21
|
-
//
|
|
22
|
+
// issue whose file exists is never read again. **A lane child carries none** (joshuafolkken/kit#5326):
|
|
23
|
+
// parallel lanes each wrote the same file and waited and conflicted on it, so `observations:flush`
|
|
24
|
+
// carries for them on the default branch (`review-comment-carry.ts`).
|
|
25
|
+
//
|
|
26
|
+
// **An observation-ledger line written while the pull request is open rides the same carry**
|
|
27
|
+
// (joshuafolkken/kit#5197): `followup` reruns a CI job red only outside the change during its CI wait,
|
|
28
|
+
// after the ledger's last commit, so the sighting is posted under its own heading and carried with the
|
|
29
|
+
// rounds.
|
|
22
30
|
|
|
23
31
|
const COMMENT_HEADING_MARK = '### '
|
|
24
32
|
const COMMENT_TITLE = 'Review round recorded after the pull request opened'
|
|
25
|
-
const
|
|
33
|
+
const OBSERVATION_TITLE = 'Observation recorded while the pull request was open'
|
|
34
|
+
const COMMENT_TITLES = [COMMENT_TITLE, OBSERVATION_TITLE]
|
|
35
|
+
const COMMENT_HEADINGS = COMMENT_TITLES.map((title) => `${COMMENT_HEADING_MARK}${title}`)
|
|
26
36
|
const COMMENT_NOTE =
|
|
27
37
|
'Kept here rather than in the observation ledger: a line appended after the commit would be pushed onto the open pull request and restart its CI.'
|
|
28
38
|
const CODE_FENCE = '```'
|
|
39
|
+
const OBSERVATION_LINE_MARK = '- k:'
|
|
29
40
|
const CARRIED_SUFFIX = '-comment-rounds'
|
|
41
|
+
const CARRIED_FILE_PATTERN = new RegExp(String.raw`^\d+${CARRIED_SUFFIX}\.md$`, 'u')
|
|
30
42
|
// One page of the newest closed issues: an issue leaves the search's interest once carried, so the
|
|
31
43
|
// ones still to carry are the recently closed.
|
|
32
44
|
const PER_PAGE = '100'
|
|
33
45
|
const UNNAMED_REPOSITORY = 'Could not name this repository from `git remote`.'
|
|
34
46
|
const UNREAD_SEARCH = 'Could not read the search for closed issues with a comment round.'
|
|
35
47
|
const UNREAD_COMMENTS = 'Could not read the comments of'
|
|
48
|
+
const UNREAD_PERMISSION = 'Could not read the write permission of'
|
|
36
49
|
|
|
37
50
|
const search_item_schema = z.object({ number: z.number() })
|
|
38
51
|
const search_schema = z.object({ items: z.array(search_item_schema) })
|
|
39
52
|
const comment_schema = z.object({
|
|
40
53
|
body: z.string().nullish(),
|
|
41
54
|
author_association: z.string().nullish(),
|
|
55
|
+
user: z.looseObject({ login: z.string() }).nullish(),
|
|
42
56
|
})
|
|
43
57
|
|
|
44
58
|
type IssueComment = z.infer<typeof comment_schema>
|
|
45
59
|
|
|
60
|
+
function body_under(title: string, lines: ReadonlyArray<string>): string {
|
|
61
|
+
const heading = `${COMMENT_HEADING_MARK}${title}`
|
|
62
|
+
|
|
63
|
+
return [heading, '', COMMENT_NOTE, '', CODE_FENCE, ...lines, CODE_FENCE].join('\n')
|
|
64
|
+
}
|
|
65
|
+
|
|
46
66
|
function body_of(lines: ReadonlyArray<string>): string {
|
|
47
|
-
return
|
|
67
|
+
return body_under(COMMENT_TITLE, lines)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function observation_body_of(lines: ReadonlyArray<string>): string {
|
|
71
|
+
return body_under(OBSERVATION_TITLE, lines)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function is_carried_line(line: string): boolean {
|
|
75
|
+
if (review_finding_ledger.is_finding_line(line)) return true
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
line.startsWith(OBSERVATION_LINE_MARK) &&
|
|
79
|
+
observation_ledger_line.line_reason(line) === undefined
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function is_round(comment: IssueComment): boolean {
|
|
84
|
+
const body = comment.body ?? ''
|
|
85
|
+
|
|
86
|
+
return COMMENT_HEADINGS.some((heading) => body.startsWith(heading))
|
|
48
87
|
}
|
|
49
88
|
|
|
50
89
|
// The ledger lines of every comment round among one issue's comments, oldest first; any other
|
|
51
90
|
// comment, one that only quotes the heading among them, carries none — nor does one whose author
|
|
52
91
|
// cannot write to the repository: anyone can comment on a public issue, and the carried lines ride
|
|
53
|
-
// the run's commit unreviewed.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
92
|
+
// the run's commit unreviewed. A permission lookup that failed throws instead: the carried file is
|
|
93
|
+
// written once, so a round dropped on a transient failure would never be carried.
|
|
94
|
+
async function is_trusted_comment(comment: IssueComment): Promise<boolean> {
|
|
95
|
+
const login = comment.user?.login
|
|
96
|
+
const is_trusted = await gh_author_association.trust_of({
|
|
97
|
+
login,
|
|
98
|
+
association: comment.author_association,
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
if (is_trusted === undefined) throw new Error(`${UNREAD_PERMISSION} ${login ?? ''}`)
|
|
102
|
+
|
|
103
|
+
return is_trusted
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async function lines_of(comments: ReadonlyArray<IssueComment>): Promise<Array<string>> {
|
|
107
|
+
const rounds = comments.filter((comment) => is_round(comment))
|
|
108
|
+
const trusted = await Promise.all(
|
|
109
|
+
rounds.map(async (comment) => await is_trusted_comment(comment)),
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
return rounds
|
|
113
|
+
.filter((_comment, index) => trusted[index] === true)
|
|
114
|
+
.flatMap((comment) => (comment.body ?? '').split('\n'))
|
|
115
|
+
.filter((line) => is_carried_line(line))
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function search_path(repo: string, title: string): string {
|
|
119
|
+
const query = `repo:${repo} is:issue is:closed in:comments "${title}"`
|
|
65
120
|
const parameters = new URLSearchParams({ q: query, sort: 'updated', per_page: PER_PAGE })
|
|
66
121
|
|
|
67
122
|
return `search/issues?${parameters.toString()}`
|
|
68
123
|
}
|
|
69
124
|
|
|
70
|
-
|
|
71
|
-
|
|
125
|
+
async function search(repo: string, title: string): Promise<ReadonlyArray<number>> {
|
|
126
|
+
const raw = await git_gh_exec.exec_gh_api({ path: search_path(repo, title) })
|
|
127
|
+
const page = parse_json.parse_json_object_or_undefined(raw, search_schema)
|
|
128
|
+
|
|
129
|
+
if (page === undefined) throw new Error(UNREAD_SEARCH)
|
|
130
|
+
|
|
131
|
+
return page.items.map((item) => item.number)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// The closed issues whose comments name a comment round of either heading; a repository that cannot be
|
|
135
|
+
// named or a search that cannot be read throws, so the run says so rather than carrying nothing in
|
|
136
|
+
// silence.
|
|
72
137
|
async function closed_issues(): Promise<ReadonlyArray<number>> {
|
|
73
138
|
const repo = session_cite.session_repo()
|
|
74
139
|
|
|
75
140
|
if (repo === undefined) throw new Error(UNNAMED_REPOSITORY)
|
|
76
141
|
|
|
77
|
-
const
|
|
78
|
-
const page = parse_json.parse_json_object_or_undefined(raw, search_schema)
|
|
79
|
-
|
|
80
|
-
if (page === undefined) throw new Error(UNREAD_SEARCH)
|
|
142
|
+
const pages = await Promise.all(COMMENT_TITLES.map(async (title) => await search(repo, title)))
|
|
81
143
|
|
|
82
|
-
return
|
|
144
|
+
return [...new Set(pages.flat())]
|
|
83
145
|
}
|
|
84
146
|
|
|
85
147
|
function carried_path(issue: number, root: string): string {
|
|
86
148
|
return observation_ledger_home.file_path(`${String(issue)}${CARRIED_SUFFIX}`, root)
|
|
87
149
|
}
|
|
88
150
|
|
|
89
|
-
//
|
|
90
|
-
|
|
91
|
-
|
|
151
|
+
// A path this carry writes, told by its file name alone so a git status path answers it too.
|
|
152
|
+
function is_carried_file(file_path: string): boolean {
|
|
153
|
+
return CARRIED_FILE_PATTERN.test(path.basename(file_path))
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// One issue's comment-round lines. Comments that could not be read throw, so no caller reads an
|
|
157
|
+
// unread issue as one without a round.
|
|
158
|
+
async function issue_lines(issue: number): Promise<Array<string>> {
|
|
92
159
|
const raw = await git_gh_issue_read.issue_list_comments(String(issue))
|
|
93
160
|
|
|
94
161
|
if (raw === undefined) throw new Error(`${UNREAD_COMMENTS} ${session_cite.issue(issue)}`)
|
|
95
162
|
|
|
96
|
-
|
|
163
|
+
return await lines_of(parse_json_array_safe(raw, comment_schema))
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// An issue whose comments could not be read writes no file, so the next run reads it again, and
|
|
167
|
+
// throws so this one says so.
|
|
168
|
+
async function carry_issue(issue: number, root: string): Promise<number> {
|
|
169
|
+
const lines = await issue_lines(issue)
|
|
97
170
|
|
|
98
171
|
await observation_ledger_home.append(carried_path(issue, root), lines)
|
|
99
172
|
|
|
@@ -109,6 +182,14 @@ async function carry(root: string): Promise<number> {
|
|
|
109
182
|
return counts.reduce((total, count) => total + count, 0)
|
|
110
183
|
}
|
|
111
184
|
|
|
112
|
-
const review_comment_round = {
|
|
185
|
+
const review_comment_round = {
|
|
186
|
+
body_of,
|
|
187
|
+
carried_path,
|
|
188
|
+
carry,
|
|
189
|
+
is_carried_file,
|
|
190
|
+
issue_lines,
|
|
191
|
+
lines_of,
|
|
192
|
+
observation_body_of,
|
|
193
|
+
}
|
|
113
194
|
|
|
114
195
|
export { review_comment_round }
|
|
@@ -7,9 +7,22 @@ import { issue_cite } from '#scripts/issue/issue-cite'
|
|
|
7
7
|
// prefix so `observation-ledger-line.ts`'s `- k:` grammar never treats them as its own — one ledger,
|
|
8
8
|
// one commit path, a second line *type* rather than a second ledger.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
// **The interaction review writes the same grammar under its own prefix** (joshuafolkken/kit#4276), so
|
|
11
|
+
// its round is told apart from `/code-review`'s by the merge gate, and its findings stay out of the
|
|
12
|
+
// `/code-review` tally a reader compares rounds by.
|
|
13
|
+
const PREFIX = { code: '- rf:', interaction: '- ri:' } as const
|
|
11
14
|
const FIELD_SEPARATOR = ' | '
|
|
12
15
|
const FIELD_COUNT = 5
|
|
16
|
+
// **The disposition is a sixth field, written only when given** (joshuafolkken/kit#5286): a line
|
|
17
|
+
// written before it existed keeps its five and reads as a finding with no disposition.
|
|
18
|
+
const DISPOSED_FIELD_COUNT = FIELD_COUNT + 1
|
|
19
|
+
const ISSUE_FIELD_INDEX = FIELD_COUNT - 1
|
|
20
|
+
const SEVERITY_FIELD_INDEX = 1
|
|
21
|
+
// **A code round written to the issue's file opens with a boundary line** (joshuafolkken/kit#5359):
|
|
22
|
+
// the ledger is append-only, so a stopped round's unfixed lines stay, and `josh review:round2` reads
|
|
23
|
+
// only the lines after the issue's last boundary. Its own prefix keeps it out of every `- rf:` reader.
|
|
24
|
+
const ROUND_PREFIX = '- rb:'
|
|
25
|
+
const ROUND_ISSUE_FIELD_INDEX = 1
|
|
13
26
|
|
|
14
27
|
// The nine review-rubric categories, as slugs (`prompts/review-rubric.md` → "Review categories"). A
|
|
15
28
|
// finding's category must be one of these so the aggregate stays countable rather than free text.
|
|
@@ -27,6 +40,12 @@ const CATEGORIES = [
|
|
|
27
40
|
|
|
28
41
|
const SEVERITIES = ['high', 'medium', 'low'] as const
|
|
29
42
|
|
|
43
|
+
// What became of a finding: fixed in this tree, a verified false positive, or left to another issue.
|
|
44
|
+
// Only the first two close it for `josh review:round2`.
|
|
45
|
+
const CLOSING_DISPOSITIONS = ['fixed', 'false-positive'] as const
|
|
46
|
+
const DISPOSITION_PATTERN = /^(?:fixed|false-positive|(?:filed|deferred):#[1-9]\d*)$/u
|
|
47
|
+
const DISPOSITION_SEPARATOR = ' '
|
|
48
|
+
|
|
30
49
|
// The sentinel a zero-finding round writes, so "a round ran and found nothing" is a recorded line
|
|
31
50
|
// rather than an absent one — the count's denominator survives.
|
|
32
51
|
const NONE = 'none'
|
|
@@ -34,11 +53,18 @@ const NO_FILE = '-'
|
|
|
34
53
|
|
|
35
54
|
type Category = (typeof CATEGORIES)[number]
|
|
36
55
|
type Severity = (typeof SEVERITIES)[number]
|
|
56
|
+
type LineKind = keyof typeof PREFIX
|
|
37
57
|
|
|
38
58
|
interface Finding {
|
|
39
59
|
category: Category
|
|
40
60
|
severity: Severity
|
|
41
61
|
file: string
|
|
62
|
+
disposition?: string
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
interface DisposedSpec {
|
|
66
|
+
disposition: string | undefined
|
|
67
|
+
spec: string
|
|
42
68
|
}
|
|
43
69
|
|
|
44
70
|
interface CategoryCount {
|
|
@@ -61,33 +87,76 @@ function is_valid_file(file: string): boolean {
|
|
|
61
87
|
return file.length > 0 && !file.includes(FIELD_SEPARATOR)
|
|
62
88
|
}
|
|
63
89
|
|
|
90
|
+
function is_disposition(value: string): boolean {
|
|
91
|
+
return DISPOSITION_PATTERN.test(value)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function is_closing(disposition: string | undefined): boolean {
|
|
95
|
+
return (CLOSING_DISPOSITIONS as ReadonlyArray<string | undefined>).includes(disposition)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// A positional's leading disposition — `fixed <spec>`, `filed:#12 <spec>` — split from the spec it
|
|
99
|
+
// marks. The token the reviewer already writes before a finding it fixed, so one grammar serves both.
|
|
100
|
+
function split_disposition(positional: string): DisposedSpec {
|
|
101
|
+
const end = positional.indexOf(DISPOSITION_SEPARATOR)
|
|
102
|
+
const head = end === -1 ? '' : positional.slice(0, end)
|
|
103
|
+
|
|
104
|
+
if (!is_disposition(head)) return { disposition: undefined, spec: positional }
|
|
105
|
+
|
|
106
|
+
return { disposition: head, spec: positional.slice(end + DISPOSITION_SEPARATOR.length) }
|
|
107
|
+
}
|
|
108
|
+
|
|
64
109
|
function issue_field(issue: number): string {
|
|
65
110
|
return issue_cite.plain(issue)
|
|
66
111
|
}
|
|
67
112
|
|
|
68
|
-
function line_of(fields: ReadonlyArray<string
|
|
69
|
-
return `${
|
|
113
|
+
function line_of(fields: ReadonlyArray<string>, kind: LineKind): string {
|
|
114
|
+
return `${PREFIX[kind]}${fields.join(FIELD_SEPARATOR)}`
|
|
70
115
|
}
|
|
71
116
|
|
|
72
|
-
function finding_line(
|
|
73
|
-
|
|
117
|
+
function finding_line(
|
|
118
|
+
finding: Finding,
|
|
119
|
+
date: string,
|
|
120
|
+
issue: number,
|
|
121
|
+
kind: LineKind = 'code',
|
|
122
|
+
): string {
|
|
123
|
+
const fields = [finding.category, finding.severity, finding.file, date, issue_field(issue)]
|
|
124
|
+
|
|
125
|
+
return line_of(
|
|
126
|
+
finding.disposition === undefined ? fields : [...fields, finding.disposition],
|
|
127
|
+
kind,
|
|
128
|
+
)
|
|
74
129
|
}
|
|
75
130
|
|
|
76
131
|
// **A zero-finding round records `none`, not nothing.** Reading its absence as "no findings" would
|
|
77
132
|
// merge the round that found nothing with the round nobody recorded, which is the exact confusion the
|
|
78
133
|
// ledger exists to end.
|
|
79
|
-
function zero_round_line(date: string, issue: number): string {
|
|
80
|
-
return line_of([NONE, NONE, NO_FILE, date, issue_field(issue)])
|
|
134
|
+
function zero_round_line(date: string, issue: number, kind: LineKind = 'code'): string {
|
|
135
|
+
return line_of([NONE, NONE, NO_FILE, date, issue_field(issue)], kind)
|
|
81
136
|
}
|
|
82
137
|
|
|
83
|
-
function is_finding_line(line: string): boolean {
|
|
84
|
-
return line.trimStart().startsWith(
|
|
138
|
+
function is_finding_line(line: string, kind: LineKind = 'code'): boolean {
|
|
139
|
+
return line.trimStart().startsWith(PREFIX[kind])
|
|
85
140
|
}
|
|
86
141
|
|
|
87
|
-
function
|
|
88
|
-
|
|
142
|
+
function fields_of(line: string, kind: LineKind = 'code'): ReadonlyArray<string> {
|
|
143
|
+
return line.trimStart().slice(PREFIX[kind].length).split(FIELD_SEPARATOR)
|
|
144
|
+
}
|
|
89
145
|
|
|
90
|
-
|
|
146
|
+
// The line's fields, or `undefined` for a malformed one — five, or six with a disposition.
|
|
147
|
+
function well_formed_fields(
|
|
148
|
+
line: string,
|
|
149
|
+
kind: LineKind = 'code',
|
|
150
|
+
): ReadonlyArray<string> | undefined {
|
|
151
|
+
const fields = fields_of(line, kind)
|
|
152
|
+
|
|
153
|
+
return fields.length === FIELD_COUNT || fields.length === DISPOSED_FIELD_COUNT
|
|
154
|
+
? fields
|
|
155
|
+
: undefined
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function category_of(line: string): string | undefined {
|
|
159
|
+
return well_formed_fields(line)?.[0]
|
|
91
160
|
}
|
|
92
161
|
|
|
93
162
|
function increment(counts: Map<string, number>, category: string): void {
|
|
@@ -135,20 +204,63 @@ function zero_round_count(content: string): number {
|
|
|
135
204
|
// The issue a finding line is keyed to — its fifth field, the `#<N>` token — or `undefined` for a
|
|
136
205
|
// non-finding or malformed line. The record check reads this to ask whether a given issue's round was
|
|
137
206
|
// recorded at all.
|
|
138
|
-
function issue_of(line: string): string | undefined {
|
|
139
|
-
|
|
207
|
+
function issue_of(line: string, kind: LineKind): string | undefined {
|
|
208
|
+
return well_formed_fields(line, kind)?.[ISSUE_FIELD_INDEX]
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
interface DisposedLine {
|
|
212
|
+
severity: string
|
|
213
|
+
disposition: string | undefined
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// One issue's `- rf:` lines, each with its severity and disposition — `undefined` disposition for a
|
|
217
|
+
// line written without one. `josh review:round2` reads round 1's closure from this.
|
|
218
|
+
function issue_dispositions(content: string, issue: number): ReadonlyArray<DisposedLine> {
|
|
219
|
+
const target = issue_field(issue)
|
|
220
|
+
|
|
221
|
+
return content
|
|
222
|
+
.split('\n')
|
|
223
|
+
.filter((line) => is_finding_line(line) && issue_of(line, 'code') === target)
|
|
224
|
+
.map((line) => well_formed_fields(line) ?? [])
|
|
225
|
+
.map((fields) => ({
|
|
226
|
+
severity: fields[SEVERITY_FIELD_INDEX] ?? NONE,
|
|
227
|
+
disposition: fields[FIELD_COUNT],
|
|
228
|
+
}))
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function round_line(date: string, issue: number): string {
|
|
232
|
+
return `${ROUND_PREFIX}${[date, issue_field(issue)].join(FIELD_SEPARATOR)}`
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function is_round_line(line: string, target: string): boolean {
|
|
236
|
+
const trimmed = line.trimStart()
|
|
237
|
+
|
|
238
|
+
if (!trimmed.startsWith(ROUND_PREFIX)) return false
|
|
239
|
+
|
|
240
|
+
const fields = trimmed.slice(ROUND_PREFIX.length).split(FIELD_SEPARATOR)
|
|
241
|
+
|
|
242
|
+
return fields[ROUND_ISSUE_FIELD_INDEX] === target
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// The content after the issue's last round boundary — the whole content when it has none, as a ledger
|
|
246
|
+
// written before the boundary existed does.
|
|
247
|
+
function latest_round(content: string, issue: number): string {
|
|
248
|
+
const target = issue_field(issue)
|
|
249
|
+
const lines = content.split('\n')
|
|
140
250
|
|
|
141
|
-
return
|
|
251
|
+
return lines.slice(lines.findLastIndex((line) => is_round_line(line, target)) + 1).join('\n')
|
|
142
252
|
}
|
|
143
253
|
|
|
144
254
|
// **A `none` zero-round line counts as recorded, exactly like a real finding line does.** The gate
|
|
145
255
|
// asks whether the round was recorded, not whether it found anything — reading the issue field, which
|
|
146
256
|
// a zero-finding line carries too, is what keeps a clean round's single line from reading as "nobody
|
|
147
257
|
// recorded this".
|
|
148
|
-
function has_issue_record(content: string, issue: number): boolean {
|
|
258
|
+
function has_issue_record(content: string, issue: number, kind: LineKind = 'code'): boolean {
|
|
149
259
|
const target = issue_field(issue)
|
|
150
260
|
|
|
151
|
-
return content
|
|
261
|
+
return content
|
|
262
|
+
.split('\n')
|
|
263
|
+
.some((line) => is_finding_line(line, kind) && issue_of(line, kind) === target)
|
|
152
264
|
}
|
|
153
265
|
|
|
154
266
|
const review_finding_ledger = {
|
|
@@ -157,13 +269,18 @@ const review_finding_ledger = {
|
|
|
157
269
|
finding_line,
|
|
158
270
|
has_issue_record,
|
|
159
271
|
is_category,
|
|
272
|
+
is_closing,
|
|
160
273
|
is_finding_line,
|
|
161
274
|
is_severity,
|
|
162
275
|
is_valid_file,
|
|
276
|
+
issue_dispositions,
|
|
277
|
+
latest_round,
|
|
278
|
+
round_line,
|
|
163
279
|
SEVERITIES,
|
|
280
|
+
split_disposition,
|
|
164
281
|
zero_round_count,
|
|
165
282
|
zero_round_line,
|
|
166
283
|
}
|
|
167
284
|
|
|
168
|
-
export type { CategoryCount, Finding }
|
|
285
|
+
export type { CategoryCount, DisposedLine, Finding, LineKind }
|
|
169
286
|
export { review_finding_ledger }
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// A finding written in the `review:record` grammar with its reason after it — `<spec> — <sentence>` —
|
|
2
|
+
// split into the two halves, the one place both its writers read it: a ship reviewer's findings file
|
|
3
|
+
// (`run-ship-review.ts`) and an agent's own `review:record` round (`review-record-cli.ts`). The spec is
|
|
4
|
+
// what the ledger keeps; the first sentence of the reason is what the durable stop log keeps.
|
|
5
|
+
|
|
6
|
+
// What a finding line carries after its spec: one sentence saying what is wrong, so a stopped ship's
|
|
7
|
+
// log tells the resumed lane child the defect rather than only its location.
|
|
8
|
+
const DESCRIPTION_SEPARATOR = ' — '
|
|
9
|
+
// Where the spec ends on read: a reviewer that types the dash as `-`, `--` or `–` still ends it there,
|
|
10
|
+
// so its sentence never lands in the ledger's file field.
|
|
11
|
+
const DESCRIPTION_BOUNDARY = / [—–-]{1,2} /u
|
|
12
|
+
// Where a description's first sentence ends, and the cap that keeps a run-on one a line. Japanese
|
|
13
|
+
// sets no space after `。`, so it ends a sentence on its own.
|
|
14
|
+
const SENTENCE_END = /(?<=[.!?])\s|(?<=。)/u
|
|
15
|
+
const SENTENCE_LIMIT = 200
|
|
16
|
+
const ELLIPSIS = '…'
|
|
17
|
+
|
|
18
|
+
function split_description(unmarked: string): { spec: string; description: string } {
|
|
19
|
+
const boundary = DESCRIPTION_BOUNDARY.exec(unmarked)
|
|
20
|
+
|
|
21
|
+
if (boundary === null) return { spec: unmarked.trim(), description: '' }
|
|
22
|
+
|
|
23
|
+
const rest = unmarked.slice(boundary.index + boundary[0].length)
|
|
24
|
+
|
|
25
|
+
return { spec: unmarked.slice(0, boundary.index).trim(), description: rest.trim() }
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function first_sentence(description: string): string {
|
|
29
|
+
const [sentence = ''] = description.split(SENTENCE_END, 1)
|
|
30
|
+
|
|
31
|
+
if (sentence.length <= SENTENCE_LIMIT) return sentence
|
|
32
|
+
|
|
33
|
+
return `${sentence.slice(0, SENTENCE_LIMIT - ELLIPSIS.length)}${ELLIPSIS}`
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const review_finding_text = {
|
|
37
|
+
DESCRIPTION_SEPARATOR,
|
|
38
|
+
SENTENCE_LIMIT,
|
|
39
|
+
first_sentence,
|
|
40
|
+
split_description,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export { review_finding_text }
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { project_checks } from '#scripts/gate/project-checks'
|
|
2
|
+
import { changed_paths } from '#scripts/git/changed-paths'
|
|
3
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
4
|
+
import { observation_ledger_home } from '#scripts/observations/observation-ledger-home'
|
|
5
|
+
import { review_attest, type ReviewSlot } from './review-attest'
|
|
6
|
+
import { review_finding_ledger } from './review-finding-ledger'
|
|
7
|
+
|
|
8
|
+
// The interaction review — one adversarial pass after `/code-review`, over a change to the run
|
|
9
|
+
// tooling (joshuafolkken/kit#4276).
|
|
10
|
+
//
|
|
11
|
+
// **`/code-review` reads the diff for its own correctness, and the defects came from elsewhere**: most
|
|
12
|
+
// of them were a new mechanism meeting an existing one — a pause meeting the next run, a count meeting
|
|
13
|
+
// the per-second repaint. This pass is given one role, to find the existing features the change
|
|
14
|
+
// breaks, and is due only where those meetings happen: the four directories below, in the kit
|
|
15
|
+
// repository alone — a consumer's own `scripts/run/` is not kit's run tooling.
|
|
16
|
+
//
|
|
17
|
+
// **Its round is its own ledger line, `- ri:`**, so the merge gate tells it apart from `/code-review`'s
|
|
18
|
+
// and `josh followup` refuses a due change that has none. The verdicts mirror `review_record.check`'s:
|
|
19
|
+
// `not-required` covers both a change outside the directories and a checkout that keeps no ledger.
|
|
20
|
+
|
|
21
|
+
const TARGET_DIRECTORIES = ['scripts/run/', 'scripts/lane/', 'scripts/backlog/', 'scripts/hooks/']
|
|
22
|
+
|
|
23
|
+
const NOT_DUE_LINE =
|
|
24
|
+
'Interaction review not due: this is not the kit repository, or the change touches none of scripts/run/, scripts/lane/, scripts/backlog/ or scripts/hooks/.'
|
|
25
|
+
|
|
26
|
+
const ROLE_LINES = [
|
|
27
|
+
'## Interaction review',
|
|
28
|
+
'This pass is not a second `/code-review`: do not hunt for bugs inside the diff — the round before it did. Your role is to find three existing features this change breaks. Check only these three:',
|
|
29
|
+
'1. Every state, command, label, file or process this change adds or gives a new meaning to — who else reads or writes it? Search the repository outside the diff for each. Where the plan has a `### 影響を受ける既存の利用者` section, check it names them all.',
|
|
30
|
+
'2. Does each of those readers and writers still behave correctly when the new state or value reaches it (for example, a paused lane counted as running)?',
|
|
31
|
+
'3. Does the change add heavy or synchronous work to a path called repeatedly — every second, every Bash call, every edit?',
|
|
32
|
+
"Report each break with the reader's `file:line` and the change's, rated by the rubric's severities; it is disposed of by `prompts/review.md` → \"Interaction review\".",
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
type InteractionStatus = 'ok' | 'missing' | 'not-required'
|
|
36
|
+
|
|
37
|
+
function due_paths(
|
|
38
|
+
paths: ReadonlyArray<string>,
|
|
39
|
+
checkout: string = process.cwd(),
|
|
40
|
+
): ReadonlyArray<string> {
|
|
41
|
+
if (!project_checks.is_kit_repository(checkout)) return []
|
|
42
|
+
|
|
43
|
+
return paths.filter((file) => TARGET_DIRECTORIES.some((directory) => file.startsWith(directory)))
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function brief_block(targets: ReadonlyArray<string>): string {
|
|
47
|
+
const listed = targets.map((file) => `- ${file}`)
|
|
48
|
+
|
|
49
|
+
return [...ROLE_LINES, 'Changed in the run tooling:', ...listed].join('\n')
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async function status_of(
|
|
53
|
+
issue: number,
|
|
54
|
+
paths: ReadonlyArray<string>,
|
|
55
|
+
root: string = observation_ledger_home.ledger_root(),
|
|
56
|
+
): Promise<InteractionStatus> {
|
|
57
|
+
const content = due_paths(paths).length > 0 ? await observation_ledger_home.read(root) : undefined
|
|
58
|
+
|
|
59
|
+
if (content === undefined) return 'not-required'
|
|
60
|
+
|
|
61
|
+
return review_finding_ledger.has_issue_record(content, issue, 'interaction') ? 'ok' : 'missing'
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// The status over this checkout's change — the reading `review:brief` takes.
|
|
65
|
+
async function status(issue: number, root?: string): Promise<InteractionStatus> {
|
|
66
|
+
return await status_of(issue, await changed_paths.read_changed_paths(false), root)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// **Round 1's slots — the interaction review beside `/code-review`'s where it is due and not yet
|
|
70
|
+
// recorded** (joshuafolkken/kit#4672, joshuafolkken/kit#4802), so it takes round 1's wait and stop.
|
|
71
|
+
// `josh ship` and `josh run:review` both open round 1 from it.
|
|
72
|
+
function round_one_slots(answer: InteractionStatus | undefined): ReadonlyArray<ReviewSlot> {
|
|
73
|
+
const { CODE, INTERACTION } = review_attest.REVIEW_SLOT
|
|
74
|
+
|
|
75
|
+
return answer === 'missing' ? [CODE, INTERACTION] : [CODE]
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const MISSING_REASON =
|
|
79
|
+
'This change touches the run tooling, and no interaction review is recorded for its issue — the pass that looks for the existing features a change breaks, which `/code-review` does not (joshuafolkken/kit#4276).'
|
|
80
|
+
|
|
81
|
+
const REMEDY =
|
|
82
|
+
'Run it from `pnpm josh review:brief --interaction`, then record it with `pnpm josh review:record --interaction --issue <N> [<category>:<severity>:<file> ...]` — a clean pass is a call with no findings — and reissue the merge.'
|
|
83
|
+
|
|
84
|
+
function refusal_message(issue: number): string {
|
|
85
|
+
return [MISSING_REASON, `Issue: ${session_cite.issue(issue)}`, REMEDY].join('\n')
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// The merge gate's half: the refusal for a due change with no recorded pass, else `undefined`.
|
|
89
|
+
async function refusal(issue: number, root?: string): Promise<string | undefined> {
|
|
90
|
+
return (await status(issue, root)) === 'missing' ? refusal_message(issue) : undefined
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const review_interaction = {
|
|
94
|
+
brief_block,
|
|
95
|
+
due_paths,
|
|
96
|
+
NOT_DUE_LINE,
|
|
97
|
+
refusal,
|
|
98
|
+
refusal_message,
|
|
99
|
+
round_one_slots,
|
|
100
|
+
status,
|
|
101
|
+
status_of,
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export type { InteractionStatus }
|
|
105
|
+
export { review_interaction }
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
2
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
3
|
+
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
4
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
5
|
+
import { review_round_reuse, type ReuseAnswer } from './review-round-reuse'
|
|
6
|
+
|
|
7
|
+
// joshuafolkken/kit#4850: once a lane child has recorded round 1 on a tree `josh ship` reuses, round 2
|
|
8
|
+
// is the ship's. The rule stood in `chain-rule.md` step 0 as prose alone (joshuafolkken/kit#4830), and
|
|
9
|
+
// the next lane reopened `run:review` after reading it, running a round 2 the ship then ran again. So
|
|
10
|
+
// `run:review` refuses that reopen and `review:record` names the ship as the next step.
|
|
11
|
+
//
|
|
12
|
+
// **A round the ship would review again is not handed over**: `review:record --check` then tells the
|
|
13
|
+
// lane to run round 1 itself, so `run:review` stays open for it.
|
|
14
|
+
|
|
15
|
+
const SHIP_STEP = 'pnpm josh ship --detach --review "<title> #<N>"'
|
|
16
|
+
const NEXT_STEP_LINE = `Next: hand over to \`${SHIP_STEP}\` — round 2 is the ship's; never reopen \`run:review\` (chain-rule.md step 0).`
|
|
17
|
+
|
|
18
|
+
// A reuse question git could not answer reads as not reused: the lane then reviews the round itself,
|
|
19
|
+
// which costs one review, rather than leaving it to a ship that may review it again detached.
|
|
20
|
+
// The stale read inside it fails open in `review_round_reuse.is_stale_here`, as the ship's probe reads it.
|
|
21
|
+
const UNANSWERED_CAUSE = 'git could not answer the reuse question'
|
|
22
|
+
|
|
23
|
+
async function answer_here(issue: number): Promise<ReuseAnswer> {
|
|
24
|
+
try {
|
|
25
|
+
return await review_round_reuse.answer_here(issue)
|
|
26
|
+
} catch (error) {
|
|
27
|
+
error_text.trace_swallowed('review_lane_handover.answer_here', error)
|
|
28
|
+
|
|
29
|
+
return { reuse: review_round_reuse.REUSE.AGAIN, cause: UNANSWERED_CAUSE }
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function is_reused_here(issue: number): Promise<boolean> {
|
|
34
|
+
const answer = await answer_here(issue)
|
|
35
|
+
|
|
36
|
+
return answer.reuse !== review_round_reuse.REUSE.AGAIN
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// The mark must name this issue as well as this checkout, so a person's run — or a branch whose issue
|
|
40
|
+
// is not the lane's — is never refused.
|
|
41
|
+
function is_lane_child_of(issue: number): boolean {
|
|
42
|
+
if (lane_child_marker.marked_issue() !== String(issue)) return false
|
|
43
|
+
|
|
44
|
+
return lane_child_marker.is_child_of(PROJECT_ROOT)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Reuse already requires the recorded round (`review_round_reuse.is_reusable`), so it answers both.
|
|
48
|
+
async function is_handed_over(issue: number): Promise<boolean> {
|
|
49
|
+
if (!is_lane_child_of(issue)) return false
|
|
50
|
+
|
|
51
|
+
return await is_reused_here(issue)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function refusal(issue: number): string {
|
|
55
|
+
return (
|
|
56
|
+
`⛔ run:review: round 1 of ${session_cite.issue(issue)} is recorded and josh ship reuses it, and this is a ` +
|
|
57
|
+
`dispatched lane child (\`${lane_child_marker.KEY}\`), so no brief is minted. ${NEXT_STEP_LINE}`
|
|
58
|
+
)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const review_lane_handover = {
|
|
62
|
+
NEXT_STEP_LINE,
|
|
63
|
+
answer_here,
|
|
64
|
+
is_handed_over,
|
|
65
|
+
refusal,
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export { review_lane_handover }
|