@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
package/scripts/josh/cli-body.ts
CHANGED
|
@@ -2,8 +2,8 @@ import { readFileSync, statSync } from 'node:fs'
|
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
|
|
4
4
|
// A body — an Issue comment, a PR comment, a notification message — handed to a command as an inline
|
|
5
|
-
// double-quoted shell argument is **evaluated by the shell before the command ever sees it
|
|
6
|
-
//
|
|
5
|
+
// double-quoted shell argument is **evaluated by the shell before the command ever sees it**.
|
|
6
|
+
// The observed damage is not a mangled string: a PR comment posted with
|
|
7
7
|
// `gh api … -f body="… \`pnpm josh ms\` …"` had part of its own text run as git commands, which
|
|
8
8
|
// switched a lane's work tree onto `main` and stopped the run.
|
|
9
9
|
//
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// A single-token "did you mean" for `josh <typo>`. The command set is small and the input is one
|
|
2
2
|
// word, so a character edit distance is the right measure here — unlike `issue-scout`'s token-set
|
|
3
|
-
// Dice similarity, which compares multi-word issue titles
|
|
3
|
+
// Dice similarity, which compares multi-word issue titles.
|
|
4
4
|
const MAX_SUGGESTION_DISTANCE = 3
|
|
5
5
|
|
|
6
6
|
// A cell of the matrix, defaulting the out-of-range read to 0. Reading through it keeps the nullish
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { process_identity } from './process-identity'
|
|
2
2
|
import { stamp_file } from './stamp-file'
|
|
3
3
|
|
|
4
|
-
// A stamp whose payload is "when this was taken, and the digest of every file it covers"
|
|
5
|
-
// (joshuafolkken/kit#1241).
|
|
4
|
+
// A stamp whose payload is "when this was taken, and the digest of every file it covers".
|
|
6
5
|
//
|
|
7
6
|
// `scripts/eval/eval-stamp.ts` was the only holder of this shape. `josh review:brief` needs two more
|
|
8
7
|
// records of exactly the same kind — the gate's result, and the snapshot round 1 takes so round 2
|
|
@@ -18,10 +17,10 @@ interface FileMapStamp {
|
|
|
18
17
|
taken_at: string
|
|
19
18
|
files: Record<string, string>
|
|
20
19
|
// The process that wrote it. Only a record whose meaning is "this is happening **now**" needs it —
|
|
21
|
-
// the in-flight gate marker
|
|
20
|
+
// the in-flight gate marker. The other two assert a completed past fact,
|
|
22
21
|
// which stays true however long the file sits there, so they carry it and never read it.
|
|
23
22
|
pid?: number
|
|
24
|
-
// The other half of that process's identity: when it started
|
|
23
|
+
// The other half of that process's identity: when it started. **A pid
|
|
25
24
|
// alone names whatever holds that number now**, so a marker left behind by a killed gate began
|
|
26
25
|
// reading as live again the moment the operating system reissued its pid — the brief then reporting
|
|
27
26
|
// a gate running on this tree about a gate that no longer exists. The pair separates them, because
|
|
@@ -30,19 +29,19 @@ interface FileMapStamp {
|
|
|
30
29
|
// the field existed carries none, which `process_identity.is_same_process` answers as "cannot tell"
|
|
31
30
|
// rather than as a match.
|
|
32
31
|
process_start?: string
|
|
33
|
-
// The commit the file map is defined against
|
|
32
|
+
// The commit the file map is defined against. Every reader of these
|
|
34
33
|
// records computes its map as a diff against that commit — the branch's merge base with the
|
|
35
|
-
// default branch
|
|
34
|
+
// default branch — so **the map alone does not describe a tree**:
|
|
36
35
|
// fetch an advanced default branch and rebase onto it, and every digest can stay identical while
|
|
37
36
|
// the rest of the working tree is replaced by code no check has read. The rebase moves `HEAD` and
|
|
38
37
|
// so moves the merge base, which is what this field catches; another lane merging into the shared
|
|
39
38
|
// default branch moves neither, and correctly leaves the record standing. Every reader that acts on
|
|
40
39
|
// a record rather than merely reporting it needs the guarantee: `josh gate`, which reuses a green
|
|
41
|
-
// result instead of re-running it, and
|
|
40
|
+
// result instead of re-running it, and the round-1 review snapshot,
|
|
42
41
|
// whose whole use is to name what round 1's fixes changed. A record written without it is refused
|
|
43
42
|
// rather than trusted.
|
|
44
43
|
base?: string
|
|
45
|
-
// When the run that wrote this record reached its verdict
|
|
44
|
+
// When the run that wrote this record reached its verdict. Written only
|
|
46
45
|
// by `complete`, so it is absent on a record whose run was interrupted or threw — which is the
|
|
47
46
|
// whole difference between "a run measured this tree" and "a run measured this tree and
|
|
48
47
|
// finished". Only a reader that acts on the *verdict* needs the second, so `josh eval` writes and
|
|
@@ -61,7 +60,7 @@ function is_file_map(value: unknown): value is Record<string, string> {
|
|
|
61
60
|
}
|
|
62
61
|
|
|
63
62
|
// An optional field of the wrong type is dropped rather than rejected: the records that never read
|
|
64
|
-
// one were written without it
|
|
63
|
+
// one were written without it, and every
|
|
65
64
|
// reader treats an absent field as the safe answer — "not running" for a `pid`, "cannot be reused"
|
|
66
65
|
// for a `base`. Spread rather than assigned, because `exactOptionalPropertyTypes` makes an explicit
|
|
67
66
|
// `undefined` a different thing from an absent key.
|
|
@@ -89,7 +88,7 @@ function parse_stamp(raw: string): FileMapStamp | undefined {
|
|
|
89
88
|
return { taken_at, files, ...optional_fields(pid, base, completed_at, process_start) }
|
|
90
89
|
}
|
|
91
90
|
|
|
92
|
-
// Whether the process that wrote this record is still running
|
|
91
|
+
// Whether the process that wrote this record is still running. It takes the
|
|
93
92
|
// whole record rather than a pid, because a pid on its own is not a process: asked that way a caller
|
|
94
93
|
// could not tell the writing process from whatever the operating system later reissued its number to,
|
|
95
94
|
// which is exactly the state the in-flight marker must never describe.
|
|
@@ -112,14 +111,13 @@ function is_writer_running(stamp: FileMapStamp | undefined): boolean {
|
|
|
112
111
|
|
|
113
112
|
// **For a guard: only when certain of the opposite.** `josh bench` deletes caches a running gate is
|
|
114
113
|
// reading, so the question it must ask is not "is the writer running" but "am I sure it is gone" — an
|
|
115
|
-
// uncertain answer there would clear the caches out from under a live gate
|
|
116
|
-
// joshuafolkken/kit#1332 was filed for. The probe is a subprocess and can fail on a loaded machine,
|
|
114
|
+
// uncertain answer there would clear the caches out from under a live gate. The probe is a subprocess and can fail on a loaded machine,
|
|
117
115
|
// which is exactly the machine a gate makes, so this is not a theoretical branch.
|
|
118
116
|
function is_writer_gone(stamp: FileMapStamp | undefined): boolean {
|
|
119
117
|
return writer_state(stamp) === false
|
|
120
118
|
}
|
|
121
119
|
|
|
122
|
-
// Whether a record may be compared against a map read now
|
|
120
|
+
// Whether a record may be compared against a map read now. Every map here is
|
|
123
121
|
// a diff against `change_base`, so two of them taken against **different** bases do not cover the same
|
|
124
122
|
// set of paths — and `changed_since` below reports that set difference as though the files had been
|
|
125
123
|
// edited. Measured on the resumed runs of #1080 / #1085 / #1147 / #1197: a merge of the default branch
|
|
@@ -142,7 +140,7 @@ function describes_base(stamp: FileMapStamp, base: string | undefined): boolean
|
|
|
142
140
|
//
|
|
143
141
|
// **It says nothing about two maps read against different bases.** It takes the union of the key
|
|
144
142
|
// sets, so a path only one of them covers is reported as changed — a set difference, not an edit.
|
|
145
|
-
// Callers guard that with `describes_base` above
|
|
143
|
+
// Callers guard that with `describes_base` above.
|
|
146
144
|
function changed_since(stamp: FileMapStamp, tree: Record<string, string>): ReadonlyArray<string> {
|
|
147
145
|
const names = new Set([...Object.keys(stamp.files), ...Object.keys(tree)])
|
|
148
146
|
|
|
@@ -153,17 +151,17 @@ function changed_since(stamp: FileMapStamp, tree: Record<string, string>): Reado
|
|
|
153
151
|
|
|
154
152
|
interface FileMapStampAccess {
|
|
155
153
|
stamp_path: () => string
|
|
156
|
-
// `base` is written by the one record that is acted on rather than merely reported —
|
|
157
|
-
//
|
|
154
|
+
// `base` is written by the one record that is acted on rather than merely reported — the
|
|
155
|
+
// green-gate reuse. The others omit it and are unaffected.
|
|
158
156
|
write: (files: Record<string, string>, target?: string, base?: string) => string
|
|
159
|
-
// Marks an existing record as belonging to a run that finished
|
|
157
|
+
// Marks an existing record as belonging to a run that finished. It
|
|
160
158
|
// amends rather than rewrites, and answers `undefined` where there is no record to amend: a run
|
|
161
159
|
// whose record never got written has nothing to assert a completion about, and inventing one here
|
|
162
160
|
// would manufacture the very vouching the field exists to withhold.
|
|
163
161
|
complete: (target?: string) => string | undefined
|
|
164
162
|
read: (source?: string) => FileMapStamp | undefined
|
|
165
|
-
// For a record whose meaning is its existence rather than its contents — the in-flight gate marker
|
|
166
|
-
//
|
|
163
|
+
// For a record whose meaning is its existence rather than its contents — the in-flight gate marker.
|
|
164
|
+
// A record nobody removes would go on asserting a gate that ended.
|
|
167
165
|
remove: (target?: string) => void
|
|
168
166
|
}
|
|
169
167
|
|
|
@@ -186,7 +184,7 @@ function read_at(source: string): FileMapStamp | undefined {
|
|
|
186
184
|
// Amending is the whole point, and re-writing would defeat it: `write` stamps a fresh `taken_at` and
|
|
187
185
|
// takes a fresh file map, so calling it again at the end of a run would claim the tree as the run
|
|
188
186
|
// *left* it was the tree the run measured — the record would then vouch for a comparison of that
|
|
189
|
-
// tree against itself, which is the one answer it exists to withhold
|
|
187
|
+
// tree against itself, which is the one answer it exists to withhold.
|
|
190
188
|
//
|
|
191
189
|
// **It completes only a record this process wrote**, which the `pid` already in the payload is what
|
|
192
190
|
// says. The path is deterministic per checkout, so a second whole-suite run started beside the first
|
|
@@ -199,7 +197,7 @@ function read_at(source: string): FileMapStamp | undefined {
|
|
|
199
197
|
// deliberate but total-by-assumption: a field added to `write` without a matching entry in
|
|
200
198
|
// `parse_stamp` and `optional_fields` would be dropped by any `complete`, so the two are extended
|
|
201
199
|
// together.
|
|
202
|
-
// **The pid is not the whole of that check either
|
|
200
|
+
// **The pid is not the whole of that check either**. A record left behind by
|
|
203
201
|
// a run that was killed, whose pid this process was later handed, passes `pid === process.pid` — and
|
|
204
202
|
// stamping it would describe that dead run as finished, which is the false `skip` the field exists to
|
|
205
203
|
// prevent, reached from a third direction. `is_writer_gone` is the added half rather than
|
|
@@ -232,8 +230,7 @@ function create(prefix: string, root?: string): FileMapStampAccess {
|
|
|
232
230
|
stamp_path: resolve,
|
|
233
231
|
// `base` goes into the payload undefined and all — `JSON.stringify` drops an undefined value,
|
|
234
232
|
// so a caller that has no base writes exactly the record it wrote before this field existed.
|
|
235
|
-
// `own_fields` is what writes the pid, and
|
|
236
|
-
// start time beside it — assembled in one place so no record can carry half an identity.
|
|
233
|
+
// `own_fields` is what writes the pid, and the writing process's start time beside it — assembled in one place so no record can carry half an identity.
|
|
237
234
|
write: (files, target = resolve(), base?: string) =>
|
|
238
235
|
stamp_file.write_stamp(target, {
|
|
239
236
|
taken_at: new Date().toISOString(),
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { json_value } from '#scripts/lib/json-value'
|
|
1
2
|
import type { GuardedCall } from '#scripts/time-runtime/time-batch-guard'
|
|
2
3
|
import { time_density_hook } from '#scripts/time-runtime/time-density-hook'
|
|
3
4
|
import { time_hook_transcript } from '#scripts/time-runtime/time-hook-transcript'
|
|
@@ -5,10 +6,10 @@ import { z } from 'zod'
|
|
|
5
6
|
import { josh_environment_file } from './josh-environment-file'
|
|
6
7
|
import { stamp_file } from './stamp-file'
|
|
7
8
|
|
|
8
|
-
// The parts every refusing `PreToolUse` hook needs, held once
|
|
9
|
+
// The parts every refusing `PreToolUse` hook needs, held once.
|
|
9
10
|
//
|
|
10
11
|
// **It exists because the second such hook arrived.** `batch-guard.ts` was the first
|
|
11
|
-
//
|
|
12
|
+
// and carried the whole shell itself: the payload schema, the envelope
|
|
12
13
|
// Claude Code understands, the environment switch, and the stamp that makes a refusal
|
|
13
14
|
// unrepeatable. The investigation guard needs all four unchanged and only its *rule* differs, so
|
|
14
15
|
// copying them across would be the clone `CLAUDE.md` prohibits — and a rule fixed in one copy and
|
|
@@ -20,7 +21,7 @@ import { stamp_file } from './stamp-file'
|
|
|
20
21
|
// Only the four fields a `PreToolUse` hook is handed and reads. Claude Code names the tool it is
|
|
21
22
|
// about to run beside a transcript path, so nothing is searched for.
|
|
22
23
|
//
|
|
23
|
-
// **`agent_id` is what makes a delegated unit answerable with its own file
|
|
24
|
+
// **`agent_id` is what makes a delegated unit answerable with its own file**.
|
|
24
25
|
// The path in the payload is the *parent* session's whichever agent issued the call, so without this
|
|
25
26
|
// field a guard judges the parent's frozen timeline and refuses nothing at all inside a fork.
|
|
26
27
|
const payload_schema = z.object({
|
|
@@ -58,7 +59,7 @@ function is_switch_enabled(key: string): boolean {
|
|
|
58
59
|
// The opt-in counterpart of `DISABLED_VALUES`: an unset variable stays off, and only one of these
|
|
59
60
|
// spellings turns the switch on. A switch that must default off cannot be read with `is_switch_enabled`
|
|
60
61
|
// — that one defaults on — so the value list is spelled out here rather than inverted at the call site,
|
|
61
|
-
// keeping a typo from silently enabling what was meant to stay disabled
|
|
62
|
+
// keeping a typo from silently enabling what was meant to stay disabled.
|
|
62
63
|
const ENABLED_VALUES: ReadonlyArray<string> = ['on', '1', 'true', 'yes']
|
|
63
64
|
|
|
64
65
|
// Read at call time for the same reason as `is_switch_enabled`, so a suite that switches the variable
|
|
@@ -85,7 +86,7 @@ function deny_envelope(reason: string): string {
|
|
|
85
86
|
})
|
|
86
87
|
}
|
|
87
88
|
|
|
88
|
-
// **A rewrite, not a refusal
|
|
89
|
+
// **A rewrite, not a refusal**: the call proceeds with `updated_input` merged
|
|
89
90
|
// over its own. `allow` is the decision the harness applies an `updatedInput` under; a settings `deny`
|
|
90
91
|
// rule still wins over it, so this never widens what the call may do.
|
|
91
92
|
function rewrite_envelope(updated_input: Record<string, unknown>, context: string): string {
|
|
@@ -126,7 +127,7 @@ function stamp_fault(switch_key: string): string {
|
|
|
126
127
|
// anything is written under it, so a fork's first guarded calls read a path with no file behind it —
|
|
127
128
|
// `time-hook-transcript.ts` states that "no history" is the honest verdict there. Reported as a fault
|
|
128
129
|
// it would print on every early call of every fork, which is the routine case drowning the signal this
|
|
129
|
-
// exists to raise
|
|
130
|
+
// exists to raise.
|
|
130
131
|
function is_missing_file(error: unknown): boolean {
|
|
131
132
|
if (!(error instanceof Error) || !('code' in error)) return false
|
|
132
133
|
|
|
@@ -168,11 +169,7 @@ function last_refusal_ms(target: string): number {
|
|
|
168
169
|
|
|
169
170
|
if (raw === undefined) return NEVER_MS
|
|
170
171
|
|
|
171
|
-
|
|
172
|
-
return refusal_schema.parse(JSON.parse(raw)).refused_at_ms
|
|
173
|
-
} catch {
|
|
174
|
-
return NEVER_MS
|
|
175
|
-
}
|
|
172
|
+
return json_value.parse_with(raw, refusal_schema)?.refused_at_ms ?? NEVER_MS
|
|
176
173
|
}
|
|
177
174
|
|
|
178
175
|
function record_refusal(target: string, now_ms: number): boolean {
|
|
@@ -199,7 +196,7 @@ function create_refusal_stamp(prefix: string): RefusalStamp {
|
|
|
199
196
|
// **`.env` is loaded here rather than through the dispatcher's `tsx_arguments`**, and the reason —
|
|
200
197
|
// declaring any `tsx_arguments` disqualifies a command from in-process dispatch — is now shared with
|
|
201
198
|
// every other command that has to stay in-process, so the loader lives in `josh-environment-file.ts` rather
|
|
202
|
-
// than here
|
|
199
|
+
// than here. Re-exported under this namespace because that is where the
|
|
203
200
|
// hooks reach for it.
|
|
204
201
|
//
|
|
205
202
|
// **Call it only on the real hook path**, never inside the pure refusal function, so a developer's
|
|
@@ -217,7 +214,7 @@ interface GuardRun {
|
|
|
217
214
|
}
|
|
218
215
|
|
|
219
216
|
// The notice half of a guard's rule, kept optional so a guard that only refuses supplies nothing and is
|
|
220
|
-
// untouched
|
|
217
|
+
// untouched. The investigation guard omits it; the batching guard supplies one
|
|
221
218
|
// for the whole-file write, which it cannot refuse but can advise.
|
|
222
219
|
interface NotifySpec {
|
|
223
220
|
// This disposition's record prefix, distinct from the refusal's so the two dedupe independently and
|
|
@@ -226,8 +223,8 @@ interface NotifySpec {
|
|
|
226
223
|
// The same shape as `should_block`, asked of the tail for a notify-only call. `notified_at_ms` is
|
|
227
224
|
// this disposition's own last-fired instant, never the refusal's.
|
|
228
225
|
should_notify: (tail: string, call: GuardedCall, notified_at_ms: number, run: GuardRun) => boolean
|
|
229
|
-
// The non-blocking text handed to `notice_envelope`, chosen from the call and the tail
|
|
230
|
-
//
|
|
226
|
+
// The non-blocking text handed to `notice_envelope`, chosen from the call and the tail.
|
|
227
|
+
// A guard now notifies about more than one kind of
|
|
231
228
|
// call — the whole-file write it cannot refuse, and, in a lane child, a refusable call whose refusal
|
|
232
229
|
// is downgraded to a notice — and the two want different wording, so the text is a function of the
|
|
233
230
|
// call. It is handed the tail as well so a notice can name the concrete calls the run just issued
|
|
@@ -252,18 +249,18 @@ interface TranscriptGuardSpec {
|
|
|
252
249
|
should_block: (tail: string, call: GuardedCall, refused_at_ms: number, run: GuardRun) => boolean
|
|
253
250
|
// What the model is told. The deny reason is the only text that reaches it.
|
|
254
251
|
reason: string
|
|
255
|
-
// **The optional notice disposition
|
|
252
|
+
// **The optional notice disposition**. Supplied, it lets a guard emit a
|
|
256
253
|
// non-blocking notice for a call it does not refuse. Its record lives under a prefix of its own.
|
|
257
254
|
notify?: NotifySpec
|
|
258
255
|
}
|
|
259
256
|
|
|
260
|
-
// What one hook invocation decided. **`fault` is the half that did not exist
|
|
257
|
+
// What one hook invocation decided. **`fault` is the half that did not exist**:
|
|
261
258
|
// every failure still allows the call, but a failure that nobody can see is indistinguishable from a
|
|
262
259
|
// run that was batching properly — so the guard could be dead for two hours and read as satisfied.
|
|
263
260
|
// `reason` refuses; `fault` allows and says so.
|
|
264
261
|
interface GuardOutcome {
|
|
265
262
|
reason: string | undefined
|
|
266
|
-
// **A notice, not a refusal
|
|
263
|
+
// **A notice, not a refusal**. Set where a notify-only call — a whole-file
|
|
267
264
|
// write — reached the limit; the call still proceeds, and `notice_envelope` carries this to the
|
|
268
265
|
// model and the person with no `permissionDecision`. Never set together with `reason`: the block
|
|
269
266
|
// path decides first and returns before the notice path is asked.
|
|
@@ -287,7 +284,7 @@ interface FireResult {
|
|
|
287
284
|
|
|
288
285
|
// The three the guard closes over: the spec, and one record per disposition. Bundled so the functions
|
|
289
286
|
// below stay within the parameter limit, and so a further disposition adds a field rather than a
|
|
290
|
-
// parameter to every one of them
|
|
287
|
+
// parameter to every one of them.
|
|
291
288
|
interface GuardParts {
|
|
292
289
|
spec: TranscriptGuardSpec
|
|
293
290
|
stamp: RefusalStamp
|
|
@@ -306,7 +303,7 @@ interface GuardContext extends GuardParts {
|
|
|
306
303
|
// cannot repeat on the call in hand. **Recording before firing is what makes a refusal unrepeatable**,
|
|
307
304
|
// so a disposition that cannot record does not fire — it reports the fault instead of risking the
|
|
308
305
|
// wedge, which is the half `scripts/hooks/batch-guard.ts` names. Shared by the refusal and the notice so the
|
|
309
|
-
// arm-then-fire order is written once
|
|
306
|
+
// arm-then-fire order is written once.
|
|
310
307
|
function fire_once(
|
|
311
308
|
stamp: RefusalStamp,
|
|
312
309
|
run: GuardRun,
|
|
@@ -367,7 +364,7 @@ function guard_reason_for_payload(
|
|
|
367
364
|
if (!parts.spec.is_candidate(call)) return NO_OUTCOME
|
|
368
365
|
|
|
369
366
|
// A hook firing inside a delegated unit is handed the *parent's* path, so the fork's own file is
|
|
370
|
-
// derived here rather than judged from the parent's frozen timeline
|
|
367
|
+
// derived here rather than judged from the parent's frozen timeline.
|
|
371
368
|
const transcript = time_hook_transcript.transcript_of(payload.transcript_path, payload.agent_id)
|
|
372
369
|
const tail = time_density_hook.read_tail(transcript)
|
|
373
370
|
const context = { ...parts, tail, call, run: { transcript, now_ms } }
|
|
@@ -393,7 +390,7 @@ function guard_outcome(parts: GuardParts, raw_payload: string, now_ms: number):
|
|
|
393
390
|
function create_transcript_guard(spec: TranscriptGuardSpec): TranscriptGuard {
|
|
394
391
|
const stamp = create_refusal_stamp(spec.prefix)
|
|
395
392
|
// A record of its own for the notice, only where a notify spec is supplied. Keyed on its own prefix
|
|
396
|
-
// so a notice never spends the refusal's stamp
|
|
393
|
+
// so a notice never spends the refusal's stamp.
|
|
397
394
|
const notify_stamp = spec.notify ? create_refusal_stamp(spec.notify.prefix) : undefined
|
|
398
395
|
const parts = { spec, stamp, notify_stamp }
|
|
399
396
|
|
|
@@ -410,7 +407,7 @@ function create_transcript_guard(spec: TranscriptGuardSpec): TranscriptGuard {
|
|
|
410
407
|
// same reason `format-edited-file.ts` swallows a formatter it could not start: a hook that failed
|
|
411
408
|
// closed would stop a run over its own plumbing.
|
|
412
409
|
//
|
|
413
|
-
// **What changed is that it no longer does so in silence
|
|
410
|
+
// **What changed is that it no longer does so in silence**. The call still
|
|
414
411
|
// goes through — failing open is the right call and is not being revisited — but the fault comes
|
|
415
412
|
// back as text the run can see, so "the guard said nothing" and "the guard could not look" stop
|
|
416
413
|
// being the same observation.
|
|
@@ -430,8 +427,8 @@ function create_transcript_guard(spec: TranscriptGuardSpec): TranscriptGuard {
|
|
|
430
427
|
}
|
|
431
428
|
|
|
432
429
|
// Write one already-resolved outcome, so a caller that has to await its rule (the watcher guard reads
|
|
433
|
-
// the lane registry and the life record) can compute the outcome first and hand it here
|
|
434
|
-
//
|
|
430
|
+
// the lane registry and the life record) can compute the outcome first and hand it here.
|
|
431
|
+
// Nothing reaches stdout on the ordinary call, so what the harness parses
|
|
435
432
|
// stays empty unless the call is being refused.
|
|
436
433
|
function emit_outcome(outcome: GuardOutcome): void {
|
|
437
434
|
const { reason, notice, fault } = outcome
|
|
@@ -453,9 +450,8 @@ function write_outcome(raw_payload: string, outcome: (raw: string) => GuardOutco
|
|
|
453
450
|
// wrapper rather than a second implementation, so both paths write the same envelopes.
|
|
454
451
|
//
|
|
455
452
|
// **A guard still calling this discards any fault it raised** — `investigation-guard.ts` is the one
|
|
456
|
-
// that does, so a stamp it could not write there is still silent
|
|
457
|
-
//
|
|
458
|
-
// subject is the batching guard, and moving another hook across belongs with its own test.
|
|
453
|
+
// that does, so a stamp it could not write there is still silent — the gap the batching guard no
|
|
454
|
+
// longer has. Moving another hook across belongs with its own test.
|
|
459
455
|
function write_decision(raw_payload: string, refusal: (raw: string) => string | undefined): void {
|
|
460
456
|
write_outcome(raw_payload, (raw) => ({
|
|
461
457
|
reason: refusal(raw),
|
|
@@ -37,6 +37,7 @@ const ALIASES: Record<string, string> = {
|
|
|
37
37
|
lr: 'lint:related',
|
|
38
38
|
ln: 'lines',
|
|
39
39
|
by: 'bytes',
|
|
40
|
+
mt: 'metrics',
|
|
40
41
|
f: 'format',
|
|
41
42
|
sd: 'cspell:dot',
|
|
42
43
|
bh: 'behavior',
|
|
@@ -80,10 +81,12 @@ const ALIASES: Record<string, string> = {
|
|
|
80
81
|
ev: 'eval',
|
|
81
82
|
lsm: 'lane:sample',
|
|
82
83
|
lst: 'lane:stats',
|
|
84
|
+
lli: 'lane:limit',
|
|
85
|
+
blr: 'backlogrun',
|
|
83
86
|
}
|
|
84
87
|
|
|
85
88
|
// The canonical name of a `josh` subcommand: an alias expands, and anything else passes through
|
|
86
|
-
// unchanged
|
|
89
|
+
// unchanged.
|
|
87
90
|
//
|
|
88
91
|
// **The expansion is one rule, so it lives beside the table it reads.** Two readers had each written
|
|
89
92
|
// their own `ALIASES[name] ?? name` — the layer report and the gate-run count — and a third, the run
|
|
@@ -6,9 +6,9 @@ import { ENV_FILE_NAME } from '#ports'
|
|
|
6
6
|
//
|
|
7
7
|
// **There is no mandatory counterpart any more.** `--env-file=.env` aborts before the script's first
|
|
8
8
|
// line when the file is missing, which is wrong for every command kit ships: `doctor` runs from
|
|
9
|
-
// anywhere, including a directory with no project at all
|
|
9
|
+
// anywhere, including a directory with no project at all, and `notify` /
|
|
10
10
|
// `followup` run in cloud sessions that carry their credentials as environment variables and keep no
|
|
11
|
-
// `.env` at all
|
|
11
|
+
// `.env` at all. A command that needs a value to be present says so itself,
|
|
12
12
|
// where it can name what is missing.
|
|
13
13
|
const OPTIONAL_ENV_FILE_FLAGS: ReadonlyArray<string> = [`--env-file-if-exists=${ENV_FILE_NAME}`]
|
|
14
14
|
|
|
@@ -17,7 +17,7 @@ type CommandCategory =
|
|
|
17
17
|
|
|
18
18
|
// The two vocabularies are runtime tuples the types are derived from, rather than bare unions. A
|
|
19
19
|
// union exists only at compile time, so the completeness test and the generated reference
|
|
20
|
-
//
|
|
20
|
+
// would each have to restate the values to check or render them — two
|
|
21
21
|
// copies that drift apart silently. Deriving the type from the tuple keeps one definition.
|
|
22
22
|
const COMMAND_AUDIENCES = ['developer', 'maintainer', 'automation'] as const
|
|
23
23
|
const COMMAND_SIDE_EFFECTS = [
|
|
@@ -57,42 +57,43 @@ interface CommandEntry {
|
|
|
57
57
|
// A command that only makes sense inside the kit repository itself — the rule-compliance eval and
|
|
58
58
|
// the run measurements that analyze kit's own development. It is dropped from a consumer's
|
|
59
59
|
// `josh --help` and refused with guidance when run in a consumer project, so a distributed help
|
|
60
|
-
// listing carries only what a consumer can run
|
|
60
|
+
// listing carries only what a consumer can run. The audience in
|
|
61
61
|
// `reference` separately decides whether the command appears in the default listing.
|
|
62
62
|
is_kit_only?: boolean
|
|
63
63
|
// Pre-built to `dist/commands/` so a consumer's `dist/josh.js` imports it in its own process
|
|
64
|
-
// instead of spawning tsx for it (
|
|
64
|
+
// instead of spawning tsx for it (`docs/maintainers/runtime-bundling.md`).
|
|
65
65
|
is_bundled?: boolean
|
|
66
|
-
// The cores the command reserves from the machine-wide budget before it starts its heavy tools
|
|
67
|
-
//
|
|
66
|
+
// The cores the command reserves from the machine-wide budget before it starts its heavy tools.
|
|
67
|
+
// `josh-logic.ts` claims them at the one dispatch point every command
|
|
68
68
|
// passes through, so the command only declares the number. A function means the weight is read
|
|
69
69
|
// when the command starts: the unit suite's share depends on what else is running at that moment.
|
|
70
70
|
// **The edit hook declares none, on purpose.** It formats one file per edit and finishes in well
|
|
71
71
|
// under a second, so a wait for room on the machine would stall every edit for the length of
|
|
72
72
|
// another lane's check.
|
|
73
73
|
core_weight?: number | (() => number)
|
|
74
|
+
// The memory the command's tools hold, claimed with its cores; read like
|
|
75
|
+
// `core_weight`, and none declared is none waited for.
|
|
76
|
+
memory_mb?: number | (() => number)
|
|
74
77
|
}
|
|
75
78
|
|
|
76
79
|
// The name `josh gate` registers under. It lives here rather than in `verification-gate.ts` so a
|
|
77
80
|
// consumer of the name — the command map, `propagate` — does not import the script module: that
|
|
78
81
|
// module carries a `process.argv[1] === import.meta.url` main guard, and esbuild bundles every
|
|
79
|
-
// import into one `dist/josh.js` where that guard matches on *any* `josh` invocation
|
|
80
|
-
// (joshuafolkken/kit#914).
|
|
82
|
+
// import into one `dist/josh.js` where that guard matches on *any* `josh` invocation.
|
|
81
83
|
const GATE_COMMAND = 'gate'
|
|
82
84
|
|
|
83
|
-
//
|
|
84
|
-
//
|
|
85
|
-
// check rescanned the whole tree every time, which cost 10.5s of CPU against 2.8s cached.
|
|
85
|
+
// Three of the gate's four checks keep a content-addressed cache, so a second run reads only what
|
|
86
|
+
// changed.
|
|
86
87
|
//
|
|
87
|
-
// Neither
|
|
88
|
-
// inside the build-info file and re-checks everything when they differ, and
|
|
89
|
-
// content hash of every config and dictionary file it loaded as that entry's dependency — so editing
|
|
88
|
+
// Neither the type check nor the spell check needs an invalidation rule of its own. `tsc` records
|
|
89
|
+
// the compiler options inside the build-info file and re-checks everything when they differ, and
|
|
90
|
+
// `cspell` records a content hash of every config and dictionary file it loaded as that entry's dependency — so editing
|
|
90
91
|
// `tsconfig.json` or `cspell.config.yaml` invalidates what it should. CI restores only the eslint
|
|
91
92
|
// cache (`.github/workflows/ci.yml` → "Setup ESLint cache"); the other two start every run cold.
|
|
92
93
|
//
|
|
93
|
-
// **eslint's does need one, and it is not here
|
|
94
|
-
// *serialized* config, which drops every rule's `create`, so editing `eslint/rules/*.js`
|
|
95
|
-
// cached entry valid on every cache file below. The
|
|
94
|
+
// **eslint's does need one, and it is not here**. ESLint hashes the
|
|
95
|
+
// *serialized* config, which drops every rule's `create`, so editing `eslint/rules/*.js` would leave
|
|
96
|
+
// every cached entry valid on every cache file below. The answer is a content fingerprint of the rule modules
|
|
96
97
|
// carried in the shared config's `settings` — `eslint/config-fingerprint.js` — because one value
|
|
97
98
|
// there invalidates the gate's cache, the scoped one and the edit hook's at once, while a rule
|
|
98
99
|
// written per cache file would have to be repeated for each and would go stale one file at a time.
|
|
@@ -150,10 +151,9 @@ const SHARED_CACHE_SPECS: ReadonlyArray<GateCacheSpec> = [
|
|
|
150
151
|
]
|
|
151
152
|
const GATE_CACHE_FILES: ReadonlyArray<string> = GATE_CACHE_SPECS.map((spec) => spec.cache_file)
|
|
152
153
|
|
|
153
|
-
//
|
|
154
|
-
//
|
|
155
|
-
//
|
|
156
|
-
// (59.4s and 54.5s, against 3.0s warm). The hook is given a location of its own rather than the
|
|
154
|
+
// The `PostToolUse` edit hook runs eslint too, and ESLint *deletes* the file at `--cache-location`
|
|
155
|
+
// whenever it is started without `--cache` — so a shared file would be wiped by every single edit,
|
|
156
|
+
// leaving the gate a cold lint. The hook is given a location of its own rather than the
|
|
157
157
|
// gate's because the two run at the same time: `josh gate` lints the whole tree beside the review
|
|
158
158
|
// while this hook fires on every edit, and each eslint run rewrites its cache file whole from the
|
|
159
159
|
// copy it loaded at start-up — so two writers silently discard each other's entries. A file of its
|
|
@@ -162,18 +162,16 @@ const GATE_CACHE_FILES: ReadonlyArray<string> = GATE_CACHE_SPECS.map((spec) => s
|
|
|
162
162
|
// **Pruning is not the reason**, though it reads like one: `file-entry-cache` defaults `noPrune` to
|
|
163
163
|
// true, and a single-file run against the gate's full cache was measured byte-identical, so a shared
|
|
164
164
|
// file would keep the entries that run never visited.
|
|
165
|
-
//
|
|
166
|
-
//
|
|
167
|
-
//
|
|
168
|
-
//
|
|
169
|
-
//
|
|
170
|
-
//
|
|
171
|
-
// one's entries.
|
|
165
|
+
// The same reasoning for the scoped lint. `josh lint:related` is what an implementation loop calls
|
|
166
|
+
// between edits, and `josh gate` lints the whole tree beside the review — so those two run at the
|
|
167
|
+
// same time as readily as the hook and the gate do. Whichever of a pair sharing one file wrote last
|
|
168
|
+
// would replace it with "the copy I loaded at start-up plus what I visited", so a narrowed run
|
|
169
|
+
// finishing during a whole-tree run would roll the cache back to its pre-gate state, and a
|
|
170
|
+
// whole-tree run finishing second would discard the narrowed one's entries.
|
|
172
171
|
//
|
|
173
|
-
// **The warming this gives up is worth less than the entries it stops losing.**
|
|
174
|
-
//
|
|
175
|
-
//
|
|
176
|
-
// stays exactly as the gate left it.
|
|
172
|
+
// **The warming this gives up is worth less than the entries it stops losing.** A shared file would
|
|
173
|
+
// let a narrowed run warm the gate's cache only while the two never overlap; a file of its own is
|
|
174
|
+
// warm from its own second call onwards, and the gate's stays exactly as the gate left it.
|
|
177
175
|
//
|
|
178
176
|
// **The lint's target scope is untouched.** This is where a cache is written, not what is read:
|
|
179
177
|
// `josh lint:related` narrows in front of the gate and `josh gate` still runs `josh lint` over the
|
|
@@ -209,7 +207,7 @@ const CSPELL_CACHE_FLAGS = content_cache_flags(CSPELL_CACHE_FILE)
|
|
|
209
207
|
|
|
210
208
|
export type { CommandCategory, CommandEntry, GateCacheSpec }
|
|
211
209
|
// The three cache files are exported one by one as well as as a list, because `josh bench` clears
|
|
212
|
-
// them per target
|
|
210
|
+
// them per target: the lint step writes only the eslint one, so a target
|
|
213
211
|
// that cleared the list would report a cold type check as the lint's own cost. The edit hook's cache
|
|
214
212
|
// stays private; the scoped lint cache is exported because #2060 shares its completed file between
|
|
215
213
|
// worktrees, but it still never overlaps the gate's distinct cache location.
|
|
@@ -77,12 +77,12 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
|
|
|
77
77
|
reference: ['[options]', 'maintainer', ['none']],
|
|
78
78
|
// Kit-only: it measures kit's own development runs and its report modules live under the
|
|
79
79
|
// undistributed `scripts/time/`, so it means nothing in a consumer project and is dropped from a
|
|
80
|
-
// consumer's help
|
|
80
|
+
// consumer's help. The runtime analysis hooks and guards rely on stays
|
|
81
81
|
// distributed under `scripts/time-runtime/`.
|
|
82
82
|
is_kit_only: true,
|
|
83
83
|
},
|
|
84
84
|
// The tool-calls-per-round-trip density the batching guard is measured on, aggregated across the
|
|
85
|
-
// recent lane sessions
|
|
85
|
+
// recent lane sessions. Kit-only for the same reason `time` is: it reads
|
|
86
86
|
// kit's own lane transcripts and means nothing in a consumer project.
|
|
87
87
|
'time:density': {
|
|
88
88
|
script: 'scripts/time/time-density-cli.ts',
|
|
@@ -99,7 +99,7 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
|
|
|
99
99
|
reference: ['', 'maintainer', ['none']],
|
|
100
100
|
// Kit-only: it reads kit's own development run — the transcript store, the review ledger and the
|
|
101
101
|
// run event stream — so it means nothing in a consumer project and is dropped from a consumer's
|
|
102
|
-
// help
|
|
102
|
+
// help, through the same declaration `josh time` uses for the same reason.
|
|
103
103
|
is_kit_only: true,
|
|
104
104
|
},
|
|
105
105
|
'review:brief': {
|
|
@@ -156,7 +156,7 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
|
|
|
156
156
|
category: 'AI tools',
|
|
157
157
|
reference: ['[--join]', 'automation', ['processes', 'files']],
|
|
158
158
|
},
|
|
159
|
-
// The post-merge sequence a run closed on, folded into one call
|
|
159
|
+
// The post-merge sequence a run closed on, folded into one call: commit the
|
|
160
160
|
// observation ledger, read the completion citations and decide the release scope. `observations:flush`,
|
|
161
161
|
// `issue:cite` and `release:scope` were three round trips re-billing the run's full context each.
|
|
162
162
|
'run:tail': {
|
|
@@ -166,7 +166,7 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
|
|
|
166
166
|
category: 'AI tools',
|
|
167
167
|
reference: ['[<issue> ...]', 'automation', ['git', 'network']],
|
|
168
168
|
},
|
|
169
|
-
// The commit-to-report region a run ships a change on, folded into one call
|
|
169
|
+
// The commit-to-report region a run ships a change on, folded into one call:
|
|
170
170
|
// the gate, the commit/push/PR (`git -y`), the CI-wait merge (`followup`) and the report bookkeeping
|
|
171
171
|
// (`run:tail`) were four round trips re-billing the run's full context each. It stops at the first
|
|
172
172
|
// failed step and names it, so the run reads only the step to fix.
|
|
@@ -231,7 +231,7 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
|
|
|
231
231
|
category: 'AI tools',
|
|
232
232
|
reference: ['[scenario...]', 'maintainer', ['processes', 'network']],
|
|
233
233
|
// Kit-only: it replays kit's own distributed rules against real Claude sessions, so it means
|
|
234
|
-
// nothing in a consumer project and is dropped from a consumer's help
|
|
234
|
+
// nothing in a consumer project and is dropped from a consumer's help.
|
|
235
235
|
is_kit_only: true,
|
|
236
236
|
},
|
|
237
237
|
}
|
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
import { OPTIONAL_ENV_FILE_FLAGS, type CommandEntry } from './josh-command-types'
|
|
2
2
|
|
|
3
3
|
// The `backlog:*` command registry, split out of `josh-commands-ai.ts` so that file stays under its
|
|
4
|
-
// 300-code-line limit, exactly as `LANE_COMMANDS` and `SPLIT_COMMANDS` were for the same reason
|
|
5
|
-
//
|
|
4
|
+
// 300-code-line limit, exactly as `LANE_COMMANDS` and `SPLIT_COMMANDS` were for the same reason.
|
|
5
|
+
// It is spread into `AI_COMMANDS` so the commands
|
|
6
6
|
// stay grouped with the other AI tools under the 'AI tools' category.
|
|
7
7
|
|
|
8
8
|
/* eslint-disable @typescript-eslint/naming-convention */
|
|
9
9
|
const BACKLOG_COMMANDS: Record<string, CommandEntry> = {
|
|
10
|
+
// Started from a terminal: the `backlogrun` keyword's launcher, and the board.
|
|
11
|
+
backlogrun: {
|
|
12
|
+
script: 'scripts/backlog/backlogrun-cli.ts',
|
|
13
|
+
description:
|
|
14
|
+
'Start a backlogrun in the background and show its board; with one already running, only show the board',
|
|
15
|
+
category: 'AI tools',
|
|
16
|
+
reference: [
|
|
17
|
+
'[#<n>...] [--only] [--max <n>] [--idle <minutes>] [--agent claude|codex]',
|
|
18
|
+
'developer',
|
|
19
|
+
['files', 'network', 'processes'],
|
|
20
|
+
],
|
|
21
|
+
},
|
|
10
22
|
'backlog:next': {
|
|
11
23
|
script: 'scripts/backlog/backlog-next.ts',
|
|
12
24
|
description:
|
|
@@ -41,7 +53,7 @@ const BACKLOG_COMMANDS: Record<string, CommandEntry> = {
|
|
|
41
53
|
},
|
|
42
54
|
'backlog:stalled': {
|
|
43
55
|
script: 'scripts/backlog/backlog-stalled-cli.ts',
|
|
44
|
-
// A stall sends one Telegram warning
|
|
56
|
+
// A stall sends one Telegram warning. The `Stop` hook calls the detector
|
|
45
57
|
// directly, so this flag costs only the manual command its in-process dispatch.
|
|
46
58
|
tsx_arguments: OPTIONAL_ENV_FILE_FLAGS,
|
|
47
59
|
description:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { CommandEntry } from './josh-command-types'
|
|
2
2
|
|
|
3
3
|
// The clone-detection commands, kept in their own module so `josh-commands-ai.ts` stays under its
|
|
4
|
-
// line ceiling as the AI-tools set grows
|
|
4
|
+
// line ceiling as the AI-tools set grows. Spread into `COMMAND_MAP` in
|
|
5
5
|
// `josh-command-map.ts` alongside the other command groups.
|
|
6
6
|
/* eslint-disable @typescript-eslint/naming-convention */
|
|
7
7
|
const CLONE_COMMANDS: Record<string, CommandEntry> = {
|