@joshuafolkken/kit 1.1240.0 → 1.1373.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 -0
- package/.claude/settings.json +4 -0
- package/.claude/skills/dependency-update/SKILL.md +5 -3
- package/.claude/skills/epic-commands/SKILL.md +82 -113
- package/.claude/skills/epic-commands/epic-bundle.md +38 -63
- package/.claude/skills/epic-commands/execution-waves.md +30 -51
- package/.claude/skills/verify-ui/SKILL.md +13 -20
- package/.claude/skills/workflow-commands/SKILL.md +10 -10
- package/.claude/skills/workflow-commands/background-commands.md +4 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +30 -105
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +29 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +45 -131
- package/.claude/skills/workflow-commands/backlogrun-park.md +36 -53
- package/.claude/skills/workflow-commands/backlogrun-progress.md +81 -331
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +29 -83
- package/.claude/skills/workflow-commands/backlogrun-steps.md +105 -424
- package/.claude/skills/workflow-commands/backlogrun.md +52 -61
- package/.claude/skills/workflow-commands/chain-rule.md +36 -40
- package/.claude/skills/workflow-commands/entry-sequence.md +6 -6
- package/.claude/skills/workflow-commands/followup.md +19 -20
- package/.claude/skills/workflow-commands/fullrun-steps.md +23 -27
- package/.claude/skills/workflow-commands/fullrun.md +10 -10
- package/.claude/skills/workflow-commands/halfrun.md +9 -8
- package/.claude/skills/workflow-commands/into-target.md +12 -18
- package/.claude/skills/workflow-commands/issue-comments.md +11 -26
- package/.claude/skills/workflow-commands/kickoff.md +26 -16
- package/.claude/skills/workflow-commands/latest-gate.md +17 -28
- package/.claude/skills/workflow-commands/needs-human-review.md +13 -24
- package/.claude/skills/workflow-commands/observation-filing.md +37 -28
- package/.claude/skills/workflow-commands/observation-ledger.md +48 -38
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -9
- package/.claude/skills/workflow-commands/prerequisite.md +23 -15
- package/.claude/skills/workflow-commands/progress-watcher.md +17 -11
- package/.claude/skills/workflow-commands/prrun.md +3 -3
- package/.claude/skills/workflow-commands/retrospective.md +13 -18
- package/.claude/skills/workflow-commands/split-assessment.md +6 -4
- package/.claude/skills/workflow-commands/target-repository.md +25 -28
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -17
- package/.gitattributes +2 -1
- package/.github/workflows/ci.yml +14 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +23 -66
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +43 -11
- package/dist/config-merge/index.js +11 -2
- package/dist/hooks/audit-provision.js +2 -2
- package/dist/hooks/batch-guard.js +7 -7
- package/dist/hooks/{chunk-KHGB5S3Y.js → chunk-7UBFU3CL.js} +18 -20
- package/dist/hooks/{chunk-ZQGD4GBY.js → chunk-7WKYHEGU.js} +8 -44
- package/dist/hooks/{chunk-4TZVB44A.js → chunk-AKGCP4LX.js} +285 -363
- package/dist/hooks/{chunk-QVSWU24O.js → chunk-BZMPVFDY.js} +7 -5
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-GPTFMK5E.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-XZYKEM6J.js → chunk-JCRDBQXB.js} +13 -11
- package/dist/hooks/{chunk-F3ELQ2AF.js → chunk-JGW24KKM.js} +4 -4
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-WK2XSHSI.js → chunk-SLSFIWTX.js} +550 -875
- package/dist/hooks/chunk-UTHMB4O2.js +1590 -0
- package/dist/hooks/{chunk-KRBERBBI.js → chunk-V4TKZHER.js} +4 -4
- package/dist/hooks/chunk-YLBBSSTF.js +3705 -0
- package/dist/hooks/chunk-Z5TMJIPW.js +45 -0
- package/dist/hooks/codex-hook-adapter.js +26 -21
- package/dist/hooks/duplicate-read-guard.js +8 -8
- package/dist/hooks/format-edited.js +4 -4
- package/dist/hooks/inputs.json +195 -181
- package/dist/hooks/investigation-guard.js +8 -8
- package/dist/hooks/pretool-guard.js +15 -15
- package/dist/hooks/session-lang.js +406 -8
- package/dist/hooks/stop-guard.js +122 -187
- package/dist/josh.js +282 -95
- package/dist/version/index.js +15 -13
- package/eslint/base.js +43 -5
- package/eslint/rules/english-only-prose.js +3 -3
- package/eslint/rules/import.js +12 -0
- package/eslint/rules/namespace-object-export.js +2 -2
- package/package.json +17 -11
- package/pnpm-workspace.yaml +2 -4
- package/prompts/coding-standards.md +14 -48
- package/prompts/collaboration-workflow/file-edits.md +1 -1
- package/prompts/collaboration-workflow/issue-citation.md +1 -1
- package/prompts/collaboration-workflow/issue-template.md +3 -10
- package/prompts/collaboration-workflow/operating-rules.md +7 -8
- package/prompts/collaboration-workflow/output-bounds.md +1 -1
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +2 -1
- package/prompts/collaboration-workflow/principles.md +21 -3
- package/prompts/collaboration-workflow/report-format.md +16 -29
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +7 -95
- package/prompts/collaboration-workflow/shell-body.md +3 -23
- package/prompts/collaboration-workflow/turn-batching.md +4 -13
- package/prompts/collaboration-workflow/wip-cap.md +5 -11
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +3 -22
- package/prompts/review.md +15 -38
- package/prompts/testing-guide.md +2 -4
- package/scripts/adopt/adopt-logic.ts +5 -5
- package/scripts/adopt/adopt-toolkits.ts +4 -5
- package/scripts/adopt/adopt.ts +2 -3
- package/scripts/agent/agent-argv.ts +7 -7
- package/scripts/agent/agent-diagnostics.ts +2 -2
- package/scripts/agent/agent-exit-record.ts +1 -1
- package/scripts/agent/agent-headless.ts +1 -1
- package/scripts/agent/agent-launch-environment.ts +6 -1
- package/scripts/agent/agent-role-profile.ts +49 -22
- package/scripts/agent/agent-session-role.ts +32 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +4 -4
- package/scripts/agent/claude-result-event.ts +4 -4
- package/scripts/agent/codex-hooks.ts +2 -2
- package/scripts/agent/interactive-ask.ts +3 -6
- package/scripts/auto-ok/auto-ok-cli.ts +46 -60
- package/scripts/backlog/backlog-arrival-added.ts +34 -0
- package/scripts/backlog/backlog-arrival.ts +54 -17
- package/scripts/backlog/backlog-budget-cli.ts +34 -6
- package/scripts/backlog/backlog-budget.ts +17 -24
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +5 -4
- package/scripts/backlog/backlog-drive-cli.ts +14 -10
- package/scripts/backlog/backlog-drive-epic.ts +85 -0
- package/scripts/backlog/backlog-drive-launch.ts +1 -1
- package/scripts/backlog/backlog-drive-named-offer.ts +60 -9
- package/scripts/backlog/backlog-drive-named.ts +39 -9
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +2 -2
- package/scripts/backlog/backlog-drive.ts +43 -28
- package/scripts/backlog/backlog-idle.ts +88 -0
- package/scripts/backlog/backlog-named.ts +11 -15
- package/scripts/backlog/backlog-next.ts +26 -30
- package/scripts/backlog/backlog-offer-cli.ts +28 -23
- package/scripts/backlog/backlog-offer.ts +7 -7
- package/scripts/backlog/backlog-overlap.ts +178 -0
- package/scripts/backlog/backlog-plan-cli.ts +14 -90
- package/scripts/backlog/backlog-plan-read.ts +111 -0
- package/scripts/backlog/backlog-plan.ts +11 -10
- package/scripts/backlog/backlog-pool.ts +13 -14
- package/scripts/backlog/backlog-rank.ts +11 -11
- package/scripts/backlog/backlog-ready.ts +15 -10
- package/scripts/backlog/backlog-scope.ts +14 -15
- package/scripts/backlog/backlog-stalled-cli.ts +2 -2
- package/scripts/backlog/backlog-stalled-detect.ts +4 -4
- package/scripts/backlog/backlog-stalled.ts +5 -6
- package/scripts/backlog/backlog-waves.ts +4 -4
- package/scripts/backlog/backlogrun-args.ts +74 -0
- package/scripts/backlog/backlogrun-cli.ts +113 -0
- package/scripts/backlog/backlogrun-launch.ts +178 -0
- package/scripts/behavior/behavior-assertion.ts +6 -8
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +3 -3
- package/scripts/build/build-claude-md.ts +4 -4
- package/scripts/build/build-codex-hooks.ts +2 -2
- package/scripts/build/build-commands.ts +1 -1
- package/scripts/build/build-hooks.ts +5 -5
- package/scripts/build/build.ts +1 -1
- package/scripts/build/hook-bundle-stamp.ts +109 -7
- package/scripts/build/local-bin.ts +2 -2
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +2 -2
- package/scripts/ci/composite-actions.ts +1 -2
- package/scripts/ci/pr-classification.ts +2 -2
- package/scripts/claude/workflow-destination.ts +1 -1
- package/scripts/clone/clone-aggregate.ts +1 -1
- package/scripts/clone/clone-fingerprint.ts +1 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/index.ts +1 -1
- package/scripts/config-merge/json-format.ts +1 -3
- package/scripts/config-merge/patch-json-array.ts +90 -0
- package/scripts/config-merge/patch-json-key.ts +6 -3
- package/scripts/config-merge/patch-json-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +1 -1
- package/scripts/cost-runtime/context-cut-payback.ts +4 -5
- package/scripts/cost-runtime/context-cut-threshold.ts +4 -6
- package/scripts/cost-runtime/cost-attribute.ts +3 -3
- package/scripts/cost-runtime/cost-blocks.ts +3 -4
- package/scripts/cost-runtime/cost-cli.ts +14 -11
- package/scripts/cost-runtime/cost-corpus.ts +11 -11
- package/scripts/cost-runtime/cost-pricing.ts +4 -4
- package/scripts/cost-runtime/cost-tokens.ts +1 -2
- package/scripts/cost-runtime/cost-transcript.ts +29 -29
- package/scripts/cost-runtime/cost-usage.ts +6 -7
- package/scripts/cost-runtime/cost-verdict.ts +10 -11
- package/scripts/cost-runtime/own-session.ts +1 -1
- package/scripts/cost-runtime/transcript-cwd.ts +2 -2
- package/scripts/delegation/delegation-cli.ts +4 -4
- package/scripts/delegation/delegation-policy.ts +13 -15
- package/scripts/delegation/duplicate-read-guard.ts +9 -10
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +1 -1
- package/scripts/delegation/investigation-guard.ts +18 -22
- package/scripts/delegation/investigation-reads.ts +48 -238
- package/scripts/discovery/repo-discovery.ts +1 -1
- package/scripts/discovery/repo-map-logic.ts +1 -2
- package/scripts/discovery/repo-origin.ts +3 -3
- package/scripts/discovery/repo-party-cli.ts +2 -2
- package/scripts/discovery/repo-party.ts +2 -2
- package/scripts/doctor/doctor-consumer.ts +1 -1
- package/scripts/doctor/doctor-io.ts +6 -7
- package/scripts/doctor/doctor-logic.ts +1 -1
- package/scripts/doctor/doctor-ports.ts +1 -1
- package/scripts/doctor/doctor.ts +8 -9
- package/scripts/document/backlogrun-parent-read-set.ts +5 -6
- package/scripts/document/bash-output-cap.ts +5 -7
- package/scripts/document/capped-print-part.ts +1 -1
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/document-byte-budget.ts +33 -64
- package/scripts/document/document-byte-check.ts +4 -4
- package/scripts/document/document-reachability.ts +7 -8
- package/scripts/document/document-read-cli.ts +2 -2
- package/scripts/document/document-scan.ts +30 -5
- package/scripts/document/document-section-cli.ts +6 -8
- package/scripts/document/document-section.ts +8 -12
- package/scripts/document/edit-files-cli.ts +3 -4
- package/scripts/document/entry-read-budget.ts +8 -70
- package/scripts/document/entry-read-set.ts +51 -34
- package/scripts/document/lane-child-read-set.ts +9 -9
- package/scripts/document/read-files-cli.ts +1 -2
- package/scripts/document/read-set-cli.ts +16 -19
- package/scripts/document/read-set-cost.ts +4 -4
- package/scripts/document/read-set-point-of-use.ts +28 -38
- package/scripts/document/read-set-pricing.ts +1 -1
- package/scripts/document/read-set-trim.ts +3 -3
- package/scripts/document/resident-budget.ts +8 -10
- package/scripts/epic/epic-add-body.ts +15 -18
- package/scripts/epic/epic-add-plan.ts +26 -28
- package/scripts/epic/epic-add.ts +32 -25
- package/scripts/epic/epic-audit-checks.ts +27 -37
- package/scripts/epic/epic-audit-cli.ts +21 -22
- package/scripts/epic/epic-audit-orphans.ts +16 -17
- package/scripts/epic/epic-audit-rationale.ts +10 -15
- package/scripts/epic/epic-audit-report.ts +2 -5
- package/scripts/epic/epic-audit.ts +18 -14
- package/scripts/epic/epic-body.ts +10 -10
- package/scripts/epic/epic-bundle-cli.ts +36 -34
- package/scripts/epic/epic-bundle-evidence.ts +5 -5
- package/scripts/epic/epic-bundle-gaps.ts +6 -9
- package/scripts/epic/epic-bundle-poll.ts +1 -1
- package/scripts/epic/epic-bundle-referenced.ts +11 -14
- package/scripts/epic/epic-bundle.ts +19 -20
- package/scripts/epic/epic-busy.ts +44 -21
- package/scripts/epic/epic-candidate-confirm.ts +15 -18
- package/scripts/epic/epic-chains.ts +18 -23
- package/scripts/epic/epic-classify.ts +11 -12
- package/scripts/epic/epic-cli-argv.ts +5 -6
- package/scripts/epic/epic-cli-remove.ts +9 -4
- package/scripts/epic/epic-cli.ts +38 -26
- package/scripts/epic/epic-close-comment.ts +14 -15
- package/scripts/epic/epic-close.ts +25 -29
- package/scripts/epic/epic-cross-repo.ts +18 -21
- package/scripts/epic/epic-decision.ts +14 -18
- package/scripts/epic/epic-fetch.ts +25 -31
- package/scripts/epic/epic-graph.ts +15 -17
- package/scripts/epic/epic-index.ts +14 -16
- package/scripts/epic/epic-issue.ts +9 -11
- package/scripts/epic/epic-label-age.ts +74 -0
- package/scripts/epic/epic-lane-offer.ts +35 -24
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +8 -8
- package/scripts/epic/epic-next-views.ts +12 -12
- package/scripts/epic/epic-next.ts +29 -33
- package/scripts/epic/epic-outside-blocker.ts +11 -10
- package/scripts/epic/epic-parse.ts +22 -24
- package/scripts/epic/epic-promote.ts +3 -2
- package/scripts/epic/epic-rank.ts +1 -1
- package/scripts/epic/epic-read.ts +10 -8
- package/scripts/epic/epic-reconcile.ts +8 -6
- package/scripts/epic/epic-reference.ts +5 -4
- package/scripts/epic/epic-relation-recheck.ts +10 -11
- package/scripts/epic/epic-relations.ts +9 -8
- package/scripts/epic/epic-remove-plan.ts +4 -5
- package/scripts/epic/epic-remove.ts +7 -5
- package/scripts/epic/epic-report.ts +18 -20
- package/scripts/epic/epic-run.ts +6 -5
- package/scripts/epic/epic-sections.ts +2 -2
- package/scripts/epic/epic-shape.ts +3 -3
- package/scripts/epic/epic-solo-stale.ts +3 -2
- package/scripts/epic/epic-solo.ts +8 -8
- package/scripts/epic/epic-triage.ts +5 -4
- package/scripts/epic/epic-validate.ts +8 -7
- package/scripts/epic/epic.ts +5 -5
- package/scripts/exports/unused-members-cli.ts +1 -1
- package/scripts/followup/followup-issue-number.ts +1 -2
- package/scripts/followup/git-followup-cleanup.ts +6 -7
- package/scripts/followup/git-followup-finish.ts +11 -13
- package/scripts/followup/git-followup-flush.ts +11 -7
- package/scripts/followup/git-followup-issue-close.ts +16 -13
- package/scripts/followup/git-followup-label.ts +9 -6
- package/scripts/followup/git-followup-merged.ts +1 -1
- package/scripts/followup/git-followup-pending.ts +7 -9
- package/scripts/followup/git-followup-stages.ts +28 -17
- package/scripts/followup/git-followup-workflow.ts +19 -21
- package/scripts/followup/git-pr-followup-checks.ts +13 -20
- package/scripts/followup/git-pr-followup-wrapup.ts +7 -7
- package/scripts/followup/git-pr-followup.ts +18 -17
- package/scripts/gate/core-admission.ts +2 -2
- package/scripts/gate/core-budget.ts +15 -26
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +70 -35
- package/scripts/gate/gate-report.ts +14 -15
- package/scripts/gate/gate-skip.ts +11 -13
- package/scripts/gate/gate-steps.ts +5 -1
- package/scripts/gate/gate-tree.ts +3 -4
- package/scripts/gate/hook-gate-reuse.ts +9 -9
- package/scripts/gate/machine-capacity.ts +168 -30
- package/scripts/gate/pre-commit-type-check.ts +4 -4
- package/scripts/gate/project-checks.ts +12 -4
- package/scripts/gate/scoped-green.ts +11 -18
- package/scripts/gate/type-check-command.ts +2 -2
- package/scripts/gate/type-check-step.ts +4 -4
- package/scripts/gate/verification-gate.ts +53 -51
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/gh/git-ai-review-scan.ts +3 -2
- package/scripts/gh/git-gh-api-path.ts +10 -11
- package/scripts/gh/git-gh-exec.ts +43 -48
- package/scripts/gh/git-gh-failure.ts +6 -9
- package/scripts/gh/git-gh-helpers.ts +1 -1
- package/scripts/gh/git-gh-issue-list.ts +15 -19
- package/scripts/gh/git-gh-issue-read.ts +43 -60
- package/scripts/gh/git-gh-issue-rest.ts +14 -15
- package/scripts/gh/git-gh-issue-write.ts +52 -40
- package/scripts/gh/git-gh-issue.ts +23 -24
- package/scripts/gh/git-gh-pr-auto-merge.ts +3 -3
- package/scripts/gh/git-gh-pr-read.ts +46 -50
- package/scripts/gh/git-gh-pr-rest.ts +23 -26
- package/scripts/gh/git-gh-pr-review.ts +2 -2
- package/scripts/gh/git-gh-pr-rollup.ts +4 -4
- package/scripts/gh/git-gh-pr-snapshot.ts +8 -10
- package/scripts/gh/git-gh-pr.ts +16 -16
- package/scripts/gh/git-gh-reachability.ts +11 -12
- package/scripts/gh/git-gh-repo.ts +2 -3
- package/scripts/gh/git-gh-rest-state.ts +1 -1
- package/scripts/gh/git-pr-ai-review.ts +6 -5
- package/scripts/gh/git-pr-checks-eval.ts +28 -30
- package/scripts/gh/git-pr-checks-parse.ts +14 -16
- package/scripts/gh/git-pr-checks-watch.ts +17 -17
- package/scripts/gh/git-pr-checks.ts +20 -23
- package/scripts/gh/git-pr-coderabbit.ts +8 -6
- package/scripts/gh/git-pr-confirmation.ts +5 -5
- package/scripts/gh/git-pr-managed-config.ts +7 -9
- package/scripts/gh/git-pr-messages.ts +1 -1
- package/scripts/gh/git-pr.ts +15 -16
- package/scripts/gh/github-issue-url.ts +8 -9
- package/scripts/git/base-tree.ts +66 -0
- package/scripts/git/change-base.ts +42 -2
- package/scripts/git/changed-file-scope.ts +5 -5
- package/scripts/git/changed-paths.ts +1 -2
- package/scripts/git/constants.ts +2 -2
- package/scripts/git/git-branch.ts +1 -1
- package/scripts/git/git-closes-keyword.ts +3 -3
- package/scripts/git/git-command.ts +53 -41
- package/scripts/git/git-common-directory.ts +3 -3
- package/scripts/git/git-diff-reads.ts +14 -15
- package/scripts/git/git-error.ts +1 -1
- package/scripts/git/git-execa-error.ts +1 -2
- package/scripts/git/git-issue.ts +10 -8
- package/scripts/git/git-location-environment.ts +3 -4
- package/scripts/git/git-ls-remote.ts +6 -8
- package/scripts/git/git-pre-push-hook.ts +11 -10
- package/scripts/git/git-preflight.ts +5 -5
- package/scripts/git/git-push-transport.ts +2 -2
- package/scripts/git/git-remote-branch.ts +1 -2
- package/scripts/git/git-schemas.ts +16 -23
- package/scripts/git/git-spawn-sync.ts +1 -1
- package/scripts/git/git-spawn.ts +37 -14
- package/scripts/git/git-ssh-keepalive.ts +12 -5
- package/scripts/git/git-staging.ts +7 -8
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/git-worktree.ts +35 -27
- package/scripts/git/gone-branch.ts +2 -2
- package/scripts/git/listing-cutoff.ts +1 -2
- package/scripts/git/lockfile-sync.ts +65 -0
- package/scripts/git/main-merge-guard.ts +1 -2
- package/scripts/git/main-merge.ts +7 -7
- package/scripts/git/main-sync.ts +23 -8
- package/scripts/git/parse-json-array.ts +18 -23
- package/scripts/git/repository-lock.ts +34 -2
- package/scripts/git/stash/git-stash.ts +4 -5
- package/scripts/git/stash/stash-orphans.ts +5 -3
- package/scripts/git/stash/stash-pop-args.ts +1 -1
- package/scripts/git/stash/stash-pop-cli.ts +3 -3
- package/scripts/git/stash/stash-sweep-lock.ts +2 -2
- package/scripts/hooks/batch-guard.ts +11 -13
- package/scripts/hooks/check-commit-message.ts +12 -9
- package/scripts/hooks/codex-hook-adapter.ts +16 -10
- package/scripts/hooks/edited-cspell.ts +3 -4
- package/scripts/hooks/format-edited-cli.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +11 -17
- package/scripts/hooks/format-rewrite-notice.ts +19 -17
- package/scripts/hooks/pre-push-unit.ts +10 -14
- package/scripts/hooks/pretool-guard-cli.ts +4 -4
- package/scripts/hooks/pretool-guard.ts +93 -18
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/step-zero-notice.ts +1 -1
- package/scripts/hooks/stop-guard.ts +21 -10
- package/scripts/init/basic-path-migration.ts +2 -2
- package/scripts/init/claude-kit-only-settings.ts +2 -2
- package/scripts/init/claude-plugin-config.ts +2 -2
- package/scripts/init/distributed-paths.ts +4 -4
- package/scripts/init/hook-command-rewrite.ts +3 -3
- package/scripts/init/hook-launch.ts +5 -5
- package/scripts/init/init-actions.ts +13 -0
- package/scripts/init/init-ai-copy.ts +11 -11
- package/scripts/init/init-bootstrap.ts +3 -3
- package/scripts/init/init-copy-content.ts +4 -4
- package/scripts/init/init-logic-json-merge.ts +7 -9
- package/scripts/init/init-logic-migrate.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic-workspace.ts +4 -4
- package/scripts/init/init-logic-yaml-merge.ts +2 -2
- package/scripts/init/init-logic.ts +19 -22
- package/scripts/init/init.ts +7 -7
- package/scripts/init/kit-base-preset.ts +1 -1
- package/scripts/init/kit-setup-state.ts +1 -1
- package/scripts/init/kit-written-paths.ts +1 -2
- package/scripts/init/package-manager-pin.ts +1 -1
- package/scripts/init/project-profile-cli.ts +1 -1
- package/scripts/init/project-profile.ts +3 -3
- package/scripts/init/session-language-environment.ts +1 -1
- package/scripts/init/start-exec.ts +3 -4
- package/scripts/init/start-plan.ts +2 -2
- package/scripts/init/start-setup-pr.ts +3 -2
- package/scripts/init/start-steps.ts +2 -2
- package/scripts/init/tsconfig-preset-migration.ts +1 -1
- package/scripts/init/vscode-tasks.ts +62 -0
- package/scripts/issue/baseline-measure.ts +2 -2
- package/scripts/issue/behavior-change-lint.ts +2 -2
- package/scripts/issue/defect-rate-cli.ts +6 -7
- package/scripts/issue/defect-rate.ts +37 -27
- package/scripts/issue/git-next-issues.ts +9 -8
- package/scripts/issue/issue-auto-ok.ts +24 -11
- package/scripts/issue/issue-backlinks-cli.ts +5 -5
- package/scripts/issue/issue-backlinks.ts +6 -6
- package/scripts/issue/issue-cite-cli.ts +20 -18
- package/scripts/issue/issue-cite.ts +18 -8
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +6 -4
- package/scripts/issue/issue-file-cli.ts +52 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +9 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +34 -38
- package/scripts/issue/issue-lint-cli.ts +2 -2
- package/scripts/issue/issue-lint.ts +1 -1
- package/scripts/issue/issue-merged.ts +10 -4
- package/scripts/issue/issue-number-shape.ts +27 -0
- package/scripts/issue/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +4 -5
- package/scripts/issue/issue-read.ts +4 -5
- package/scripts/issue/issue-reference.ts +5 -5
- package/scripts/issue/issue-release-cli.ts +17 -7
- package/scripts/issue/issue-release.ts +3 -3
- package/scripts/issue/issue-report-failures.ts +7 -4
- package/scripts/issue/issue-scout-cli.ts +11 -11
- package/scripts/issue/issue-scout-closed.ts +4 -4
- package/scripts/issue/issue-scout.ts +4 -5
- package/scripts/issue/issue-state-cli.ts +17 -10
- package/scripts/issue/issue-state.ts +12 -13
- package/scripts/issue/issue-wip.ts +7 -7
- package/scripts/issue/markdown-section.ts +3 -3
- package/scripts/issue/measure-rerun-cli.ts +10 -9
- package/scripts/issue/reproduction-measure.ts +3 -3
- package/scripts/issue/session-cite.ts +56 -0
- package/scripts/josh/agent-session-environment.ts +10 -8
- package/scripts/josh/cli-body.ts +2 -2
- package/scripts/josh/command-suggest.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +20 -23
- package/scripts/josh/hook-decision.ts +24 -28
- package/scripts/josh/josh-command-map.ts +4 -1
- package/scripts/josh/josh-command-types.ts +30 -35
- package/scripts/josh/josh-commands-ai.ts +6 -6
- package/scripts/josh/josh-commands-backlog.ts +15 -3
- package/scripts/josh/josh-commands-clone.ts +1 -1
- package/scripts/josh/josh-commands-development.ts +25 -4
- package/scripts/josh/josh-commands-document.ts +3 -3
- package/scripts/josh/josh-commands-guard.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +4 -5
- package/scripts/josh/josh-commands-lane.ts +14 -4
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-run.ts +21 -7
- package/scripts/josh/josh-commands-split.ts +1 -2
- package/scripts/josh/josh-commands-versioning.ts +5 -5
- package/scripts/josh/josh-commands-workflow.ts +30 -22
- package/scripts/josh/josh-environment-file.ts +1 -1
- package/scripts/josh/josh-in-process.ts +3 -3
- package/scripts/josh/josh-logic.ts +6 -7
- package/scripts/josh/josh-run.ts +3 -3
- package/scripts/josh/josh-verdict.ts +9 -12
- package/scripts/josh/josh.ts +3 -3
- package/scripts/josh/kit-only.ts +2 -2
- package/scripts/josh/path-decision.ts +3 -3
- package/scripts/josh/platform-temporary.ts +7 -5
- package/scripts/josh/process-identity.ts +24 -6
- package/scripts/josh/process-owner.ts +4 -4
- package/scripts/josh/session-language-cli.ts +53 -11
- package/scripts/josh/session-language.ts +1 -1
- package/scripts/josh/stamp-file.ts +48 -29
- package/scripts/josh/stamp-record.ts +57 -0
- package/scripts/lane/lane-await.ts +35 -11
- package/scripts/lane/lane-cache.ts +6 -6
- package/scripts/lane/lane-capacity.ts +32 -17
- package/scripts/lane/lane-child-invocation.ts +17 -15
- package/scripts/lane/lane-child-marker.ts +12 -12
- package/scripts/lane/lane-cli.ts +12 -13
- package/scripts/lane/lane-close.ts +6 -6
- package/scripts/lane/lane-dispatch.ts +61 -72
- package/scripts/lane/lane-environment.ts +5 -5
- package/scripts/lane/lane-guard-policy.ts +7 -21
- package/scripts/lane/lane-handoff.ts +2 -2
- package/scripts/lane/lane-install.ts +9 -10
- package/scripts/lane/lane-launch-cli.ts +13 -8
- package/scripts/lane/lane-ledger.ts +73 -11
- package/scripts/lane/lane-leftover.ts +2 -2
- package/scripts/lane/lane-limit-cli.ts +160 -0
- package/scripts/lane/lane-limit-override.ts +74 -0
- package/scripts/lane/lane-load.ts +19 -68
- package/scripts/lane/lane-measure-cli.ts +15 -25
- package/scripts/lane/lane-occupancy.ts +6 -4
- package/scripts/lane/lane-open.ts +20 -19
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +12 -11
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +16 -15
- package/scripts/lane/lane-relaunch.ts +9 -9
- package/scripts/lane/lane-report.ts +5 -4
- package/scripts/lane/lane-resume.ts +2 -2
- package/scripts/lane/lane-sampler.ts +55 -0
- package/scripts/lane/lane-seed.ts +7 -7
- package/scripts/lane/lane-stage-stats.ts +135 -0
- package/scripts/lane/lane-start-point.ts +8 -11
- package/scripts/lane/lane-stats.ts +60 -15
- package/scripts/lane/lane-stray.ts +1 -1
- package/scripts/lane/lane-vacant.ts +1 -1
- package/scripts/lane/openai-lane-supervisor-decision.ts +3 -7
- package/scripts/lane/openai-lane-supervisor-owner.ts +3 -9
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +1 -1
- package/scripts/lib/bounded-pool.ts +2 -2
- package/scripts/lib/buffered-process.ts +4 -6
- package/scripts/lib/caddy-logs.sh +0 -0
- package/scripts/lib/cli-flags.ts +39 -6
- package/scripts/lib/error-message.ts +1 -1
- package/scripts/lib/json-value.ts +17 -3
- package/scripts/lib/poll.ts +1 -1
- package/scripts/lib/status-icons.ts +3 -3
- package/scripts/lib/timed-fetch.ts +1 -1
- package/scripts/lib/timeouts.ts +1 -1
- package/scripts/lines/bytes-command.ts +3 -4
- package/scripts/lines/effective-limit.ts +25 -12
- package/scripts/lines/line-budget.ts +47 -55
- package/scripts/lines/line-targets.ts +6 -2
- package/scripts/lines/lines-command.ts +3 -3
- package/scripts/lint/cross-file-recheck.ts +155 -0
- package/scripts/lint/cspell-cached.ts +1 -1
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +35 -19
- package/scripts/lint/lint-related-scope.ts +25 -15
- package/scripts/lint/lint-related.ts +6 -7
- package/scripts/managed-marker/index.ts +1 -1
- package/scripts/managed-marker/managed-marker-logic.ts +1 -2
- package/scripts/notify/git-notify.ts +9 -7
- package/scripts/notify/telegram-notify.ts +53 -37
- package/scripts/notify/telegram-test-logic.ts +3 -3
- package/scripts/notify/telegram-test.ts +45 -30
- package/scripts/observations/observation-ledger-home.ts +14 -8
- package/scripts/observations/observation-ledger-line.ts +3 -2
- package/scripts/observations/observation-ledger-migrate.ts +3 -4
- package/scripts/observations/observation-ledger-prepare.ts +4 -4
- package/scripts/observations/observation-ledger.ts +14 -15
- package/scripts/observations/observation-record-cli.ts +83 -0
- package/scripts/observations/observation-record.ts +91 -0
- package/scripts/observations/observations-flush-cli.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +7 -6
- package/scripts/observations/observations-flush.ts +26 -27
- package/scripts/overrides/overrides-check.ts +18 -8
- package/scripts/package/package-scout-cli.ts +1 -1
- package/scripts/package/package-scout-format.ts +2 -2
- package/scripts/package/package-scout.ts +1 -1
- package/scripts/propagate/propagate-git-failure.ts +1 -1
- package/scripts/propagate/propagate-git.ts +7 -7
- package/scripts/propagate/propagate-plan.ts +2 -2
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +5 -7
- package/scripts/propagate/propagate-select.ts +1 -1
- package/scripts/propagate/propagate-steps.ts +19 -20
- package/scripts/propagate/propagate-targets.ts +6 -10
- package/scripts/propagate/propagate.ts +5 -5
- package/scripts/refactor/import-graph.ts +1 -1
- package/scripts/refactor/refactor-lint.ts +4 -10
- package/scripts/refactor/refactor-scan-cli.ts +1 -1
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +1 -1
- package/scripts/release/github-release-cli.ts +25 -3
- package/scripts/release/github-release-runs.ts +1 -1
- package/scripts/release/release-cli.ts +21 -4
- package/scripts/release/release-history.ts +6 -10
- package/scripts/release/release-plan.ts +3 -3
- package/scripts/release/release-progress.ts +3 -4
- package/scripts/release/release-publish.ts +8 -9
- package/scripts/release/release-scope-cli.ts +8 -10
- package/scripts/release/release-tag.ts +6 -8
- package/scripts/release/release-worktree.ts +5 -5
- package/scripts/repo/auto-merge-setting-logic.ts +7 -9
- package/scripts/repo/auto-merge-setting.ts +1 -1
- package/scripts/repo/repo-setting.ts +4 -4
- package/scripts/repo/repository-labels.ts +1 -1
- package/scripts/repo/required-checks-logic.ts +3 -3
- package/scripts/repo/required-checks-report.ts +1 -1
- package/scripts/repo/ruleset-check-cli.ts +1 -1
- package/scripts/repo/ruleset-check.ts +1 -1
- package/scripts/report/report-format-reference.ts +26 -0
- package/scripts/report/report-lint-cli.ts +2 -2
- package/scripts/report/report-lint.ts +16 -2
- package/scripts/review/disposition-cli.ts +2 -2
- package/scripts/review/disposition-logic.ts +1 -1
- package/scripts/review/live-evidence.ts +9 -6
- package/scripts/review/review-attest-cli.ts +1 -2
- package/scripts/review/review-attest.ts +3 -3
- package/scripts/review/review-brief-cli.ts +19 -20
- package/scripts/review/review-brief.ts +29 -32
- package/scripts/review/review-checkout.ts +2 -2
- package/scripts/review/review-diff-parts.ts +3 -5
- package/scripts/review/review-diff-write.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +7 -4
- package/scripts/review/review-findings-cli.ts +2 -2
- package/scripts/review/review-level.ts +4 -7
- package/scripts/review/review-record-cli.ts +73 -16
- package/scripts/review/review-record.ts +5 -4
- package/scripts/review/review-round2-cli.ts +2 -3
- package/scripts/review/review-round2.ts +13 -21
- package/scripts/review/review-stamps.ts +9 -71
- package/scripts/review/review-tree.ts +4 -5
- package/scripts/rules/bash-triggers.ts +4 -4
- package/scripts/rules/decision-oracle-batch.ts +6 -7
- package/scripts/rules/decision-oracle-stage.ts +1 -1
- package/scripts/rules/decision-oracle-tokens.ts +1 -2
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +61 -406
- package/scripts/rules/destructive-command.ts +2 -2
- package/scripts/rules/direct-filing.ts +4 -4
- package/scripts/rules/direct-pr-create.ts +2 -2
- package/scripts/rules/early-heartbeat.ts +15 -19
- package/scripts/rules/file-body.ts +5 -6
- package/scripts/rules/filing-cap.ts +6 -7
- package/scripts/rules/filing-offer.ts +1 -1
- package/scripts/rules/firing-point.ts +6 -6
- package/scripts/rules/gh-api.ts +2 -2
- package/scripts/rules/git-argv.ts +3 -3
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/hook-context-line.ts +31 -0
- package/scripts/rules/implementation-cut-verdict.ts +5 -8
- package/scripts/rules/implementation-cut.ts +35 -32
- package/scripts/rules/index-guard.ts +2 -2
- package/scripts/rules/issue-citation.ts +7 -7
- package/scripts/rules/issue-comments.ts +21 -13
- package/scripts/rules/josh-git-bare.ts +2 -2
- package/scripts/rules/lane-background.ts +14 -16
- package/scripts/rules/lane-carry-conflict.ts +41 -5
- package/scripts/rules/lane-interactive-ask.ts +6 -9
- package/scripts/rules/lane-park.ts +12 -16
- package/scripts/rules/lane-split-park.ts +1 -2
- package/scripts/rules/lane-switch-main.ts +10 -13
- package/scripts/rules/last-prompt.ts +1 -1
- package/scripts/rules/oracle-consulted.ts +5 -5
- package/scripts/rules/oracle-firing.ts +6 -9
- package/scripts/rules/oracle-list-cli.ts +2 -2
- package/scripts/rules/permission-guards.ts +2 -2
- package/scripts/rules/piped-verification.ts +79 -9
- package/scripts/rules/poll-loop.ts +9 -11
- package/scripts/rules/pre-gate-cut.ts +33 -30
- package/scripts/rules/prior-comment-read.ts +3 -3
- package/scripts/rules/protected-files.ts +25 -13
- package/scripts/rules/raw-field-body.ts +3 -4
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +10 -12
- package/scripts/rules/rule-guard.ts +1 -1
- package/scripts/rules/rule-list.ts +51 -0
- package/scripts/rules/rule-registry-rows.ts +282 -0
- package/scripts/rules/rule-registry.ts +109 -0
- package/scripts/rules/rule-value-cache.ts +2 -2
- package/scripts/rules/rule-value-cli.ts +6 -4
- package/scripts/rules/rule-value.ts +61 -22
- package/scripts/rules/run-tail-rule.ts +11 -15
- package/scripts/rules/shell-body-trigger.ts +7 -7
- package/scripts/rules/shell-segments.ts +2 -4
- package/scripts/rules/stop-rules.ts +54 -41
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +2 -2
- package/scripts/rules/third-party-write.ts +3 -3
- package/scripts/rules/worktree-guard.ts +12 -5
- package/scripts/run/add/run-add-cli.ts +165 -0
- package/scripts/run/add/run-add.ts +124 -0
- package/scripts/run/board/run-board-cli.ts +207 -0
- package/scripts/run/board/run-board-closed.ts +95 -0
- package/scripts/run/board/run-board-every.ts +60 -0
- package/scripts/run/board/run-board-fetch.ts +38 -0
- package/scripts/run/board/run-board-fit.ts +219 -0
- package/scripts/run/board/run-board-github.ts +162 -0
- package/scripts/run/board/run-board-header.ts +275 -0
- package/scripts/run/board/run-board-kind.ts +35 -0
- package/scripts/run/board/run-board-labels.ts +299 -0
- package/scripts/run/board/run-board-layout.ts +222 -0
- package/scripts/run/board/run-board-link.ts +31 -0
- package/scripts/run/board/run-board-machine.ts +198 -0
- package/scripts/run/board/run-board-notes.ts +103 -0
- package/scripts/run/board/run-board-phase.ts +136 -0
- package/scripts/run/board/run-board-plan.ts +129 -0
- package/scripts/run/board/run-board-read.ts +62 -0
- package/scripts/run/board/run-board-render-legend.ts +82 -0
- package/scripts/run/board/run-board-render-notes.ts +77 -0
- package/scripts/run/board/run-board-render-slot.ts +50 -0
- package/scripts/run/board/run-board-render.ts +407 -0
- package/scripts/run/board/run-board-scope.ts +17 -0
- package/scripts/run/board/run-board-screen.ts +43 -0
- package/scripts/run/board/run-board-span.ts +66 -0
- package/scripts/run/board/run-board-spin.ts +115 -0
- package/scripts/run/board/run-board-state.ts +113 -0
- package/scripts/run/board/run-board-status.ts +279 -0
- package/scripts/run/board/run-board-tick.ts +210 -0
- package/scripts/run/board/run-board-track.ts +22 -0
- package/scripts/run/board/run-board-usage-read.ts +255 -0
- package/scripts/run/board/run-board-usage-rusage.ts +124 -0
- package/scripts/run/board/run-board-usage-text.ts +80 -0
- package/scripts/run/board/run-board-usage.ts +165 -0
- package/scripts/run/carry/run-carry-added.ts +62 -0
- package/scripts/run/carry/run-carry-args.ts +25 -22
- package/scripts/run/carry/run-carry-change.ts +1 -1
- package/scripts/run/carry/run-carry-cli.ts +71 -48
- package/scripts/run/carry/run-carry-conversation.ts +6 -7
- package/scripts/run/carry/run-carry-ended.ts +85 -0
- package/scripts/run/carry/run-carry-reclaim.ts +1 -1
- package/scripts/run/carry/run-carry-stash.ts +3 -2
- package/scripts/run/carry/run-carry-streak.ts +8 -10
- package/scripts/run/carry/run-carry.ts +85 -89
- package/scripts/run/cut/run-cut-args.ts +7 -7
- package/scripts/run/cut/run-cut-cli.ts +54 -36
- package/scripts/run/cut/run-cut-handoff.ts +15 -15
- package/scripts/run/cut/run-cut-report.ts +37 -16
- package/scripts/run/cut/run-cut.ts +63 -77
- package/scripts/run/detached-launch.ts +35 -50
- package/scripts/run/entry/run-entry-cli.ts +48 -27
- package/scripts/run/entry/run-entry-stop.ts +7 -9
- package/scripts/run/entry/run-entry.ts +5 -6
- package/scripts/run/event/run-event-cli.ts +5 -6
- package/scripts/run/event/run-event-filed.ts +69 -0
- package/scripts/run/event/run-event-follow.ts +3 -3
- package/scripts/run/event/run-event-plan.ts +38 -0
- package/scripts/run/event/run-event-render.ts +9 -4
- package/scripts/run/event/run-event-scope.ts +47 -18
- package/scripts/run/event/run-event-stream-emit.ts +64 -11
- package/scripts/run/event/run-event-stream.ts +171 -46
- package/scripts/run/event/run-event-watch.ts +4 -6
- package/scripts/run/hold/run-hold-cli.ts +65 -62
- package/scripts/run/hold/run-hold.ts +88 -46
- package/scripts/run/merge/run-merge-cli.ts +116 -77
- package/scripts/run/merge/run-merge-collect.ts +107 -0
- package/scripts/run/merge/run-merge-steps.ts +112 -65
- package/scripts/run/merge/run-merge-token.ts +30 -0
- package/scripts/run/merge/run-merge.ts +31 -22
- package/scripts/run/progress/run-progress-args.ts +4 -4
- package/scripts/run/progress/run-progress-cli.ts +39 -50
- package/scripts/run/progress/run-progress-clock.ts +25 -32
- package/scripts/run/progress/run-progress-config.ts +6 -9
- package/scripts/run/progress/run-progress-read.ts +9 -10
- package/scripts/run/progress/run-progress.ts +48 -53
- package/scripts/run/review/run-review-cli.ts +6 -6
- package/scripts/run/review/run-review-steps.ts +6 -6
- package/scripts/run/review/run-review.ts +9 -11
- package/scripts/run/run-cli-fault.ts +29 -0
- package/scripts/run/run-ending-cli.ts +3 -3
- package/scripts/run/run-ending.ts +10 -14
- package/scripts/run/run-halfrun-resume.ts +6 -8
- package/scripts/run/run-headless.ts +26 -12
- package/scripts/run/run-invocation.ts +17 -22
- package/scripts/run/run-label.ts +7 -5
- package/scripts/run/run-liveness-cli.ts +19 -6
- package/scripts/run/run-liveness.ts +27 -38
- package/scripts/run/run-next-cli.ts +5 -9
- package/scripts/run/run-next.ts +4 -5
- package/scripts/run/run-parent-cut-hook.ts +10 -12
- package/scripts/run/run-preflight.ts +25 -29
- package/scripts/run/run-prep-cli.ts +17 -13
- package/scripts/run/run-prep-locate.ts +4 -5
- package/scripts/run/run-prep.ts +7 -10
- package/scripts/run/run-prrun-resume.ts +2 -2
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +9 -14
- package/scripts/run/run-retrospective.ts +3 -3
- package/scripts/run/run-section.ts +42 -0
- package/scripts/run/run-stage-read.ts +2 -2
- package/scripts/run/run-stage.ts +6 -4
- package/scripts/run/run-status-cli.ts +7 -5
- package/scripts/run/run-status.ts +6 -7
- package/scripts/run/run-step-cli.ts +64 -18
- package/scripts/run/run-step.ts +107 -51
- package/scripts/run/run-stop-notify.ts +7 -8
- package/scripts/run/run-stranded-cli.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +11 -13
- package/scripts/run/run-tail-cli.ts +15 -16
- package/scripts/run/run-tail.ts +14 -33
- package/scripts/run/run-watcher-guard-cli.ts +3 -4
- package/scripts/run/run-watcher-guard.ts +11 -12
- package/scripts/run/run-watcher-hook.ts +6 -12
- package/scripts/run/ship/run-ship-cli.ts +67 -33
- package/scripts/run/ship/run-ship-detach.ts +15 -13
- package/scripts/run/ship/run-ship-lock.ts +1 -1
- package/scripts/run/ship/run-ship-next.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +27 -11
- package/scripts/run/ship/run-ship-preflight.ts +10 -11
- package/scripts/run/ship/run-ship-probe.ts +4 -4
- package/scripts/run/ship/run-ship-return.ts +1 -1
- package/scripts/run/ship/run-ship-review-steps.ts +43 -24
- package/scripts/run/ship/run-ship-review.ts +12 -14
- package/scripts/run/ship/run-ship-scoped.ts +15 -6
- package/scripts/run/ship/run-ship-stage.ts +80 -26
- package/scripts/run/ship/run-ship-steps.ts +26 -16
- package/scripts/run/ship/run-ship-stop-text.ts +4 -2
- package/scripts/run/ship/run-ship-sync.ts +9 -8
- package/scripts/run/ship/run-ship.ts +17 -32
- package/scripts/run/tidy/run-tidy-cli.ts +9 -5
- package/scripts/run/tidy/run-tidy-lanes.ts +18 -7
- package/scripts/run/tidy/run-tidy-stashes.ts +8 -8
- package/scripts/run/tidy/run-tidy.ts +4 -3
- package/scripts/run/wake/run-wake-cli.ts +27 -32
- package/scripts/run/wake/run-wake-describe.ts +24 -28
- package/scripts/run/wake/run-wake-driver.ts +14 -14
- package/scripts/run/wake/run-wake-handoff.ts +6 -6
- package/scripts/run/wake/run-wake-loop.ts +9 -9
- package/scripts/run/wake/run-wake-restart.ts +4 -5
- package/scripts/run/wake/run-wake-session.ts +23 -27
- package/scripts/run/wake/run-wake.ts +57 -279
- package/scripts/safe-chain/ci-installer-pin.ts +3 -3
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -2
- package/scripts/security/security-audit-logic.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +1 -1
- package/scripts/security/security-audit-provision.ts +2 -2
- package/scripts/security/security-audit.ts +5 -5
- package/scripts/security/security-updates-logic.ts +2 -3
- package/scripts/security/security-updates.ts +2 -4
- package/scripts/self-sync-guard/index.ts +1 -1
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +2 -2
- package/scripts/self-sync-guard/self-sync-refusal.ts +1 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +1 -1
- package/scripts/sonar/sonar-hotspots.ts +1 -1
- package/scripts/sonar/sonar-new-code-cli.ts +1 -1
- package/scripts/sonar/sonar-new-code.ts +1 -1
- package/scripts/sonar/sonar-project.ts +1 -1
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +3 -3
- package/scripts/sync/directory-copy-guard.ts +2 -3
- package/scripts/sync/managed-config-scope-cli.ts +1 -2
- package/scripts/sync/managed-config-scope.ts +4 -4
- package/scripts/sync/plugin-skill-directories.ts +2 -2
- package/scripts/sync/reconcile-templates.ts +17 -8
- package/scripts/sync/removed-skill-manifest.ts +2 -3
- package/scripts/sync/sync-ai-files.ts +7 -7
- package/scripts/sync/sync-configs.ts +30 -3
- package/scripts/sync/sync-hook-safety.ts +2 -2
- package/scripts/sync/sync.ts +23 -10
- package/scripts/sync/synced-paths.ts +2 -1
- package/scripts/sync/workflow-pin-logic.ts +1 -1
- package/scripts/test/test-declared-changed.ts +4 -4
- package/scripts/test/test-declared-logic.ts +2 -3
- package/scripts/test/test-declared-match.ts +25 -4
- package/scripts/test/test-declared.ts +26 -9
- package/scripts/test/test-red-commit.ts +3 -2
- package/scripts/test/test-red-logic.ts +7 -14
- package/scripts/test/test-red.ts +12 -47
- package/scripts/test/test-related-scope.ts +2 -3
- package/scripts/test/test-related.ts +3 -3
- package/scripts/test/test-type-logic.ts +1 -2
- package/scripts/test/test-unit-guard.ts +13 -17
- package/scripts/test/unit-worker-share.ts +7 -8
- package/scripts/time-runtime/time-agent-bundles.ts +2 -4
- package/scripts/time-runtime/time-background.ts +17 -21
- package/scripts/time-runtime/time-batch-guard.ts +67 -342
- package/scripts/time-runtime/time-bundle-call.ts +26 -28
- package/scripts/time-runtime/time-bundles.ts +11 -12
- package/scripts/time-runtime/time-call-identity.ts +1 -1
- package/scripts/time-runtime/time-command-key.ts +2 -2
- package/scripts/time-runtime/time-density-hook.ts +8 -11
- package/scripts/time-runtime/time-density.ts +5 -5
- package/scripts/time-runtime/time-followup-stage.ts +7 -7
- package/scripts/time-runtime/time-format.ts +5 -5
- package/scripts/time-runtime/time-hook-transcript.ts +3 -3
- package/scripts/time-runtime/time-instant.ts +1 -1
- package/scripts/time-runtime/time-markers.ts +15 -19
- package/scripts/time-runtime/time-phase-names.ts +3 -3
- package/scripts/time-runtime/time-reported-failure.ts +15 -19
- package/scripts/time-runtime/time-round-trips.ts +20 -23
- package/scripts/time-runtime/time-shell.ts +8 -8
- package/scripts/time-runtime/time-single-check.ts +1 -2
- package/scripts/time-runtime/time-spans.ts +35 -40
- package/scripts/time-runtime/time-tool-call.ts +15 -16
- package/scripts/time-runtime/time-transcript-line.ts +53 -34
- package/scripts/time-runtime/time-writes.ts +5 -5
- package/scripts/ui/ui-routes-cli.ts +1 -2
- package/scripts/ui/ui-routes.ts +1 -2
- package/scripts/version/bump-version.ts +1 -1
- package/scripts/version/fresh-metadata-cache.ts +2 -2
- package/scripts/version/latest-corepack.ts +26 -26
- package/scripts/version/latest-lane-guard.ts +1 -1
- package/scripts/version/latest-scope-cli.ts +2 -2
- package/scripts/version/latest-stamp.ts +1 -2
- package/scripts/version/latest-update.ts +2 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/package-manager-version.ts +18 -0
- package/scripts/version/publishable-range-check.ts +2 -1
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +11 -11
- package/scripts/version/release-hold.ts +2 -2
- package/scripts/version/safe-chain-version-update.ts +3 -3
- package/scripts/version/version-check-logic.ts +2 -3
- package/scripts/version/version-check.ts +1 -2
- package/scripts/version/version-command-config.ts +2 -2
- package/scripts/version/version-commands.ts +3 -3
- package/scripts/version/version-remote.ts +4 -4
- package/scripts/version/version-targets.ts +2 -2
- package/templates/gitignore +7 -0
- package/dist/hooks/chunk-KHX4U3BG.js +0 -6400
- package/dist/hooks/chunk-RKUAD3I6.js +0 -90
- package/dist/hooks/chunk-WPALEIRX.js +0 -18
- package/scripts/backlog/backlog-restructure.ts +0 -152
- package/scripts/rules/issue-fold-rule.ts +0 -72
- package/scripts/rules/wip-cap.ts +0 -63
- package/scripts/run/run-issue-number.ts +0 -19
|
@@ -29,7 +29,7 @@ function scanner_version(binary_or_path: string): string | undefined {
|
|
|
29
29
|
|
|
30
30
|
// Whether the binary at this name or path parses the whole lockfile, i.e. is at or above the pinned
|
|
31
31
|
// floor. A version that cannot be read is not the floor met — an unspawnable or version-less binary
|
|
32
|
-
// is treated as below it, never as a pass
|
|
32
|
+
// is treated as below it, never as a pass.
|
|
33
33
|
function meets_floor(binary_or_path: string): boolean {
|
|
34
34
|
const version = scanner_version(binary_or_path)
|
|
35
35
|
|
|
@@ -68,9 +68,9 @@ function managed_scanner(project_root: string, platform: string): string | undef
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
// PATH first, but only when its scanner meets the floor: an older PATH build reads a fraction of the
|
|
71
|
-
// lockfile and calls it clean
|
|
72
|
-
// rather than the other way round (
|
|
73
|
-
// build
|
|
71
|
+
// lockfile and calls it clean, so a provisioned v2.6.0 is preferred over it
|
|
72
|
+
// rather than the other way round (preferring PATH outright holds only while every
|
|
73
|
+
// build reads the whole file). A below-floor PATH binary is the last resort, returned flagged so the
|
|
74
74
|
// audit can warn that its clean result proves nothing. `undefined` means no scanner at all.
|
|
75
75
|
function resolve_scanner(project_root: string, platform: string): ScannerChoice | undefined {
|
|
76
76
|
const { BINARY_NAME } = security_audit_logic
|
|
@@ -92,7 +92,7 @@ function resolve_scanner(project_root: string, platform: string): ScannerChoice
|
|
|
92
92
|
// next shell prompt as `11;rgb:0101/0404/0909;1R` after a push ran this audit from the pre-push hook.
|
|
93
93
|
// A pipe means the scanner sees no terminal and asks nothing; the `inherit` half still prints its report.
|
|
94
94
|
// The fix belongs here, at the one command that asks, rather than on `git push`: piping the push would
|
|
95
|
-
// make its timeout wait on any process a hook left running
|
|
95
|
+
// make its timeout wait on any process a hook left running.
|
|
96
96
|
const FORWARDED_OUTPUT = ['inherit', 'pipe'] as const
|
|
97
97
|
|
|
98
98
|
function run_scanner(scanner_path: string): number {
|
|
@@ -3,12 +3,11 @@ import { repo_setting, type RepoSettingStatus } from '#scripts/repo/repo-setting
|
|
|
3
3
|
// GitHub's Dependabot security-updates setting, as reported by
|
|
4
4
|
// `GET /repos/{owner}/{repo}/automated-security-fixes`.
|
|
5
5
|
//
|
|
6
|
-
//
|
|
6
|
+
// `open-pull-requests-limit: 0` is set on the npm entry of the distributed
|
|
7
7
|
// `.github/dependabot.yml`, which makes the security-advisory path the only remaining source of npm
|
|
8
8
|
// Dependabot PRs. That path depends on this repository-level setting, which is opt-in and off by
|
|
9
9
|
// default for private repositories — so a consumer that syncs the file without it gets zero npm
|
|
10
|
-
// Dependabot PRs, advisories included. The failure is silent: no PR looks exactly like no advisory
|
|
11
|
-
// (joshuafolkken/kit#805).
|
|
10
|
+
// Dependabot PRs, advisories included. The failure is silent: no PR looks exactly like no advisory.
|
|
12
11
|
//
|
|
13
12
|
// `paused` is this setting's own third state, which is why the shared two-state classifier is only
|
|
14
13
|
// half the answer here (see classify_security_updates).
|
|
@@ -4,8 +4,7 @@ import { security_updates_logic, type SecurityUpdatesStatus } from './security-u
|
|
|
4
4
|
const SECURITY_FIXES_PATH = 'automated-security-fixes'
|
|
5
5
|
|
|
6
6
|
// Read the repository's Dependabot security-updates setting. Never throws and never propagates a
|
|
7
|
-
// non-zero exit: an unreadable answer is a reported status, not a command failure
|
|
8
|
-
// (joshuafolkken/kit#805).
|
|
7
|
+
// non-zero exit: an unreadable answer is a reported status, not a command failure.
|
|
9
8
|
function read_security_updates(repo: string): SecurityUpdatesStatus {
|
|
10
9
|
const { exit_code, stdout } = repo_setting.query_repo_api(`repos/${repo}/${SECURITY_FIXES_PATH}`)
|
|
11
10
|
|
|
@@ -14,8 +13,7 @@ function read_security_updates(repo: string): SecurityUpdatesStatus {
|
|
|
14
13
|
|
|
15
14
|
// Report the repository's setting as a blank-line-separated block. A repository that cannot be
|
|
16
15
|
// resolved (no `gh`, not a GitHub remote) reports `unreadable` rather than skipping the check
|
|
17
|
-
// silently —
|
|
18
|
-
// clean one.
|
|
16
|
+
// silently — an absent answer must not look like a clean one.
|
|
19
17
|
//
|
|
20
18
|
// `repo` is always supplied by the caller — deliberately not a default parameter. A default fires
|
|
21
19
|
// on an explicitly-passed `undefined`, so `josh sync` handing over a failed lookup would silently
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// The public surface a downstream distribution package imports to refuse a sync aimed at its own
|
|
2
2
|
// repository. Exported rather than left internal because app-kit and game-kit run the same kind of
|
|
3
|
-
// copy and would otherwise each re-implement the detection
|
|
3
|
+
// copy and would otherwise each re-implement the detection, which is the
|
|
4
4
|
// duplication `managed-marker` was extracted to avoid for the workflow stamp.
|
|
5
5
|
export { self_sync_guard } from './self-sync-guard-logic'
|
|
@@ -6,8 +6,8 @@ import path from 'node:path'
|
|
|
6
6
|
// truth is overwritten by the derived template, and the copy transforms fire against a project
|
|
7
7
|
// where they are wrong (a `prompts/…` reference rewritten to `node_modules/@joshuafolkken/kit/…`
|
|
8
8
|
// resolves nowhere, a workflow written from `templates/` loses the pins `.github/workflows` owns).
|
|
9
|
-
//
|
|
10
|
-
//
|
|
9
|
+
// In kit the same damage reaches 14 files, including CLAUDE.md, tsconfig.json and both mapped
|
|
10
|
+
// workflows.
|
|
11
11
|
//
|
|
12
12
|
// The check lives here rather than in each package's sync so the three distributors share one
|
|
13
13
|
// implementation: a second copy would drift, and a distributor that spelled the signal differently
|
|
@@ -3,7 +3,7 @@ import { self_sync_guard } from './self-sync-guard-logic'
|
|
|
3
3
|
// The half of the guard that `sync` and `init` share verbatim: print the refusal and leave a
|
|
4
4
|
// non-zero exit code. It lives beside the detection rather than in either entry point because the
|
|
5
5
|
// two commands do the same damage in the source repository — `init` a larger share of it, since it
|
|
6
|
-
// rewrites `package.json` scripts and devDependencies as well
|
|
6
|
+
// rewrites `package.json` scripts and devDependencies as well — and a copy
|
|
7
7
|
// in each `main()` would be the second implementation the shared module exists to prevent.
|
|
8
8
|
//
|
|
9
9
|
// Not re-exported from `index.ts`: the published `@joshuafolkken/kit/self-sync-guard` surface stays
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
import { sonar_project } from './sonar-project'
|
|
12
12
|
|
|
13
13
|
// `josh sonar:hotspots <PR>` — fetch the SonarCloud hotspots on a pull request and print the Step B
|
|
14
|
-
// disposition of each
|
|
14
|
+
// disposition of each.
|
|
15
15
|
//
|
|
16
16
|
// The decision itself lives in `sonar-hotspots.ts`; this file is the I/O around it: read the project
|
|
17
17
|
// key from `sonar-project.properties`, fetch the public search API, and answer the upstream-synced
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// The Step B disposition for each SonarCloud hotspot on a pull request, computed rather than read by
|
|
2
|
-
// eye
|
|
2
|
+
// eye.
|
|
3
3
|
//
|
|
4
4
|
// `prompts/sonar-hotspot-handling.md` carried Step A and Step B as prose: the reader built the API
|
|
5
5
|
// URL by hand and then walked a decision table whose one mechanical branch key — "is this path
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
import { sonar_project } from './sonar-project'
|
|
14
14
|
|
|
15
15
|
// `josh sonar:new-code <PR>` — fail when a pull request adds any new SonarCloud issue or duplicated
|
|
16
|
-
// block
|
|
16
|
+
// block.
|
|
17
17
|
//
|
|
18
18
|
// `sonar-qube.yml` runs it after the scan on every pull request, so the `SonarQube` check turns red on
|
|
19
19
|
// a single finding instead of only when the Quality Gate's ratios tip over. The verdict lives in
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Whether a pull request adds any new SonarCloud finding — computed from the counts rather than from
|
|
2
|
-
// the Quality Gate
|
|
2
|
+
// the Quality Gate.
|
|
3
3
|
//
|
|
4
4
|
// The built-in `Sonar way` gate judges a ratio and a rating, not a count: a few MINOR code smells keep
|
|
5
5
|
// the maintainability rating at A, and a copied block in a large pull request stays under the 3%
|
|
@@ -6,7 +6,7 @@ import { timed_fetch } from '#scripts/lib/timed-fetch'
|
|
|
6
6
|
import type { z } from 'zod'
|
|
7
7
|
|
|
8
8
|
// The SonarCloud project a `josh sonar:*` command reads, shared by every command that calls the
|
|
9
|
-
// SonarCloud API
|
|
9
|
+
// SonarCloud API: the host, the project key `sonar-project.properties`
|
|
10
10
|
// records — the file `josh init` / `josh sync` generate from the GitHub repository name — and the
|
|
11
11
|
// `<PR>` positional each command takes.
|
|
12
12
|
|
|
@@ -5,7 +5,7 @@ import { path_decision } from '#scripts/josh/path-decision'
|
|
|
5
5
|
import { split_assess } from './split-assess'
|
|
6
6
|
|
|
7
7
|
// `josh split:assess` — measure a branch's change size, tests excluded, and answer the size question
|
|
8
|
-
// of the split assessment
|
|
8
|
+
// of the split assessment.
|
|
9
9
|
//
|
|
10
10
|
// A command rather than a paragraph for the reason every decision oracle is one: the "about 10 files /
|
|
11
11
|
// 400 lines" guide is a number, but the size behind it was estimated by eye, so no data ever
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { test_declared_logic } from '#scripts/test/test-declared-logic'
|
|
2
2
|
|
|
3
|
-
// The size half of the split assessment, measured rather than estimated
|
|
3
|
+
// The size half of the split assessment, measured rather than estimated.
|
|
4
4
|
//
|
|
5
5
|
// `split-assessment.md` → "The question" asks two things, and only the second is mechanical: does the
|
|
6
6
|
// change **clearly exceed** what one verification gate confirms in one pass, the guide being about 10
|
|
@@ -27,8 +27,8 @@ interface SizeMeasurement {
|
|
|
27
27
|
verdict: SplitVerdict
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
// The guide's single source: `split-assessment.md` states these once and a test pins the two equal
|
|
31
|
-
//
|
|
30
|
+
// The guide's single source: `split-assessment.md` states these once and a test pins the two equal.
|
|
31
|
+
// Strictly greater than: "about 10 changed files" and a change
|
|
32
32
|
// that "lands at 11 files is not thereby a split" put the bar above the round number, not at it.
|
|
33
33
|
const FILE_GUIDE = 10
|
|
34
34
|
const LINE_GUIDE = 400
|
|
@@ -7,7 +7,7 @@ import { file_content } from './file-content'
|
|
|
7
7
|
// `josh init` and `josh sync` both copy a distributed directory with `cpSync`, and both have to
|
|
8
8
|
// answer the same question first: is this copy one that `cpSync` will refuse? The answer lives here
|
|
9
9
|
// rather than in each command, because the failure modes are the same and a second copy of the list
|
|
10
|
-
// would drift
|
|
10
|
+
// would drift.
|
|
11
11
|
//
|
|
12
12
|
// Every check goes through `lstat`, never `existsSync` or `stat`:
|
|
13
13
|
// - `stat` follows a symlink, so a link pointing at a directory would read as a directory while
|
|
@@ -49,8 +49,7 @@ function directory_copy_blocker(source_path: string, destination_path: string):
|
|
|
49
49
|
// `cpSync` copies bytes, so a distributed directory would otherwise carry the package's own
|
|
50
50
|
// `prompts/…` references into a consumer, where that directory does not exist — the very rewrite
|
|
51
51
|
// every file copy already runs through `transform_copied_content`. Running it over the copied tree
|
|
52
|
-
// puts both copy paths on one transform, which is what lets a skill cite the prompt it extends
|
|
53
|
-
// (joshuafolkken/kit#854).
|
|
52
|
+
// puts both copy paths on one transform, which is what lets a skill cite the prompt it extends.
|
|
54
53
|
//
|
|
55
54
|
// Markdown only, and deliberately so: the rewrite is a text substitution, the workflow pin and
|
|
56
55
|
// managed-marker passes inside `transform_copied_content` are gated on a `.github/workflows`
|
|
@@ -3,8 +3,7 @@ import { fileURLToPath } from 'node:url'
|
|
|
3
3
|
import { path_decision } from '#scripts/josh/path-decision'
|
|
4
4
|
import { managed_config_scope } from './managed-config-scope'
|
|
5
5
|
|
|
6
|
-
// `josh sync:scope` — say whether this change touches a file `josh sync` distributes
|
|
7
|
-
// (joshuafolkken/kit#1578).
|
|
6
|
+
// `josh sync:scope` — say whether this change touches a file `josh sync` distributes.
|
|
8
7
|
//
|
|
9
8
|
// A command rather than a paragraph, for the reason `josh review:level` is one: the confirmation
|
|
10
9
|
// stop this feeds was written as an instruction to compare the diff against three arrays by eye, and
|
|
@@ -13,8 +13,8 @@ const AI_COPY_DIRECTORIES_LIST = 'AI_COPY_DIRECTORIES'
|
|
|
13
13
|
// `init-logic.ts`: these destinations are written by `sync.ts` directly and appear on no list there.
|
|
14
14
|
const SYNCED_PATHS_LIST = 'SYNCED_PATHS'
|
|
15
15
|
|
|
16
|
-
// The fifth source: the skill directories that ship as the `kit` plugin rather than as a copy
|
|
17
|
-
//
|
|
16
|
+
// The fifth source: the skill directories that ship as the `kit` plugin rather than as a copy.
|
|
17
|
+
// They are no longer in `AI_COPY_DIRECTORIES`, but a change to one still
|
|
18
18
|
// reaches consumers through the package, so the gate keeps flagging it.
|
|
19
19
|
const PLUGIN_SKILL_DIRECTORIES_LIST = 'PLUGIN_SKILL_DIRECTORIES'
|
|
20
20
|
|
|
@@ -57,7 +57,7 @@ function matches_plugin_skill(path: string): boolean {
|
|
|
57
57
|
|
|
58
58
|
// The paths `josh sync` writes outside the three `AI_COPY_*` lists — `playwright.config.ts` and the
|
|
59
59
|
// rest. Reading only those three made the gate **narrower than the instruction it replaced**, whose
|
|
60
|
-
// own worked example was a file none of them holds
|
|
60
|
+
// own worked example was a file none of them holds.
|
|
61
61
|
function matches_synced_path(path: string): boolean {
|
|
62
62
|
return synced_paths.get_synced_paths().includes(path)
|
|
63
63
|
}
|
|
@@ -96,7 +96,7 @@ function has_managed_path(paths: ReadonlyArray<string>): boolean {
|
|
|
96
96
|
|
|
97
97
|
// The path *and* the list that claimed it, because the two answer different questions: which file to
|
|
98
98
|
// look at, and why it counts as distributed. `AI_COPY_DIRECTORIES` is the one a reader cannot derive
|
|
99
|
-
// by eye — the path matched a directory entry it does not textually equal
|
|
99
|
+
// by eye — the path matched a directory entry it does not textually equal.
|
|
100
100
|
function format_hit(hit: ManagedHit): string {
|
|
101
101
|
return `${hit.path} (${hit.list})`
|
|
102
102
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
// The skill directories kit ships as the `kit` Claude Code plugin
|
|
1
|
+
// The skill directories kit ships as the `kit` Claude Code plugin. A
|
|
2
2
|
// consumer receives them through the plugin rather than as a copy, so this is the single source two
|
|
3
3
|
// places read: `skill-migration.ts` removes a consumer's stale copy of one, and
|
|
4
4
|
// `managed-config-scope.ts` flags a change to one as reaching consumers. It is deliberately separate
|
|
5
5
|
// from `init-logic.ts`'s `AI_COPY_DIRECTORIES` — which is now empty — because these directories are
|
|
6
6
|
// distributed but no longer copied. `diag` is deliberately absent: it drives kit's own run
|
|
7
|
-
// measurement, so it is excluded from the package and the plugin
|
|
7
|
+
// measurement, so it is excluded from the package and the plugin.
|
|
8
8
|
const PLUGIN_SKILL_DIRECTORIES: ReadonlyArray<string> = [
|
|
9
9
|
'.claude/skills/workflow-commands',
|
|
10
10
|
'.claude/skills/epic-commands',
|
|
@@ -12,9 +12,13 @@
|
|
|
12
12
|
* is reviewed and reconciled. Only the review is enforced for tripwire pairs.
|
|
13
13
|
*/
|
|
14
14
|
import { fileURLToPath } from 'node:url'
|
|
15
|
-
import {
|
|
15
|
+
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
16
16
|
import { template_source_logic } from './template-source-logic'
|
|
17
17
|
|
|
18
|
+
const ARGV_OFFSET = 2
|
|
19
|
+
const OPTIONS = { check: { type: 'boolean', default: false } } as const
|
|
20
|
+
const USAGE = cli_flags.usage_line(['--check'], 'reconcile-templates')
|
|
21
|
+
|
|
18
22
|
function check_drift(): never {
|
|
19
23
|
const copy_drift = template_source_logic.find_copy_drift()
|
|
20
24
|
const tripwire_drift = template_source_logic.find_tripwire_drift(
|
|
@@ -38,16 +42,21 @@ function reconcile(): never {
|
|
|
38
42
|
process.exit(0)
|
|
39
43
|
}
|
|
40
44
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
// A line nobody can read is refused before either path runs: a misspelled `--check` that fell through
|
|
46
|
+
// would regenerate the templates the caller only meant to verify.
|
|
47
|
+
function refuse_usage(): never {
|
|
48
|
+
console.error(USAGE)
|
|
49
|
+
process.exit(1)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function main(argv: ReadonlyArray<string>): void {
|
|
53
|
+
const values = cli_flags.values_of(argv, OPTIONS)
|
|
46
54
|
|
|
55
|
+
if (values === undefined) refuse_usage()
|
|
47
56
|
if (values.check) check_drift()
|
|
48
57
|
reconcile()
|
|
49
58
|
}
|
|
50
59
|
|
|
51
|
-
if (process.argv[1] === fileURLToPath(import.meta.url)) main()
|
|
60
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) main(process.argv.slice(ARGV_OFFSET))
|
|
52
61
|
|
|
53
|
-
export { check_drift, reconcile }
|
|
62
|
+
export { check_drift, reconcile, main }
|
|
@@ -6,9 +6,8 @@ import type { RemovedSkillManifest } from './skill-migration'
|
|
|
6
6
|
// of each file's distributed (path-transformed) content, which is consumer-independent, so one hash
|
|
7
7
|
// matches every consumer's untouched copy while an edited copy no longer matches and is kept.
|
|
8
8
|
//
|
|
9
|
-
// `diag`
|
|
10
|
-
//
|
|
11
|
-
// received before then (joshuafolkken/kit#1990). `removed-skill-manifest.test.ts` recomputes these
|
|
9
|
+
// `diag` is no longer distributed because it drives kit's own run measurement, and its source is
|
|
10
|
+
// gone; this removes the copy a consumer received while it still shipped. `removed-skill-manifest.test.ts` recomputes these
|
|
12
11
|
// from the repo's own skill source and fails on drift where that source still ships; an entry whose
|
|
13
12
|
// source has since been deleted has nothing left to recompute against, so its frozen hashes stand as
|
|
14
13
|
// the permanent distributed record, guarded only by the test's well-formed-sha256 shape check.
|
|
@@ -30,7 +30,7 @@ function sync_ai_file(source_path: string, destination_path: string): boolean {
|
|
|
30
30
|
|
|
31
31
|
// Both copied hook files must run against the consumer's installed bundle. When sync is run from a
|
|
32
32
|
// newer source than that install, writing either file would leave hooks
|
|
33
|
-
// that fail every prompt
|
|
33
|
+
// that fail every prompt; skip it and print how to update instead.
|
|
34
34
|
function should_skip_hook_file(filename: string): boolean {
|
|
35
35
|
if (filename !== CLAUDE_SETTINGS_FILE && filename !== CODEX_HOOKS_FILE) return false
|
|
36
36
|
const warning = sync_hook_safety.hook_write_warning(
|
|
@@ -60,7 +60,7 @@ function sync_file_mapping(source_path: string, destination_path: string): void
|
|
|
60
60
|
|
|
61
61
|
// Routed through sync_ai_file rather than cpSync: templates/workflows/ci.yml is a mapped
|
|
62
62
|
// file, so a byte copy would hand the consumer the template's own action pins. The pins
|
|
63
|
-
// have to be resolved from .github/workflows at write time
|
|
63
|
+
// have to be resolved from .github/workflows at write time.
|
|
64
64
|
const did_change = sync_ai_file(source_path, destination_path)
|
|
65
65
|
|
|
66
66
|
console.info(` ✔ ${did_change ? 'synced ' : 'unchanged'} ${path.basename(destination_path)}`)
|
|
@@ -121,8 +121,8 @@ function sync_directory(directory_name: string): void {
|
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
// A consumer's stale copy of a distributed skill is removed once it still matches the shipment and
|
|
124
|
-
// kept with a warning once it does not
|
|
125
|
-
// package source; a retired skill compares against the frozen manifest
|
|
124
|
+
// kept with a warning once it does not. Plugin skills compare against the
|
|
125
|
+
// package source; a retired skill compares against the frozen manifest. The
|
|
126
126
|
// note distinguishes the two, and `absent` — the consumer never had the copy — prints nothing.
|
|
127
127
|
function report_migration_result(result: MigrationResult): void {
|
|
128
128
|
if (result.action === 'absent') return
|
|
@@ -151,7 +151,7 @@ function ensured_claude_md(existing: string | undefined, shape?: ProjectShape):
|
|
|
151
151
|
: init_logic.ensure_claude_md_import(existing)
|
|
152
152
|
}
|
|
153
153
|
|
|
154
|
-
// CLAUDE.md is not byte-copied
|
|
154
|
+
// CLAUDE.md is not byte-copied: a consumer's file is one @import of kit's
|
|
155
155
|
// published rules plus the project's own additions below it. Ensure the import line is present
|
|
156
156
|
// without ever disturbing those additions — so this ignores --force, which would otherwise mean
|
|
157
157
|
// discarding a consumer's content.
|
|
@@ -171,7 +171,7 @@ function sync_claude_md(destination_path: string, shape?: ProjectShape): void {
|
|
|
171
171
|
}
|
|
172
172
|
|
|
173
173
|
// A basic shape syncs the file set `josh init` writes for that profile; no shape is the full set,
|
|
174
|
-
// unfiltered, as sync has always written it
|
|
174
|
+
// unfiltered, as sync has always written it.
|
|
175
175
|
function sync_ai_copy_all(is_force: boolean, shape?: ProjectShape): void {
|
|
176
176
|
console.info('AI files:')
|
|
177
177
|
|
|
@@ -191,7 +191,7 @@ function sync_ai_copy_all(is_force: boolean, shape?: ProjectShape): void {
|
|
|
191
191
|
|
|
192
192
|
migrate_removed_skills()
|
|
193
193
|
// Both profiles write the Safe Chain `preinstall`, so both get the hook that keeps it out of a
|
|
194
|
-
// published package
|
|
194
|
+
// published package.
|
|
195
195
|
pack_hook.sync_pack_hook(PROJECT_ROOT, PACKAGE_DIR)
|
|
196
196
|
}
|
|
197
197
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { existsSync, readFileSync, writeFileSync } from 'node:fs'
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } 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
|
+
import { vscode_tasks } from '#scripts/init/vscode-tasks'
|
|
5
6
|
import { string_array_schema, vscode_settings_schema } from '#scripts/lib/schemas'
|
|
6
7
|
|
|
7
8
|
type MergeFunction = (existing: string) => string
|
|
@@ -30,10 +31,10 @@ function sync_with_merge(
|
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
// Removes only the exact settings lines earlier kit releases wrote, which pnpm 12 ignores in
|
|
33
|
-
// `.npmrc
|
|
34
|
+
// `.npmrc`; every other line, a `_authToken` line included, is left alone.
|
|
34
35
|
// Sync used to remove the env-var form, which broke every project that had opted its project
|
|
35
36
|
// .npmrc in via `npmrcAuthFile` — there the line is the live credential, and the opt-in itself
|
|
36
|
-
// can live in a deploy platform's dashboard where sync cannot see it
|
|
37
|
+
// can live in a deploy platform's dashboard where sync cannot see it.
|
|
37
38
|
function sync_npmrc(destination_path: string): void {
|
|
38
39
|
sync_with_merge(destination_path, '.npmrc', init_logic.merge_npmrc)
|
|
39
40
|
}
|
|
@@ -142,6 +143,31 @@ function sync_vscode_settings_json(destination_path: string): void {
|
|
|
142
143
|
)
|
|
143
144
|
}
|
|
144
145
|
|
|
146
|
+
// Creates the file when absent, unlike the other `.vscode` syncs: the folder-open board task is the
|
|
147
|
+
// whole point of distributing it, and a consumer
|
|
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.
|
|
150
|
+
function sync_vscode_tasks_json(destination_path: string): void {
|
|
151
|
+
const kit_content = readFileSync(
|
|
152
|
+
path.join(PACKAGE_DIR, '.vscode', vscode_tasks.VSCODE_TASKS_FILENAME),
|
|
153
|
+
'utf8',
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
if (existsSync(destination_path)) {
|
|
157
|
+
const kit_tasks = vscode_tasks.read_kit_tasks(kit_content)
|
|
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')
|
|
169
|
+
}
|
|
170
|
+
|
|
145
171
|
const sync_configs = {
|
|
146
172
|
sync_npmrc,
|
|
147
173
|
sync_gitignore,
|
|
@@ -152,6 +178,7 @@ const sync_configs = {
|
|
|
152
178
|
sync_secretlint_config,
|
|
153
179
|
sync_vscode_extensions_json,
|
|
154
180
|
sync_vscode_settings_json,
|
|
181
|
+
sync_vscode_tasks_json,
|
|
155
182
|
}
|
|
156
183
|
|
|
157
184
|
export { sync_configs }
|
|
@@ -6,11 +6,11 @@ import { KIT_PACKAGE_NAME } from '#scripts/version/kit-descriptor'
|
|
|
6
6
|
import semver from 'semver'
|
|
7
7
|
|
|
8
8
|
// `josh sync` writes the consumer's Claude and Codex hook files, whose hooks invoke bundles under
|
|
9
|
-
// `node_modules/@joshuafolkken/kit/dist
|
|
9
|
+
// `node_modules/@joshuafolkken/kit/dist/`. When sync is run from a
|
|
10
10
|
// newer source than the consumer's installed package — an `npx @joshuafolkken/kit sync`, or a global
|
|
11
11
|
// josh — the settings it writes reference commands (e.g. `pretool:guard`) the older installed bundle
|
|
12
12
|
// does not have, and every prompt then fails a hook that exits `Unknown command`
|
|
13
|
-
// (
|
|
13
|
+
// (observed on kit 1.214). This checks the version before writing and
|
|
14
14
|
// asks the consumer to update first rather than leaving broken hooks behind.
|
|
15
15
|
//
|
|
16
16
|
// Run through `pnpm josh sync` in the consumer the two versions are equal by construction — the same
|
package/scripts/sync/sync.ts
CHANGED
|
@@ -64,7 +64,7 @@ function sync_prettier_config(destination_path: string): void {
|
|
|
64
64
|
write_merged_prettier_config(destination_path)
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
// A basic project's prettier config written
|
|
67
|
+
// A basic project's prettier config written under the static profile name still imports the static
|
|
68
68
|
// preset path; it is moved onto the basic one with the rule `josh init` applies.
|
|
69
69
|
function sync_basic_prettier_config(destination_path: string): void {
|
|
70
70
|
if (!existsSync(destination_path)) return
|
|
@@ -137,6 +137,7 @@ function sync_config_files(): void {
|
|
|
137
137
|
sync_configs.sync_secretlint_config(path.join(PROJECT_ROOT, '.secretlintrc.json'))
|
|
138
138
|
sync_configs.sync_vscode_extensions_json(path.join(PROJECT_ROOT, '.vscode/extensions.json'))
|
|
139
139
|
sync_configs.sync_vscode_settings_json(path.join(PROJECT_ROOT, '.vscode/settings.json'))
|
|
140
|
+
sync_configs.sync_vscode_tasks_json(path.join(PROJECT_ROOT, '.vscode/tasks.json'))
|
|
140
141
|
}
|
|
141
142
|
|
|
142
143
|
function sync_package_json_with(
|
|
@@ -170,6 +171,16 @@ function sync_package_manager_version(destination_path: string): void {
|
|
|
170
171
|
)
|
|
171
172
|
}
|
|
172
173
|
|
|
174
|
+
// A manifest an earlier `josh init` wrote rejects a standalone pnpm of another version outright;
|
|
175
|
+
// `"download"` fetches the pin instead.
|
|
176
|
+
function sync_package_manager_on_fail(destination_path: string): void {
|
|
177
|
+
sync_package_json_with(
|
|
178
|
+
destination_path,
|
|
179
|
+
(existing) => package_manager_version.upgrade_development_engines_on_fail(existing),
|
|
180
|
+
' ✔ synced devEngines.packageManager.onFail',
|
|
181
|
+
)
|
|
182
|
+
}
|
|
183
|
+
|
|
173
184
|
// The pre-commit secretlint rule resolves secretlint from the consumer project, so a project
|
|
174
185
|
// that predates the rule needs the devDependencies added here (then `pnpm install`) before the
|
|
175
186
|
// hook can run. `josh init` covers fresh projects; this covers everyone already initialized.
|
|
@@ -182,7 +193,7 @@ function sync_secretlint_development_deps(destination_path: string): void {
|
|
|
182
193
|
}
|
|
183
194
|
|
|
184
195
|
// `lefthook install` fails silently when `core.hooksPath` is set, leaving a consumer with no hooks
|
|
185
|
-
// and no message
|
|
196
|
+
// and no message. `josh init` rewrites the clause it wrote so the failure
|
|
186
197
|
// is reported; this covers everyone already initialized, who never re-runs `josh init`.
|
|
187
198
|
function sync_prepare_lefthook_warning(destination_path: string): void {
|
|
188
199
|
sync_package_json_with(
|
|
@@ -192,7 +203,7 @@ function sync_prepare_lefthook_warning(destination_path: string): void {
|
|
|
192
203
|
)
|
|
193
204
|
}
|
|
194
205
|
|
|
195
|
-
// The `preinstall` earlier kits wrote fetched safe-chain on every install
|
|
206
|
+
// The `preinstall` earlier kits wrote fetched safe-chain on every install;
|
|
196
207
|
// `josh init` replaces it, and this covers everyone already initialized.
|
|
197
208
|
function sync_safe_chain_preinstall(destination_path: string): void {
|
|
198
209
|
sync_package_json_with(
|
|
@@ -206,6 +217,7 @@ function sync_safe_chain_preinstall(destination_path: string): void {
|
|
|
206
217
|
// group so the next one is added here rather than at the call site.
|
|
207
218
|
function sync_package_json_migrations(destination_path: string): void {
|
|
208
219
|
sync_package_manager_version(destination_path)
|
|
220
|
+
sync_package_manager_on_fail(destination_path)
|
|
209
221
|
sync_secretlint_development_deps(destination_path)
|
|
210
222
|
sync_prepare_lefthook_warning(destination_path)
|
|
211
223
|
sync_safe_chain_preinstall(destination_path)
|
|
@@ -213,16 +225,16 @@ function sync_package_json_migrations(destination_path: string): void {
|
|
|
213
225
|
|
|
214
226
|
// Two distributed artifacts each depend on a repository setting kit cannot write, and both reports
|
|
215
227
|
// are tied to the moment the artifact reaches the consumer. `.github/dependabot.yml` disables npm
|
|
216
|
-
// version updates
|
|
217
|
-
// requests through the security-advisory path
|
|
228
|
+
// version updates, so a synced consumer only receives npm Dependabot pull
|
|
229
|
+
// requests through the security-advisory path;
|
|
218
230
|
// `.github/workflows/dependabot-auto-merge.yml` runs `gh pr merge --auto`, which fails outright
|
|
219
|
-
// unless the repository allows auto-merge
|
|
231
|
+
// unless the repository allows auto-merge. Neither ever fails the sync: both
|
|
220
232
|
// are GitHub-side state, not synced artifacts. Unconditional, unlike `init`, because `sync`
|
|
221
233
|
// overwrites both files on every run.
|
|
222
234
|
//
|
|
223
235
|
// The labels are the same kind of GitHub-side prerequisite, and one kit *can* write: the synced
|
|
224
236
|
// `pr-classification.yml` requires one of the release classification labels, so the missing ones are
|
|
225
|
-
// created here rather than reported
|
|
237
|
+
// created here rather than reported.
|
|
226
238
|
function report_repository_settings(name_with_owner: string | undefined): void {
|
|
227
239
|
security_updates.report_security_updates_section(name_with_owner)
|
|
228
240
|
auto_merge_setting.report_auto_merge_section(name_with_owner)
|
|
@@ -242,7 +254,7 @@ function sync_project_artifacts(is_force: boolean): void {
|
|
|
242
254
|
sync_sonar_with_template(name_with_owner, is_force)
|
|
243
255
|
sync_config_files()
|
|
244
256
|
// After `sync_ai_copy_all`, which may add the `pnpm-workspace.yaml` window `.aikido`'s age is
|
|
245
|
-
// derived from
|
|
257
|
+
// derived from.
|
|
246
258
|
project_config.sync_project_config(PROJECT_ROOT)
|
|
247
259
|
sync_package_json_migrations(path.join(PROJECT_ROOT, PACKAGE_JSON))
|
|
248
260
|
report_repository_settings(name_with_owner)
|
|
@@ -250,7 +262,7 @@ function sync_project_artifacts(is_force: boolean): void {
|
|
|
250
262
|
|
|
251
263
|
// A basic project gets what `josh init` gives that profile and nothing more: its AI file set and the
|
|
252
264
|
// move of its prettier preset path. The full toolchain's configs, Sonar, package.json migrations and
|
|
253
|
-
// repository settings are never written into it
|
|
265
|
+
// repository settings are never written into it.
|
|
254
266
|
function sync_basic_artifacts(is_force: boolean): void {
|
|
255
267
|
console.info('profile: basic (package.json josh.profile)\n')
|
|
256
268
|
sync_ai_files.sync_ai_copy_all(is_force, project_profile.inspect_project(PROJECT_ROOT, 'basic'))
|
|
@@ -259,7 +271,7 @@ function sync_basic_artifacts(is_force: boolean): void {
|
|
|
259
271
|
|
|
260
272
|
// Checked before anything is written, never per file: the damage is the whole run, and a partial
|
|
261
273
|
// sync that stopped halfway would leave the source repository in a state neither `git checkout` nor
|
|
262
|
-
// a re-run describes
|
|
274
|
+
// a re-run describes.
|
|
263
275
|
//
|
|
264
276
|
// Only a recorded basic profile switches the file set; an unrecorded one stays full, as every
|
|
265
277
|
// project initialized before the profile was recorded was set up.
|
|
@@ -286,6 +298,7 @@ const sync = {
|
|
|
286
298
|
sync_playwright_config,
|
|
287
299
|
sync_deploy_vps,
|
|
288
300
|
sync_package_manager_version,
|
|
301
|
+
sync_package_manager_on_fail,
|
|
289
302
|
sync_secretlint_development_deps,
|
|
290
303
|
sync_prepare_lefthook_warning,
|
|
291
304
|
sync_safe_chain_preinstall,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { init_logic } from '#scripts/init/init-logic'
|
|
2
2
|
|
|
3
3
|
// **`josh sync` distributes more than the three `AI_COPY_*` lists**, and a gate that reads only
|
|
4
|
-
// those is narrower than the instruction it replaced
|
|
4
|
+
// those is narrower than the instruction it replaced. The prose that
|
|
5
5
|
// instruction lived in named `playwright.config.ts` as its own worked example — a file no `AI_COPY_*`
|
|
6
6
|
// list holds — so a matcher built from those lists alone would have answered "not distributed" for
|
|
7
7
|
// the very file the rule was written about.
|
|
@@ -29,6 +29,7 @@ const SYNCED_CONFIG_PATHS: ReadonlyArray<string> = [
|
|
|
29
29
|
'.secretlintrc.json',
|
|
30
30
|
'.vscode/extensions.json',
|
|
31
31
|
'.vscode/settings.json',
|
|
32
|
+
'.vscode/tasks.json',
|
|
32
33
|
]
|
|
33
34
|
|
|
34
35
|
// **`package.json` is deliberately absent.** `sync` does not overwrite it — it realigns one field,
|
|
@@ -147,7 +147,7 @@ function list_workflow_sources(relative_directory: string): Array<WorkflowSource
|
|
|
147
147
|
}
|
|
148
148
|
|
|
149
149
|
// The local composite actions are runtime sources too: `.github/actions/setup-pnpm` is the only
|
|
150
|
-
// place kit's own workflows still pin pnpm/setup
|
|
150
|
+
// place kit's own workflows still pin pnpm/setup.
|
|
151
151
|
function list_composite_action_sources(): Array<WorkflowSource> {
|
|
152
152
|
return composite_actions
|
|
153
153
|
.list(package_path)
|
|
@@ -4,7 +4,7 @@ import { git_spawn_sync } from '#scripts/git/git-spawn-sync'
|
|
|
4
4
|
import { test_declared_logic, type Verdict } from './test-declared-logic'
|
|
5
5
|
|
|
6
6
|
// The working-tree change set and the verdict over it, read **synchronously** for the `PreToolUse`
|
|
7
|
-
// trigger in `delivered-rules.ts
|
|
7
|
+
// trigger in `delivered-rules.ts`.
|
|
8
8
|
//
|
|
9
9
|
// **Synchronous on purpose, and separate from `git-command.ts` for the same reason `run-cut.ts` keeps
|
|
10
10
|
// a `carried_cut_sync`.** A guard answers a hook synchronously — an `await` or a network call is out —
|
|
@@ -45,7 +45,7 @@ function read_changed_paths_sync(): Array<string> {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
// The working-tree read behind `current_verdict`, injectable so the delivery path can be exercised
|
|
48
|
-
// without a checkout
|
|
48
|
+
// without a checkout. Held on a `const` object rather than a reassigned
|
|
49
49
|
// variable — production leaves `paths` unset and the real reader runs; a test fixes it for the span of
|
|
50
50
|
// one call through `with_paths`, and it is cleared afterwards.
|
|
51
51
|
const injected: { paths?: ReadonlyArray<string> } = {}
|
|
@@ -64,7 +64,7 @@ function current_verdict(paths: ReadonlyArray<string> = source_paths()): Verdict
|
|
|
64
64
|
|
|
65
65
|
// Put the injection back to what it was before a `with_paths` span — cleared to the live reader when
|
|
66
66
|
// nothing was in force, else the outer span's set. Restoring rather than always clearing lets a nested
|
|
67
|
-
// span prove the clear happened without reading the live tree
|
|
67
|
+
// span prove the clear happened without reading the live tree.
|
|
68
68
|
function restore_injection(previous: ReadonlyArray<string> | undefined): void {
|
|
69
69
|
if (previous === undefined) {
|
|
70
70
|
delete injected.paths
|
|
@@ -75,7 +75,7 @@ function restore_injection(previous: ReadonlyArray<string> | undefined): void {
|
|
|
75
75
|
injected.paths = previous
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
// The seam the `rule_delivery` call path needs
|
|
78
|
+
// The seam the `rule_delivery` call path needs. `is_untested_commit` reads the
|
|
79
79
|
// tree at trigger time rather than from an argument, so a unit test driving `rule_delivery` cannot reach
|
|
80
80
|
// `current_verdict`'s `paths` port from the outside. Running `body` inside `with_paths` fixes the read
|
|
81
81
|
// to `paths` for its duration and restores it afterwards — the `PreToolUse` production path, which never
|