@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
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
|
|
2
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
3
|
+
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
1
4
|
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
2
5
|
import { shell_segments } from './shell-segments'
|
|
3
6
|
|
|
4
|
-
// The rule delivered at the call that pipes a verification command
|
|
7
|
+
// The rule delivered at the call that pipes a verification command.
|
|
5
8
|
//
|
|
6
9
|
// **A pipeline exits with its last command's status.** `pnpm josh gate 2>&1 | tail -40` therefore
|
|
7
10
|
// answers success on a gate that printed `✗ verification gate failed`, and the failure that was
|
|
@@ -54,9 +57,8 @@ const VERIFICATION_COMMANDS: ReadonlySet<string> = new Set([
|
|
|
54
57
|
])
|
|
55
58
|
|
|
56
59
|
// **The canonical name of each check, and both spellings still match**: `pnpm josh ga | tail` masks a
|
|
57
|
-
// gate exactly as the long spelling does, and
|
|
58
|
-
//
|
|
59
|
-
// (joshuafolkken/kit#1643 for the reading). The suite names `pnpm josh ga` for that reason: an
|
|
60
|
+
// gate exactly as the long spelling does, and the alias is expanded where the command is read rather
|
|
61
|
+
// than by widening this set with every alias standing for one of its names. The suite names `pnpm josh ga` for that reason: an
|
|
60
62
|
// expansion that regressed would show up here rather than as a guard that quietly stopped firing.
|
|
61
63
|
function is_verification_command(segment: string): boolean {
|
|
62
64
|
return shell_segments.is_josh_command(segment, VERIFICATION_COMMANDS)
|
|
@@ -93,15 +95,18 @@ const PIPED_VERIFICATION_REASON =
|
|
|
93
95
|
// command chain quoted inside a body is text rather than a call, and this repository's issue bodies
|
|
94
96
|
// quote them constantly — without the blanking the two halves disagree, and
|
|
95
97
|
// `gh issue comment 1 --body "… | pnpm josh gate | …"` reads as a check whose verdict survived.
|
|
96
|
-
function
|
|
98
|
+
function pipelines_of(command: string): Array<Array<string>> {
|
|
97
99
|
return shell_segments
|
|
98
100
|
.segments_of(time_shell.unquoted(command))
|
|
99
|
-
.
|
|
100
|
-
|
|
101
|
+
.map((segment) => segment.split('|').map((piece) => piece.trim()))
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function command_pieces(command: string): Array<string> {
|
|
105
|
+
return pipelines_of(command).flat()
|
|
101
106
|
}
|
|
102
107
|
|
|
103
|
-
// **The occasion this rule governs: a check whose result means pass or fail, run at all
|
|
104
|
-
//
|
|
108
|
+
// **The occasion this rule governs: a check whose result means pass or fail, run at all**.
|
|
109
|
+
// The trigger fires only on the masked spelling, so a run that never piped
|
|
105
110
|
// one would drop out of the reading entirely and the rate would be taken over runs that masked at
|
|
106
111
|
// least once.
|
|
107
112
|
function runs_verification(command: string): boolean {
|
|
@@ -115,11 +120,76 @@ function keeps_verdict_intact(command: string): boolean {
|
|
|
115
120
|
return runs_verification(command) && !is_masked_verification(command)
|
|
116
121
|
}
|
|
117
122
|
|
|
123
|
+
// **The commonest masking is rewritten rather than refused**. Almost every
|
|
124
|
+
// refusal was a check narrowed with `| tail` or `| grep`, and the refusal cost a round trip to arrive at
|
|
125
|
+
// the call `set -o pipefail;` in front would have made. Prefixed, the pipeline carries the check's
|
|
126
|
+
// status, which is the rule's whole outcome — so the hook runs that call instead.
|
|
127
|
+
//
|
|
128
|
+
// **Only a filter that reads its input to the end qualifies.** One that exits early — `head`, or a
|
|
129
|
+
// `grep` stopping at its first match — closes the pipe on a check still writing, and under `pipefail` the
|
|
130
|
+
// check's SIGPIPE turns a passing run into exit 141; `head` also cuts the verdict line josh prints last.
|
|
131
|
+
//
|
|
132
|
+
// **Every command on the line is a josh check or a filter after one.** The rewrite answers `allow`, so
|
|
133
|
+
// anything else chained beside the check — `&& rm -r dist`, or a `git log | head` never written for
|
|
134
|
+
// `pipefail` — would skip the permission prompt it would otherwise meet. Those lines are refused as before.
|
|
135
|
+
//
|
|
136
|
+
// **The raw line is read for what the cut cannot see.** `segments_of` does not split on a lone `&`, and
|
|
137
|
+
// `time_shell.unquoted` blanks a double-quoted `$(…)`, so `| tail & curl …`, `| tail > ~/.zshrc` and
|
|
138
|
+
// `| grep "$(cmd)"` all look like a filter after a check. Any `&`, redirection, backtick or `$(` beyond
|
|
139
|
+
// the `&&` chain and the check's own `2>&1` leaves the line to the refusal.
|
|
140
|
+
const PIPEFAIL_PREFIX = 'set -o pipefail; '
|
|
141
|
+
const FULL_READING_FILTER = /^(?:tail|grep)\b/u
|
|
142
|
+
const EARLY_EXIT_GREP =
|
|
143
|
+
/^grep\b.*\s(?:-[a-zA-Z]*[lLmq]|--(?:quiet|silent|max-count|files-with(?:out)?-match))/u
|
|
144
|
+
|
|
145
|
+
const ALLOWED_OPERATORS = /2>&1|&&/gu
|
|
146
|
+
const SIDE_EFFECT_SYNTAX = /[&<>`]|\$\(/u
|
|
147
|
+
|
|
148
|
+
const PIPEFAIL_NOTE =
|
|
149
|
+
'↻ piped verification: the josh check was piped, so `set -o pipefail;` was prefixed and the call ran ' +
|
|
150
|
+
"with the check's status carried to the exit code. Read the printed verdict, never the exit code " +
|
|
151
|
+
'alone — `prompts/collaboration-workflow/output-bounds.md` (joshuafolkken/kit#3570).'
|
|
152
|
+
|
|
153
|
+
function reads_to_the_end(piece: string): boolean {
|
|
154
|
+
return FULL_READING_FILTER.test(piece) && !EARLY_EXIT_GREP.test(piece)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function is_filtered_check(pipeline: Array<string>): boolean {
|
|
158
|
+
const [head = '', ...filters] = pipeline
|
|
159
|
+
|
|
160
|
+
return is_verification_command(head) && filters.every((piece) => reads_to_the_end(piece))
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function has_side_effect_syntax(command: string): boolean {
|
|
164
|
+
return SIDE_EFFECT_SYNTAX.test(command.replaceAll(ALLOWED_OPERATORS, ' '))
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function is_pipefail_rewritable(command: string): boolean {
|
|
168
|
+
return (
|
|
169
|
+
is_masked_verification(command) &&
|
|
170
|
+
!has_side_effect_syntax(command) &&
|
|
171
|
+
pipelines_of(command).every((pipeline) => is_filtered_check(pipeline))
|
|
172
|
+
)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// The call's input with the prefix in front, or `undefined` where the call is not a rewritable masking.
|
|
176
|
+
function pipefail_input(call: GuardedCall): Record<string, unknown> | undefined {
|
|
177
|
+
if (call.name !== cost_blocks.BASH_TOOL || !json_value.is_record(call.input)) return undefined
|
|
178
|
+
|
|
179
|
+
const command = time_shell.bash_command(call.input)
|
|
180
|
+
|
|
181
|
+
if (!is_pipefail_rewritable(command)) return undefined
|
|
182
|
+
|
|
183
|
+
return { ...call.input, command: `${PIPEFAIL_PREFIX}${command}` }
|
|
184
|
+
}
|
|
185
|
+
|
|
118
186
|
const piped_verification = {
|
|
119
187
|
PIPED_VERIFICATION_REASON,
|
|
188
|
+
PIPEFAIL_NOTE,
|
|
120
189
|
VERIFICATION_COMMANDS,
|
|
121
190
|
is_masked_verification,
|
|
122
191
|
keeps_verdict_intact,
|
|
192
|
+
pipefail_input,
|
|
123
193
|
runs_verification,
|
|
124
194
|
}
|
|
125
195
|
|
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
2
2
|
import { bash_triggers } from './bash-triggers'
|
|
3
3
|
|
|
4
|
-
// The trigger and the delivered text behind the `poll-loop` row of `delivered-rules.ts
|
|
5
|
-
//
|
|
4
|
+
// The trigger and the delivered text behind the `poll-loop` row of `delivered-rules.ts`.
|
|
5
|
+
// The hand-written wait loop a lane child improvises over a backgrounded
|
|
6
6
|
// command's output file.
|
|
7
7
|
//
|
|
8
|
-
// **The gap `early-heartbeat` left, on purpose.**
|
|
8
|
+
// **The gap `early-heartbeat` left, on purpose.** That rule refuses a bare
|
|
9
9
|
// `sleep` — a clock timer arming a progress report — and it stands down the moment it sees a loop
|
|
10
10
|
// keyword (`early-heartbeat.ts`'s `LOOP_KEYWORD`), because a loop that ends on a condition is waiting
|
|
11
11
|
// on a thing rather than on a clock. This is that thing: a `while`/`until` loop that sleeps between
|
|
12
|
-
// probes of a command's output file.
|
|
13
|
-
// half of the waste — six lanes lost about 45 minutes, 13% of their wall clock, to it.
|
|
12
|
+
// probes of a command's output file.
|
|
14
13
|
//
|
|
15
14
|
// **The loop does not know when the command finished.** A regex over the output file that never
|
|
16
15
|
// matches waits to the harness block limit; one that matches a mid-run line exits too early. Either
|
|
17
16
|
// way the command's *exit* is not what ends the wait, and each pass spends a full-context round trip.
|
|
18
17
|
// A command backgrounded with `run_in_background` re-invokes the run when it exits — the completion
|
|
19
18
|
// notification is what ends the wait on the task itself, which is the mechanism this row hands back,
|
|
20
|
-
// the same reading
|
|
19
|
+
// the same reading `run-tail-rule.ts` takes for the foreground push.
|
|
21
20
|
//
|
|
22
21
|
// **It fires on every occurrence**, for the reason `git-force.ts` does: a poll loop wastes the same
|
|
23
22
|
// round trips each time it is armed, so refused-once-and-free-after would put every loop but the first
|
|
@@ -31,10 +30,9 @@ const LOOP_KEYWORD = /\b(?:while|until)\s/u
|
|
|
31
30
|
// a stream reader. Read anywhere in the line rather than at a command position, because the loop body
|
|
32
31
|
// puts it behind a `do` keyword (`; do sleep 30; done`), which no separator precedes. The argument is
|
|
33
32
|
// matched as any non-space rather than a digit, so a variable duration (`sleep "$INTERVAL"`) is caught
|
|
34
|
-
// as a literal one is — a poll with a configurable interval is still a poll
|
|
35
|
-
// review round 1).
|
|
33
|
+
// as a literal one is — a poll with a configurable interval is still a poll.
|
|
36
34
|
const SLEEP_COMMAND = /\bsleep\s+\S/u
|
|
37
|
-
// **A loop with no `sleep` is still a poll — a worse one
|
|
35
|
+
// **A loop with no `sleep` is still a poll — a worse one**. A lane child ran
|
|
38
36
|
// `until [ -f /tmp/gate-done ]; do if ! kill -0 %1 …; then break; fi; done` for hours: a busy-wait
|
|
39
37
|
// that spun a core on a marker nobody wrote, and slipped through because the rule required the
|
|
40
38
|
// `sleep`. Two headers make a loop a poll with or without one. An `until` header waits for a state to
|
|
@@ -59,12 +57,12 @@ function is_state_wait(plain: string): boolean {
|
|
|
59
57
|
}
|
|
60
58
|
|
|
61
59
|
// **A `while read … done < file` is a stream reader, not a poll**, even when its body sleeps to
|
|
62
|
-
// throttle processing
|
|
60
|
+
// throttle processing. Its condition consumes input rather
|
|
63
61
|
// than probing for a state — a poll never reads its condition, it *tests* it (grep, wc, a file check)
|
|
64
62
|
// — so the completion notification this rule points to has nothing to do with it. A `while read`
|
|
65
63
|
// header is therefore always a stream reader; a line that also carried a separate `until` poll would
|
|
66
64
|
// go un-refused, which fails safe (under-refusal) and is contrived enough not to warrant the added
|
|
67
|
-
// regex the attempt to catch it
|
|
65
|
+
// regex the attempt to catch it needs.
|
|
68
66
|
const STREAM_READER = /\bwhile\s+read\b/u
|
|
69
67
|
|
|
70
68
|
function is_stream_reader(plain: string): boolean {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { agent_session_role } from '#scripts/agent/agent-session-role'
|
|
1
2
|
import { cost_cli, type CostVerdict } from '#scripts/cost-runtime/cost-cli'
|
|
2
3
|
import { cost_verdict } from '#scripts/cost-runtime/cost-verdict'
|
|
3
4
|
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
@@ -7,31 +8,22 @@ import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
|
7
8
|
import { bash_triggers } from './bash-triggers'
|
|
8
9
|
import { shell_segments } from './shell-segments'
|
|
9
10
|
|
|
10
|
-
// The pre-gate cut, delivered at the call it binds on
|
|
11
|
+
// The pre-gate cut, delivered at the call it binds on.
|
|
11
12
|
//
|
|
12
|
-
// **
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
// the
|
|
17
|
-
// step of prose in the middle of it, so joshuafolkken/kit#1839's fourth acceptance condition — the
|
|
18
|
-
// drop in context per request — could not be judged at all.
|
|
19
|
-
//
|
|
20
|
-
// **This is the third time prose lost to a refusal.** joshuafolkken/kit#1344 measured three
|
|
21
|
-
// consecutive runs in which resident text about batching moved the number not at all, and
|
|
22
|
-
// joshuafolkken/kit#1460 measured the same for the investigation threshold; in both, a `PreToolUse`
|
|
23
|
-
// refusal was what finally moved it. A step a run is free to skip is a step that gets skipped under
|
|
24
|
-
// time pressure, and `run:hold` — the one boundary step that never gets missed — is the one that
|
|
25
|
-
// refuses.
|
|
13
|
+
// **A refusal, not prose.** A lane child issues the *entry* check `pnpm josh run:cut --resume <N>`
|
|
14
|
+
// and goes on to the gate; carried as a step of prose, `pnpm josh run:cut <N>` — the call that
|
|
15
|
+
// actually cuts — is the step that gets skipped. A step a run is free to skip is a step that gets
|
|
16
|
+
// skipped under time pressure, and `run:hold` — the one boundary step that never gets missed — is
|
|
17
|
+
// the one that refuses.
|
|
26
18
|
|
|
27
19
|
const GATE_COMMANDS: ReadonlySet<string> = new Set(['gate'])
|
|
28
20
|
const CUT_COMMANDS: ReadonlySet<string> = new Set(['run:cut'])
|
|
29
21
|
// The three spellings that ask about a cut rather than take one: the fresh process's entry check, the
|
|
30
|
-
// teardown, and the record read. **Excluding them is the whole point** —
|
|
31
|
-
//
|
|
32
|
-
// `run:cut` would
|
|
22
|
+
// teardown, and the record read. **Excluding them is the whole point** — a child that issued
|
|
23
|
+
// `--resume` and went straight on to the gate is the run this rule exists for, so a predicate that
|
|
24
|
+
// counted any `run:cut` would be silent on exactly those runs.
|
|
33
25
|
const CUT_MODE_FLAG = /(?:^|\s)--(?:resume|end|json)(?:[=\s]|$)/u
|
|
34
|
-
// **The one entry call the resumed half never makes
|
|
26
|
+
// **The one entry call the resumed half never makes**.
|
|
35
27
|
// `.claude/skills/workflow-commands/pre-gate-cut.md` sends a `fresh` verdict on to "claim the hold,
|
|
36
28
|
// ask the session boundary, read the issue, implement", and tells a `resume` verdict to "skip the
|
|
37
29
|
// title, the plan, the fresh hold claim and the implementation". So the hold claim is what a run made
|
|
@@ -75,7 +67,7 @@ function claims_the_hold(command: string): boolean {
|
|
|
75
67
|
return invokes_josh(command, HOLD_COMMANDS, HOLD_MODE_FLAG)
|
|
76
68
|
}
|
|
77
69
|
|
|
78
|
-
// **One half of the occasion, never the whole of it
|
|
70
|
+
// **One half of the occasion, never the whole of it**. Taken alone this
|
|
79
71
|
// predicate enrols both processes of one obedient lane child: the cut relaunches a second session
|
|
80
72
|
// which issues this same entry check byte for byte and can never take a cut of its own, so the row
|
|
81
73
|
// read at half its true rate. `delivered-rules.ts` pairs it with `claims_the_hold`, which only the
|
|
@@ -87,7 +79,7 @@ function claims_the_hold(command: string): boolean {
|
|
|
87
79
|
// read from the working directory and appears nowhere in a transcript, so it cannot be the
|
|
88
80
|
// denominator — and taking the gate as the occasion instead would enrol every ordinary non-lane run,
|
|
89
81
|
// where the rule can never be kept, and `pnpm josh rule:value` would read the row low by
|
|
90
|
-
// construction.
|
|
82
|
+
// construction.
|
|
91
83
|
function asks_about_the_cut(command: string): boolean {
|
|
92
84
|
return invokes_josh(command, CUT_COMMANDS)
|
|
93
85
|
}
|
|
@@ -95,12 +87,15 @@ function asks_about_the_cut(command: string): boolean {
|
|
|
95
87
|
// What the trigger has to know about the world, passed in so the decision itself is testable without
|
|
96
88
|
// a lane on disk and without a git call. `marked_issue` is the dispatch mark read from the
|
|
97
89
|
// environment — the fact that makes the human-or-child question mechanical rather than the model's to
|
|
98
|
-
// judge
|
|
90
|
+
// judge.
|
|
99
91
|
interface LaneCutState {
|
|
100
92
|
directory: string
|
|
101
93
|
carried: (now?: Date) => RunCut | undefined
|
|
102
94
|
marked_issue: string | undefined
|
|
103
|
-
//
|
|
95
|
+
// Whether this session is a ship reviewer, which carries the implementing child's mark without
|
|
96
|
+
// being the run the cut is for (joshuafolkken/kit#3623).
|
|
97
|
+
is_reviewer: boolean
|
|
98
|
+
// **The context verdict, read lazily**. It is a thunk, like
|
|
104
99
|
// `carried`, so `current_state` builds the object without pricing a session — the read happens only
|
|
105
100
|
// after the command and lane checks pass, off the handful of calls that actually run a lane's gate.
|
|
106
101
|
context_verdict: () => CostVerdict
|
|
@@ -111,6 +106,7 @@ function current_state(): LaneCutState {
|
|
|
111
106
|
directory: process.cwd(),
|
|
112
107
|
carried: run_cut.carried_cut_sync,
|
|
113
108
|
marked_issue: lane_child_marker.marked_issue(),
|
|
109
|
+
is_reviewer: agent_session_role.is_reviewer(),
|
|
114
110
|
context_verdict: cost_cli.session_verdict,
|
|
115
111
|
}
|
|
116
112
|
}
|
|
@@ -119,27 +115,35 @@ function current_state(): LaneCutState {
|
|
|
119
115
|
// A person working in the lane carries no mark, so the rule stays silent for them — the
|
|
120
116
|
// human-or-child call is read from the environment, never left to the model. A mark that leaked in
|
|
121
117
|
// from the parent session names some other issue, so requiring it to equal this lane's issue reads
|
|
122
|
-
// that leak as a person too
|
|
118
|
+
// that leak as a person too.
|
|
123
119
|
//
|
|
124
120
|
// **The resumed process must also stay silent, and the cut record is what says so.** After a cut,
|
|
125
121
|
// `adopt_cut` leaves the record in place with `is_handed_off: false`, so a carried record naming this
|
|
126
122
|
// issue means the process asking is the one the cut already produced. Without this half the rule
|
|
127
123
|
// would fire on the fresh process too — refusing a gate call on a run that had kept the rule
|
|
128
124
|
// perfectly, which `prompts/collaboration-workflow/rule-delivery.md` calls worse than no hook at all.
|
|
125
|
+
//
|
|
126
|
+
// **A ship reviewer's inherited mark is not a dispatch**. The supervisor that launched it is waiting on
|
|
127
|
+
// its findings, so there is no fresh process a cut could hand the gate to; `implementation-cut.ts`
|
|
128
|
+
// stands down for the same session on the same fact.
|
|
129
|
+
function dispatched_issue(state: LaneCutState): string | undefined {
|
|
130
|
+
return state.is_reviewer ? undefined : state.marked_issue
|
|
131
|
+
}
|
|
132
|
+
|
|
129
133
|
function uncut_lane_issue(state: LaneCutState): string | undefined {
|
|
130
134
|
const issue = lane_paths.lane_issue_of(state.directory)
|
|
131
135
|
|
|
132
136
|
if (issue === undefined) return undefined
|
|
133
137
|
|
|
134
|
-
if (state
|
|
138
|
+
if (dispatched_issue(state) !== issue) return undefined
|
|
135
139
|
|
|
136
140
|
return state.carried()?.issue === issue ? undefined : issue
|
|
137
141
|
}
|
|
138
142
|
|
|
139
|
-
// **The cut is taken only when the current context is worth its resume
|
|
143
|
+
// **The cut is taken only when the current context is worth its resume**.
|
|
140
144
|
// Below the shared `CONTEXT_CUT_THRESHOLD` a short lane has no accumulation a cut would drop, so the
|
|
141
145
|
// gate runs uncut rather than paying for a relaunch; an unmeasurable session keeps the old
|
|
142
|
-
// unconditional cut as the safety net
|
|
146
|
+
// unconditional cut as the safety net. The verdict is
|
|
143
147
|
// `cost_cli.session_verdict`'s, the same statistic and threshold `run:cut` and the implementation-phase
|
|
144
148
|
// cut read, so the guard and the command can never disagree about whether a cut was due.
|
|
145
149
|
function warrants_the_cut(verdict: CostVerdict): boolean {
|
|
@@ -176,12 +180,11 @@ const PRE_GATE_CUT_REASON =
|
|
|
176
180
|
'`.claude/skills/workflow-commands/pre-gate-cut.md`. Reissue the gate once the cut has answered — ' +
|
|
177
181
|
'this fires once per run, so it cannot repeat on the call in hand.'
|
|
178
182
|
|
|
179
|
-
// **The pre-gate cut is two acts, one call apart
|
|
183
|
+
// **The pre-gate cut is two acts, one call apart**, so its `rule:value`
|
|
180
184
|
// denominator is only the runs that reached the boundary: a run that issues the cut's entry check and,
|
|
181
185
|
// somewhere in the same run, claimed the working-tree hold — the near half of the boundary a fresh
|
|
182
186
|
// process never makes. Read only by the offline measurement, never the live delivery path. Moved here
|
|
183
|
-
// from `delivered-rules.ts` so the pre-gate row lives with its rule, as `implementation-cut.ts`'s does
|
|
184
|
-
// (joshuafolkken/kit#2346).
|
|
187
|
+
// from `delivered-rules.ts` so the pre-gate row lives with its rule, as `implementation-cut.ts`'s does.
|
|
185
188
|
function reaches_the_pre_gate_boundary(
|
|
186
189
|
call: GuardedCall,
|
|
187
190
|
_turn: ReadonlyArray<GuardedCall>,
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { cost_blocks } from '#scripts/cost-runtime/cost-blocks'
|
|
2
|
+
import { issue_number_shape } from '#scripts/issue/issue-number-shape'
|
|
2
3
|
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
3
4
|
import { time_shell } from '#scripts/time-runtime/time-shell'
|
|
4
5
|
import { tail_commands } from './tail-commands'
|
|
5
6
|
|
|
6
7
|
// The stand-down that keeps the `issue-comments` rule from refusing a body read the run has already
|
|
7
|
-
// earned
|
|
8
|
+
// earned. The rule exists so a run reads an Issue's comments before building
|
|
8
9
|
// on its body — but a run that already read them, and later reads the body again (a post-merge state
|
|
9
10
|
// check, a re-read), was refused a second time for a read it had already made. **The delivery path
|
|
10
11
|
// sees only the raw transcript tail** — `delivered-rules.ts` names the reason the run's own calls are
|
|
@@ -22,7 +23,6 @@ const ISSUE_PATH_NUMBER = /issues\/(\d+)/gu
|
|
|
22
23
|
const ISSUE_VIEW_NUMBER = /\bissue\s+view\s+(?:-{1,2}\S+\s+)*(\d+)/u
|
|
23
24
|
// The run of numbers `pnpm josh issue:read` takes as its positional arguments.
|
|
24
25
|
const ISSUE_READ_ARGUMENTS = /\bissue:read\b([\s\d]*)/u
|
|
25
|
-
const A_NUMBER = /^\d+$/u
|
|
26
26
|
|
|
27
27
|
// A command that prints an Issue's comments: the comments endpoint, `gh issue view … --comments`, or
|
|
28
28
|
// the josh command that reads body and comments together.
|
|
@@ -38,7 +38,7 @@ function add_issue_read_numbers(command: string, numbers: Set<number>): void {
|
|
|
38
38
|
const tokens = (match[1] ?? '').split(/\s+/u)
|
|
39
39
|
|
|
40
40
|
for (const token of tokens) {
|
|
41
|
-
if (
|
|
41
|
+
if (issue_number_shape.ISSUE_NUMBER_PATTERN.test(token)) numbers.add(Number(token))
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
|
|
@@ -5,12 +5,13 @@ import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
|
5
5
|
import { bash_triggers } from './bash-triggers'
|
|
6
6
|
import { shell_segments } from './shell-segments'
|
|
7
7
|
|
|
8
|
-
// The trigger and the delivered text behind the `protected-file` row of `delivered-rules.ts
|
|
9
|
-
//
|
|
8
|
+
// The trigger and the delivered text behind the `protected-file` row of `delivered-rules.ts`:
|
|
9
|
+
// the two files a run's own file tools must not touch.
|
|
10
10
|
//
|
|
11
|
-
// -
|
|
12
|
-
// Telegram bot token,
|
|
13
|
-
//
|
|
11
|
+
// - **A secret file is never read** — by the `Read` tool or by a shell reader in a `Bash` call. `.env`
|
|
12
|
+
// carries the Telegram bot token, its `.env.*` variants and wrangler's `.dev.vars` carry the same
|
|
13
|
+
// kind of value, and either read lands it in the transcript. The scripts that need one load it in
|
|
14
|
+
// their own process, so refusing the call costs them nothing.
|
|
14
15
|
// - **`.claude/settings.json` is never edited in a consumer repository.** It is the deny list and the
|
|
15
16
|
// hooks that enforce every other rule, so a run that rewrites it can switch the guards off; `josh
|
|
16
17
|
// sync` owns it there. Only a kit consumer's file is refused — decided per file from the repository
|
|
@@ -21,7 +22,11 @@ import { shell_segments } from './shell-segments'
|
|
|
21
22
|
|
|
22
23
|
const READ_TOOL = 'Read'
|
|
23
24
|
const EDIT_TOOLS: ReadonlySet<string> = new Set(['Edit', 'Write'])
|
|
24
|
-
const
|
|
25
|
+
const SECRET_FILES: ReadonlySet<string> = new Set(['.env', '.dev.vars'])
|
|
26
|
+
const ENVIRONMENT_VARIANT_PREFIX = '.env.'
|
|
27
|
+
// The two variants `.gitignore` un-ignores: they are tracked and hold placeholders, not secrets. The
|
|
28
|
+
// `Read(!…)` carve-outs in `.claude/settings.json` name the same two.
|
|
29
|
+
const TRACKED_VARIANTS: ReadonlySet<string> = new Set(['.env.example', '.env.test'])
|
|
25
30
|
const SETTINGS_FILE = path.join('.claude', 'settings.json')
|
|
26
31
|
const WHITESPACE = /\s+/u
|
|
27
32
|
const TOKEN_QUOTES = /["']/gu
|
|
@@ -56,12 +61,17 @@ function file_path_of(call: GuardedCall): string {
|
|
|
56
61
|
}
|
|
57
62
|
|
|
58
63
|
function is_environment_path(token: string): boolean {
|
|
59
|
-
|
|
64
|
+
const name = path.basename(token.replaceAll(TOKEN_QUOTES, ''))
|
|
65
|
+
|
|
66
|
+
if (TRACKED_VARIANTS.has(name)) return false
|
|
67
|
+
|
|
68
|
+
return SECRET_FILES.has(name) || name.startsWith(ENVIRONMENT_VARIANT_PREFIX)
|
|
60
69
|
}
|
|
61
70
|
|
|
62
71
|
// A shell read reaches the same bytes a `Read` does, so a segment that runs a reader (`cat .env`,
|
|
63
|
-
// `source .env`) or redirects the file into a command (`< .env`) is refused too.
|
|
64
|
-
//
|
|
72
|
+
// `source .env`) or redirects the file into a command (`< .env`) is refused too. Claude Code applies
|
|
73
|
+
// the `Read` deny rules to the readers it recognizes, but `source .env.local` passes them (measured on
|
|
74
|
+
// 2.1.289, kit #3602), so the variants are matched here as well.
|
|
65
75
|
function is_environment_read_segment(segment: string): boolean {
|
|
66
76
|
const words = segment
|
|
67
77
|
.replaceAll(INPUT_REDIRECT, ' < ')
|
|
@@ -109,12 +119,14 @@ function is_protected_file_call(
|
|
|
109
119
|
}
|
|
110
120
|
|
|
111
121
|
const PROTECTED_FILE_REASON =
|
|
112
|
-
'⛔ protected file: `.env` holds the Telegram bot token,
|
|
113
|
-
'
|
|
114
|
-
'transcript — the scripts that need it load it
|
|
122
|
+
'⛔ protected file: `.env` holds the Telegram bot token, and a `.env.*` variant or `.dev.vars` ' +
|
|
123
|
+
'holds the same kind of secret, so reading one — with the Read tool or a shell reader such as ' +
|
|
124
|
+
'`cat` / `grep` / `source` — puts a secret in the transcript — the scripts that need it load it ' +
|
|
125
|
+
'in their own process (the tracked `.env.example` and `.env.test` stay readable). ' +
|
|
126
|
+
'`.claude/settings.json` in a ' +
|
|
115
127
|
'consumer repository is the deny list and the hooks every other rule rests on, so a run must not ' +
|
|
116
128
|
'rewrite it; `josh sync` owns it, and a change belongs upstream in kit (`CLAUDE.md` → "Route ' +
|
|
117
|
-
'distributed-doc / config changes upstream to kit"). Leave
|
|
129
|
+
'distributed-doc / config changes upstream to kit"). Leave these files alone, or ask the user. ' +
|
|
118
130
|
'**This rule fires on every occurrence, not once per run.**'
|
|
119
131
|
|
|
120
132
|
const ROW = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { bash_triggers } from './bash-triggers'
|
|
2
2
|
|
|
3
|
-
// The trigger and the delivered text behind the `raw-field-body` row of `delivered-rules.ts
|
|
4
|
-
//
|
|
3
|
+
// The trigger and the delivered text behind the `raw-field-body` row of `delivered-rules.ts`.
|
|
4
|
+
// Its sibling `shell-body` refuses a body a run passed *inline* so the shell
|
|
5
5
|
// evaluates it; this one refuses a body a run passed *by path with the wrong flag*, so the path is
|
|
6
6
|
// posted as text.
|
|
7
7
|
//
|
|
@@ -9,8 +9,7 @@ import { bash_triggers } from './bash-triggers'
|
|
|
9
9
|
// reads the file when the value opens with `@`; `-f` / `--raw-field` sends the value verbatim, so
|
|
10
10
|
// `-f body=@<path>` posts the literal string `@<path>`. The two differ by a single character, `gh`
|
|
11
11
|
// exits 0 and returns a comment URL either way, and the break is invisible until a person reads the
|
|
12
|
-
// issue —
|
|
13
|
-
// record) lost exactly this way, which was the only place the reason for a stopped child was written.
|
|
12
|
+
// issue — a park comment lost this way is the only place the reason for a stopped child was written.
|
|
14
13
|
//
|
|
15
14
|
// **The trigger is the raw-field flag with an `@`-opening body, not `@` alone.** `-F` / `--field
|
|
16
15
|
// body=@<path>` is the spelling the rule *asks* for and stays silent; a `-f body="plain text"` with no
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Whether a reply is written in the session language
|
|
1
|
+
// Whether a reply is written in the session language. The session-language
|
|
2
2
|
// line reaches a turn only through `UserPromptSubmit`, so a turn opened by a background completion or a
|
|
3
3
|
// Stop hook refusal answered in whatever language it was just shown, and kept answering in it.
|
|
4
4
|
//
|
|
@@ -5,15 +5,14 @@ import { bash_triggers } from './bash-triggers'
|
|
|
5
5
|
import { shell_segments } from './shell-segments'
|
|
6
6
|
import { tail_commands } from './tail-commands'
|
|
7
7
|
|
|
8
|
-
// The trigger and the delivered text behind the `rule-body` row of `delivered-rules.ts
|
|
9
|
-
//
|
|
8
|
+
// The trigger and the delivered text behind the `rule-body` row of `delivered-rules.ts`.
|
|
9
|
+
// It delivers the residency questions at the one moment they are skipped —
|
|
10
10
|
// the edit that writes a rule into prose.
|
|
11
11
|
//
|
|
12
|
-
// **The gap it closes.**
|
|
13
|
-
// decision oracle)
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
// whether a run read it before writing a rule was left to judgement. This row is the firing.
|
|
12
|
+
// **The gap it closes.** Question 0 of the residency criterion (is the answer computable, so it is a
|
|
13
|
+
// decision oracle) and `pnpm josh oracle:list` do not fire on their own: a new computable rule could
|
|
14
|
+
// be written into prose and no test would fail, so friction would run one way only — toward more
|
|
15
|
+
// prose. This row is the firing.
|
|
17
16
|
//
|
|
18
17
|
// **The trigger is the append, not the edit.** A rule delivered on *every* edit to these files would
|
|
19
18
|
// speak on typo fixes, link swaps and deletions — the wrong-turn firing `rule-delivery.md` calls worse
|
|
@@ -22,13 +21,12 @@ import { tail_commands } from './tail-commands'
|
|
|
22
21
|
// URL is stripped) all fail. What stays is the case the Issue names — writing rule prose into a rule
|
|
23
22
|
// document.
|
|
24
23
|
//
|
|
25
|
-
// **The stand-down is what
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
// questions. Now the pass condition is a *record*: the run has run `pnpm josh oracle:list` (question 0)
|
|
24
|
+
// **The stand-down is what makes the reminder a check**. A row that only *reminded* — fired once and
|
|
25
|
+
// let the reissue through unconditionally — would let a computable rule be written into prose with
|
|
26
|
+
// nothing having answered the two questions. The pass condition is a *record*: the run has run `pnpm josh oracle:list` (question 0)
|
|
29
27
|
// and `pnpm josh run:step` (the ordering question) earlier in the transcript. Both present, the edit is
|
|
30
28
|
// stood down; either missing, it is refused — on the reissue too, since a row with a stand-down
|
|
31
|
-
// refuses until it is met
|
|
29
|
+
// refuses until it is met. It passes on answering the questions, not on reading the
|
|
32
30
|
// reminder. Keeping the rule is therefore running those two commands, which `keeps` names.
|
|
33
31
|
|
|
34
32
|
// The two edit tools the `PreToolUse` matcher routes here. A `Write` carries the whole new file; an
|
|
@@ -4,7 +4,7 @@ import { fileURLToPath } from 'node:url'
|
|
|
4
4
|
import { hook_decision } from '#scripts/josh/hook-decision'
|
|
5
5
|
import { delivered_rules } from './delivered-rules'
|
|
6
6
|
|
|
7
|
-
// The hook entry point for trigger-delivered rules
|
|
7
|
+
// The hook entry point for trigger-delivered rules.
|
|
8
8
|
//
|
|
9
9
|
// **It is the same shape `batch-guard.ts` and `investigation-guard.ts` already have**, and
|
|
10
10
|
// deliberately so: read the payload on stdin, ask the rule, write the one envelope Claude Code
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
import { fileURLToPath } from 'node:url'
|
|
3
|
+
import { delivered_rules } from './delivered-rules'
|
|
4
|
+
import { rule_registry, type RegisteredRule } from './rule-registry'
|
|
5
|
+
|
|
6
|
+
// `josh rule:list` — the list of trigger-delivered rules, rendered from the guard rows themselves.
|
|
7
|
+
// One item per `MEASURED_RULES` row in delivery order, then the `Stop`
|
|
8
|
+
// hook's rows; each carries its single source, the call it fires on and the turn it stays silent on.
|
|
9
|
+
// The prose is `rule-registry.ts`; the order and the set are `delivered-rules.ts`, so a row added
|
|
10
|
+
// there is listed without a document edit — and a row with no registry entry is listed as missing.
|
|
11
|
+
|
|
12
|
+
const HEADER =
|
|
13
|
+
'# Trigger-delivered rules — rendered by `pnpm josh rule:list` from `scripts/rules/delivered-rules.ts`'
|
|
14
|
+
const MISSING = '(no entry in `scripts/rules/rule-registry.ts`)'
|
|
15
|
+
|
|
16
|
+
function item(id: string, rule: RegisteredRule | undefined): string {
|
|
17
|
+
if (rule === undefined) return `- \`${id}\` ${MISSING}`
|
|
18
|
+
|
|
19
|
+
return [
|
|
20
|
+
`- **${rule.title}** (\`${id}\`, ${rule.topic})`,
|
|
21
|
+
` - fires: \`${rule.entry}\` — ${rule.fires}`,
|
|
22
|
+
` - silent: ${rule.quiet}`,
|
|
23
|
+
].join('\n')
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function row_ids(): ReadonlyArray<string> {
|
|
27
|
+
return delivered_rules.MEASURED_RULES.map((rule) => rule.id)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function render(): string {
|
|
31
|
+
const rows = row_ids().map((id) => item(id, rule_registry.entry_for(id)))
|
|
32
|
+
const stops = rule_registry.STOP_ROWS.map((rule) => item(rule.id, rule))
|
|
33
|
+
|
|
34
|
+
return [HEADER, '', ...rows, ...stops].join('\n')
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Registry entries no guard row reaches — a renamed or removed row left its prose behind.
|
|
38
|
+
function orphans(): ReadonlyArray<string> {
|
|
39
|
+
const reached = new Set(row_ids().map((id) => rule_registry.registry_id(id)))
|
|
40
|
+
const stop_ids = new Set(rule_registry.STOP_ROWS.map((rule) => rule.id))
|
|
41
|
+
|
|
42
|
+
return rule_registry.REGISTERED_RULES.map((rule) => rule.id).filter(
|
|
43
|
+
(id) => !reached.has(id) && !stop_ids.has(id),
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) process.stdout.write(`${render()}\n`)
|
|
48
|
+
|
|
49
|
+
const rule_list = { MISSING, orphans, render }
|
|
50
|
+
|
|
51
|
+
export { rule_list }
|