@joshuafolkken/kit 1.1514.0 → 1.2114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/investigator.md +1 -1
- package/.claude/agents/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/epic-commands/SKILL.md +26 -65
- package/.claude/skills/epic-commands/epic-bundle.md +3 -1
- package/.claude/skills/workflow-commands/SKILL.md +11 -11
- package/.claude/skills/workflow-commands/background-commands.md +13 -10
- package/.claude/skills/workflow-commands/backlogrun-child.md +12 -8
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +18 -14
- package/.claude/skills/workflow-commands/backlogrun-park.md +18 -24
- package/.claude/skills/workflow-commands/backlogrun-progress.md +4 -5
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +6 -6
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -11
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +43 -28
- package/.claude/skills/workflow-commands/delegation.md +11 -10
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -10
- package/.claude/skills/workflow-commands/followup.md +16 -36
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -47
- package/.claude/skills/workflow-commands/fullrun.md +3 -3
- package/.claude/skills/workflow-commands/halfrun.md +17 -25
- package/.claude/skills/workflow-commands/issue-comments.md +25 -16
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/issue-scout.md +2 -2
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +7 -12
- package/.claude/skills/workflow-commands/needs-human-review.md +9 -14
- package/.claude/skills/workflow-commands/observation-filing.md +4 -36
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -37
- package/.claude/skills/workflow-commands/prerequisite.md +11 -16
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +3 -7
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +15 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +9 -9
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-node/action.yml +9 -0
- package/.github/actions/setup-pnpm/action.yml +10 -17
- package/.github/dependabot.yml +32 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +267 -17
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +67 -46
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/settings.json +19 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +7 -18
- package/README.md +4 -2
- package/SECURITY.md +3 -3
- package/dist/CLAUDE.md +7 -18
- package/dist/commands/document-read-cli.js +883 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +81 -38
- package/dist/commands/read-set-cli.js +1927 -0
- package/dist/commands/run-prep-main.js +21174 -0
- package/dist/commands/run-step-cli.js +27733 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +39 -36
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/chunk-5PM2JRGV.js +7780 -0
- package/dist/hooks/chunk-7SIUNQXK.js +3591 -0
- package/dist/hooks/chunk-CQD4LJE6.js +4858 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/chunk-UJ3FPMMM.js +628 -0
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +10 -22
- package/dist/hooks/format-edited.js +4 -6
- package/dist/hooks/inputs.json +460 -308
- package/dist/hooks/pretool-guard.js +8 -25
- package/dist/hooks/session-lang.js +135 -299
- package/dist/hooks/stop-guard.js +6496 -1799
- package/dist/josh.js +7412 -4228
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +276 -407
- package/eslint/base.js +1 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/lefthook/base.yml +3 -1
- package/package.json +23 -54
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +2 -2
- package/prompts/collaboration-workflow/file-edits.md +14 -17
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +54 -18
- package/prompts/collaboration-workflow/lane-instructions.md +3 -2
- package/prompts/collaboration-workflow/measurement.md +44 -0
- package/prompts/collaboration-workflow/operating-rules.md +15 -8
- package/prompts/collaboration-workflow/output-bounds.md +6 -7
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +14 -0
- package/prompts/collaboration-workflow/report-format.md +31 -60
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/shell-body.md +6 -16
- package/prompts/collaboration-workflow/turn-batching.md +0 -2
- package/prompts/collaboration-workflow/upstream-interrupt.md +15 -5
- package/prompts/collaboration-workflow/wip-cap.md +4 -2
- package/prompts/collaboration-workflow.md +3 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +9 -2
- package/prompts/review.md +65 -36
- package/prompts/testing-guide.md +9 -43
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +25 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +2 -3
- package/scripts/backlog/backlog-defect-priority.ts +5 -4
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +118 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +161 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -35
- package/scripts/backlog/backlog-drive-named.ts +81 -13
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +170 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +96 -131
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +78 -56
- package/scripts/backlog/backlog-occupied.ts +52 -39
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +62 -10
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +22 -5
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +60 -22
- package/scripts/backlog/backlog-rank.ts +70 -15
- package/scripts/backlog/backlog-ready.ts +112 -30
- package/scripts/backlog/backlog-stalled-detect.ts +110 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +56 -15
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +13 -4
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +67 -29
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +18 -5
- package/scripts/delegation/duplicate-read-guard.ts +1 -8
- package/scripts/delegation/investigation-guard.ts +12 -8
- package/scripts/delegation/investigation-reads.ts +48 -27
- package/scripts/dependabot/dependabot-cooldown.ts +195 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +18 -6
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +0 -8
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +33 -2
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +6 -0
- package/scripts/epic/epic-graph.ts +8 -1
- package/scripts/epic/epic-issue.ts +8 -2
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +85 -0
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +52 -12
- package/scripts/followup/git-followup-workflow.ts +19 -66
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +32 -18
- package/scripts/followup/git-pr-followup.ts +96 -33
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +3 -3
- package/scripts/gate/busy-average.ts +90 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +39 -95
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/check-reuse.ts +33 -54
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +236 -28
- package/scripts/gate/core-budget-timing.ts +51 -0
- package/scripts/gate/core-budget.ts +111 -100
- package/scripts/gate/core-wait-record.ts +49 -0
- package/scripts/gate/core-wait.ts +62 -7
- package/scripts/gate/core-weights.ts +94 -0
- package/scripts/gate/free-cores.ts +27 -4
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +44 -8
- package/scripts/gate/gate-plan.ts +130 -78
- package/scripts/gate/gate-report.ts +23 -9
- package/scripts/gate/gate-run-steps.ts +77 -9
- package/scripts/gate/gate-skip.ts +57 -8
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +14 -2
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +65 -31
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +76 -19
- package/scripts/gate/since-green.ts +70 -0
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +70 -32
- package/scripts/gate/verification-inputs.ts +265 -0
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +117 -9
- package/scripts/gh/git-ai-review-scan.ts +5 -3
- package/scripts/gh/git-gh-api-path.ts +26 -2
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +7 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +75 -31
- package/scripts/gh/git-gh-issue.ts +19 -8
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +21 -9
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +4 -2
- package/scripts/gh/git-gh-pr-snapshot.ts +48 -20
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +48 -22
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +42 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/git/base-tree.ts +49 -2
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +34 -2
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +91 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +30 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +77 -13
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +38 -6
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +86 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +38 -27
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +29 -25
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +44 -4
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +77 -9
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +34 -19
- package/scripts/hooks/reserved-run.ts +81 -10
- package/scripts/hooks/run-hook.sh +30 -6
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +5 -36
- package/scripts/hooks/stop-guard.ts +20 -15
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +23 -5
- package/scripts/init/hook-launch.ts +17 -17
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +78 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +38 -179
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +65 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +74 -0
- package/scripts/issue/issue-cite-cli.ts +1 -12
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -7
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +102 -0
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +131 -36
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +56 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +97 -89
- package/scripts/issue/issue-lint-cli.ts +29 -12
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +34 -0
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +114 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +282 -0
- package/scripts/issue/issue-rank.ts +27 -4
- package/scripts/issue/issue-read-cli.ts +35 -16
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +62 -13
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +213 -0
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +77 -0
- package/scripts/issue/issue-scout-cli.ts +0 -11
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +87 -16
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -11
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -65
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +76 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +17 -44
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -79
- package/scripts/josh/josh-command-types.ts +12 -6
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +160 -161
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +142 -101
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +25 -2
- package/scripts/josh/josh-commands-issue-write.ts +200 -0
- package/scripts/josh/josh-commands-issue.ts +156 -24
- package/scripts/josh/josh-commands-lane.ts +187 -3
- package/scripts/josh/josh-commands-lint.ts +34 -10
- package/scripts/josh/josh-commands-maintenance.ts +127 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +159 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +217 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +144 -6
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +11 -16
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/package-directory.ts +2 -4
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +20 -17
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +56 -20
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +14 -23
- package/scripts/lane/lane-check-stats.ts +84 -22
- package/scripts/lane/lane-child-invocation.ts +17 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +91 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +26 -5
- package/scripts/lane/lane-gap-stats.ts +157 -0
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-handoff.ts +69 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-install.ts +4 -11
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +349 -0
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +56 -233
- package/scripts/lane/lane-limit-cli.ts +12 -1
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +193 -30
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +25 -8
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +133 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +38 -4
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +22 -2
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +26 -3
- package/scripts/lane/lane-session-action.ts +112 -23
- package/scripts/lane/lane-session-broker.ts +146 -37
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +7 -4
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +20 -3
- package/scripts/lane/lane-state.ts +334 -0
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +74 -4
- package/scripts/lane/lane-stop-stats.ts +145 -37
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +202 -0
- package/scripts/lane/lane-transcript-stats.ts +200 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-cli.ts +5 -4
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +149 -71
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +304 -0
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/format.ts +11 -2
- package/scripts/lint/import-graph.ts +409 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +113 -33
- package/scripts/lint/lint-related-scope.ts +30 -24
- package/scripts/lint/lint-related.ts +183 -30
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +32 -23
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +2 -6
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +38 -10
- package/scripts/overrides/overrides-check.ts +11 -6
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +24 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +10 -16
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +17 -1
- package/scripts/report/report-labels.ts +166 -0
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +29 -7
- package/scripts/report/report-lint.ts +85 -128
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map.ts +1 -0
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +138 -23
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +45 -10
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +111 -30
- package/scripts/review/review-finding-ledger.ts +135 -18
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +105 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +165 -0
- package/scripts/review/review-record-cli.ts +236 -74
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +135 -36
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +103 -19
- package/scripts/review/review-stamps.ts +23 -1
- package/scripts/review/review-stop-log.ts +110 -0
- package/scripts/review/review-stops-cli.ts +86 -0
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +9 -1
- package/scripts/rules/bash-triggers.ts +49 -6
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +3 -3
- package/scripts/rules/delivered-rules.ts +115 -18
- package/scripts/rules/destructive-command.ts +11 -12
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +139 -0
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +72 -26
- package/scripts/rules/early-heartbeat.ts +4 -1
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +14 -4
- package/scripts/rules/guard-remedy.ts +17 -4
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +68 -27
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +18 -5
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +103 -33
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +172 -0
- package/scripts/rules/lane-interactive-ask.ts +12 -2
- package/scripts/rules/lane-park.ts +49 -25
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +11 -3
- package/scripts/rules/lane-switch-main.ts +11 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +11 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/permission-guards.ts +7 -0
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +68 -18
- package/scripts/rules/poll-loop.ts +78 -8
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +113 -22
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +13 -15
- package/scripts/rules/rule-list.ts +9 -28
- package/scripts/rules/rule-value-cache.ts +57 -14
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +106 -39
- package/scripts/rules/rule-value.ts +18 -5
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +43 -0
- package/scripts/rules/stop-rule-rows.ts +52 -0
- package/scripts/rules/stop-rules.ts +36 -62
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +115 -21
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +32 -7
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -32
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +71 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +177 -37
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +118 -38
- package/scripts/run/board/run-board-header.ts +90 -20
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +126 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +123 -0
- package/scripts/run/board/run-board-layout.ts +239 -60
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +59 -32
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +19 -35
- package/scripts/run/board/run-board-phase.ts +3 -6
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +56 -4
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +197 -28
- package/scripts/run/board/run-board-reason.ts +247 -51
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +42 -7
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +78 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +89 -0
- package/scripts/run/board/run-board-render-legend.ts +136 -48
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +104 -20
- package/scripts/run/board/run-board-render.ts +264 -258
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +9 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +3 -5
- package/scripts/run/board/run-board-state.ts +22 -33
- package/scripts/run/board/run-board-status.ts +149 -71
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +158 -114
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +12 -6
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +54 -10
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +18 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +10 -10
- package/scripts/run/event/run-event-scope.ts +2 -2
- package/scripts/run/event/run-event-stream-emit.ts +82 -22
- package/scripts/run/event/run-event-stream.ts +58 -10
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-stop-notify.ts +178 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +119 -62
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +25 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +33 -7
- package/scripts/run/merge/run-merge-signals.ts +66 -25
- package/scripts/run/merge/run-merge-steps.ts +162 -107
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +76 -48
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +28 -7
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +60 -29
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +7 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +6 -3
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +140 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +181 -166
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +29 -12
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +74 -0
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +44 -27
- package/scripts/run/ship/run-ship-overlap.ts +49 -7
- package/scripts/run/ship/run-ship-place.ts +103 -0
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +42 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +144 -33
- package/scripts/run/ship/run-ship-preflight.ts +150 -33
- package/scripts/run/ship/run-ship-probe.ts +28 -6
- package/scripts/run/ship/run-ship-relaunch-cap.ts +106 -0
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +183 -25
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +296 -171
- package/scripts/run/ship/run-ship-review.ts +222 -35
- package/scripts/run/ship/run-ship-reviewer.ts +303 -0
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +101 -16
- package/scripts/run/ship/run-ship-steps.ts +68 -17
- package/scripts/run/ship/run-ship-stop-cause.ts +176 -0
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +212 -34
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +44 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +121 -209
- package/scripts/run/wake/run-wake-code.ts +125 -0
- package/scripts/run/wake/run-wake-driver.ts +22 -9
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +36 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +98 -0
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +5 -3
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +6 -11
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +20 -0
- package/scripts/security/security-audit-provision.ts +12 -27
- package/scripts/security/security-audit.ts +27 -8
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +25 -1
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +83 -0
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +25 -1
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +333 -0
- package/scripts/test/test-pinned-main.ts +144 -0
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +311 -0
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +288 -0
- package/scripts/test/test-read-recording.ts +103 -0
- package/scripts/test/test-read-trace.ts +166 -0
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +39 -37
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +21 -0
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +139 -0
- package/scripts/test/test-related-scope.ts +292 -41
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +381 -19
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +66 -25
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +64 -151
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +74 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +40 -8
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +12 -3
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +98 -11
- package/scripts/time-runtime/time-transcript-line.ts +65 -66
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +19 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +6 -1
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +53 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-4KKD2UTK.js +0 -66
- package/dist/hooks/chunk-6TS2JD6D.js +0 -237
- package/dist/hooks/chunk-7DSBJVFH.js +0 -50
- package/dist/hooks/chunk-A65Y4YOR.js +0 -79
- package/dist/hooks/chunk-APUO6U4J.js +0 -2451
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-DGT54IH5.js +0 -161
- package/dist/hooks/chunk-EFXE6C37.js +0 -81
- package/dist/hooks/chunk-GP4IEC4O.js +0 -20
- package/dist/hooks/chunk-JP45SOCJ.js +0 -56
- package/dist/hooks/chunk-LAOV7NLM.js +0 -45
- package/dist/hooks/chunk-M4HGZV7U.js +0 -83
- package/dist/hooks/chunk-O6GDRNJB.js +0 -343
- package/dist/hooks/chunk-PF2NZL2A.js +0 -131
- package/dist/hooks/chunk-PTICX4OL.js +0 -358
- package/dist/hooks/chunk-RT27QRJW.js +0 -6247
- package/dist/hooks/chunk-SYOTDYCI.js +0 -3533
- package/dist/hooks/chunk-TNUMY6NL.js +0 -4838
- package/dist/hooks/chunk-UPUZF3AN.js +0 -279
- package/dist/hooks/chunk-WK6SMBIC.js +0 -3180
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -29
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/josh/josh-usage-automation.ts +0 -121
- package/scripts/josh/josh-usage-backlog.ts +0 -180
- package/scripts/josh/josh-usage-developer.ts +0 -230
- package/scripts/josh/josh-usage-hooks.ts +0 -38
- package/scripts/josh/josh-usage-issue.ts +0 -205
- package/scripts/josh/josh-usage-review.ts +0 -101
- package/scripts/josh/josh-usage-run.ts +0 -252
- package/scripts/josh/josh-usage-session.ts +0 -238
- package/scripts/josh/josh-usage-workflow.ts +0 -212
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/filing-cap.ts +0 -132
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -292
- package/scripts/rules/rule-registry.ts +0 -112
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
2
|
+
import { SPLIT_ROUTE_LABEL } from '#scripts/issue/issue-labels'
|
|
3
|
+
import { issue_read } from '#scripts/issue/issue-read'
|
|
4
|
+
import { session_cite } from '#scripts/issue/session-cite'
|
|
5
|
+
import {
|
|
6
|
+
lane_ledger,
|
|
7
|
+
type LedgerEntry,
|
|
8
|
+
type SplitFiledEntry,
|
|
9
|
+
type SplitNoticeEntry,
|
|
10
|
+
} from '#scripts/lane/lane-ledger'
|
|
11
|
+
import { lane_ledger_write } from '#scripts/lane/lane-ledger-write'
|
|
12
|
+
import { split_assess } from './split-assess'
|
|
13
|
+
|
|
14
|
+
// **What answers a split notice** (joshuafolkken/kit#4695). Of the lanes the notice reached, none split
|
|
15
|
+
// and none recorded why it stayed one Issue (joshuafolkken/kit#4676): the notice asked, and nothing
|
|
16
|
+
// checked. The pre-gate `josh run:cut` now does. A noticed Issue passes once it has either answer:
|
|
17
|
+
//
|
|
18
|
+
// - **a split child** — a `josh issue:file --route split` filed from its lane, recorded in the lane
|
|
19
|
+
// ledger as the filing lands;
|
|
20
|
+
// - **a reason** — a trusted Issue comment carrying the filing's own reason line
|
|
21
|
+
// (`split_assess.REASON_PREFIX`), so one declaration reads the same at filing and before the gate.
|
|
22
|
+
|
|
23
|
+
const { REASON_PREFIX } = split_assess
|
|
24
|
+
const NOTICE_SECTION = `split-assessment.md → "${split_assess.NOTICE_SECTION}"`
|
|
25
|
+
const UNREAD_NOTE = 'Its comments could not be read, so no recorded reason was found. '
|
|
26
|
+
|
|
27
|
+
function is_notice(entry: LedgerEntry): entry is SplitNoticeEntry {
|
|
28
|
+
return entry.kind === lane_ledger.KIND.SPLIT_NOTICE
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function is_split_child(entry: LedgerEntry): entry is SplitFiledEntry {
|
|
32
|
+
return entry.kind === lane_ledger.KIND.SPLIT_FILED
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// The ledger's split notices, oldest first — `josh lane:stats` counts the lanes they reached.
|
|
36
|
+
function notices(entries: ReadonlyArray<LedgerEntry>): ReadonlyArray<SplitNoticeEntry> {
|
|
37
|
+
return entries.filter((entry) => is_notice(entry))
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// The Issues whose lane filed a split child.
|
|
41
|
+
function split_issues(entries: ReadonlyArray<LedgerEntry>): ReadonlySet<number> {
|
|
42
|
+
return new Set(entries.filter((entry) => is_split_child(entry)).map((entry) => entry.issue))
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function is_reason_line(line: string): boolean {
|
|
46
|
+
const text = line.trim()
|
|
47
|
+
|
|
48
|
+
return text.startsWith(REASON_PREFIX) && text !== REASON_PREFIX
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function has_reason(bodies: ReadonlyArray<string>): boolean {
|
|
52
|
+
return bodies.some((body) => body.split('\n').some((line) => is_reason_line(line)))
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// The trusted comments' bodies, or `undefined` when the listing could not be read.
|
|
56
|
+
async function trusted_comments(issue: number): Promise<ReadonlyArray<string> | undefined> {
|
|
57
|
+
const json = await git_gh_issue_read.issue_list_comments(String(issue))
|
|
58
|
+
const comments = await issue_read.parse_comments(json)
|
|
59
|
+
|
|
60
|
+
return comments === undefined ? undefined : issue_read.trusted_bodies(comments)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function refusal_text(notice: SplitNoticeEntry, bodies: ReadonlyArray<string> | undefined): string {
|
|
64
|
+
const counted = `${String(notice.files)} file(s), ${String(notice.lines)} line(s), tests excluded`
|
|
65
|
+
const unread = bodies === undefined ? UNREAD_NOTE : ''
|
|
66
|
+
const answers = `post an Issue comment with the line \`${REASON_PREFIX} <理由>\`, or file the rest with \`pnpm josh issue:file --route split\``
|
|
67
|
+
|
|
68
|
+
return `${session_cite.issue(notice.issue)} got the split notice (${counted}) and has neither a recorded reason nor a split child. ${unread}Either ${answers}, then run \`pnpm josh run:cut ${String(notice.issue)}\` again — ${NOTICE_SECTION}`
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// The refusal for a noticed Issue that has no answer yet, else `undefined`. The ledger is read first,
|
|
72
|
+
// so an Issue the notice never reached costs no GitHub read.
|
|
73
|
+
async function refusal(
|
|
74
|
+
issue: number,
|
|
75
|
+
entries: ReadonlyArray<LedgerEntry>,
|
|
76
|
+
): Promise<string | undefined> {
|
|
77
|
+
const notice = notices(entries).findLast((entry) => entry.issue === issue)
|
|
78
|
+
|
|
79
|
+
if (notice === undefined || split_issues(entries).has(issue)) return undefined
|
|
80
|
+
const bodies = await trusted_comments(issue)
|
|
81
|
+
|
|
82
|
+
return bodies !== undefined && has_reason(bodies) ? undefined : refusal_text(notice, bodies)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// The refusal against this repository's lane ledger; outside a repository there is none to read.
|
|
86
|
+
async function ledger_refusal(issue: number): Promise<string | undefined> {
|
|
87
|
+
const ledger = await lane_ledger.target()
|
|
88
|
+
|
|
89
|
+
return ledger === undefined ? undefined : await refusal(issue, lane_ledger.read_entries(ledger))
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
interface Filing {
|
|
93
|
+
route: string | undefined
|
|
94
|
+
found_during: string | undefined
|
|
95
|
+
child: string
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// What `josh issue:file` just filed: a split child is recorded against the lane it was found in. Any
|
|
99
|
+
// other route, and a filing found in no lane, record nothing.
|
|
100
|
+
async function record_child({ route, found_during, child }: Filing): Promise<void> {
|
|
101
|
+
if (route !== SPLIT_ROUTE_LABEL || found_during === undefined) return
|
|
102
|
+
await lane_ledger_write.record_split_filed({ issue: Number(found_during), child })
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const split_resolution = { ledger_refusal, notices, record_child, refusal, split_issues }
|
|
106
|
+
|
|
107
|
+
export { split_resolution }
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { json_format } from '#scripts/config-merge/json-format'
|
|
2
2
|
import { hook_command_rewrite } from '#scripts/init/hook-command-rewrite'
|
|
3
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
3
4
|
|
|
4
5
|
// `josh sync` used to replace a project's `.claude/settings.json` with the distributed file, which
|
|
5
6
|
// deleted every hook and permission the project had added — and `.claude/settings.local.json` is
|
|
@@ -29,10 +30,6 @@ const WITHDRAWN_KIT_PERMISSIONS: ReadonlySet<unknown> = new Set([
|
|
|
29
30
|
'Bash(git commit --all*)',
|
|
30
31
|
])
|
|
31
32
|
|
|
32
|
-
function is_json_object(value: unknown): value is JsonObject {
|
|
33
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
34
|
-
}
|
|
35
|
-
|
|
36
33
|
function as_array(value: unknown): Array<unknown> {
|
|
37
34
|
return Array.isArray(value) ? value : []
|
|
38
35
|
}
|
|
@@ -46,7 +43,7 @@ function merge_objects(kit: JsonObject, own: JsonObject, merge_entry: EntryMerge
|
|
|
46
43
|
}
|
|
47
44
|
|
|
48
45
|
function merge_kit_value(kit: unknown, own: unknown): unknown {
|
|
49
|
-
if (!
|
|
46
|
+
if (!json_value.is_record(kit) || !json_value.is_record(own)) return kit
|
|
50
47
|
|
|
51
48
|
return merge_objects(kit, own, (_key, kit_entry, own_entry) =>
|
|
52
49
|
merge_kit_value(kit_entry, own_entry),
|
|
@@ -68,7 +65,7 @@ function without_withdrawn(value: unknown): unknown {
|
|
|
68
65
|
// The withdrawn entries are taken out of every list first, so one goes even when kit no longer ships
|
|
69
66
|
// the list it sat in.
|
|
70
67
|
function merge_permissions(kit: unknown, own: unknown): unknown {
|
|
71
|
-
if (!
|
|
68
|
+
if (!json_value.is_record(kit) || !json_value.is_record(own)) return kit
|
|
72
69
|
const kept = Object.entries(own).map(([key, value]) => [key, without_withdrawn(value)] as const)
|
|
73
70
|
|
|
74
71
|
return merge_objects(kit, Object.fromEntries(kept), (_key, kit_entry, own_entry) =>
|
|
@@ -77,7 +74,7 @@ function merge_permissions(kit: unknown, own: unknown): unknown {
|
|
|
77
74
|
}
|
|
78
75
|
|
|
79
76
|
function is_kit_handler(handler: unknown): boolean {
|
|
80
|
-
if (!
|
|
77
|
+
if (!json_value.is_record(handler)) return false
|
|
81
78
|
const { command } = handler
|
|
82
79
|
|
|
83
80
|
return typeof command === 'string' && hook_command_rewrite.is_kit_hook_command(command)
|
|
@@ -85,7 +82,7 @@ function is_kit_handler(handler: unknown): boolean {
|
|
|
85
82
|
|
|
86
83
|
// A matcher group left with no handler of the project's own was kit's alone, and goes with them.
|
|
87
84
|
function without_kit_handlers(group: unknown): unknown {
|
|
88
|
-
if (!
|
|
85
|
+
if (!json_value.is_record(group)) return group
|
|
89
86
|
const handlers = as_array(group[HOOKS_KEY]).filter((handler) => !is_kit_handler(handler))
|
|
90
87
|
|
|
91
88
|
return handlers.length === 0 ? undefined : { ...group, [HOOKS_KEY]: handlers }
|
|
@@ -104,7 +101,7 @@ function own_hook_events(own: JsonObject): JsonObject {
|
|
|
104
101
|
}
|
|
105
102
|
|
|
106
103
|
function merge_hooks(kit: unknown, own: unknown): unknown {
|
|
107
|
-
if (!
|
|
104
|
+
if (!json_value.is_record(kit) || !json_value.is_record(own)) return kit
|
|
108
105
|
|
|
109
106
|
return merge_objects(kit, own_hook_events(own), (_event, kit_groups, groups) => [
|
|
110
107
|
...as_array(kit_groups),
|
|
@@ -120,13 +117,9 @@ function merge_top_level(key: string, kit: unknown, own: unknown): unknown {
|
|
|
120
117
|
}
|
|
121
118
|
|
|
122
119
|
function parse_object(content: string): JsonObject | undefined {
|
|
123
|
-
|
|
124
|
-
const parsed: unknown = JSON.parse(content)
|
|
120
|
+
const parsed = json_value.parse_or_undefined(content)
|
|
125
121
|
|
|
126
|
-
|
|
127
|
-
} catch {
|
|
128
|
-
return undefined
|
|
129
|
-
}
|
|
122
|
+
return json_value.is_record(parsed) ? parsed : undefined
|
|
130
123
|
}
|
|
131
124
|
|
|
132
125
|
// A file that does not parse as a JSON object has nothing the merge can keep, so it is replaced with
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { cpSync, lstatSync, readdirSync, readFileSync
|
|
1
|
+
import { cpSync, lstatSync, readdirSync, readFileSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { transform_copied_content } from '#scripts/init/init-copy-content'
|
|
4
4
|
import { error_text } from '#scripts/lib/error-message'
|
|
5
|
+
import { file_reader } from '#scripts/lib/read-file'
|
|
5
6
|
import { file_content } from './file-content'
|
|
6
7
|
|
|
7
8
|
// `josh init` and `josh sync` both copy a distributed directory with `cpSync`, and both have to
|
|
@@ -20,17 +21,11 @@ type DestinationKind = 'absent' | 'directory' | 'other'
|
|
|
20
21
|
// says the opposite — something is there and cannot be inspected — and ENOTDIR says a component of
|
|
21
22
|
// the path is a file, which is also something rather than nothing. Reading either as absent would
|
|
22
23
|
// send the caller into the `cpSync` that then throws uncaught, the abort this module exists to stop.
|
|
23
|
-
const ABSENT_CODE = 'ENOENT'
|
|
24
|
-
|
|
25
|
-
function error_code_of(error: unknown): string {
|
|
26
|
-
return error instanceof Error && 'code' in error ? String(error.code) : ''
|
|
27
|
-
}
|
|
28
|
-
|
|
29
24
|
function classify_path(candidate_path: string): DestinationKind {
|
|
30
25
|
try {
|
|
31
26
|
return lstatSync(candidate_path).isDirectory() ? 'directory' : 'other'
|
|
32
27
|
} catch (error) {
|
|
33
|
-
return
|
|
28
|
+
return file_reader.is_absent(error) ? 'absent' : 'other'
|
|
34
29
|
}
|
|
35
30
|
}
|
|
36
31
|
|
|
@@ -79,7 +74,7 @@ function is_transformable(candidate_path: string): boolean {
|
|
|
79
74
|
function transform_copied_file(file_path: string): void {
|
|
80
75
|
const content = readFileSync(file_path, 'utf8')
|
|
81
76
|
const transformed = transform_copied_content(file_path, content)
|
|
82
|
-
if (transformed !== content)
|
|
77
|
+
if (transformed !== content) file_content.write_contained(file_path, transformed)
|
|
83
78
|
}
|
|
84
79
|
|
|
85
80
|
// The walk reads the SOURCE listing and rewrites the matching destination paths, never the
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { lstatSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'
|
|
1
|
+
import { lstatSync, mkdirSync, readFileSync, readlinkSync, writeFileSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
|
+
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
4
|
+
import { file_reader } from '#scripts/lib/read-file'
|
|
3
5
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
6
|
+
const PATH_SEPARATORS = path.sep === '\\' ? /[/\\]/u : /\//u
|
|
7
|
+
const MAX_RESOLVE_STEPS = 4096
|
|
7
8
|
|
|
8
9
|
function is_read_denied(error: unknown): boolean {
|
|
9
10
|
return (
|
|
@@ -15,7 +16,7 @@ function is_regular_existing_file(destination_path: string): boolean {
|
|
|
15
16
|
try {
|
|
16
17
|
return lstatSync(destination_path).isFile()
|
|
17
18
|
} catch (error) {
|
|
18
|
-
if (
|
|
19
|
+
if (file_reader.is_absent(error)) return false
|
|
19
20
|
throw error
|
|
20
21
|
}
|
|
21
22
|
}
|
|
@@ -37,13 +38,82 @@ function is_same_file_content(destination_path: string, content: string | Buffer
|
|
|
37
38
|
return does_read_match(destination_path, expected)
|
|
38
39
|
}
|
|
39
40
|
|
|
40
|
-
function
|
|
41
|
-
if (
|
|
41
|
+
function read_symlink(target: string): string | undefined {
|
|
42
|
+
if (!lstatSync(target, { throwIfNoEntry: false })?.isSymbolicLink()) return undefined
|
|
43
|
+
|
|
44
|
+
return readlinkSync(target)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function split_components(target: string): Array<string> {
|
|
48
|
+
return target.split(PATH_SEPARATORS).filter((part) => part !== '' && part !== '.')
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// One component, as the kernel takes it: `..` steps up from the real directory reached so far, and
|
|
52
|
+
// a link — dangling or not — splices its own text in, from the root when it is absolute.
|
|
53
|
+
function enter_component(current: string, name: string, pending: Array<string>): string {
|
|
54
|
+
if (name === '..') return path.dirname(current)
|
|
55
|
+
|
|
56
|
+
const next = path.join(current, name)
|
|
57
|
+
const link = read_symlink(next)
|
|
58
|
+
if (link === undefined) return next
|
|
59
|
+
const root = path.isAbsolute(link) ? path.parse(link).root : ''
|
|
60
|
+
|
|
61
|
+
pending.unshift(...split_components(link.slice(root.length)))
|
|
62
|
+
|
|
63
|
+
return root === '' ? current : root
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Where a write to `target` lands. The path is walked component by component rather than through
|
|
67
|
+
// `path.resolve` or `realpathSync`: the first folds `link/..` lexically while the kernel climbs
|
|
68
|
+
// out of where `link` points, and the second refuses the not-yet-created file a dangling link
|
|
69
|
+
// names. A link cycle the walk would never leave is cut off rather than spun on.
|
|
70
|
+
function resolve_write_path(target: string): string {
|
|
71
|
+
const absolute = path.isAbsolute(target) ? target : `${process.cwd()}${path.sep}${target}`
|
|
72
|
+
let current = path.parse(absolute).root
|
|
73
|
+
const pending = split_components(absolute.slice(current.length))
|
|
74
|
+
|
|
75
|
+
for (let steps = 0; steps <= MAX_RESOLVE_STEPS; steps += 1) {
|
|
76
|
+
const name = pending.shift()
|
|
77
|
+
if (name === undefined) return current
|
|
78
|
+
current = enter_component(current, name, pending)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
throw new Error(`Refusing to write ${target}: too many links`)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function is_within(root: string, target: string): boolean {
|
|
85
|
+
const relative = path.relative(root, target)
|
|
86
|
+
|
|
87
|
+
return relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Only a path named inside the project is held to it: one the caller names elsewhere (a scratch
|
|
91
|
+
// directory) is that caller's choice, and the link the guard is for sits inside the project.
|
|
92
|
+
function does_escape_project(destination_path: string): boolean {
|
|
93
|
+
if (!is_within(path.resolve(PROJECT_ROOT), path.resolve(destination_path))) return false
|
|
94
|
+
|
|
95
|
+
return !is_within(resolve_write_path(PROJECT_ROOT), resolve_write_path(destination_path))
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// A symlinked destination is written through, and one pointing outside the project (`~/.zshrc`)
|
|
99
|
+
// would let a sync overwrite a file the project does not own. A link that stays inside —
|
|
100
|
+
// `CLAUDE.md` → `AGENTS.md`, `.agents/skills` — is written through as before. The check runs before
|
|
101
|
+
// the parent directories are created, so a directory link to outside gets none created through it.
|
|
102
|
+
function write_contained(destination_path: string, content: string | Buffer): void {
|
|
103
|
+
if (does_escape_project(destination_path)) {
|
|
104
|
+
throw new Error(`Refusing to write ${destination_path}: it resolves outside the project`)
|
|
105
|
+
}
|
|
42
106
|
|
|
43
107
|
mkdirSync(path.dirname(destination_path), { recursive: true })
|
|
44
108
|
writeFileSync(destination_path, content)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function write_text_if_changed(destination_path: string, content: string): boolean {
|
|
112
|
+
if (is_same_file_content(destination_path, content)) return false
|
|
113
|
+
|
|
114
|
+
write_contained(destination_path, content)
|
|
45
115
|
|
|
46
116
|
return true
|
|
47
117
|
}
|
|
48
118
|
|
|
49
|
-
export const file_content = { is_same_file_content, write_text_if_changed }
|
|
119
|
+
export const file_content = { is_same_file_content, write_contained, write_text_if_changed }
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync,
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { init_ai_copy } from '#scripts/init/init-ai-copy'
|
|
4
4
|
import { transform_copied_content } from '#scripts/init/init-copy-content'
|
|
@@ -16,7 +16,6 @@ import { skill_migration, type MigrationResult } from './skill-migration'
|
|
|
16
16
|
import { sync_hook_safety } from './sync-hook-safety'
|
|
17
17
|
|
|
18
18
|
const WORKSPACE_YAML = 'pnpm-workspace.yaml'
|
|
19
|
-
const PACKAGE_JSON = 'package.json'
|
|
20
19
|
const CLAUDE_MD_FILENAME = 'CLAUDE.md'
|
|
21
20
|
const CLAUDE_SETTINGS_FILE = '.claude/settings.json'
|
|
22
21
|
const CODEX_HOOKS_FILE = '.codex/hooks.json'
|
|
@@ -37,7 +36,7 @@ function should_skip_hook_file(filename: string): boolean {
|
|
|
37
36
|
if (filename !== CLAUDE_SETTINGS_FILE && filename !== CODEX_HOOKS_FILE) return false
|
|
38
37
|
const warning = sync_hook_safety.hook_write_warning(
|
|
39
38
|
PROJECT_ROOT,
|
|
40
|
-
sync_hook_safety.read_version_at(
|
|
39
|
+
sync_hook_safety.read_version_at(PACKAGE_DIR),
|
|
41
40
|
filename,
|
|
42
41
|
)
|
|
43
42
|
if (warning === undefined) return false
|
|
@@ -191,8 +190,7 @@ function sync_claude_md(destination_path: string, shape?: ProjectShape): void {
|
|
|
191
190
|
return
|
|
192
191
|
}
|
|
193
192
|
|
|
194
|
-
|
|
195
|
-
writeFileSync(destination_path, ensured)
|
|
193
|
+
file_content.write_contained(destination_path, ensured)
|
|
196
194
|
console.info(` ✔ synced ${CLAUDE_MD_FILENAME}`)
|
|
197
195
|
}
|
|
198
196
|
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { existsSync,
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { init_logic } from '#scripts/init/init-logic'
|
|
4
4
|
import { PACKAGE_DIR } from '#scripts/init/init-paths'
|
|
5
5
|
import { vscode_tasks } from '#scripts/init/vscode-tasks'
|
|
6
6
|
import { string_array_schema, vscode_settings_schema } from '#scripts/lib/schemas'
|
|
7
|
+
import { file_content } from './file-content'
|
|
7
8
|
|
|
8
9
|
type MergeFunction = (existing: string) => string
|
|
9
10
|
|
|
@@ -26,7 +27,7 @@ function sync_with_merge(
|
|
|
26
27
|
return
|
|
27
28
|
}
|
|
28
29
|
|
|
29
|
-
|
|
30
|
+
file_content.write_contained(destination_path, merged)
|
|
30
31
|
console.info(` ✔ synced ${destination_name}`)
|
|
31
32
|
}
|
|
32
33
|
|
|
@@ -107,7 +108,7 @@ function sync_secretlint_config(destination_path: string): void {
|
|
|
107
108
|
return
|
|
108
109
|
}
|
|
109
110
|
|
|
110
|
-
|
|
111
|
+
file_content.write_contained(destination_path, init_logic.generate_secretlint_config())
|
|
111
112
|
console.info(' ✔ created .secretlintrc.json')
|
|
112
113
|
}
|
|
113
114
|
|
|
@@ -143,29 +144,16 @@ function sync_vscode_settings_json(destination_path: string): void {
|
|
|
143
144
|
)
|
|
144
145
|
}
|
|
145
146
|
|
|
146
|
-
//
|
|
147
|
-
//
|
|
148
|
-
// without a tasks.json has nothing of its own to protect. An existing file keeps every task whose
|
|
149
|
-
// label kit does not ship.
|
|
147
|
+
// Like the other `.vscode` syncs, never creates the file: `josh init` does, and a project without it
|
|
148
|
+
// opted out. An existing file keeps every task whose label kit does not ship.
|
|
150
149
|
function sync_vscode_tasks_json(destination_path: string): void {
|
|
151
|
-
const
|
|
152
|
-
path.join(PACKAGE_DIR, '.vscode', vscode_tasks.VSCODE_TASKS_FILENAME),
|
|
153
|
-
'utf8',
|
|
150
|
+
const kit_tasks = vscode_tasks.read_kit_tasks(
|
|
151
|
+
readFileSync(path.join(PACKAGE_DIR, '.vscode', vscode_tasks.VSCODE_TASKS_FILENAME), 'utf8'),
|
|
154
152
|
)
|
|
155
153
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
sync_with_merge(destination_path, '.vscode/tasks.json', (existing) =>
|
|
160
|
-
vscode_tasks.merge_tasks(existing, kit_tasks),
|
|
161
|
-
)
|
|
162
|
-
|
|
163
|
-
return
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
mkdirSync(path.dirname(destination_path), { recursive: true })
|
|
167
|
-
writeFileSync(destination_path, kit_content)
|
|
168
|
-
console.info(' ✔ created .vscode/tasks.json')
|
|
154
|
+
sync_with_merge(destination_path, '.vscode/tasks.json', (existing) =>
|
|
155
|
+
vscode_tasks.merge_tasks(existing, kit_tasks),
|
|
156
|
+
)
|
|
169
157
|
}
|
|
170
158
|
|
|
171
159
|
const sync_configs = {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from 'node:fs'
|
|
2
1
|
import path from 'node:path'
|
|
3
|
-
import {
|
|
2
|
+
import { package_manifest } from '#scripts/lib/package-manifest'
|
|
4
3
|
import { package_version_schema } from '#scripts/lib/schemas'
|
|
5
4
|
import { KIT_PACKAGE_NAME } from '#scripts/version/kit-descriptor'
|
|
6
5
|
import semver from 'semver'
|
|
@@ -18,20 +17,15 @@ import semver from 'semver'
|
|
|
18
17
|
|
|
19
18
|
const NODE_MODULES = 'node_modules'
|
|
20
19
|
|
|
21
|
-
function read_version_at(
|
|
22
|
-
|
|
23
|
-
const parsed = package_version_schema.safeParse(
|
|
24
|
-
json_value.parse_or_undefined(readFileSync(package_json_path, 'utf8')),
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
return parsed.success ? parsed.data.version : undefined
|
|
20
|
+
function read_version_at(package_directory: string): string | undefined {
|
|
21
|
+
return package_manifest.read_manifest_if_valid(package_directory, package_version_schema)?.version
|
|
28
22
|
}
|
|
29
23
|
|
|
30
24
|
// The version of kit installed in the consumer's node_modules — the bundle the rewritten hooks
|
|
31
25
|
// actually run. Undefined before the first install, which is safe: a fresh install receives the
|
|
32
26
|
// matching bundle, so there is nothing older to break.
|
|
33
27
|
function installed_consumer_version(project_root: string): string | undefined {
|
|
34
|
-
return read_version_at(path.join(project_root, NODE_MODULES, KIT_PACKAGE_NAME
|
|
28
|
+
return read_version_at(path.join(project_root, NODE_MODULES, KIT_PACKAGE_NAME))
|
|
35
29
|
}
|
|
36
30
|
|
|
37
31
|
// Unsafe only when both versions are known AND the installed bundle the hooks run is older than the
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { main } from './sync'
|
|
4
|
+
|
|
5
|
+
// The `josh sync` entry, kept apart from `sync.ts` because `init.ts` imports that one: a bundle is one
|
|
6
|
+
// file, so a main guard there would fire for every command that carries it (joshuafolkken/kit#4186).
|
|
7
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
8
|
+
const ARGV_OFFSET = 2
|
|
9
|
+
|
|
10
|
+
main(process.argv.slice(ARGV_OFFSET))
|
|
11
|
+
}
|
package/scripts/sync/sync.ts
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
import { existsSync, readFileSync, rmSync, writeFileSync } from 'node:fs'
|
|
1
|
+
import { existsSync, readFileSync, rmSync } from 'node:fs'
|
|
3
2
|
import path from 'node:path'
|
|
4
|
-
import {
|
|
3
|
+
import { dependabot_cooldown } from '#scripts/dependabot/dependabot-cooldown'
|
|
5
4
|
import { project_checks } from '#scripts/gate/project-checks'
|
|
6
5
|
import { gh_spawn } from '#scripts/gh/gh-spawn'
|
|
7
|
-
import { basic_path_migration } from '#scripts/init/basic-path-migration'
|
|
8
6
|
import { init_logic } from '#scripts/init/init-logic'
|
|
9
7
|
import { PACKAGE_DIR, PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
10
8
|
import { project_profile } from '#scripts/init/project-profile'
|
|
9
|
+
import { PACKAGE_JSON } from '#scripts/lib/package-manifest'
|
|
11
10
|
import { auto_merge_setting } from '#scripts/repo/auto-merge-setting'
|
|
12
11
|
import { repository_labels } from '#scripts/repo/repository-labels'
|
|
13
12
|
import { project_config } from '#scripts/safe-chain/project-config'
|
|
@@ -19,9 +18,7 @@ import { file_content } from './file-content'
|
|
|
19
18
|
import { sync_ai_files } from './sync-ai-files'
|
|
20
19
|
import { sync_configs } from './sync-configs'
|
|
21
20
|
|
|
22
|
-
const
|
|
23
|
-
const PACKAGE_JSON_UNCHANGED_MSG = ' ✔ unchanged package.json'
|
|
24
|
-
const BASIC_PRETTIER_CONFIG = 'prettier.config.mjs'
|
|
21
|
+
const PACKAGE_JSON_UNCHANGED_MSG = ` ✔ unchanged ${PACKAGE_JSON}`
|
|
25
22
|
|
|
26
23
|
function did_migrate_prettierrc(destination_path: string): boolean {
|
|
27
24
|
const legacy_path = path.join(path.dirname(destination_path), '.prettierrc')
|
|
@@ -29,7 +26,7 @@ function did_migrate_prettierrc(destination_path: string): boolean {
|
|
|
29
26
|
|
|
30
27
|
const existing = readFileSync(legacy_path, 'utf8')
|
|
31
28
|
|
|
32
|
-
|
|
29
|
+
file_content.write_contained(
|
|
33
30
|
destination_path,
|
|
34
31
|
init_logic.merge_prettier_config(existing, path.dirname(destination_path)),
|
|
35
32
|
)
|
|
@@ -48,7 +45,7 @@ function write_merged_prettier_config(destination_path: string): void {
|
|
|
48
45
|
return
|
|
49
46
|
}
|
|
50
47
|
|
|
51
|
-
|
|
48
|
+
file_content.write_contained(destination_path, merged)
|
|
52
49
|
console.info(' ✔ synced prettier.config.js')
|
|
53
50
|
}
|
|
54
51
|
|
|
@@ -64,20 +61,6 @@ function sync_prettier_config(destination_path: string): void {
|
|
|
64
61
|
write_merged_prettier_config(destination_path)
|
|
65
62
|
}
|
|
66
63
|
|
|
67
|
-
// A basic project's prettier config written under the static profile name still imports the static
|
|
68
|
-
// preset path; it is moved onto the basic one with the rule `josh init` applies.
|
|
69
|
-
function sync_basic_prettier_config(destination_path: string): void {
|
|
70
|
-
if (!existsSync(destination_path)) return
|
|
71
|
-
|
|
72
|
-
const existing = readFileSync(destination_path, 'utf8')
|
|
73
|
-
const did_change = file_content.write_text_if_changed(
|
|
74
|
-
destination_path,
|
|
75
|
-
basic_path_migration.migrate_basic_paths(existing),
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
console.info(` ✔ ${did_change ? 'synced ' : 'unchanged'} ${BASIC_PRETTIER_CONFIG}`)
|
|
79
|
-
}
|
|
80
|
-
|
|
81
64
|
function sync_playwright_config(destination_path: string): void {
|
|
82
65
|
if (!existsSync(destination_path)) return
|
|
83
66
|
|
|
@@ -90,7 +73,7 @@ function sync_playwright_config(destination_path: string): void {
|
|
|
90
73
|
return
|
|
91
74
|
}
|
|
92
75
|
|
|
93
|
-
|
|
76
|
+
file_content.write_contained(destination_path, template)
|
|
94
77
|
console.info(' ✔ synced playwright.config.ts')
|
|
95
78
|
}
|
|
96
79
|
|
|
@@ -106,7 +89,7 @@ function sync_deploy_vps(destination_path: string): void {
|
|
|
106
89
|
return
|
|
107
90
|
}
|
|
108
91
|
|
|
109
|
-
|
|
92
|
+
file_content.write_contained(destination_path, patched)
|
|
110
93
|
console.info(' ✔ synced deploy-vps.yml')
|
|
111
94
|
}
|
|
112
95
|
|
|
@@ -156,7 +139,7 @@ function sync_package_json_with(
|
|
|
156
139
|
return
|
|
157
140
|
}
|
|
158
141
|
|
|
159
|
-
|
|
142
|
+
file_content.write_contained(destination_path, transformed)
|
|
160
143
|
console.info(synced_message)
|
|
161
144
|
}
|
|
162
145
|
|
|
@@ -255,6 +238,13 @@ function report_repository_settings(name_with_owner: string | undefined): void {
|
|
|
255
238
|
repository_labels.ensure_labels(name_with_owner)
|
|
256
239
|
}
|
|
257
240
|
|
|
241
|
+
// Every file that restates the workspace's `minimumReleaseAge`: Safe Chain's `.aikido` and
|
|
242
|
+
// Dependabot's `cooldown`.
|
|
243
|
+
function sync_release_window_mirrors(root: string): void {
|
|
244
|
+
project_config.sync_project_config(root)
|
|
245
|
+
dependabot_cooldown.sync_dependabot_cooldown(root)
|
|
246
|
+
}
|
|
247
|
+
|
|
258
248
|
function sync_project_artifacts(is_force: boolean): void {
|
|
259
249
|
sync_ai_files.sync_ai_copy_all(is_force)
|
|
260
250
|
sync_prettier_config(path.join(PROJECT_ROOT, 'prettier.config.js'))
|
|
@@ -267,20 +257,19 @@ function sync_project_artifacts(is_force: boolean): void {
|
|
|
267
257
|
|
|
268
258
|
sync_sonar_with_template(name_with_owner, is_force)
|
|
269
259
|
sync_config_files()
|
|
270
|
-
// After `sync_ai_copy_all`, which may add the `pnpm-workspace.yaml` window
|
|
271
|
-
//
|
|
272
|
-
|
|
260
|
+
// After `sync_ai_copy_all`, which may add the `pnpm-workspace.yaml` window both mirrors are derived
|
|
261
|
+
// from, and which rewrites `.github/dependabot.yml` itself.
|
|
262
|
+
sync_release_window_mirrors(PROJECT_ROOT)
|
|
273
263
|
sync_package_json_migrations(path.join(PROJECT_ROOT, PACKAGE_JSON))
|
|
274
264
|
report_repository_settings(name_with_owner)
|
|
275
265
|
}
|
|
276
266
|
|
|
277
|
-
// A basic project gets what `josh init` gives that profile and nothing more: its AI file set
|
|
278
|
-
//
|
|
279
|
-
//
|
|
267
|
+
// A basic project gets what `josh init` gives that profile and nothing more: its AI file set. The full
|
|
268
|
+
// toolchain's configs, Sonar, package.json migrations and repository settings are never written into
|
|
269
|
+
// it.
|
|
280
270
|
function sync_basic_artifacts(is_force: boolean): void {
|
|
281
271
|
console.info('profile: basic (package.json josh.profile)\n')
|
|
282
272
|
sync_ai_files.sync_ai_copy_all(is_force, project_profile.inspect_project(PROJECT_ROOT, 'basic'))
|
|
283
|
-
sync_basic_prettier_config(path.join(PROJECT_ROOT, BASIC_PRETTIER_CONFIG))
|
|
284
273
|
}
|
|
285
274
|
|
|
286
275
|
// Checked before anything is written, never per file: the damage is the whole run, and a partial
|
|
@@ -289,10 +278,10 @@ function sync_basic_artifacts(is_force: boolean): void {
|
|
|
289
278
|
//
|
|
290
279
|
// Only a recorded basic profile switches the file set; an unrecorded one stays full, as every
|
|
291
280
|
// project initialized before the profile was recorded was set up.
|
|
292
|
-
function main(): void {
|
|
281
|
+
function main(args: ReadonlyArray<string> = []): void {
|
|
293
282
|
if (did_refuse_self_run(PACKAGE_DIR, PROJECT_ROOT)) return
|
|
294
283
|
|
|
295
|
-
const is_force =
|
|
284
|
+
const is_force = args.includes('--force')
|
|
296
285
|
|
|
297
286
|
console.info('\n🔄 Syncing @joshuafolkken/kit AI files\n')
|
|
298
287
|
if (project_checks.is_basic(PROJECT_ROOT)) sync_basic_artifacts(is_force)
|
|
@@ -300,8 +289,6 @@ function main(): void {
|
|
|
300
289
|
console.info('\n✅ Done.\n')
|
|
301
290
|
}
|
|
302
291
|
|
|
303
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) main()
|
|
304
|
-
|
|
305
292
|
const sync = {
|
|
306
293
|
should_skip_hook_file: sync_ai_files.should_skip_hook_file,
|
|
307
294
|
sync_file_mapping: sync_ai_files.sync_file_mapping,
|
|
@@ -318,6 +305,7 @@ const sync = {
|
|
|
318
305
|
sync_prepare_lefthook_warning,
|
|
319
306
|
sync_safe_chain_preinstall,
|
|
320
307
|
sync_package_json_migrations,
|
|
308
|
+
sync_release_window_mirrors,
|
|
321
309
|
migrate_prettierrc: did_migrate_prettierrc,
|
|
322
310
|
}
|
|
323
311
|
|