@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,3 +1,4 @@
|
|
|
1
|
+
import { gh_author_association } from '#scripts/gh/gh-author-association'
|
|
1
2
|
import { git_gh_api_path } from '#scripts/gh/git-gh-api-path'
|
|
2
3
|
import { git_gh_conditional } from '#scripts/gh/git-gh-conditional'
|
|
3
4
|
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
@@ -30,10 +31,18 @@ const record_schema = z.object({
|
|
|
30
31
|
checked_at: z.string(),
|
|
31
32
|
etag: z.string().optional(),
|
|
32
33
|
pending: z.string().optional(),
|
|
34
|
+
// A body edit withheld from the run (`issue_watch_diff.withheld_notice`) — shown, never a hold.
|
|
35
|
+
notice: z.string().optional(),
|
|
33
36
|
shown: z.string().optional(),
|
|
34
37
|
})
|
|
35
38
|
|
|
36
|
-
const issue_schema = z.looseObject({
|
|
39
|
+
const issue_schema = z.looseObject({
|
|
40
|
+
body: z.string().nullish(),
|
|
41
|
+
state: z.string(),
|
|
42
|
+
...gh_author_association.author_fields_schema,
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
type IssueRead = z.infer<typeof issue_schema>
|
|
37
46
|
|
|
38
47
|
type WatchRecord = z.infer<typeof record_schema>
|
|
39
48
|
|
|
@@ -71,16 +80,28 @@ interface FetchRequest {
|
|
|
71
80
|
timeout_ms?: number | undefined
|
|
72
81
|
}
|
|
73
82
|
|
|
83
|
+
async function read_comments(
|
|
84
|
+
request: FetchRequest,
|
|
85
|
+
): Promise<WatchSnapshot['comments'] | undefined> {
|
|
86
|
+
return await issue_watch_diff.parse_comments(
|
|
87
|
+
await git_gh_issue_read.issue_list_comments(request.issue, request.timeout_ms),
|
|
88
|
+
request.timeout_ms,
|
|
89
|
+
)
|
|
90
|
+
}
|
|
91
|
+
|
|
74
92
|
async function read_snapshot(
|
|
75
93
|
request: FetchRequest,
|
|
76
|
-
|
|
94
|
+
issue: IssueRead,
|
|
77
95
|
etag: string | undefined,
|
|
78
96
|
): Promise<Fetched> {
|
|
79
|
-
const comments =
|
|
80
|
-
|
|
81
|
-
|
|
97
|
+
const [comments, is_body_trusted] = await Promise.all([
|
|
98
|
+
read_comments(request),
|
|
99
|
+
gh_author_association.trust_of(gh_author_association.author_of(issue, request.timeout_ms)),
|
|
100
|
+
])
|
|
82
101
|
|
|
83
|
-
|
|
102
|
+
if (comments === undefined) return UNREADABLE
|
|
103
|
+
|
|
104
|
+
return { kind: 'read', snapshot: { body: issue.body ?? '', is_body_trusted, comments }, etag }
|
|
84
105
|
}
|
|
85
106
|
|
|
86
107
|
async function fetch_issue(request: FetchRequest): Promise<Fetched> {
|
|
@@ -97,7 +118,7 @@ async function fetch_issue(request: FetchRequest): Promise<Fetched> {
|
|
|
97
118
|
if (fields === undefined) return UNREADABLE
|
|
98
119
|
if (fields.state === CLOSED_STATE) return { kind: 'closed' }
|
|
99
120
|
|
|
100
|
-
return await read_snapshot(request, fields
|
|
121
|
+
return await read_snapshot(request, fields, read.etag)
|
|
101
122
|
}
|
|
102
123
|
|
|
103
124
|
// `acknowledged_at` is when a person's update was last taken in — the baseline's own read, or an
|
|
@@ -114,6 +135,20 @@ function fresh_record(
|
|
|
114
135
|
return { issue, ...baseline, acknowledged_at, checked_at, etag: fetched.etag }
|
|
115
136
|
}
|
|
116
137
|
|
|
138
|
+
// The previous `acknowledged_at` when a re-read of the same issue takes nothing in, so a `josh
|
|
139
|
+
// run:entry` re-run keeps a review briefed before it valid; `undefined` (now) otherwise.
|
|
140
|
+
function kept_acknowledgement(
|
|
141
|
+
previous: WatchRecord | undefined,
|
|
142
|
+
issue: string,
|
|
143
|
+
fetched: Extract<Fetched, { kind: 'read' }>,
|
|
144
|
+
): string | undefined {
|
|
145
|
+
if (previous?.issue !== issue) return undefined
|
|
146
|
+
|
|
147
|
+
const diff = issue_watch_diff.unread_diff(previous, fetched.snapshot)
|
|
148
|
+
|
|
149
|
+
return diff === undefined ? previous.acknowledged_at : undefined
|
|
150
|
+
}
|
|
151
|
+
|
|
117
152
|
// Called by `josh run:entry` once it has printed the issue. `false` when the issue could not be read,
|
|
118
153
|
// which leaves no record — a watch with no baseline would call the whole issue unread.
|
|
119
154
|
async function record_baseline(
|
|
@@ -125,7 +160,9 @@ async function record_baseline(
|
|
|
125
160
|
|
|
126
161
|
if (fetched.kind !== 'read') return false
|
|
127
162
|
|
|
128
|
-
|
|
163
|
+
const acknowledged_at = kept_acknowledgement(read_record(root), issue, fetched)
|
|
164
|
+
|
|
165
|
+
write_record(fresh_record(issue, fetched, now, acknowledged_at), root)
|
|
129
166
|
|
|
130
167
|
return true
|
|
131
168
|
}
|
|
@@ -144,8 +181,9 @@ function with_fetched(record: WatchRecord, fetched: Fetched, checked_at: string)
|
|
|
144
181
|
if (fetched.kind !== 'read') return { ...record, checked_at }
|
|
145
182
|
|
|
146
183
|
const pending = issue_watch_diff.unread_diff(record, fetched.snapshot)
|
|
184
|
+
const notice = issue_watch_diff.withheld_notice(record, fetched.snapshot)
|
|
147
185
|
|
|
148
|
-
return { ...record, checked_at, etag: fetched.etag, pending }
|
|
186
|
+
return { ...record, checked_at, etag: fetched.etag, pending, notice }
|
|
149
187
|
}
|
|
150
188
|
|
|
151
189
|
interface PollOptions {
|
|
@@ -190,9 +228,14 @@ async function poll(options: PollOptions, root?: string): Promise<WatchRecord |
|
|
|
190
228
|
return await refresh(record, options, now, root)
|
|
191
229
|
}
|
|
192
230
|
|
|
193
|
-
//
|
|
231
|
+
// What the hook shows: a pending update, else a withheld edit's notice.
|
|
232
|
+
function news_of(record: WatchRecord): string | undefined {
|
|
233
|
+
return record.pending ?? record.notice
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Marks the news shown, so the hook stops once per update rather than on every call.
|
|
194
237
|
function mark_shown(record: WatchRecord, root?: string): WatchRecord {
|
|
195
|
-
return write_record({ ...record, shown: record
|
|
238
|
+
return write_record({ ...record, shown: news_of(record) }, root)
|
|
196
239
|
}
|
|
197
240
|
|
|
198
241
|
interface Acknowledged {
|
|
@@ -229,6 +272,7 @@ const issue_watch = {
|
|
|
229
272
|
clear,
|
|
230
273
|
clear_here,
|
|
231
274
|
mark_shown,
|
|
275
|
+
news_of,
|
|
232
276
|
poll,
|
|
233
277
|
read_record,
|
|
234
278
|
record_baseline,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
1
2
|
import { INTERRUPT_ROUTE_LABEL, SPLIT_ROUTE_LABEL, TIER_A_ROUTE_LABEL } from './issue-labels'
|
|
2
3
|
|
|
3
4
|
// The WIP cap at the call that files. `josh issue:file` reads the count and asks the exemption
|
|
@@ -55,13 +56,7 @@ function count_line(count: number, repo: string, verdict: WipVerdict): string {
|
|
|
55
56
|
// The listing's JSON is an array of rows; anything else is unreadable rather than zero, because zero
|
|
56
57
|
// would pass every filing as within the cap.
|
|
57
58
|
function count_of(json: string): number | undefined {
|
|
58
|
-
|
|
59
|
-
const parsed: unknown = JSON.parse(json)
|
|
60
|
-
|
|
61
|
-
return Array.isArray(parsed) ? parsed.length : undefined
|
|
62
|
-
} catch {
|
|
63
|
-
return undefined
|
|
64
|
-
}
|
|
59
|
+
return json_value.parse_array(json)?.length
|
|
65
60
|
}
|
|
66
61
|
|
|
67
62
|
const issue_wip = { WIP_CAP, HELD, HELD_MESSAGE, UNREAD_MESSAGE, verdict_of, count_line, count_of }
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { markdown_section } from './markdown-section'
|
|
3
|
+
|
|
4
|
+
// joshuafolkken/kit#4621: a follow-up measurement ("measure K merges after #N") took a lane for 20–40
|
|
5
|
+
// minutes to run one command and compare its value with a bound — work `backlog:drive` can do itself.
|
|
6
|
+
// The body declares that command and the bound once, under the background heading, so the drive runs
|
|
7
|
+
// it when the issue comes due and closes it on a pass; only a miss or an unreadable value takes a lane.
|
|
8
|
+
//
|
|
9
|
+
// **The value is the command's last non-empty output line, read as one number.** Anything else — a
|
|
10
|
+
// unit, a sentence, a failure — is unreadable, so a person never relies on how a free-text line parses.
|
|
11
|
+
|
|
12
|
+
const BACKGROUND_HEADING = '## 背景'
|
|
13
|
+
const PREFIX = '- 計測宣言:'
|
|
14
|
+
// joshuafolkken/kit#5144: a follow-up whose value no one command prints (an Actions record, an external
|
|
15
|
+
// service) says why under the same heading instead, so it files without a declaration.
|
|
16
|
+
const ABSENT_PREFIX = '- 計測宣言なし:'
|
|
17
|
+
const ABSENT = `${ABSENT_PREFIX} <理由>`
|
|
18
|
+
const DECLARATION = `${PREFIX} \`<command>\` <=|<|>=|> <number>`
|
|
19
|
+
const VALUE_PATTERN =
|
|
20
|
+
/^`(?<command>[^`\s][^`]*)`\s*(?<operator><=|>=|<|>)\s*(?<threshold>-?\d+(?:\.\d+)?)$/u
|
|
21
|
+
const NUMBER_PATTERN = /^-?\d+(?:\.\d+)?$/u
|
|
22
|
+
// The refusal ends in a line ready to paste (joshuafolkken/kit#5225).
|
|
23
|
+
const EXAMPLE = `${PREFIX} \`pnpm josh lane:net 5168\` <= 40`
|
|
24
|
+
const MALFORMED = `\`${PREFIX}\` must be written ${DECLARATION}\n${EXAMPLE}`
|
|
25
|
+
const declaration_schema = z.object({
|
|
26
|
+
command: z.string().trim(),
|
|
27
|
+
operator: z.enum(['<=', '<', '>=', '>']),
|
|
28
|
+
threshold: z.coerce.number(),
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
type MeasureDeclaration = z.infer<typeof declaration_schema>
|
|
32
|
+
type Operator = MeasureDeclaration['operator']
|
|
33
|
+
type MeasureVerdict = { kind: 'pass' | 'fail'; value: number } | { kind: 'unreadable' }
|
|
34
|
+
|
|
35
|
+
const COMPARE: Readonly<Record<Operator, (value: number, threshold: number) => boolean>> = {
|
|
36
|
+
'<=': (value, threshold) => value <= threshold,
|
|
37
|
+
'<': (value, threshold) => value < threshold,
|
|
38
|
+
'>=': (value, threshold) => value >= threshold,
|
|
39
|
+
'>': (value, threshold) => value > threshold,
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// The value after `prefix` under the background heading, or `undefined` when the body has no such line.
|
|
43
|
+
function background_value(body: string, prefix: string): string | undefined {
|
|
44
|
+
const background = markdown_section.section_lines(body, BACKGROUND_HEADING).join('\n')
|
|
45
|
+
const line = markdown_section
|
|
46
|
+
.unfenced_lines(background)
|
|
47
|
+
.map((text) => text.trim())
|
|
48
|
+
.find((text) => text.startsWith(prefix))
|
|
49
|
+
|
|
50
|
+
return line?.slice(prefix.length).trim()
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function declared_value(body: string): string | undefined {
|
|
54
|
+
return background_value(body, PREFIX)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Whether the body writes a declaration line — a malformed one is `problems`' refusal — or says why it
|
|
58
|
+
// has none; an empty reason says nothing.
|
|
59
|
+
function is_stated(body: string): boolean {
|
|
60
|
+
if (declared_value(body) !== undefined) return true
|
|
61
|
+
|
|
62
|
+
return (background_value(body, ABSENT_PREFIX) ?? '').length > 0
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function parsed(value: string): MeasureDeclaration | undefined {
|
|
66
|
+
const read = declaration_schema.safeParse(VALUE_PATTERN.exec(value)?.groups)
|
|
67
|
+
|
|
68
|
+
return read.success ? read.data : undefined
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// The declaration, or `undefined` when there is none or it does not parse — `issue:file` refuses a
|
|
72
|
+
// malformed one, and the drive hands an issue it cannot read to a lane as before.
|
|
73
|
+
function parse(body: string): MeasureDeclaration | undefined {
|
|
74
|
+
const value = declared_value(body)
|
|
75
|
+
|
|
76
|
+
return value === undefined ? undefined : parsed(value)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function problems(body: string): ReadonlyArray<string> {
|
|
80
|
+
const value = declared_value(body)
|
|
81
|
+
|
|
82
|
+
return value === undefined || parsed(value) !== undefined ? [] : [MALFORMED]
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function value_of(output: string): number | undefined {
|
|
86
|
+
const last = output
|
|
87
|
+
.split('\n')
|
|
88
|
+
.map((line) => line.trim())
|
|
89
|
+
.findLast((line) => line.length > 0)
|
|
90
|
+
|
|
91
|
+
return last !== undefined && NUMBER_PATTERN.test(last) ? Number(last) : undefined
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function judge(declaration: MeasureDeclaration, output: string): MeasureVerdict {
|
|
95
|
+
const value = value_of(output)
|
|
96
|
+
|
|
97
|
+
if (value === undefined) return { kind: 'unreadable' }
|
|
98
|
+
|
|
99
|
+
const is_pass = COMPARE[declaration.operator](value, declaration.threshold)
|
|
100
|
+
|
|
101
|
+
return { kind: is_pass ? 'pass' : 'fail', value }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function format(declaration: MeasureDeclaration): string {
|
|
105
|
+
return `\`${declaration.command}\` ${declaration.operator} ${String(declaration.threshold)}`
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const measure_declaration = {
|
|
109
|
+
ABSENT,
|
|
110
|
+
DECLARATION,
|
|
111
|
+
EXAMPLE,
|
|
112
|
+
PREFIX,
|
|
113
|
+
format,
|
|
114
|
+
is_stated,
|
|
115
|
+
judge,
|
|
116
|
+
parse,
|
|
117
|
+
problems,
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export type { MeasureDeclaration, MeasureVerdict }
|
|
121
|
+
export { measure_declaration }
|
|
@@ -1,64 +1,33 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
|
-
import { execSync } from 'node:child_process'
|
|
3
2
|
import { fileURLToPath } from 'node:url'
|
|
4
|
-
import { gh_author_association } from '#scripts/gh/gh-author-association'
|
|
5
|
-
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
6
|
-
import { parse_json_object_or_undefined } from '#scripts/git/parse-json-array'
|
|
7
3
|
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
8
|
-
import { error_text } from '#scripts/lib/error-message'
|
|
9
4
|
import { observation_ledger_home } from '#scripts/observations/observation-ledger-home'
|
|
10
|
-
import { z } from 'zod'
|
|
11
5
|
import { baseline_measure, type Baseline } from './baseline-measure'
|
|
12
|
-
import {
|
|
6
|
+
import { trusted_measure } from './trusted-measure'
|
|
13
7
|
|
|
14
8
|
// `josh measure:rerun <N>` — read a behavior-change Issue body after merge, re-run each baseline
|
|
15
9
|
// command, and print the before/after pair. A value that did not move means
|
|
16
10
|
// the premise the rule rested on is refuted, so a line is appended to the observation ledger — reusing
|
|
17
11
|
// that append-only, same-key mechanism rather than a second one.
|
|
18
12
|
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
// commands cannot make it safe; what can is who wrote it. The input is therefore the Issue number, not
|
|
22
|
-
// a file, so the author's `author_association` arrives with the body from the same REST read, and only
|
|
23
|
-
// a body written by someone with write access to the repository is run.
|
|
13
|
+
// The baseline is shell, so only a body whose author can write to the repository is run
|
|
14
|
+
// (`trusted-measure.ts`).
|
|
24
15
|
|
|
25
16
|
const FAILURE_EXIT_CODE = 1
|
|
26
17
|
const ARGV_OFFSET = 2
|
|
27
|
-
const ISSUE_FIELDS = 'body,author_association'
|
|
28
|
-
const UNKNOWN_ASSOCIATION = 'unknown'
|
|
29
18
|
const USAGE = 'Usage: josh measure:rerun <issue-number>'
|
|
30
19
|
const NO_BASELINE = 'no `command → value` baseline found in ## ベースライン — nothing to re-run'
|
|
31
20
|
const DATE_END = 10
|
|
32
|
-
// One baseline command's budget — the same minute `josh-harness.ts` gives one command it spawns. A
|
|
33
|
-
// baseline is a count or a digest that answers in seconds, so a command still running after a minute
|
|
34
|
-
// is stuck, and without a bound it would hold the whole re-measurement open with nothing printed.
|
|
35
|
-
const MEASURE_TIMEOUT_MS = 60_000
|
|
36
|
-
const issue_schema = z.object({
|
|
37
|
-
body: z.string().nullish(),
|
|
38
|
-
author_association: z.string().nullish(),
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
type IssueFields = z.infer<typeof issue_schema>
|
|
42
|
-
type BodyRead = { kind: 'trusted'; body: string } | { kind: 'refused'; reason: string }
|
|
43
|
-
|
|
44
|
-
// The command's stdout, trimmed to one value. A failing or timed-out command yields its message so the
|
|
45
|
-
// pair still prints and the remaining baselines still run, rather than aborting the whole
|
|
46
|
-
// re-measurement.
|
|
47
|
-
function measure(command: string): string {
|
|
48
|
-
try {
|
|
49
|
-
return execSync(command, { encoding: 'utf8', timeout: MEASURE_TIMEOUT_MS }).trim()
|
|
50
|
-
} catch (error) {
|
|
51
|
-
return `(command failed: ${error_text.message_of(error)})`
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
21
|
|
|
55
22
|
interface Outcome {
|
|
56
23
|
pair: string
|
|
57
24
|
ledger_line: string | undefined
|
|
58
25
|
}
|
|
59
26
|
|
|
27
|
+
// A failing or timed-out command yields its message so the pair still prints and the remaining
|
|
28
|
+
// baselines still run, rather than aborting the whole re-measurement.
|
|
60
29
|
function rerun_one(baseline: Baseline, date: string): Outcome {
|
|
61
|
-
const after =
|
|
30
|
+
const after = trusted_measure.text_of(trusted_measure.run_command(baseline.command))
|
|
62
31
|
const is_unchanged = baseline_measure.is_no_change(baseline.value, after)
|
|
63
32
|
|
|
64
33
|
return {
|
|
@@ -82,33 +51,6 @@ function today(now: Date): string {
|
|
|
82
51
|
return now.toISOString().slice(0, DATE_END)
|
|
83
52
|
}
|
|
84
53
|
|
|
85
|
-
async function read_issue(issue_number: string): Promise<IssueFields | undefined> {
|
|
86
|
-
const json = await git_gh_issue_read.issue_view_json(issue_number, ISSUE_FIELDS)
|
|
87
|
-
|
|
88
|
-
return json === undefined ? undefined : parse_json_object_or_undefined(json, issue_schema)
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// The body, only when its author can write to the repository. A read that fails is refused as well:
|
|
92
|
-
// an unknown author is not a trusted one.
|
|
93
|
-
async function read_trusted_body(issue_number: string): Promise<BodyRead> {
|
|
94
|
-
const issue = await read_issue(issue_number)
|
|
95
|
-
|
|
96
|
-
if (issue === undefined) {
|
|
97
|
-
return { kind: 'refused', reason: `could not read issue ${session_cite.issue(issue_number)}` }
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
const association = issue.author_association ?? UNKNOWN_ASSOCIATION
|
|
101
|
-
|
|
102
|
-
if (!gh_author_association.is_trusted(association)) {
|
|
103
|
-
return {
|
|
104
|
-
kind: 'refused',
|
|
105
|
-
reason: `refusing to run the baseline of ${session_cite.issue(issue_number)}: its author is ${association}, not ${gh_author_association.TRUSTED_LIST}`,
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return { kind: 'trusted', body: issue.body ?? '' }
|
|
110
|
-
}
|
|
111
|
-
|
|
112
54
|
async function rerun(body: string, now: Date): Promise<number> {
|
|
113
55
|
const baselines = baseline_measure.parse_baselines(body)
|
|
114
56
|
|
|
@@ -136,7 +78,7 @@ async function run(issue_number: string | undefined, now: Date): Promise<number>
|
|
|
136
78
|
return FAILURE_EXIT_CODE
|
|
137
79
|
}
|
|
138
80
|
|
|
139
|
-
const read = await read_trusted_body(issue_number)
|
|
81
|
+
const read = await trusted_measure.read_trusted_body(issue_number)
|
|
140
82
|
|
|
141
83
|
if (read.kind === 'refused') {
|
|
142
84
|
console.error(read.reason)
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { plan_consumers } from '#scripts/issue/plan-consumers'
|
|
2
|
+
|
|
3
|
+
// `josh plan:consumers <identifier...>` — prints each identifier's existing references and the draft
|
|
4
|
+
// of a plan's existing-consumers section (`plan-consumers.ts`). A flag is refused rather than searched
|
|
5
|
+
// for, since an identifier never starts with `-`.
|
|
6
|
+
|
|
7
|
+
const SUCCESS_EXIT_CODE = 0
|
|
8
|
+
const FAILURE_EXIT_CODE = 1
|
|
9
|
+
const USAGE = 'Usage: josh plan:consumers <identifier...>'
|
|
10
|
+
|
|
11
|
+
function identifiers_of(argv: ReadonlyArray<string>): Array<string> | undefined {
|
|
12
|
+
const identifiers = [...new Set(argv.map((argument) => argument.trim()))]
|
|
13
|
+
|
|
14
|
+
if (identifiers.length === 0) return undefined
|
|
15
|
+
|
|
16
|
+
return identifiers.some((identifier) => identifier === '' || identifier.startsWith('-'))
|
|
17
|
+
? undefined
|
|
18
|
+
: identifiers
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
22
|
+
const identifiers = identifiers_of(argv)
|
|
23
|
+
|
|
24
|
+
if (identifiers === undefined) {
|
|
25
|
+
console.error(USAGE)
|
|
26
|
+
|
|
27
|
+
return FAILURE_EXIT_CODE
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const { text, has_failed } = await plan_consumers.report(identifiers)
|
|
31
|
+
|
|
32
|
+
console.info(text)
|
|
33
|
+
|
|
34
|
+
return has_failed ? FAILURE_EXIT_CODE : SUCCESS_EXIT_CODE
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const plan_consumers_cli = { USAGE, run }
|
|
38
|
+
|
|
39
|
+
export { plan_consumers_cli }
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { plan_consumers_cli } from './plan-consumers-cli'
|
|
4
|
+
|
|
5
|
+
// The `josh plan:consumers` entry, kept apart from `plan-consumers-cli.ts` so a bundle carrying that
|
|
6
|
+
// module never fires this guard (joshuafolkken/kit#4186).
|
|
7
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
8
|
+
const ARGV_OFFSET = 2
|
|
9
|
+
|
|
10
|
+
process.exitCode = await plan_consumers_cli.run(process.argv.slice(ARGV_OFFSET))
|
|
11
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { markdown_section } from '#scripts/issue/markdown-section'
|
|
2
|
+
|
|
3
|
+
// A plan's existing-consumers section (`HEADING`) — the existing code, prompts and documents that
|
|
4
|
+
// read or write each state, command, label, file or process the plan adds or changes, and what this
|
|
5
|
+
// issue does with each. A concept added without it shipped while its readers still assumed the old
|
|
6
|
+
// world (joshuafolkken/kit#4270, #4265 after `lane:pause`), so `issue:plan` refuses a plan that omits
|
|
7
|
+
// it.
|
|
8
|
+
//
|
|
9
|
+
// **"None" is an answer only with its reason** (`NONE_WITH_REASON`), since a bare "none" cannot be
|
|
10
|
+
// told from a section filled in to get past the check.
|
|
11
|
+
|
|
12
|
+
const HEADING = '### 影響を受ける既存の利用者'
|
|
13
|
+
const ANY_HEADING = /^#{1,6}\s/u
|
|
14
|
+
const LIST_MARKER = /^(?:[-*+]|\d+\.)\s+/u
|
|
15
|
+
const NONE_WORD = 'なし'
|
|
16
|
+
const NONE_WITH_REASON = /^なし\s*[((]\s*\S.*[))]$/u
|
|
17
|
+
const MISSING = `The plan has no \`${HEADING}\` section: list, for each state, command, label, file or process it adds or changes, the existing places that read or write it and what this issue does with each (\`pnpm josh plan:consumers <identifier...>\` drafts it), or write \`なし(<reason>)\`.`
|
|
18
|
+
const EMPTY = `The plan's \`${HEADING}\` section is empty: list the existing consumers, or write \`なし(<reason>)\`.`
|
|
19
|
+
const BARE_NONE = `The plan's \`${HEADING}\` section says \`なし\` without a reason: write \`なし(<reason>)\`.`
|
|
20
|
+
|
|
21
|
+
// The section runs to the next heading of any level, since the plan's own sections are `###`. Fenced
|
|
22
|
+
// lines are blanked first, so a `# comment` in a code block neither ends the section nor is an entry.
|
|
23
|
+
function section_entries(plan: string): ReadonlyArray<string> | undefined {
|
|
24
|
+
if (!markdown_section.has_line(plan, HEADING)) return undefined
|
|
25
|
+
const raw = markdown_section.section_lines(plan, HEADING).join('\n')
|
|
26
|
+
const lines = markdown_section.fence_free_lines(raw)
|
|
27
|
+
const end = lines.findIndex((line) => ANY_HEADING.test(line.trim()))
|
|
28
|
+
const body = end === -1 ? lines : lines.slice(0, end)
|
|
29
|
+
|
|
30
|
+
return body.map((line) => line.trim().replace(LIST_MARKER, '')).filter((line) => line !== '')
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// "None" answers for the whole section, so only a section that opens with it is read as one — a "none"
|
|
34
|
+
// nested under a consumer entry is that entry's note. A reason wrapped onto later lines is joined back.
|
|
35
|
+
function is_bare_none(entries: ReadonlyArray<string>): boolean {
|
|
36
|
+
const [first = ''] = entries
|
|
37
|
+
|
|
38
|
+
if (!first.startsWith(NONE_WORD) || NONE_WITH_REASON.test(first)) return false
|
|
39
|
+
|
|
40
|
+
return !NONE_WITH_REASON.test(entries.join(' '))
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// The refusal for a plan whose section is missing, empty or a reasonless "none"; `undefined` passes.
|
|
44
|
+
function refusal_of(plan: string): string | undefined {
|
|
45
|
+
const entries = section_entries(plan)
|
|
46
|
+
|
|
47
|
+
if (entries === undefined) return MISSING
|
|
48
|
+
if (entries.length === 0) return EMPTY
|
|
49
|
+
|
|
50
|
+
return is_bare_none(entries) ? BARE_NONE : undefined
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// The lines `[start, end)` the section spans in `visible`, or `undefined` when the plan has none.
|
|
54
|
+
function section_range(visible: ReadonlyArray<string>): [number, number] | undefined {
|
|
55
|
+
const start = visible.findIndex((line) => line.trim() === HEADING)
|
|
56
|
+
|
|
57
|
+
if (start === -1) return undefined
|
|
58
|
+
const end = visible.slice(start + 1).findIndex((line) => ANY_HEADING.test(line.trim()))
|
|
59
|
+
|
|
60
|
+
return [start, end === -1 ? visible.length : start + 1 + end]
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// `plan` with the section, heading included, removed — its entries name the files that read what the
|
|
64
|
+
// plan changes, not the files it edits (joshuafolkken/kit#4923).
|
|
65
|
+
function without(plan: string): string {
|
|
66
|
+
const range = section_range(markdown_section.unfenced_lines(plan))
|
|
67
|
+
|
|
68
|
+
if (range === undefined) return plan
|
|
69
|
+
const lines = markdown_section.lines_of(plan)
|
|
70
|
+
|
|
71
|
+
return [...lines.slice(0, range[0]), ...lines.slice(range[1])].join('\n')
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const plan_consumers_section = { HEADING, refusal_of, without }
|
|
75
|
+
|
|
76
|
+
export { plan_consumers_section }
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { git_grep_hits, type Hit } from '#scripts/git/git-grep-hits'
|
|
2
|
+
import { plan_consumers_section } from '#scripts/issue/plan-consumers-section'
|
|
3
|
+
|
|
4
|
+
// `josh plan:consumers <identifier...>` — where each identifier a plan adds or changes is already
|
|
5
|
+
// read or written, so its existing-consumers section names them rather than leaving them for the
|
|
6
|
+
// next incident to find. Every reference in the tracked tree — a CI workflow or a settings file reads
|
|
7
|
+
// a name as surely as code does — grouped by kind, then a draft of the section for the plan to finish.
|
|
8
|
+
// `.josh/` is left out: its observations and metrics record past runs rather than read the name.
|
|
9
|
+
//
|
|
10
|
+
// **Unlike `run:prep`'s code locations it keeps every line and every kind** — a prompt that tells a
|
|
11
|
+
// run to count a label is as much a consumer of it as the code that does — but caps each kind, so one
|
|
12
|
+
// common name cannot bury the rest.
|
|
13
|
+
|
|
14
|
+
type Kind = 'code' | 'config' | 'doc' | 'prompt' | 'test'
|
|
15
|
+
|
|
16
|
+
interface Consumers {
|
|
17
|
+
identifier: string
|
|
18
|
+
hits: ReadonlyArray<Hit>
|
|
19
|
+
has_failed: boolean
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const PATHSPECS = [':(exclude).josh']
|
|
23
|
+
const KINDS: ReadonlyArray<readonly [Kind, string]> = [
|
|
24
|
+
['code', 'code'],
|
|
25
|
+
['config', 'config and workflows'],
|
|
26
|
+
['prompt', 'prompts and skills'],
|
|
27
|
+
['doc', 'docs'],
|
|
28
|
+
['test', 'tests'],
|
|
29
|
+
]
|
|
30
|
+
const TEST_PATH = /(?:\.test\.ts|\.e2e\.ts|\.snap)$/u
|
|
31
|
+
const CODE_PATH = /\.(?:ts|js|mjs|cjs|svelte|sh)$/u
|
|
32
|
+
const PROMPT_ROOTS = ['prompts/', '.claude/']
|
|
33
|
+
const MAX_HITS_PER_KIND = 20
|
|
34
|
+
const MAX_DRAFT_FILES = 8
|
|
35
|
+
const INDENT = ' '
|
|
36
|
+
const HIT_INDENT = `${INDENT}${INDENT}`
|
|
37
|
+
const HIT_SEPARATOR = ' '
|
|
38
|
+
const NO_REFERENCE = ' — no reference in the tracked tree'
|
|
39
|
+
const SEARCH_FAILED = ' — git grep failed; not searched'
|
|
40
|
+
const DRAFT_ACTION = '<直す | 影響なし | 別 Issue>'
|
|
41
|
+
const DRAFT_NO_REFERENCE = 'no existing reference'
|
|
42
|
+
|
|
43
|
+
// Markdown under `prompts/` or `.claude/` instructs a run and other Markdown is read by people; the
|
|
44
|
+
// rest that is neither code nor a test — workflows, settings, JSON and YAML data — is configuration.
|
|
45
|
+
function markdown_kind(path: string): Kind {
|
|
46
|
+
return PROMPT_ROOTS.some((root) => path.startsWith(root)) ? 'prompt' : 'doc'
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function kind_of(path: string): Kind {
|
|
50
|
+
if (TEST_PATH.test(path)) return 'test'
|
|
51
|
+
if (CODE_PATH.test(path)) return 'code'
|
|
52
|
+
|
|
53
|
+
return path.endsWith('.md') ? markdown_kind(path) : 'config'
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function more_line(count: number): Array<string> {
|
|
57
|
+
return count > MAX_HITS_PER_KIND
|
|
58
|
+
? [`${HIT_INDENT}… +${String(count - MAX_HITS_PER_KIND)} more`]
|
|
59
|
+
: []
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function format_kind(hits: ReadonlyArray<Hit>, kind: Kind, label: string): Array<string> {
|
|
63
|
+
const of_kind = hits.filter((hit) => kind_of(hit.path) === kind)
|
|
64
|
+
|
|
65
|
+
if (of_kind.length === 0) return []
|
|
66
|
+
const lines = of_kind
|
|
67
|
+
.slice(0, MAX_HITS_PER_KIND)
|
|
68
|
+
.map((hit) => `${HIT_INDENT}${hit.path}:${hit.line}${HIT_SEPARATOR}${hit.excerpt}`)
|
|
69
|
+
|
|
70
|
+
return [`${INDENT}${label}`, ...lines, ...more_line(of_kind.length)]
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function format_consumers(consumers: Consumers): string {
|
|
74
|
+
if (consumers.has_failed) return `${consumers.identifier}${SEARCH_FAILED}`
|
|
75
|
+
if (consumers.hits.length === 0) return `${consumers.identifier}${NO_REFERENCE}`
|
|
76
|
+
const kinds = KINDS.flatMap(([kind, label]) => format_kind(consumers.hits, kind, label))
|
|
77
|
+
|
|
78
|
+
return [consumers.identifier, ...kinds].join('\n')
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Tests are left out of the draft: a test follows the code it covers, so it is never the consumer a
|
|
82
|
+
// plan has to decide about.
|
|
83
|
+
function kind_rank(path: string): number {
|
|
84
|
+
return KINDS.findIndex(([kind]) => kind === kind_of(path))
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Code first, in `KINDS` order, so the cap drops docs before the code a plan most has to decide on.
|
|
88
|
+
function draft_files(hits: ReadonlyArray<Hit>): Array<string> {
|
|
89
|
+
const paths = [...new Set(hits.map((hit) => hit.path))]
|
|
90
|
+
.filter((path) => kind_of(path) !== 'test')
|
|
91
|
+
.toSorted((left, right) => kind_rank(left) - kind_rank(right))
|
|
92
|
+
const shown = paths.slice(0, MAX_DRAFT_FILES).map((path) => `\`${path}\``)
|
|
93
|
+
const rest = paths.length - shown.length
|
|
94
|
+
|
|
95
|
+
return rest > 0 ? [...shown, `+${String(rest)} more`] : shown
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function draft_entry(consumers: Consumers): string {
|
|
99
|
+
const files = draft_files(consumers.hits)
|
|
100
|
+
|
|
101
|
+
if (files.length === 0) return `- \`${consumers.identifier}\`: ${DRAFT_NO_REFERENCE}`
|
|
102
|
+
|
|
103
|
+
return `- \`${consumers.identifier}\`: ${files.join(', ')} — ${DRAFT_ACTION}`
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function format_draft(all: ReadonlyArray<Consumers>): string {
|
|
107
|
+
const entries = all.map((consumers) => draft_entry(consumers))
|
|
108
|
+
|
|
109
|
+
return ['draft:', plan_consumers_section.HEADING, '', ...entries].join('\n')
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function find(identifier: string): Promise<Consumers> {
|
|
113
|
+
return { identifier, ...(await git_grep_hits.search(identifier, [], PATHSPECS)) }
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async function report(
|
|
117
|
+
identifiers: ReadonlyArray<string>,
|
|
118
|
+
): Promise<{ text: string; has_failed: boolean }> {
|
|
119
|
+
const all = await Promise.all(identifiers.map(async (identifier) => await find(identifier)))
|
|
120
|
+
const sections = [...all.map((consumers) => format_consumers(consumers)), format_draft(all)]
|
|
121
|
+
|
|
122
|
+
return { text: sections.join('\n\n'), has_failed: all.some((consumers) => consumers.has_failed) }
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const plan_consumers = { kind_of, report }
|
|
126
|
+
|
|
127
|
+
export { plan_consumers }
|
|
@@ -10,6 +10,8 @@ const REPRODUCTION_HEADING = '## 再現'
|
|
|
10
10
|
// A backticked command span on a line that is not inside a fenced block. `- `grep …`` and a bare
|
|
11
11
|
// `` `grep …` `` both match; prose with no backticked command does not.
|
|
12
12
|
const COMMAND_SPAN = /`[^`]+`/u
|
|
13
|
+
// A template placeholder span (a backticked `<...>`) the filer never replaced — not a command.
|
|
14
|
+
const PLACEHOLDER_SPAN = /`<[^`]*>`/gu
|
|
13
15
|
// A fenced code block boundary — a backtick or tilde fence. The actual output goes between an opening
|
|
14
16
|
// and a closing fence, so a valid reproduction carries at least two of these lines. Tilde is accepted
|
|
15
17
|
// so the template can show the block without nesting a backtick fence inside its own ```md example.
|
|
@@ -28,7 +30,7 @@ function has_command_line(lines: ReadonlyArray<string>): boolean {
|
|
|
28
30
|
const first_fence = lines.findIndex((line) => FENCE_LINE.test(line))
|
|
29
31
|
const open_lines = first_fence === -1 ? lines : lines.slice(0, first_fence)
|
|
30
32
|
|
|
31
|
-
return open_lines.some((line) => COMMAND_SPAN.test(line))
|
|
33
|
+
return open_lines.some((line) => COMMAND_SPAN.test(line.replaceAll(PLACEHOLDER_SPAN, '')))
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
// An opened-and-closed output block is two fence lines, so counting them is enough — a section with a
|