@joshuafolkken/kit 1.1229.0 → 1.1370.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 +50 -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 +24 -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 +27 -16
- package/.claude/skills/workflow-commands/latest-gate.md +18 -29
- 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/.github/workflows/publish.yml +2 -0
- package/.vscode/tasks.json +14 -0
- package/CLAUDE.md +10 -61
- package/README.md +38 -57
- package/SECURITY.md +1 -1
- package/dist/CLAUDE.md +10 -61
- package/dist/commands/document-section-cli.js +42 -10
- 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-FIVDHQGT.js → chunk-43G45XJF.js} +18 -20
- package/dist/hooks/{chunk-JUDKDCDP.js → chunk-4TW4MQUL.js} +284 -362
- package/dist/hooks/{chunk-5VMKCCC4.js → chunk-76RK6E3H.js} +13 -11
- package/dist/hooks/{chunk-RNWHN5BP.js → chunk-DZWZ3DKY.js} +4 -4
- package/dist/hooks/{chunk-5VNDSNG3.js → chunk-FZ6FUSBM.js} +1 -1
- package/dist/hooks/{chunk-VC3PZPZO.js → chunk-GG72ANKI.js} +1 -1
- package/dist/hooks/{chunk-6HJJXRBX.js → chunk-KPM4YIIX.js} +8 -44
- package/dist/hooks/chunk-MXVQMLDP.js +3705 -0
- package/dist/hooks/{chunk-ELCN5LCH.js → chunk-NEC4AT4Z.js} +34 -12
- package/dist/hooks/{chunk-TQNPDZNH.js → chunk-NZBHG6FW.js} +7 -5
- package/dist/hooks/chunk-NZN2UFI6.js +2409 -0
- package/dist/hooks/{chunk-F56MFS4B.js → chunk-R6CRQEAL.js} +4 -4
- package/dist/hooks/chunk-SYSRHRWU.js +1589 -0
- package/dist/hooks/{chunk-55HHG5PX.js → chunk-TLJYAGZK.js} +799 -903
- 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 +213 -197
- 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 -201
- package/dist/josh.js +540 -137
- 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 +16 -10
- 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 +4 -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 +26 -2
- 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 +162 -0
- package/scripts/gate/core-budget.ts +134 -91
- package/scripts/gate/gate-ledger.ts +114 -0
- package/scripts/gate/gate-log.ts +7 -9
- package/scripts/gate/gate-plan.ts +103 -35
- package/scripts/gate/gate-report.ts +39 -21
- 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 +313 -0
- 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 +60 -53
- 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 +12 -8
- 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 +35 -0
- 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 +49 -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 +75 -15
- package/scripts/issue/issue-file-fold.ts +155 -0
- package/scripts/issue/issue-file.ts +14 -6
- package/scripts/issue/issue-fold-cli.ts +14 -9
- package/scripts/issue/issue-fold.ts +23 -8
- package/scripts/issue/issue-labels.ts +46 -37
- 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 +165 -0
- package/scripts/issue/issue-release.ts +58 -0
- 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 +32 -34
- 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 +33 -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 +11 -5
- package/scripts/josh/josh-commands-lane.ts +16 -5
- package/scripts/josh/josh-commands-lint.ts +1 -1
- package/scripts/josh/josh-commands-maintenance.ts +2 -2
- package/scripts/josh/josh-commands-run.ts +20 -6
- 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 +10 -10
- 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 +20 -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 +44 -30
- 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 +25 -24
- package/scripts/lane/lane-output.ts +4 -3
- package/scripts/lane/lane-paths.ts +22 -8
- package/scripts/lane/lane-phase.ts +33 -0
- package/scripts/lane/lane-reap.ts +2 -2
- package/scripts/lane/lane-registry.ts +27 -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 +140 -0
- 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/cspell-cached.ts +1 -1
- package/scripts/lint/cycle-recheck.ts +122 -0
- package/scripts/lint/format.ts +1 -2
- package/scripts/lint/lint-parallel.ts +34 -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-environment.ts +1 -0
- package/scripts/release/github-release-runs.ts +115 -0
- package/scripts/release/github-release.ts +13 -67
- 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 +5 -6
- 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 +68 -37
- 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 +10 -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 +172 -43
- 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 +25 -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 +13 -15
- package/scripts/run/run-step.ts +62 -48
- 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 -33
- package/scripts/run/wake/run-wake-describe.ts +76 -29
- 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 +13 -21
- 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 -328
- 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 +129 -98
- 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/templates/workflows/github-release.yml +4 -0
- package/dist/hooks/chunk-NV2JRZZO.js +0 -6385
- 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
|
@@ -4,6 +4,7 @@ import path from 'node:path'
|
|
|
4
4
|
import { fileURLToPath } from 'node:url'
|
|
5
5
|
import { resolve_local_bin, resolve_package_bin } from '#scripts/build/local-bin'
|
|
6
6
|
import { ESLINT_EDIT_CACHE_FLAGS } from '#scripts/josh/josh-command-types'
|
|
7
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
7
8
|
import { HOOK_PROCESS_TIMEOUT_MS } from '#scripts/lib/timeouts'
|
|
8
9
|
import { time_density_hook } from '#scripts/time-runtime/time-density-hook'
|
|
9
10
|
import { execa } from 'execa'
|
|
@@ -61,7 +62,7 @@ const PRETTIER_ARGUMENTS: ReadonlyArray<string> = ['--write', '--ignore-unknown'
|
|
|
61
62
|
// nothing to say about it, and a non-zero exit here would be reported as a failed hook.
|
|
62
63
|
//
|
|
63
64
|
// The cache flags are not here to make the hook faster — they are here to stop it destroying the
|
|
64
|
-
// gate's cache
|
|
65
|
+
// gate's cache. ESLint started *without* `--cache` deletes the file at
|
|
65
66
|
// `--cache-location`, so this hook wiped `.eslintcache` on every edit and the gate's lint ran cold
|
|
66
67
|
// every time. Passing them points that deletion, and the hook's own reads and writes, at a location
|
|
67
68
|
// of its own — its own rather than the gate's because the two run concurrently, and each eslint run
|
|
@@ -81,7 +82,7 @@ const ESLINT_ARGUMENTS: ReadonlyArray<string> = [
|
|
|
81
82
|
// hope — behind a socket and forwards the same arguments to it, which is why the fixed output is
|
|
82
83
|
// identical rather than merely similar. The config entry file is re-read per request; the modules it
|
|
83
84
|
// imports are not, which `plan_daemon_restart` below is the answer to. The daemon exits after 15
|
|
84
|
-
// minutes of inactivity
|
|
85
|
+
// minutes of inactivity.
|
|
85
86
|
const ESLINT_DAEMON = 'eslint_d'
|
|
86
87
|
const DAEMON_RESTART = 'restart'
|
|
87
88
|
// The two shapes a flat config is built from here and in every consumer of this kit: the root
|
|
@@ -90,8 +91,7 @@ const ESLINT_CONFIG_DIR = 'eslint'
|
|
|
90
91
|
const ESLINT_CONFIG_ENTRY = /^eslint\.config\.[cm]?[jt]s$/u
|
|
91
92
|
|
|
92
93
|
// The problems eslint could not auto-fix are handed to the model verbatim from eslint's own stdout —
|
|
93
|
-
// its default formatter already prints the file, the `line:col`, and the rule name the
|
|
94
|
-
// for (joshuafolkken/kit#2275). A header names what the block is, since additionalContext arrives
|
|
94
|
+
// its default formatter already prints the file, the `line:col`, and the rule name. A header names what the block is, since additionalContext arrives
|
|
95
95
|
// with no framing of its own.
|
|
96
96
|
const DIAGNOSTIC_HEADER =
|
|
97
97
|
'The edit hook could not auto-fix these lint problems; address them now rather than at the gate:'
|
|
@@ -129,7 +129,7 @@ interface BinRoutes {
|
|
|
129
129
|
// on a half-written file. The stdout the spawn captured is what separates the two: eslint prints the
|
|
130
130
|
// problems it is exiting non-zero about, while a daemon that could not start prints its reason to
|
|
131
131
|
// stderr and leaves stdout empty. It is kept whole rather than reduced to a boolean because the
|
|
132
|
-
// problems eslint could not fix are reported to the model from it
|
|
132
|
+
// problems eslint could not fix are reported to the model from it.
|
|
133
133
|
interface CommandOutcome {
|
|
134
134
|
exit_code: number
|
|
135
135
|
stdout: string
|
|
@@ -138,13 +138,7 @@ interface CommandOutcome {
|
|
|
138
138
|
type CommandRunner = (command: FormatCommand, project_root: string) => Promise<CommandOutcome>
|
|
139
139
|
|
|
140
140
|
function parse_edited_path(raw_payload: string): string | undefined {
|
|
141
|
-
|
|
142
|
-
const result = hook_payload_schema.safeParse(JSON.parse(raw_payload))
|
|
143
|
-
|
|
144
|
-
return result.success ? result.data.tool_input?.file_path : undefined
|
|
145
|
-
} catch {
|
|
146
|
-
return undefined
|
|
147
|
-
}
|
|
141
|
+
return json_value.parse_with(raw_payload, hook_payload_schema)?.tool_input?.file_path
|
|
148
142
|
}
|
|
149
143
|
|
|
150
144
|
// Read against the path relative to the project root, never the absolute one: a checkout that lives
|
|
@@ -352,7 +346,7 @@ function format_diagnostics(unfixed: string | undefined): string | undefined {
|
|
|
352
346
|
}
|
|
353
347
|
|
|
354
348
|
// The fixes eslint could apply are applied silently, as before; what it could not fix is returned so
|
|
355
|
-
// the model sees it on this edit rather than at the gate
|
|
349
|
+
// the model sees it on this edit rather than at the gate. A `PostToolUse`
|
|
356
350
|
// hook still reports no failure — the edit already landed, and returning the problems is not the same
|
|
357
351
|
// as failing the write.
|
|
358
352
|
// Runs the planned commands in order, returning the last unfixed eslint output. Empty until eslint
|
|
@@ -410,7 +404,7 @@ async function format_edited_payload(
|
|
|
410
404
|
const HOOK_EVENT_NAME = 'PostToolUse'
|
|
411
405
|
|
|
412
406
|
// The live round-trip density line, riding this hook rather than one of its own
|
|
413
|
-
//
|
|
407
|
+
// — a `PostToolUse` matcher covering every tool would add a process start to
|
|
414
408
|
// all ~250 calls of a run.
|
|
415
409
|
//
|
|
416
410
|
// **A `PostToolUse` hook's plain stdout never reaches the model**; only `additionalContext` inside
|
|
@@ -458,9 +452,9 @@ function report_no_payload(): void {
|
|
|
458
452
|
// their processes have run; the density line is joined to them into the single envelope the harness
|
|
459
453
|
// can parse, rather than written first on its own. The rewrite notice is read from the file itself —
|
|
460
454
|
// its content before the formatters ran against its content after — so it too is known only once they
|
|
461
|
-
// have
|
|
462
|
-
// joined to the density line — one envelope, since a `PostToolUse` hook's stdout carries only one
|
|
463
|
-
//
|
|
455
|
+
// have. The rewrite, lint and spell blocks are composed together first, then
|
|
456
|
+
// joined to the density line — one envelope, since a `PostToolUse` hook's stdout carries only one.
|
|
457
|
+
// A hook killed at its 15s timeout is the one case this loses the density
|
|
464
458
|
// line to — a run already gone pathologically wrong, per HOOK_PROCESS_TIMEOUT_MS.
|
|
465
459
|
async function run_hook(payload: string): Promise<void> {
|
|
466
460
|
const notice = time_density_hook.density_notice(payload)
|
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
import { file_reader } from '#scripts/lib/read-file'
|
|
2
2
|
|
|
3
|
-
// The rewrite half of the edit hook
|
|
3
|
+
// The rewrite half of the edit hook. The format hook runs prettier and
|
|
4
4
|
// `eslint --fix` in place after every edit, so a file the model just wrote can be rewritten out from
|
|
5
5
|
// under the image the model holds — and the next `Edit` against that stale image misses, then pays for
|
|
6
|
-
// a full re-read that rides every later request.
|
|
7
|
-
//
|
|
6
|
+
// a full re-read that rides every later request. Riding the same `additionalContext` path as the lint
|
|
7
|
+
// and cspell halves, this returns the fact that the file
|
|
8
8
|
// changed and the region that changed, so the model reissues against current text without re-reading
|
|
9
9
|
// the whole file. Nothing is added when formatting left the file untouched.
|
|
10
10
|
|
|
11
|
-
// additionalContext rides back on the edit, so the
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
|
|
15
|
-
const
|
|
11
|
+
// additionalContext rides back on the edit, so the whole notice is cut to this bound rather than let
|
|
12
|
+
// a large reformat balloon the run's context — the notice is a cheaper hint than the full re-read it
|
|
13
|
+
// replaces, and stays cheaper only while it is bounded. The line range leads, so a cut preview still
|
|
14
|
+
// says where to re-read.
|
|
15
|
+
const MAX_REWRITE_CHARS = 600
|
|
16
|
+
const REWRITE_TRUNCATION_NOTICE = '\n…(truncated)'
|
|
16
17
|
// The header names what the block is, since additionalContext arrives with no framing of its own, and
|
|
17
18
|
// says the one thing the model has to act on: its copy is stale, so re-read before the next edit.
|
|
18
19
|
const REWRITE_HEADER =
|
|
19
|
-
'The format hook rewrote this file
|
|
20
|
-
const REWRITE_RANGE_PREFIX = '
|
|
20
|
+
'The format hook rewrote this file, so your copy is stale; re-read these lines before the next Edit.'
|
|
21
|
+
const REWRITE_RANGE_PREFIX = 'Lines '
|
|
21
22
|
const LINE_SEPARATOR = '\n'
|
|
22
23
|
const FIRST_LINE = 1
|
|
23
24
|
|
|
@@ -64,21 +65,22 @@ function changed_range(before: string, after: string): ChangedRange {
|
|
|
64
65
|
}
|
|
65
66
|
}
|
|
66
67
|
|
|
67
|
-
|
|
68
|
-
|
|
68
|
+
// `budget` is what the header and the range left of the bound; the marker is paid out of it.
|
|
69
|
+
function cap_body(body: string, budget: number): string {
|
|
70
|
+
if (body.length <= budget) return body
|
|
69
71
|
|
|
70
|
-
return `${body.slice(0,
|
|
72
|
+
return `${body.slice(0, Math.max(0, budget - REWRITE_TRUNCATION_NOTICE.length))}${REWRITE_TRUNCATION_NOTICE}`
|
|
71
73
|
}
|
|
72
74
|
|
|
73
|
-
// The block the model reads: the header, the line range, then the region's new text
|
|
74
|
-
// `undefined` when formatting changed nothing, so the ordinary edit adds nothing
|
|
75
|
+
// The block the model reads: the header, the line range, then the region's new text — the whole cut
|
|
76
|
+
// to the bound. `undefined` when formatting changed nothing, so the ordinary edit adds nothing.
|
|
75
77
|
function build(before: string, after: string): string | undefined {
|
|
76
78
|
if (before === after) return undefined
|
|
77
79
|
|
|
78
80
|
const range = changed_range(before, after)
|
|
79
|
-
const
|
|
81
|
+
const head = `${REWRITE_HEADER}\n${REWRITE_RANGE_PREFIX}${String(range.start_line)}-${String(range.end_line)}:\n`
|
|
80
82
|
|
|
81
|
-
return `${
|
|
83
|
+
return `${head}${cap_body(range.body, MAX_REWRITE_CHARS - head.length)}`
|
|
82
84
|
}
|
|
83
85
|
|
|
84
86
|
// The file content around a format run, read for the before/after comparison. A path the hook was
|
|
@@ -5,22 +5,18 @@ import { gate_tree, type GateTree } from '#scripts/gate/gate-tree'
|
|
|
5
5
|
import { hook_gate_reuse } from '#scripts/gate/hook-gate-reuse'
|
|
6
6
|
import { test_unit_guard } from '#scripts/test/test-unit-guard'
|
|
7
7
|
|
|
8
|
-
// The pre-push hook's unit run, which
|
|
9
|
-
//
|
|
8
|
+
// The pre-push hook's unit run, which does not re-run a suite a green gate already covers: the gate
|
|
9
|
+
// writes its record down, and re-running `vitest run` on a tree it just printed green is the bulk of
|
|
10
|
+
// what `pnpm josh git -y` would otherwise spend.
|
|
10
11
|
//
|
|
11
|
-
//
|
|
12
|
-
// `vitest run` — started 40 seconds after `pnpm josh gate` had printed all four checks green on that
|
|
13
|
-
// same tree, with nothing edited in between. The gate had written the record down and the hook was
|
|
14
|
-
// the one reader that never looked at it.
|
|
15
|
-
//
|
|
16
|
-
// **The decision is joshuafolkken/kit#1328's, imported rather than restated.** "There is a green
|
|
12
|
+
// **The decision is the gate's, imported rather than restated.** "There is a green
|
|
17
13
|
// record and nothing it covers has moved" is one question, and a hook answering it differently from
|
|
18
14
|
// the gate beside it would be two commands disagreeing about the same tree — the clone `CLAUDE.md`
|
|
19
15
|
// prohibits. So `gate_skip.reusable_green_gate` decides all three of its conditions here too: the
|
|
20
16
|
// file map matches, the **base commit** the map is a diff against matches, and the map is non-empty.
|
|
21
17
|
//
|
|
22
|
-
// **What this hook shares with the pre-commit type check is `hook-gate-reuse.ts
|
|
23
|
-
//
|
|
18
|
+
// **What this hook shares with the pre-commit type check is `hook-gate-reuse.ts`**:
|
|
19
|
+
// the escape hatch, the pre-filter in front of the record and the one
|
|
24
20
|
// `git status` reading both narrow themselves from. Only the narrowing itself is written here, because
|
|
25
21
|
// only it is about a push.
|
|
26
22
|
//
|
|
@@ -41,7 +37,7 @@ const FORCE_ENV = 'JOSH_PRE_PUSH_FORCE'
|
|
|
41
37
|
// `gate-tree.ts` rather than read a second way here — plus the one this hook adds.
|
|
42
38
|
interface PushTree extends GateTree {
|
|
43
39
|
is_clean: boolean
|
|
44
|
-
// What a dirty tree reports as the reason the record was not reused
|
|
40
|
+
// What a dirty tree reports as the reason the record was not reused — the
|
|
45
41
|
// paths name a lock file a hook's own `pnpm install` rewrote, the case that went unexplained.
|
|
46
42
|
carry_miss: string
|
|
47
43
|
}
|
|
@@ -104,7 +100,7 @@ function push_reuse(
|
|
|
104
100
|
// **The sentence claims the result, never merely the omission.** "unit tests skipped" reads as "not
|
|
105
101
|
// verified", which is the one thing this line must not be mistaken for while the push it precedes
|
|
106
102
|
// goes on to the remote. So it says what passed, on which tree, when, and how to run it anyway — in
|
|
107
|
-
// the one sentence every reader of the record shares
|
|
103
|
+
// the one sentence every reader of the record shares.
|
|
108
104
|
function format_skip(taken_at: string): string {
|
|
109
105
|
return gate_skip.format_reuse_notice({
|
|
110
106
|
subject: 'the unit tests',
|
|
@@ -118,9 +114,9 @@ function format_skip(taken_at: string): string {
|
|
|
118
114
|
// The suite is run through the guard `josh test:unit` uses rather than a bare `vitest run`, so a
|
|
119
115
|
// project with no vitest prints a skip notice instead of failing the push — the behavior the hook's
|
|
120
116
|
// other commands already have. **A project that has vitest and no test file at all fails the push
|
|
121
|
-
// instead
|
|
117
|
+
// instead**: the guard treats that half as a broken state rather than a
|
|
122
118
|
// young project, and the hook returns what the guard returns.
|
|
123
|
-
// **A fall back to the whole suite says why, in one line
|
|
119
|
+
// **A fall back to the whole suite says why, in one line**: under a crowded
|
|
124
120
|
// machine the suite costs minutes, and a silent miss left a moved merge base, a dirty tree and a
|
|
125
121
|
// mismatched record indistinguishable from one another.
|
|
126
122
|
function format_miss(reason: string): string {
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
import { text } from 'node:stream/consumers'
|
|
3
3
|
import { fileURLToPath } from 'node:url'
|
|
4
4
|
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
5
|
-
import { pretool_guard
|
|
5
|
+
import { pretool_guard } from './pretool-guard'
|
|
6
6
|
|
|
7
|
-
// The `PreToolUse` hook's entry, kept apart from the composition in `pretool-guard.ts
|
|
8
|
-
//
|
|
7
|
+
// The `PreToolUse` hook's entry, kept apart from the composition in `pretool-guard.ts`.
|
|
8
|
+
// The hook bundles are built with `splitting: true`, which moves a module
|
|
9
9
|
// imported by two entries into a shared chunk — and `codex-hook-adapter.ts` imports `pretool-guard.ts`.
|
|
10
10
|
// Its self-invoke went into that chunk, whose `import.meta.url` never equals the launched
|
|
11
11
|
// `dist/hooks/pretool-guard.js`, so the bundled hook ran no guard at all and every refusal failed open.
|
|
@@ -16,6 +16,6 @@ if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
|
16
16
|
const raw_payload = await text(process.stdin)
|
|
17
17
|
|
|
18
18
|
hook_decision.load_environment_file()
|
|
19
|
-
pretool_guard.
|
|
19
|
+
await pretool_guard.respond(raw_payload)
|
|
20
20
|
}
|
|
21
21
|
}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { duplicate_read_outcome } from '#scripts/delegation/duplicate-read-guard'
|
|
2
2
|
import { investigation_refusal } from '#scripts/delegation/investigation-guard'
|
|
3
3
|
import { hook_decision, type GuardOutcome } from '#scripts/josh/hook-decision'
|
|
4
|
+
import { lane_phase } from '#scripts/lane/lane-phase'
|
|
5
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
4
6
|
import { delivered_rules } from '#scripts/rules/delivered-rules'
|
|
5
7
|
import { lane_background } from '#scripts/rules/lane-background'
|
|
8
|
+
import { piped_verification } from '#scripts/rules/piped-verification'
|
|
6
9
|
import { run_parent_cut_hook } from '#scripts/run/run-parent-cut-hook'
|
|
7
10
|
import { run_watcher_hook } from '#scripts/run/run-watcher-hook'
|
|
8
11
|
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
9
12
|
import { batch_outcome } from './batch-guard'
|
|
10
13
|
import { step_zero_notice } from './step-zero-notice'
|
|
11
14
|
|
|
12
|
-
// One PreToolUse process for the three guards that used to be three
|
|
15
|
+
// One PreToolUse process for the three guards that used to be three. A Bash
|
|
13
16
|
// call used to spawn `batch:guard`, `investigation:guard` and `rule:guard` separately — three pnpm
|
|
14
17
|
// launches on top of the tool call — while consumers paid that thrice on every guarded call. The
|
|
15
18
|
// three share one shell (`hook-decision.ts`): the same payload schema, the same deny envelope, the
|
|
@@ -19,10 +22,10 @@ import { step_zero_notice } from './step-zero-notice'
|
|
|
19
22
|
// **The verdict is identical to running the three in turn**, and that is the whole point. Each guard
|
|
20
23
|
// self-gates on the tool name inside its own `is_candidate` / trigger, so running all three on the
|
|
21
24
|
// union matcher (`Bash|Edit|Read|Write|AskUserQuestion`) refuses exactly what the three separate
|
|
22
|
-
// entries did — `AskUserQuestion` is matched for the rule guard's lane-child interactive-ask row
|
|
23
|
-
//
|
|
25
|
+
// entries did — `AskUserQuestion` is matched for the rule guard's lane-child interactive-ask row,
|
|
26
|
+
// and the batching and investigation guards self-gate away from it. A
|
|
24
27
|
// refusal from any guard wins first; only when none refuses is the batch guard's non-blocking notice
|
|
25
|
-
// (the whole-file-write notice
|
|
28
|
+
// (the whole-file-write notice) emitted. Each guard still honours its own
|
|
26
29
|
// switch (`JOSH_BATCH_GUARD` / `JOSH_INVESTIGATION_GUARD` / `JOSH_RULE_GUARD`) internally, so this
|
|
27
30
|
// process needs no switch of its own.
|
|
28
31
|
|
|
@@ -44,7 +47,7 @@ function is_clear(outcome: GuardOutcome): boolean {
|
|
|
44
47
|
}
|
|
45
48
|
|
|
46
49
|
// The duplicate-read guard is `notice`-mode in a lane child, so it is the second guard that can raise a
|
|
47
|
-
// non-refusal notice
|
|
50
|
+
// non-refusal notice. Its notice is surfaced only where nothing else spoke —
|
|
48
51
|
// a refusal from any guard, or the batch guard's own notice, wins first.
|
|
49
52
|
function with_duplicate_notice(combined: GuardOutcome, notice: string | undefined): GuardOutcome {
|
|
50
53
|
if (notice === undefined || !is_clear(combined)) return combined
|
|
@@ -52,7 +55,7 @@ function with_duplicate_notice(combined: GuardOutcome, notice: string | undefine
|
|
|
52
55
|
return { reason: undefined, notice, fault: undefined }
|
|
53
56
|
}
|
|
54
57
|
|
|
55
|
-
// The Step 0 reminder is the last word
|
|
58
|
+
// The Step 0 reminder is the last word: asked only where every guard stayed
|
|
56
59
|
// clear, so a refusal or another notice never spends its once-per-session stamp unseen.
|
|
57
60
|
function with_step_zero_notice(outcome: GuardOutcome, raw_payload: string): GuardOutcome {
|
|
58
61
|
if (!is_clear(outcome)) return outcome
|
|
@@ -81,15 +84,22 @@ function pretool_outcome(raw_payload: string): GuardOutcome {
|
|
|
81
84
|
return with_step_zero_notice(guard_outcome(raw_payload), raw_payload)
|
|
82
85
|
}
|
|
83
86
|
|
|
87
|
+
// The Step 0 notice fires once, on the first runtime-file edit: the moment a lane child's plan turns
|
|
88
|
+
// into code, which `run:board` draws as its `implement` phase. Both the Claude
|
|
89
|
+
// path and the Codex adapter call this on their final outcome, so neither runtime skips the phase.
|
|
90
|
+
async function mark_phase(outcome: GuardOutcome): Promise<void> {
|
|
91
|
+
if (outcome.notice === step_zero_notice.NOTICE) await lane_phase.mark_implement()
|
|
92
|
+
}
|
|
93
|
+
|
|
84
94
|
// The watcher guard is the one composed rule that cannot answer synchronously — it reads the lane
|
|
85
|
-
// registry and the watcher's life record off disk
|
|
95
|
+
// registry and the watcher's life record off disk. So it is asked after the
|
|
86
96
|
// synchronous guards and only where they stayed clear: a refusal from any of them wins first, exactly
|
|
87
97
|
// as `combine_outcomes` orders them, and the watcher's refusal fills a clear verdict rather than
|
|
88
98
|
// overriding one. It fires once per run itself (`run-watcher-hook.ts`), so a stale watcher refuses the
|
|
89
99
|
// first call but not the `pnpm josh run:progress --wait` that fixes it.
|
|
90
100
|
//
|
|
91
|
-
// **The parent hand-off guard is the second asynchronous rule, asked after the watcher's
|
|
92
|
-
//
|
|
101
|
+
// **The parent hand-off guard is the second asynchronous rule, asked after the watcher's**.
|
|
102
|
+
// It reads the carry record to tell the `backlogrun` parent apart, so it sits
|
|
93
103
|
// beside the watcher rather than among the synchronous rows; a stale watcher is the cheaper fix and is
|
|
94
104
|
// surfaced first.
|
|
95
105
|
async function async_reason(raw_payload: string): Promise<string | undefined> {
|
|
@@ -107,7 +117,11 @@ async function pretool_outcome_async(raw_payload: string): Promise<GuardOutcome>
|
|
|
107
117
|
|
|
108
118
|
if (reason !== undefined) return { reason, notice: undefined, fault: undefined }
|
|
109
119
|
|
|
110
|
-
|
|
120
|
+
const outcome = with_step_zero_notice(base, raw_payload)
|
|
121
|
+
|
|
122
|
+
await mark_phase(outcome)
|
|
123
|
+
|
|
124
|
+
return outcome
|
|
111
125
|
}
|
|
112
126
|
|
|
113
127
|
function guarded_call(raw_payload: string): GuardedCall | undefined {
|
|
@@ -122,8 +136,13 @@ function guarded_call(raw_payload: string): GuardedCall | undefined {
|
|
|
122
136
|
}
|
|
123
137
|
}
|
|
124
138
|
|
|
125
|
-
//
|
|
126
|
-
|
|
139
|
+
// A rewrite's note first, so the transcript's context line opens with it; the outcome's notice after.
|
|
140
|
+
function rewrite_context(note: string, outcome: GuardOutcome): string {
|
|
141
|
+
return [note, outcome.notice ?? outcome.fault].filter(Boolean).join('\n\n')
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// The envelope that replaces the outcome's own when a lane child backgrounded `josh ship` alone:
|
|
145
|
+
// the call is run in the foreground instead of being refused. A refusal from
|
|
127
146
|
// any guard still wins, and a notice the outcome carried rides along in the same context.
|
|
128
147
|
function foreground_rewrite(
|
|
129
148
|
outcome: GuardOutcome,
|
|
@@ -138,19 +157,75 @@ function foreground_rewrite(
|
|
|
138
157
|
|
|
139
158
|
if (input === undefined) return undefined
|
|
140
159
|
|
|
141
|
-
|
|
160
|
+
return hook_decision.rewrite_envelope(
|
|
161
|
+
input,
|
|
162
|
+
rewrite_context(lane_background.FOREGROUND_NOTE, outcome),
|
|
163
|
+
)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
interface PipefailRewrite {
|
|
167
|
+
payload: string
|
|
168
|
+
input: Record<string, unknown>
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// A piped josh check the hook runs under `set -o pipefail` instead of refusing it:
|
|
172
|
+
// the rewritten input, and the payload that carries it. The rewrite is the
|
|
173
|
+
// rule guard's delivery, so the rule guard's switch turns it off too.
|
|
174
|
+
function pipefail_rewrite(raw_payload: string): PipefailRewrite | undefined {
|
|
175
|
+
if (!delivered_rules.is_enabled()) return undefined
|
|
176
|
+
|
|
177
|
+
const call = guarded_call(raw_payload)
|
|
178
|
+
const input = call === undefined ? undefined : piped_verification.pipefail_input(call)
|
|
179
|
+
const payload = json_value.parse_or_undefined(raw_payload)
|
|
180
|
+
|
|
181
|
+
if (input === undefined || !json_value.is_record(payload)) return undefined
|
|
182
|
+
|
|
183
|
+
return { payload: JSON.stringify({ ...payload, tool_input: input }), input }
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function pipefail_envelope(
|
|
187
|
+
outcome: GuardOutcome,
|
|
188
|
+
input: Record<string, unknown> | undefined,
|
|
189
|
+
): string | undefined {
|
|
190
|
+
if (input === undefined || outcome.reason !== undefined) return undefined
|
|
142
191
|
|
|
143
|
-
return hook_decision.rewrite_envelope(
|
|
192
|
+
return hook_decision.rewrite_envelope(
|
|
193
|
+
input,
|
|
194
|
+
rewrite_context(piped_verification.PIPEFAIL_NOTE, outcome),
|
|
195
|
+
)
|
|
144
196
|
}
|
|
145
197
|
|
|
146
|
-
// The hook's one write:
|
|
147
|
-
function emit(
|
|
148
|
-
|
|
198
|
+
// The hook's one write: a rewrite where one applies, the outcome's own envelope otherwise.
|
|
199
|
+
function emit(
|
|
200
|
+
raw_payload: string,
|
|
201
|
+
outcome: GuardOutcome,
|
|
202
|
+
pipefail_input?: Record<string, unknown>,
|
|
203
|
+
): void {
|
|
204
|
+
const rewrite =
|
|
205
|
+
pipefail_envelope(outcome, pipefail_input) ?? foreground_rewrite(outcome, raw_payload)
|
|
149
206
|
|
|
150
207
|
if (rewrite === undefined) hook_decision.emit_outcome(outcome)
|
|
151
208
|
else process.stdout.write(`${rewrite}\n`)
|
|
152
209
|
}
|
|
153
210
|
|
|
154
|
-
|
|
211
|
+
// **The guards judge the call that will run.** A rewritable piped check reaches every guard already
|
|
212
|
+
// prefixed, so the piped-verification row stays quiet on it while any other guard's refusal still wins
|
|
213
|
+
// over the rewrite. The Codex adapter cannot rewrite a call, so it goes on judging the call as typed.
|
|
214
|
+
async function respond(raw_payload: string): Promise<void> {
|
|
215
|
+
const pipefail = pipefail_rewrite(raw_payload)
|
|
216
|
+
const judged = pipefail?.payload ?? raw_payload
|
|
217
|
+
|
|
218
|
+
emit(judged, await pretool_outcome_async(judged), pipefail?.input)
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const pretool_guard = {
|
|
222
|
+
combine_outcomes,
|
|
223
|
+
emit,
|
|
224
|
+
foreground_rewrite,
|
|
225
|
+
mark_phase,
|
|
226
|
+
pipefail_rewrite,
|
|
227
|
+
pretool_outcome,
|
|
228
|
+
respond,
|
|
229
|
+
}
|
|
155
230
|
|
|
156
231
|
export { pretool_guard, pretool_outcome, pretool_outcome_async }
|
|
@@ -4,7 +4,7 @@ import { core_budget } from '#scripts/gate/core-budget'
|
|
|
4
4
|
import { unit_worker_share } from '#scripts/test/unit-worker-share'
|
|
5
5
|
import { execa } from 'execa'
|
|
6
6
|
|
|
7
|
-
// Runs a command while holding a place in the machine-wide core budget
|
|
7
|
+
// Runs a command while holding a place in the machine-wide core budget.
|
|
8
8
|
//
|
|
9
9
|
// **The pre-push hook's `pnpm install` and `pnpm josh audit` are heavy and were outside the ledger.**
|
|
10
10
|
// The gate's checks reserve their cores, but a lefthook `pre-push` fires `pnpm install` on every push
|
|
@@ -70,7 +70,7 @@ async function run_reserved(argv: ReadonlyArray<string>): Promise<number> {
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
// **A command already inside a gate's unit suite takes no place, for the reason a nested gate does
|
|
73
|
-
// not
|
|
73
|
+
// not**: this repository's own gate tests exercise the wrapper, and a place
|
|
74
74
|
// claimed there would wait on cores the outer gate is holding. In its real use — the pre-push hook —
|
|
75
75
|
// nothing has set the marker, so the reservation is taken.
|
|
76
76
|
if (unit_worker_share.is_nested_run()) return await run_command(parsed.command)
|
|
@@ -4,7 +4,7 @@ import { json_value } from '#scripts/lib/json-value'
|
|
|
4
4
|
import { test_declared_logic } from '#scripts/test/test-declared-logic'
|
|
5
5
|
|
|
6
6
|
// The Code Change Rules Step 0 reminder, delivered at the moment implementation code is about to be
|
|
7
|
-
// written rather than on every prompt
|
|
7
|
+
// written rather than on every prompt. As a `UserPromptSubmit` echo it was
|
|
8
8
|
// injected into every turn — a question that writes nothing included — and re-read as accumulated
|
|
9
9
|
// context on each turn after it. The trigger the rule names is "before writing any implementation
|
|
10
10
|
// code", so the hook that delivers it is the one that sees that write: the first `Edit` / `Write` of a
|
|
@@ -23,7 +23,7 @@ import { run_stranded_detect } from '#scripts/run/run-stranded-detect'
|
|
|
23
23
|
import { time_density_hook } from '#scripts/time-runtime/time-density-hook'
|
|
24
24
|
import { time_hook_transcript } from '#scripts/time-runtime/time-hook-transcript'
|
|
25
25
|
|
|
26
|
-
// The `Stop` hook entry: one process that delivers the three stop-time rules
|
|
26
|
+
// The `Stop` hook entry: one process that delivers the three stop-time rules.
|
|
27
27
|
// It is the stop-time counterpart of `pretool-guard.ts` — a second entry on the same `hook_decision`
|
|
28
28
|
// foundation, not a second copy of it.
|
|
29
29
|
//
|
|
@@ -33,8 +33,8 @@ import { time_hook_transcript } from '#scripts/time-runtime/time-hook-transcript
|
|
|
33
33
|
// resolving (send the notify, release the hold) and `stop_hook_active` is the backstop, so failing
|
|
34
34
|
// open here costs at most a missed nudge, never a stuck run.
|
|
35
35
|
|
|
36
|
-
// The hold record for this working tree is still in place, and whether it is a `prrun` stop's
|
|
37
|
-
//
|
|
36
|
+
// The hold record for this working tree is still in place, and whether it is a `prrun` stop's.
|
|
37
|
+
// `unreadable` reads as absent: the safe direction for a stop guard is not to
|
|
38
38
|
// block, and an unreadable record is not proof a run is holding.
|
|
39
39
|
async function hold_facts(): Promise<Pick<StopContext, 'hold_present' | 'prrun_stopped'>> {
|
|
40
40
|
const directory = await run_hold.worktree_directory()
|
|
@@ -65,6 +65,19 @@ function session_lang(): string {
|
|
|
65
65
|
return session_language.resolve_session_lang().lang
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
+
// Which session this is — a headless parent, a lane child, a kit-launched agent, the `backlogrun`
|
|
69
|
+
// parent — the facts that say whether a person is there to answer.
|
|
70
|
+
async function session_role_facts(): Promise<
|
|
71
|
+
Pick<StopContext, 'backlog_parent' | 'headless_agent' | 'headless_waiting' | 'lane_child'>
|
|
72
|
+
> {
|
|
73
|
+
return {
|
|
74
|
+
headless_waiting: await run_headless.must_keep_waiting(),
|
|
75
|
+
lane_child: lane_child_marker.is_child_of(process.cwd()),
|
|
76
|
+
headless_agent: agent_headless.is_headless(),
|
|
77
|
+
backlog_parent: await run_headless.is_backlog_parent(),
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
68
81
|
async function build_context(
|
|
69
82
|
transcript_path: string,
|
|
70
83
|
payload_tail: { stop_hook_active: boolean; message: string },
|
|
@@ -81,14 +94,12 @@ async function build_context(
|
|
|
81
94
|
cut_pending: run_cut.carried_cut_sync() !== undefined,
|
|
82
95
|
filed: was_filed(tail),
|
|
83
96
|
session_owner: repo_party.current_owner(),
|
|
84
|
-
|
|
97
|
+
...(await session_role_facts()),
|
|
85
98
|
headless_refusals: stop_rules.count_headless_refusals(tail),
|
|
86
|
-
lane_child: lane_child_marker.is_child_of(process.cwd()),
|
|
87
99
|
background_pending: lane_background.pending_background_ids(tail).length > 0,
|
|
88
100
|
agent_pending: lane_background.pending_agent_ids(tail).length > 0,
|
|
89
101
|
handed_off: lane_handoff.is_handed_off(process.cwd()),
|
|
90
102
|
session_lang: session_lang(),
|
|
91
|
-
headless_agent: agent_headless.is_headless(),
|
|
92
103
|
}
|
|
93
104
|
}
|
|
94
105
|
|
|
@@ -117,7 +128,7 @@ async function outcome_of(raw_payload: string): Promise<StopOutcome> {
|
|
|
117
128
|
// a carried run: the strand judge reads this very record and returns on anything but `carried`, and a
|
|
118
129
|
// stall needs a backlog driver, which begins one before its plan. A spent (`expired`) or `unreadable`
|
|
119
130
|
// record a crashed run left behind is no run either, so it does not re-arm the stall's backlog probe
|
|
120
|
-
// on every stop
|
|
131
|
+
// on every stop.
|
|
121
132
|
// A failed git read — outside a repository, `git rev-parse` exits non-zero — reads as no run, since this
|
|
122
133
|
// gate sits ahead of the checks' own swallowing and must not throw into the stop decision either.
|
|
123
134
|
async function has_run_record(): Promise<boolean> {
|
|
@@ -133,8 +144,8 @@ async function has_run_record(): Promise<boolean> {
|
|
|
133
144
|
}
|
|
134
145
|
|
|
135
146
|
// The stall check rides the Stop hook because the stop *is* the loop boundary: a run alive but not
|
|
136
|
-
// advancing ends turns without dispatching
|
|
137
|
-
// boundary and is the step before the stall
|
|
147
|
+
// advancing ends turns without dispatching. The strand check rides the same
|
|
148
|
+
// boundary and is the step before the stall: it fires when the driver is gone
|
|
138
149
|
// — the budget handed off, the owner dead, no supervisor watching. Both only report and swallow their
|
|
139
150
|
// own failures, so neither can change the stop decision. An ordinary stop with no run record skips
|
|
140
151
|
// both, so it pays one directory read rather than their reads and a stale stream's backlog probe.
|
|
@@ -146,7 +157,7 @@ async function run_report_checks(): Promise<void> {
|
|
|
146
157
|
}
|
|
147
158
|
|
|
148
159
|
// Nothing reaches stdout on an ordinary stop, so what the harness parses stays empty unless the stop
|
|
149
|
-
// is being held — all three rules block, so a bare `#N` is reported the same way
|
|
160
|
+
// is being held — all three rules block, so a bare `#N` is reported the same way.
|
|
150
161
|
async function write_stop_decision(raw_payload: string): Promise<void> {
|
|
151
162
|
hook_decision.load_environment_file()
|
|
152
163
|
await run_report_checks()
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// The two references `josh init` writes into a basic project, under the paths they had
|
|
2
|
-
//
|
|
1
|
+
// The two references `josh init` writes into a basic project, under the paths they had while the
|
|
2
|
+
// basic profile was named static. kit still ships both old paths so an earlier
|
|
3
3
|
// project keeps working; re-running `josh init` moves the project onto the new ones, which is what
|
|
4
4
|
// lets the old paths be retired once projects have moved.
|
|
5
5
|
const RENAMED_REFERENCES: ReadonlyArray<readonly [RegExp, string]> = [
|
|
@@ -2,8 +2,8 @@ import { patch_json_key } from '#scripts/config-merge/patch-json-key'
|
|
|
2
2
|
import { claude_plugin_config } from './claude-plugin-config'
|
|
3
3
|
|
|
4
4
|
// Keys kit's own `.claude/settings.json` sets for its sessions but never ships. `enableArtifact:
|
|
5
|
-
// false` keeps the Artifact tool's ~12k tokens out of every call of a kit run
|
|
6
|
-
//
|
|
5
|
+
// false` keeps the Artifact tool's ~12k tokens out of every call of a kit run,
|
|
6
|
+
// but Claude Code lets any layer that sets it to `false` win, so a
|
|
7
7
|
// consumer given it could not turn the tool back on from `.claude/settings.local.json`.
|
|
8
8
|
const KIT_ONLY_SETTING_KEYS: ReadonlyArray<string> = ['enableArtifact']
|
|
9
9
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import path from 'node:path'
|
|
2
2
|
import { init_logic_json_merge } from './init-logic-json-merge'
|
|
3
3
|
|
|
4
|
-
// The Claude Code plugin that ships kit's distributed skills
|
|
4
|
+
// The Claude Code plugin that ships kit's distributed skills. A consumer no
|
|
5
5
|
// longer receives the five skill directories as a byte copy under its own `.claude/skills/`; it
|
|
6
6
|
// receives this marketplace and plugin declaration in its `.claude/settings.json`, and the skills
|
|
7
7
|
// load from the package as `kit:<name>`.
|
|
@@ -16,7 +16,7 @@ const CLAUDE_SETTINGS_DESTINATION = path.join('.claude', 'settings.json')
|
|
|
16
16
|
// `enabledPlugins` declares the plugin; `extraKnownMarketplaces` says where to find it. Nothing needs
|
|
17
17
|
// installing: in a trusted workspace Claude Code registers the marketplace from this declaration and
|
|
18
18
|
// loads the skills — an interactive session from its first session, a headless one (`claude -p`) from
|
|
19
|
-
// its second
|
|
19
|
+
// its second.
|
|
20
20
|
const PLUGIN_SETTINGS: Record<string, unknown> = {
|
|
21
21
|
extraKnownMarketplaces: {
|
|
22
22
|
[MARKETPLACE_NAME]: { source: { source: 'directory', path: MARKETPLACE_PATH } },
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// The path transform that makes kit's distributed AI documents resolve in a consumer, and the
|
|
2
|
-
// one-line CLAUDE.md import that replaces the old byte-copy
|
|
2
|
+
// one-line CLAUDE.md import that replaces the old byte-copy. Applied at
|
|
3
3
|
// publish time to CLAUDE.md (scripts/build/build-claude-md.ts) and at copy time to the pointer files kit
|
|
4
4
|
// still ships whole (AGENTS.md / GEMINI.md / .cursorrules, via init-copy-content.ts).
|
|
5
5
|
|
|
@@ -28,7 +28,7 @@ const CLAUDE_MD_BOOTSTRAP =
|
|
|
28
28
|
// A span containing `*` is excluded: it is a **glob**, not a reference to a file a consumer can
|
|
29
29
|
// open. A distributed document that writes a directory set as `prompts/**` means "anything beneath
|
|
30
30
|
// it", and rewriting that to `node_modules/@joshuafolkken/kit/prompts/**` would print a path that can
|
|
31
|
-
// never appear in a consumer's diff and is not what the set matches
|
|
31
|
+
// never appear in a consumer's diff and is not what the set matches.
|
|
32
32
|
function transform_prompt_paths(content: string): string {
|
|
33
33
|
return content.replaceAll(
|
|
34
34
|
/`prompts\/([^`*]+)`/gu,
|
|
@@ -97,8 +97,8 @@ function ensure_claude_md_import(existing: string | undefined): string {
|
|
|
97
97
|
return `${CLAUDE_MD_BOOTSTRAP}\n\n${CLAUDE_MD_IMPORT_LINE}\n\n${updated}`
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
// The lines `ensure_claude_md_import` writes. A basic project imports other rules, so
|
|
101
|
-
//
|
|
100
|
+
// The lines `ensure_claude_md_import` writes. A basic project imports other rules, so an older sync,
|
|
101
|
+
// or a switch from full, leaves these behind for it to remove.
|
|
102
102
|
const FULL_CLAUDE_MD_LINES = new Set([
|
|
103
103
|
CLAUDE_MD_BOOTSTRAP,
|
|
104
104
|
OLD_CLAUDE_MD_BOOTSTRAP,
|
|
@@ -2,9 +2,9 @@ import { claude_plugin_config } from './claude-plugin-config'
|
|
|
2
2
|
import { hook_launch } from './hook-launch'
|
|
3
3
|
|
|
4
4
|
// The consumer's `.claude/settings.json` runs its hooks off the published package directly, not
|
|
5
|
-
// through `pnpm josh
|
|
6
|
-
// command are rebased onto the installed package: the hook launcher `scripts/hooks/run-hook.sh
|
|
7
|
-
//
|
|
5
|
+
// through `pnpm josh`. Two paths inside a hook
|
|
6
|
+
// command are rebased onto the installed package: the hook launcher `scripts/hooks/run-hook.sh`,
|
|
7
|
+
// which picks the bundle or the dispatcher from where it is installed, and a
|
|
8
8
|
// plain `pnpm josh <command>`, which becomes the `dist/josh.js` dispatcher — the published package
|
|
9
9
|
// always ships `dist`, and a `pnpm` launch would only add the wrapper this exists to remove.
|
|
10
10
|
//
|