@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
|
@@ -7,7 +7,11 @@ import { execaSync } from 'execa'
|
|
|
7
7
|
|
|
8
8
|
const SECRETLINT_BIN = 'secretlint'
|
|
9
9
|
const NO_GLOB_FLAG = '--no-glob'
|
|
10
|
+
const END_OF_OPTIONS = '--'
|
|
10
11
|
const ARGV_OFFSET = 2
|
|
12
|
+
// Set by the CI `Secret Scan` job, where nothing provisions the binary later: there a missing
|
|
13
|
+
// secretlint would turn the scan into a silent pass, so it fails instead (kit#4657).
|
|
14
|
+
const REQUIRE_ENV = 'JOSH_SECRETLINT_REQUIRE'
|
|
11
15
|
|
|
12
16
|
// The scan is defense in depth ahead of GitHub push protection, not the only gate, so a
|
|
13
17
|
// missing binary must not block the commit. kit ships the pre-commit rule inside
|
|
@@ -21,7 +25,14 @@ const MISSING_NOTICE =
|
|
|
21
25
|
` The kit pre-commit hook ships ahead of the dependency it needs.\n` +
|
|
22
26
|
` Run \`pnpm josh sync && pnpm install\` to provision it.`
|
|
23
27
|
|
|
24
|
-
|
|
28
|
+
const REQUIRED_MISSING_ERROR =
|
|
29
|
+
`❌ secretlint is not installed, and ${REQUIRE_ENV} requires the scan.\n` +
|
|
30
|
+
` Add it to the devDependencies with \`pnpm josh sync && pnpm install\`.`
|
|
31
|
+
|
|
32
|
+
type ScanDecision =
|
|
33
|
+
| { kind: 'skip'; notice?: string }
|
|
34
|
+
| { kind: 'fail'; error: string }
|
|
35
|
+
| { kind: 'scan'; binary: string }
|
|
25
36
|
|
|
26
37
|
function resolve_secretlint_binary(project_root: string): string | undefined {
|
|
27
38
|
const candidate = resolve_local_bin(project_root, SECRETLINT_BIN)
|
|
@@ -31,17 +42,28 @@ function resolve_secretlint_binary(project_root: string): string | undefined {
|
|
|
31
42
|
|
|
32
43
|
// lefthook substitutes literal paths, so `--no-glob` is mandatory: a SvelteKit route directory
|
|
33
44
|
// such as `(app)` or `[id]` would otherwise reach secretlint's glob engine as a pattern.
|
|
34
|
-
// Masking and the .gitignore cascade are both on by default in v13 — no flag adds them.
|
|
45
|
+
// Masking and the .gitignore cascade are both on by default in v13 — no flag adds them. `--` ends
|
|
46
|
+
// the options, so a staged file named like `--secretlintrc=evil.json` stays a path, not a flag.
|
|
35
47
|
function build_scan_arguments(staged_files: ReadonlyArray<string>): Array<string> {
|
|
36
|
-
return [NO_GLOB_FLAG, ...staged_files]
|
|
48
|
+
return [NO_GLOB_FLAG, END_OF_OPTIONS, ...staged_files]
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function plan_missing(is_required: boolean): ScanDecision {
|
|
52
|
+
return is_required
|
|
53
|
+
? { kind: 'fail', error: REQUIRED_MISSING_ERROR }
|
|
54
|
+
: { kind: 'skip', notice: MISSING_NOTICE }
|
|
37
55
|
}
|
|
38
56
|
|
|
39
|
-
function plan_scan(
|
|
57
|
+
function plan_scan(
|
|
58
|
+
staged_files: ReadonlyArray<string>,
|
|
59
|
+
project_root: string,
|
|
60
|
+
is_required = false,
|
|
61
|
+
): ScanDecision {
|
|
40
62
|
if (staged_files.length === 0) return { kind: 'skip' }
|
|
41
63
|
|
|
42
64
|
const binary = resolve_secretlint_binary(project_root)
|
|
43
65
|
|
|
44
|
-
if (binary === undefined) return
|
|
66
|
+
if (binary === undefined) return plan_missing(is_required)
|
|
45
67
|
|
|
46
68
|
return { kind: 'scan', binary }
|
|
47
69
|
}
|
|
@@ -59,18 +81,29 @@ function run_scan(binary: string, staged_files: ReadonlyArray<string>): number {
|
|
|
59
81
|
return resolve_spawn_exit(binary, result)
|
|
60
82
|
}
|
|
61
83
|
|
|
62
|
-
function main(
|
|
63
|
-
|
|
84
|
+
function main(
|
|
85
|
+
staged_files: ReadonlyArray<string>,
|
|
86
|
+
project_root: string,
|
|
87
|
+
is_required = false,
|
|
88
|
+
): number {
|
|
89
|
+
const decision = plan_scan(staged_files, project_root, is_required)
|
|
64
90
|
|
|
65
91
|
if (decision.kind === 'scan') return run_scan(decision.binary, staged_files)
|
|
66
92
|
|
|
93
|
+
if (decision.kind === 'fail') {
|
|
94
|
+
console.error(decision.error)
|
|
95
|
+
|
|
96
|
+
return 1
|
|
97
|
+
}
|
|
98
|
+
|
|
67
99
|
if (decision.notice !== undefined) console.warn(decision.notice)
|
|
68
100
|
|
|
69
101
|
return 0
|
|
70
102
|
}
|
|
71
103
|
|
|
72
104
|
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
73
|
-
const
|
|
105
|
+
const is_required = process.env[REQUIRE_ENV] === '1'
|
|
106
|
+
const exit_code = main(process.argv.slice(ARGV_OFFSET), process.cwd(), is_required)
|
|
74
107
|
|
|
75
108
|
if (exit_code !== 0) process.exit(exit_code)
|
|
76
109
|
}
|
|
@@ -83,4 +116,4 @@ const secretlint_scan = {
|
|
|
83
116
|
run_scan,
|
|
84
117
|
}
|
|
85
118
|
|
|
86
|
-
export { MISSING_NOTICE, secretlint_scan }
|
|
119
|
+
export { MISSING_NOTICE, REQUIRE_ENV, REQUIRED_MISSING_ERROR, secretlint_scan }
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { security_audit } from './security-audit'
|
|
4
|
+
|
|
5
|
+
// The `josh audit` entry, kept apart from `security-audit.ts` because `start-steps.ts` imports that
|
|
6
|
+
// one: a bundle is one file, so a main guard there would fire for every command that carries it
|
|
7
|
+
// (joshuafolkken/kit#4186). The audit takes no arguments.
|
|
8
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) process.exitCode = security_audit.run()
|
|
@@ -14,7 +14,6 @@ const RELEASE_BASE_URL = 'https://github.com/google/osv-scanner/releases/downloa
|
|
|
14
14
|
|
|
15
15
|
const WINDOWS_PLATFORM = 'win32'
|
|
16
16
|
const WINDOWS_ASSET_SUFFIX = '.exe'
|
|
17
|
-
const STAGING_SUFFIX = '.download'
|
|
18
17
|
|
|
19
18
|
// The asset is ~55 MB, and a link delivering it at 300 KB/s — measured, not hypothetical — takes
|
|
20
19
|
// over three minutes. A `SessionStart` hook is waited on, so a single bound generous enough to
|
|
@@ -91,15 +90,6 @@ function build_download_url(asset_name: string): string {
|
|
|
91
90
|
return `${RELEASE_BASE_URL}/v${SCANNER_VERSION}/${asset_name}`
|
|
92
91
|
}
|
|
93
92
|
|
|
94
|
-
// The staging file the download is written to before it is renamed onto the target. The process id
|
|
95
|
-
// is what keeps two sessions of one project apart — the `SessionStart` matcher is empty, so a
|
|
96
|
-
// `clear` during a startup's download is exactly that — and without it their writes interleave into
|
|
97
|
-
// one file that both then rename into place, which the checksum cannot catch because each verified
|
|
98
|
-
// its own buffer.
|
|
99
|
-
function build_staging_path(target_path: string, process_id: number): string {
|
|
100
|
-
return `${target_path}.${String(process_id)}${STAGING_SUFFIX}`
|
|
101
|
-
}
|
|
102
|
-
|
|
103
93
|
// The whole "where do we fetch from" decision in one pure call, so the table above is testable
|
|
104
94
|
// without a network round trip — which the unit suite forbids anyway (`test-network-guard.ts`).
|
|
105
95
|
function resolve_asset(platform: string, architecture: string): ScannerAsset | undefined {
|
|
@@ -198,7 +188,6 @@ const security_audit_provision_logic = {
|
|
|
198
188
|
build_asset_name,
|
|
199
189
|
build_download_timeout,
|
|
200
190
|
build_download_url,
|
|
201
|
-
build_staging_path,
|
|
202
191
|
format_already_present,
|
|
203
192
|
format_below_floor,
|
|
204
193
|
format_checksum_mismatch,
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { session_owner_pin } from '#scripts/discovery/session-owner-pin'
|
|
4
|
+
import { security_audit_provision } from './security-audit-provision'
|
|
5
|
+
|
|
6
|
+
// The `josh audit:provision` entry and the session-start hook's bundle, kept apart from
|
|
7
|
+
// `security-audit-provision.ts` because `start-steps.ts` imports that one: a bundle is one file, so a
|
|
8
|
+
// main guard there would fire for every command that carries it (joshuafolkken/kit#4186).
|
|
9
|
+
//
|
|
10
|
+
// Run by the session-start hook (`--session-start`), it also pins the session's owner
|
|
11
|
+
// (`session-owner-pin.ts`) at no spawn of its own. A manual `josh audit:provision` pins only when
|
|
12
|
+
// passed `--session-start`, which re-pins to whatever owner `origin` names at that moment.
|
|
13
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
14
|
+
const ARGV_OFFSET = 2
|
|
15
|
+
const SESSION_START_FLAG = '--session-start'
|
|
16
|
+
const argv = process.argv.slice(ARGV_OFFSET)
|
|
17
|
+
|
|
18
|
+
if (argv.includes(SESSION_START_FLAG)) session_owner_pin.pin()
|
|
19
|
+
await security_audit_provision.run(argv)
|
|
20
|
+
}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
import { chmodSync, mkdirSync, renameSync, rmSync, writeFileSync } from 'node:fs'
|
|
3
|
-
import path from 'node:path'
|
|
4
|
-
import { fileURLToPath } from 'node:url'
|
|
5
1
|
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
6
2
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
3
|
+
import { atomic_write } from '#scripts/lib/atomic-write'
|
|
7
4
|
import { error_text } from '#scripts/lib/error-message'
|
|
8
5
|
import { timed_fetch } from '#scripts/lib/timed-fetch'
|
|
9
6
|
import { security_audit } from './security-audit'
|
|
@@ -43,24 +40,14 @@ async function download(url: string, timeout_ms: number): Promise<DownloadOutcom
|
|
|
43
40
|
}
|
|
44
41
|
}
|
|
45
42
|
|
|
46
|
-
// Staged beside the target and renamed onto it
|
|
47
|
-
//
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
-
//
|
|
51
|
-
//
|
|
43
|
+
// Staged beside the target and renamed onto it (`atomic-write.ts`). A download interrupted halfway
|
|
44
|
+
// would otherwise leave a truncated file at the path `josh audit` spawns; and a shared staging name
|
|
45
|
+
// would let two sessions of the same project — the `SessionStart` matcher is empty, so a `clear`
|
|
46
|
+
// during a startup's download is exactly that — interleave their writes into one file that both then
|
|
47
|
+
// rename into place, which the checksum cannot catch because it was verified against each process's
|
|
48
|
+
// own buffer.
|
|
52
49
|
function install(target_path: string, content: Buffer): void {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
mkdirSync(path.dirname(target_path), { recursive: true })
|
|
56
|
-
|
|
57
|
-
try {
|
|
58
|
-
writeFileSync(staging_path, content)
|
|
59
|
-
chmodSync(staging_path, EXECUTABLE_MODE)
|
|
60
|
-
renameSync(staging_path, target_path)
|
|
61
|
-
} finally {
|
|
62
|
-
rmSync(staging_path, { force: true })
|
|
63
|
-
}
|
|
50
|
+
atomic_write.replace_file(target_path, content, { mode: EXECUTABLE_MODE })
|
|
64
51
|
}
|
|
65
52
|
|
|
66
53
|
function failure_stamp_path(target_path: string): string {
|
|
@@ -153,7 +140,7 @@ async function report(
|
|
|
153
140
|
is_forced: boolean,
|
|
154
141
|
): Promise<string> {
|
|
155
142
|
const logic = security_audit_provision_logic
|
|
156
|
-
const target_path =
|
|
143
|
+
const target_path = security_audit.managed_binary_path(project_root, platform)
|
|
157
144
|
const existing = existing_scanner(target_path)
|
|
158
145
|
if (existing !== undefined) return logic.format_already_present(existing)
|
|
159
146
|
|
|
@@ -167,8 +154,8 @@ async function report(
|
|
|
167
154
|
// Every failure is a printed line and a zero exit, deliberately: this runs at session start, and a
|
|
168
155
|
// non-zero exit there would take an agent's whole session away over a tool it does not need yet.
|
|
169
156
|
// The audit's own gate is unchanged — a scanner that never arrived still fails the pre-push run.
|
|
170
|
-
async function
|
|
171
|
-
const is_forced =
|
|
157
|
+
async function run(argv: ReadonlyArray<string>): Promise<void> {
|
|
158
|
+
const is_forced = argv.includes(FORCE_FLAG)
|
|
172
159
|
|
|
173
160
|
try {
|
|
174
161
|
console.info(await report(PROJECT_ROOT, process.platform, process.arch, is_forced))
|
|
@@ -179,8 +166,6 @@ async function main(): Promise<void> {
|
|
|
179
166
|
}
|
|
180
167
|
}
|
|
181
168
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
const security_audit_provision = { attempt, provision, report }
|
|
169
|
+
const security_audit_provision = { attempt, provision, report, run }
|
|
185
170
|
|
|
186
171
|
export { security_audit_provision }
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
1
|
import { accessSync, constants, statSync } from 'node:fs'
|
|
3
|
-
import
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
4
4
|
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
5
5
|
import { execaSync } from 'execa'
|
|
6
6
|
import { security_audit_logic } from './security-audit-logic'
|
|
7
7
|
import { security_audit_provision_logic } from './security-audit-provision-logic'
|
|
8
8
|
|
|
9
9
|
const FAILURE_EXIT_CODE = 1
|
|
10
|
+
const GIT_DIRECTORY_NAME = '.git'
|
|
10
11
|
const UNKNOWN_VERSION = 'unknown'
|
|
11
12
|
|
|
12
13
|
// execa reports `exitCode: undefined` only when the binary could not be spawned
|
|
@@ -58,11 +59,27 @@ interface ScannerChoice {
|
|
|
58
59
|
is_below_floor: boolean
|
|
59
60
|
}
|
|
60
61
|
|
|
62
|
+
// A linked work tree shares the primary checkout's managed scanner, so a lane neither downloads its
|
|
63
|
+
// own copy at every session start nor keeps its own no-retry record (joshuafolkken/kit#4942). Where
|
|
64
|
+
// the primary checkout cannot be named — a bare repository, a submodule, or no repository — the root
|
|
65
|
+
// is the project's own. The primary checkout reads git's answer too, so it keys the no-retry record
|
|
66
|
+
// on the same real path its lanes do even when it was entered through a symlink.
|
|
67
|
+
function managed_root(project_root: string): string {
|
|
68
|
+
const common = git_common_directory.repository(project_root)
|
|
69
|
+
if (common === undefined || path.basename(common) !== GIT_DIRECTORY_NAME) return project_root
|
|
70
|
+
|
|
71
|
+
return path.dirname(common)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function managed_binary_path(project_root: string, platform: string): string {
|
|
75
|
+
return security_audit_logic.build_managed_binary_path(managed_root(project_root), platform)
|
|
76
|
+
}
|
|
77
|
+
|
|
61
78
|
// A provisioned copy counts only when it is both a real executable and at or above the floor: a
|
|
62
79
|
// leftover from an earlier pinned version would otherwise be preferred over the PATH binary while
|
|
63
80
|
// reading less of the lockfile than it should.
|
|
64
81
|
function managed_scanner(project_root: string, platform: string): string | undefined {
|
|
65
|
-
const managed_path =
|
|
82
|
+
const managed_path = managed_binary_path(project_root, platform)
|
|
66
83
|
|
|
67
84
|
return is_executable_file(managed_path) && meets_floor(managed_path) ? managed_path : undefined
|
|
68
85
|
}
|
|
@@ -115,27 +132,29 @@ function warn_below_floor(scanner_path: string): void {
|
|
|
115
132
|
console.warn(security_audit_provision_logic.format_below_floor(version))
|
|
116
133
|
}
|
|
117
134
|
|
|
118
|
-
|
|
135
|
+
// The `josh audit` run: the scanner's exit code, or a failure when there is no scanner at all.
|
|
136
|
+
function run(): number {
|
|
119
137
|
const { BINARY_NAME, format_missing_binary_error } = security_audit_logic
|
|
120
138
|
const choice = resolve_scanner(PROJECT_ROOT, process.platform)
|
|
121
139
|
|
|
122
140
|
if (choice === undefined) {
|
|
123
141
|
console.error(format_missing_binary_error(BINARY_NAME))
|
|
124
|
-
|
|
142
|
+
|
|
143
|
+
return FAILURE_EXIT_CODE
|
|
125
144
|
}
|
|
126
145
|
|
|
127
146
|
if (choice.is_below_floor) warn_below_floor(choice.path)
|
|
128
147
|
|
|
129
|
-
|
|
148
|
+
return run_scanner(choice.path)
|
|
130
149
|
}
|
|
131
150
|
|
|
132
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) main()
|
|
133
|
-
|
|
134
151
|
const security_audit = {
|
|
135
152
|
is_binary_available,
|
|
136
153
|
is_executable_file,
|
|
154
|
+
managed_binary_path,
|
|
137
155
|
meets_floor,
|
|
138
156
|
resolve_scanner,
|
|
157
|
+
run,
|
|
139
158
|
run_scanner,
|
|
140
159
|
}
|
|
141
160
|
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import { existsSync,
|
|
2
|
-
import path from 'node:path'
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
3
2
|
import { init_logic } from '#scripts/init/init-logic'
|
|
4
3
|
import type { SonarIdentifiers } from '#scripts/init/init-logic-sonar'
|
|
4
|
+
import { file_content } from '#scripts/sync/file-content'
|
|
5
|
+
|
|
6
|
+
// Written through `write_contained` like every other sync write, so a `sonar-project.properties`
|
|
7
|
+
// linked outside the project is refused rather than written through (joshuafolkken/kit#4634).
|
|
5
8
|
|
|
6
9
|
function write_sonar_file(
|
|
7
10
|
template_source: string,
|
|
@@ -14,8 +17,7 @@ function write_sonar_file(
|
|
|
14
17
|
identifiers.organization,
|
|
15
18
|
)
|
|
16
19
|
|
|
17
|
-
|
|
18
|
-
writeFileSync(destination_path, content)
|
|
20
|
+
file_content.write_contained(destination_path, content)
|
|
19
21
|
}
|
|
20
22
|
|
|
21
23
|
function merge_sonar_file(
|
|
@@ -36,7 +38,10 @@ function merge_sonar_file(
|
|
|
36
38
|
)
|
|
37
39
|
const existing = readFileSync(destination_path, 'utf8')
|
|
38
40
|
|
|
39
|
-
|
|
41
|
+
file_content.write_contained(
|
|
42
|
+
destination_path,
|
|
43
|
+
init_logic.merge_sonar_properties(existing, template_content),
|
|
44
|
+
)
|
|
40
45
|
}
|
|
41
46
|
|
|
42
47
|
const sonar_file = { write_sonar_file, merge_sonar_file }
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs'
|
|
2
1
|
import path from 'node:path'
|
|
2
|
+
import { package_manifest } from '#scripts/lib/package-manifest'
|
|
3
|
+
import { z } from 'zod'
|
|
3
4
|
|
|
4
5
|
// `josh sync` / `josh-app sync` / `josh-game sync` all copy a distribution package's files into a
|
|
5
6
|
// consumer project. Run inside the package's OWN repository the direction reverses: the source of
|
|
@@ -12,20 +13,12 @@ import path from 'node:path'
|
|
|
12
13
|
// The check lives here rather than in each package's sync so the three distributors share one
|
|
13
14
|
// implementation: a second copy would drift, and a distributor that spelled the signal differently
|
|
14
15
|
// would keep exactly the hole this closes.
|
|
15
|
-
const
|
|
16
|
+
const named_manifest_schema = z.object({ name: z.string() })
|
|
16
17
|
|
|
18
|
+
// A missing, unreadable or malformed manifest says nothing about self-sync, and refusing to sync on
|
|
19
|
+
// it would break consumers whose manifest this package is about to create.
|
|
17
20
|
function read_package_name(directory: string): string | undefined {
|
|
18
|
-
|
|
19
|
-
const manifest: unknown = JSON.parse(readFileSync(path.join(directory, MANIFEST_NAME), 'utf8'))
|
|
20
|
-
if (typeof manifest !== 'object' || manifest === null) return undefined
|
|
21
|
-
const { name } = manifest as { name?: unknown }
|
|
22
|
-
|
|
23
|
-
return typeof name === 'string' ? name : undefined
|
|
24
|
-
} catch {
|
|
25
|
-
// A missing, unreadable or malformed manifest says nothing about self-sync, and refusing to
|
|
26
|
-
// sync on it would break consumers whose manifest this package is about to create.
|
|
27
|
-
return undefined
|
|
28
|
-
}
|
|
21
|
+
return package_manifest.read_manifest_if_valid(directory, named_manifest_schema)?.name
|
|
29
22
|
}
|
|
30
23
|
|
|
31
24
|
function is_same_directory(first: string, second: string): boolean {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
-
import { git_command } from '#scripts/git/git-command'
|
|
4
3
|
import { path_decision } from '#scripts/josh/path-decision'
|
|
5
4
|
import { split_assess } from './split-assess'
|
|
5
|
+
import { split_measure } from './split-measure'
|
|
6
6
|
|
|
7
7
|
// `josh split:assess` — measure a branch's change size, tests excluded, and answer the size question
|
|
8
8
|
// of the split assessment.
|
|
@@ -33,7 +33,7 @@ async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
33
33
|
return FAILURE_EXIT_CODE
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
const measurement =
|
|
36
|
+
const measurement = await split_measure.read_branch()
|
|
37
37
|
const reason = split_assess.reason(measurement)
|
|
38
38
|
|
|
39
39
|
path_decision.print_decision(JSON_KEY, measurement.verdict, reason, is_json)
|
|
@@ -76,7 +76,8 @@ function non_test_changes(changes: ReadonlyArray<FileChange>): Array<FileChange>
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
// `split` only when **both** guides are exceeded together — the size condition a split has to clear,
|
|
79
|
-
// per `split-assessment.md`'s conservative default. Either one alone leaves the change one Issue.
|
|
79
|
+
// per `split-assessment.md`'s conservative default. Either one alone leaves the change one Issue. A
|
|
80
|
+
// filing's declared estimate is judged by this same call (`issue/size-estimate.ts`).
|
|
80
81
|
function verdict_for(files: number, lines: number): SplitVerdict {
|
|
81
82
|
return files > FILE_GUIDE && lines > LINE_GUIDE ? SPLIT_VERDICT : SINGLE_VERDICT
|
|
82
83
|
}
|
|
@@ -107,14 +108,37 @@ function reason(measurement: SizeMeasurement): string {
|
|
|
107
108
|
return `${counted} (${guide}) — ${tail}`
|
|
108
109
|
}
|
|
109
110
|
|
|
111
|
+
// The `split-assessment.md` headings the notice and a filing refusal point at; the document-rule test
|
|
112
|
+
// pins the document to both.
|
|
113
|
+
const NOTICE_SECTION = 'Over the guide before the gate'
|
|
114
|
+
const QUESTION_SECTION = 'The question'
|
|
115
|
+
// The line that records why an Issue stays one — read the same in a filed body (`size_estimate`) and
|
|
116
|
+
// in the Issue comment that answers the notice (`split_resolution`).
|
|
117
|
+
const REASON_PREFIX = '- 分割しない理由:'
|
|
118
|
+
const NOTICE_ACTION = `record why it stays one Issue in an Issue comment line \`${REASON_PREFIX} <理由>\`, or carve the rest out with \`pnpm josh issue:file --route split\` — split-assessment.md → "${NOTICE_SECTION}"`
|
|
119
|
+
|
|
120
|
+
// The pre-gate notice `josh main:merge` prints for a diff over the guide. "Clearly" is the `split`
|
|
121
|
+
// verdict — both guides exceeded — so the one bar this file draws is the one the notice fires on,
|
|
122
|
+
// and a diff under it prints nothing.
|
|
123
|
+
function notice(measurement: SizeMeasurement): string | undefined {
|
|
124
|
+
if (measurement.verdict !== SPLIT_VERDICT) return undefined
|
|
125
|
+
|
|
126
|
+
return `split notice: ${reason(measurement)}. Before the run:cut, ${NOTICE_ACTION}`
|
|
127
|
+
}
|
|
128
|
+
|
|
110
129
|
const split_assess = {
|
|
111
130
|
FILE_GUIDE,
|
|
112
131
|
LINE_GUIDE,
|
|
132
|
+
NOTICE_SECTION,
|
|
133
|
+
QUESTION_SECTION,
|
|
134
|
+
REASON_PREFIX,
|
|
113
135
|
SPLIT_VERDICT,
|
|
114
136
|
SINGLE_VERDICT,
|
|
115
137
|
assess,
|
|
138
|
+
notice,
|
|
116
139
|
parse_numstat,
|
|
117
140
|
reason,
|
|
141
|
+
verdict_for,
|
|
118
142
|
}
|
|
119
143
|
|
|
120
144
|
export type { FileChange, SizeMeasurement, SplitVerdict }
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs'
|
|
2
|
+
import { writeFile } from 'node:fs/promises'
|
|
3
|
+
import path from 'node:path'
|
|
4
|
+
import { git_branch } from '#scripts/git/git-branch'
|
|
5
|
+
import { git_command } from '#scripts/git/git-command'
|
|
6
|
+
import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
|
|
7
|
+
import { split_assess, type SizeMeasurement } from './split-assess'
|
|
8
|
+
import { split_measure } from './split-measure'
|
|
9
|
+
|
|
10
|
+
// **The split notice, shown mid-implementation** (joshuafolkken/kit#4642). `josh main:merge` prints it
|
|
11
|
+
// only before the gate, when the run can no longer carve anything out; a lane that grew to 17 files met
|
|
12
|
+
// it 25 minutes in. The first `josh lint:related` or `josh test:related` after the branch's diff passes
|
|
13
|
+
// the guide prints the same notice — `split_assess.notice`, so the bar and the question are one
|
|
14
|
+
// definition — once per Issue: a marker in the work tree's git directory, created exclusively, records
|
|
15
|
+
// that it was shown. A diff under the guide leaves no marker, so the first crossing still prints.
|
|
16
|
+
// Advisory only: an unmeasurable diff or a branch with no Issue prints nothing.
|
|
17
|
+
|
|
18
|
+
const MARKER_PREFIX = 'josh-split-notice-'
|
|
19
|
+
const EXISTS_CODE = 'EEXIST'
|
|
20
|
+
|
|
21
|
+
async function marker_path(issue_number: number): Promise<string | undefined> {
|
|
22
|
+
const [git_directory] = await git_command.git_directories()
|
|
23
|
+
|
|
24
|
+
if (git_directory === undefined) return undefined
|
|
25
|
+
|
|
26
|
+
return path.join(git_directory, `${MARKER_PREFIX}${String(issue_number)}`)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Undefined once shown, so a later run skips the measurement — a diff against main and a read of
|
|
30
|
+
// every untracked file.
|
|
31
|
+
async function unclaimed_marker(issue_number: number): Promise<string | undefined> {
|
|
32
|
+
const target = await marker_path(issue_number)
|
|
33
|
+
|
|
34
|
+
return target === undefined || existsSync(target) ? undefined : target
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function is_exists_error(error: unknown): boolean {
|
|
38
|
+
return error instanceof Error && 'code' in error && error.code === EXISTS_CODE
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// True only for the call that created the marker — the one that shows the notice.
|
|
42
|
+
async function claim(target: string): Promise<boolean> {
|
|
43
|
+
try {
|
|
44
|
+
await writeFile(target, '', { flag: 'wx' })
|
|
45
|
+
|
|
46
|
+
return true
|
|
47
|
+
} catch (error) {
|
|
48
|
+
if (is_exists_error(error)) return false
|
|
49
|
+
throw error
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// The claim that shows the notice first also writes it to the lane ledger, so the ledger holds one
|
|
54
|
+
// line per Issue, whichever command showed it (joshuafolkken/kit#4695).
|
|
55
|
+
async function claim_notice(
|
|
56
|
+
target: string,
|
|
57
|
+
issue: number,
|
|
58
|
+
measurement: SizeMeasurement,
|
|
59
|
+
): Promise<boolean> {
|
|
60
|
+
if (!(await claim(target))) return false
|
|
61
|
+
await lane_ledger_write.record_split_notice({
|
|
62
|
+
issue,
|
|
63
|
+
files: measurement.files,
|
|
64
|
+
lines: measurement.lines,
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
return true
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async function branch_issue(): Promise<number | undefined> {
|
|
71
|
+
return git_branch.issue_from_branch(await git_command.branch())
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async function pending_notice(): Promise<string | undefined> {
|
|
75
|
+
const issue_number = await branch_issue()
|
|
76
|
+
|
|
77
|
+
if (issue_number === undefined) return undefined
|
|
78
|
+
const target = await unclaimed_marker(issue_number)
|
|
79
|
+
|
|
80
|
+
if (target === undefined) return undefined
|
|
81
|
+
const measurement = await split_measure.read_branch()
|
|
82
|
+
const notice = split_assess.notice(measurement)
|
|
83
|
+
|
|
84
|
+
return notice !== undefined && (await claim_notice(target, issue_number, measurement))
|
|
85
|
+
? notice
|
|
86
|
+
: undefined
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// `josh main:merge` prints its notice on every merge; this records the first showing, as the scoped
|
|
90
|
+
// checks do, when neither of them showed it before. Advisory, as `surface` is.
|
|
91
|
+
async function record(measurement: SizeMeasurement): Promise<void> {
|
|
92
|
+
try {
|
|
93
|
+
const issue_number = await branch_issue()
|
|
94
|
+
const target = issue_number === undefined ? undefined : await unclaimed_marker(issue_number)
|
|
95
|
+
|
|
96
|
+
if (issue_number !== undefined && target !== undefined) {
|
|
97
|
+
await claim_notice(target, issue_number, measurement)
|
|
98
|
+
}
|
|
99
|
+
} catch {
|
|
100
|
+
// Advisory: the notice was printed; only its record is lost.
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async function surface(): Promise<void> {
|
|
105
|
+
try {
|
|
106
|
+
const notice = await pending_notice()
|
|
107
|
+
|
|
108
|
+
if (notice !== undefined) console.warn(`\n${notice}`)
|
|
109
|
+
} catch {
|
|
110
|
+
// Advisory: `josh main:merge` reports an unmeasurable diff before the gate.
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const split_early_notice = { MARKER_PREFIX, record, surface }
|
|
115
|
+
|
|
116
|
+
export { split_early_notice }
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { change_base } from '#scripts/git/change-base'
|
|
4
|
+
import { changed_paths } from '#scripts/git/changed-paths'
|
|
5
|
+
import { git_command } from '#scripts/git/git-command'
|
|
6
|
+
import { git_spawn } from '#scripts/git/git-spawn'
|
|
7
|
+
import { split_assess } from './split-assess'
|
|
8
|
+
|
|
9
|
+
// The branch's size measurement — the one reading every `split_assess` caller takes.
|
|
10
|
+
//
|
|
11
|
+
// joshuafolkken/kit#4302: `git diff` never lists an untracked file, and a run has staged nothing
|
|
12
|
+
// when it measures, so the diff alone counted every new file a branch created as absent. Each
|
|
13
|
+
// untracked file is added as a numstat row of its line count, so a branch made of new modules
|
|
14
|
+
// measures as large as it is. A file holding a NUL byte is binary and counts zero lines, as
|
|
15
|
+
// `git diff --numstat` counts it. An entry with no readable content — a dangling symlink, a nested
|
|
16
|
+
// repository's directory — still counts as a file, of zero lines, so one such entry cannot reject
|
|
17
|
+
// the whole measurement.
|
|
18
|
+
//
|
|
19
|
+
// joshuafolkken/kit#4696: **the tracked half is measured from the tree's base, through a merge in
|
|
20
|
+
// progress** (`change_base.resolved_through_merge`). A merge of the default branch stopped on a
|
|
21
|
+
// conflict has already put the default branch's files in the work tree while `HEAD` is still the
|
|
22
|
+
// commit before it, so measuring from `HEAD`'s merge-base counted everything the merge brought in as
|
|
23
|
+
// this branch's own — 53 files where the branch had 10. A base that cannot be resolved throws, so no
|
|
24
|
+
// caller reads it as under the guide: the notices report the diff as unmeasured and `split:assess`
|
|
25
|
+
// fails outright.
|
|
26
|
+
|
|
27
|
+
const UNRESOLVED_BASE = 'the change base could not be resolved'
|
|
28
|
+
const NUL_BYTE = 0
|
|
29
|
+
const NO_CONTENT = Buffer.alloc(0)
|
|
30
|
+
const NEWLINE = '\n'
|
|
31
|
+
|
|
32
|
+
function line_count(content: Buffer): number {
|
|
33
|
+
if (content.includes(NUL_BYTE)) return 0
|
|
34
|
+
|
|
35
|
+
const text = content.toString('utf8')
|
|
36
|
+
const newlines = text.split(NEWLINE).length - 1
|
|
37
|
+
|
|
38
|
+
return text === '' || text.endsWith(NEWLINE) ? newlines : newlines + 1
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async function read_content(file_path: string): Promise<Buffer> {
|
|
42
|
+
try {
|
|
43
|
+
return await readFile(file_path)
|
|
44
|
+
} catch {
|
|
45
|
+
return NO_CONTENT
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function untracked_row(root: string, file: string): Promise<string> {
|
|
50
|
+
const lines = line_count(await read_content(path.join(root, file)))
|
|
51
|
+
|
|
52
|
+
return `${String(lines)}\t0\t${file}`
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function untracked_numstat(): Promise<string> {
|
|
56
|
+
const files = changed_paths.to_paths(await git_command.untracked_names())
|
|
57
|
+
|
|
58
|
+
if (files.length === 0) return ''
|
|
59
|
+
|
|
60
|
+
const toplevel = await git_spawn.read(['rev-parse', '--show-toplevel'])
|
|
61
|
+
const root = toplevel.trim()
|
|
62
|
+
const rows = await Promise.all(files.map(async (file) => await untracked_row(root, file)))
|
|
63
|
+
|
|
64
|
+
return rows.join(NEWLINE)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function tracked_numstat(): Promise<string> {
|
|
68
|
+
const base = await change_base.resolved_through_merge()
|
|
69
|
+
|
|
70
|
+
if (base === undefined) throw new Error(UNRESOLVED_BASE)
|
|
71
|
+
|
|
72
|
+
return await git_command.diff_numstat_since(base)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function read_branch(): Promise<ReturnType<typeof split_assess.assess>> {
|
|
76
|
+
const tracked = await tracked_numstat()
|
|
77
|
+
|
|
78
|
+
return split_assess.assess(`${tracked}${NEWLINE}${await untracked_numstat()}`)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const split_measure = { line_count, read_branch }
|
|
82
|
+
|
|
83
|
+
export { split_measure }
|