@joshuafolkken/kit 1.1784.0 → 1.2116.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/reviewer-verification.md +19 -0
- package/.claude/agents/reviewer.md +19 -0
- package/.claude/settings.json +5 -6
- package/.claude/skills/dependency-update/SKILL.md +9 -10
- package/.claude/skills/workflow-commands/SKILL.md +6 -6
- package/.claude/skills/workflow-commands/background-commands.md +8 -5
- package/.claude/skills/workflow-commands/backlogrun-child.md +3 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-park.md +5 -2
- package/.claude/skills/workflow-commands/backlogrun-progress.md +2 -3
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/backlogrun.md +1 -1
- package/.claude/skills/workflow-commands/chain-rule.md +41 -32
- package/.claude/skills/workflow-commands/delegation.md +6 -6
- package/.claude/skills/workflow-commands/entry-sequence.md +2 -2
- package/.claude/skills/workflow-commands/followup.md +7 -5
- package/.claude/skills/workflow-commands/fullrun-steps.md +6 -6
- package/.claude/skills/workflow-commands/fullrun.md +1 -1
- package/.claude/skills/workflow-commands/issue-comments.md +9 -4
- package/.claude/skills/workflow-commands/issue-fold-existing.md +2 -1
- package/.claude/skills/workflow-commands/kickoff.md +2 -2
- package/.claude/skills/workflow-commands/observation-filing.md +1 -1
- package/.claude/skills/workflow-commands/observation-ledger.md +6 -4
- package/.claude/skills/workflow-commands/pre-gate-cut.md +9 -7
- package/.claude/skills/workflow-commands/prerequisite.md +3 -2
- package/.claude/skills/workflow-commands/retrospective.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +7 -5
- package/.codex/hooks.json +5 -5
- package/.github/actions/setup-pnpm/action.yml +9 -16
- package/.github/dependabot.yml +16 -0
- package/.github/workflows/auto-tag.yml +45 -0
- package/.github/workflows/ci.yml +155 -15
- package/.github/workflows/dependabot-auto-merge.yml +63 -4
- package/.github/workflows/production.yml +8 -0
- package/.github/workflows/publish.yml +60 -45
- package/.vscode/settings.json +19 -0
- package/CLAUDE.md +5 -12
- package/SECURITY.md +2 -2
- package/dist/CLAUDE.md +5 -12
- package/dist/commands/document-read-cli.js +2 -1
- package/dist/commands/document-section-main.js +2 -1
- package/dist/commands/read-set-cli.js +194 -134
- package/dist/commands/run-prep-main.js +9694 -10173
- package/dist/commands/run-step-cli.js +22138 -18285
- package/dist/hooks/audit-provision.js +23 -5
- package/dist/hooks/chunk-3GKE653K.js +6204 -0
- package/dist/hooks/chunk-45CJJOO7.js +1243 -0
- package/dist/hooks/{chunk-CWMBGKYW.js → chunk-5PM2JRGV.js} +2153 -856
- package/dist/hooks/{chunk-WR2KQAYZ.js → chunk-7SIUNQXK.js} +1207 -1470
- package/dist/hooks/{chunk-O2YBIDSI.js → chunk-CQD4LJE6.js} +1682 -1130
- package/dist/hooks/{chunk-VWWCFGWK.js → chunk-OPSRGWFU.js} +1 -1
- package/dist/hooks/{chunk-XGBNSWEI.js → chunk-UJ3FPMMM.js} +132 -49
- package/dist/hooks/chunk-VVNYJWEI.js +30 -0
- package/dist/hooks/chunk-Z6DQJKH3.js +2806 -0
- package/dist/hooks/codex-hook-adapter.js +8 -8
- package/dist/hooks/format-edited.js +4 -5
- package/dist/hooks/inputs.json +386 -360
- package/dist/hooks/pretool-guard.js +7 -6
- package/dist/hooks/session-lang.js +101 -258
- package/dist/hooks/stop-guard.js +1744 -2576
- package/dist/josh.js +7133 -6368
- package/dist/version/index.js +161 -1
- package/eslint/rules/comment-why-only.js +108 -0
- package/package.json +16 -9
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +14 -11
- package/prompts/collaboration-workflow/issue-citation.md +0 -4
- package/prompts/collaboration-workflow/issue-template.md +40 -21
- package/prompts/collaboration-workflow/lane-instructions.md +3 -1
- package/prompts/collaboration-workflow/measurement.md +8 -1
- package/prompts/collaboration-workflow/operating-rules.md +11 -2
- package/prompts/collaboration-workflow/output-bounds.md +6 -2
- package/prompts/collaboration-workflow/plan-comment.md +1 -1
- package/prompts/collaboration-workflow/principles.md +9 -0
- package/prompts/collaboration-workflow/residency.md +3 -2
- package/prompts/collaboration-workflow/rule-delivery.md +13 -1
- package/prompts/collaboration-workflow/upstream-interrupt.md +2 -2
- package/prompts/collaboration-workflow/wip-cap.md +3 -1
- package/prompts/review-rubric.md +8 -0
- package/prompts/review.md +31 -22
- package/prompts/testing-guide.md +1 -0
- package/scripts/agent/agent-argv.ts +14 -16
- package/scripts/agent/agent-provider.ts +138 -0
- package/scripts/agent/agent-role-profile.ts +108 -156
- package/scripts/agent/agent-safe-text.ts +20 -5
- package/scripts/agent/api-usage-limit.ts +65 -0
- package/scripts/agent/claude-agent-argv.ts +19 -9
- package/scripts/agent/codex-agent-argv.ts +118 -22
- package/scripts/agent/usage-limit-reset.ts +179 -0
- package/scripts/auth/claude-token-output.ts +2 -2
- package/scripts/auto-ok/auto-ok-author.ts +53 -0
- package/scripts/auto-ok/auto-ok-cli.ts +20 -9
- package/scripts/backlog/backlog-defect-priority.ts +1 -1
- package/scripts/backlog/backlog-drive-cli.ts +6 -1
- package/scripts/backlog/backlog-drive-hold.ts +3 -3
- package/scripts/backlog/backlog-drive-idle.ts +10 -0
- package/scripts/backlog/backlog-drive-launch-pass.ts +90 -0
- package/scripts/backlog/backlog-drive-launch.ts +8 -2
- package/scripts/backlog/backlog-drive-named-offer.ts +73 -30
- package/scripts/backlog/backlog-drive-named.ts +28 -7
- package/scripts/backlog/backlog-drive-paused.ts +5 -4
- package/scripts/backlog/backlog-drive-restore.ts +11 -3
- package/scripts/backlog/backlog-drive.ts +21 -60
- package/scripts/backlog/backlog-gate-scope.ts +61 -0
- package/scripts/backlog/backlog-measure-close.ts +112 -0
- package/scripts/backlog/backlog-next.ts +39 -49
- package/scripts/backlog/backlog-occupied.ts +2 -2
- package/scripts/backlog/backlog-overlap.ts +42 -8
- package/scripts/backlog/backlog-plan-cli.ts +4 -1
- package/scripts/backlog/backlog-plan-comment.ts +81 -0
- package/scripts/backlog/backlog-plan-read.ts +19 -6
- package/scripts/backlog/backlog-pool.ts +50 -12
- package/scripts/backlog/backlog-rank.ts +60 -13
- package/scripts/backlog/backlog-stalled-detect.ts +2 -1
- package/scripts/backlog/backlog-waves.ts +17 -2
- package/scripts/backlog/backlogrun-launch.ts +7 -4
- package/scripts/cost-runtime/context-cut-payback.ts +27 -25
- package/scripts/cost-runtime/cost-cli.ts +37 -16
- package/scripts/cost-runtime/cost-pricing.ts +9 -0
- package/scripts/cost-runtime/cost-verdict.ts +4 -1
- package/scripts/delegation/delegation-policy.ts +2 -2
- package/scripts/delegation/duplicate-read-guard.ts +1 -0
- package/scripts/delegation/investigation-guard.ts +14 -2
- package/scripts/delegation/investigation-reads.ts +45 -23
- package/scripts/dependabot/dependabot-cooldown.ts +3 -2
- package/scripts/discovery/repo-party.ts +80 -20
- package/scripts/discovery/session-owner-pin.ts +51 -0
- package/scripts/document/capped-print.ts +1 -1
- package/scripts/document/command-reference-line-budget.ts +42 -0
- package/scripts/document/document-byte-budget.ts +17 -7
- package/scripts/document/document-checks.ts +20 -0
- package/scripts/document/document-ratchet-check.ts +101 -0
- package/scripts/document/document-section.ts +1 -0
- package/scripts/document/entry-read-budget.ts +7 -3
- package/scripts/document/issue-citation-budget.ts +94 -0
- package/scripts/epic/epic-cli-argv.ts +2 -2
- package/scripts/epic/epic-fetch.ts +4 -2
- package/scripts/epic/epic-graph.ts +7 -2
- package/scripts/epic/epic-issue.ts +3 -1
- package/scripts/epic/epic-rank.ts +5 -0
- package/scripts/exports/unused-members-check.ts +62 -0
- package/scripts/exports/unused-members-cli.ts +6 -51
- package/scripts/followup/followup-ci-path.ts +67 -0
- package/scripts/followup/followup-coderabbit-retrigger.ts +261 -0
- package/scripts/followup/followup-coderabbit-wait.ts +13 -10
- package/scripts/followup/followup-failed-tests.ts +160 -0
- package/scripts/followup/followup-job-needs.ts +100 -0
- package/scripts/followup/followup-job-rerun.ts +303 -0
- package/scripts/followup/followup-main-move.ts +113 -0
- package/scripts/followup/git-followup-finish.ts +43 -11
- package/scripts/followup/git-followup-pending.ts +3 -3
- package/scripts/followup/git-followup-stages.ts +41 -11
- package/scripts/followup/git-pr-followup-checks.ts +55 -16
- package/scripts/followup/git-pr-followup-wrapup.ts +24 -5
- package/scripts/followup/git-pr-followup.ts +62 -27
- package/scripts/fresh-machine/fresh-machine-script.ts +5 -9
- package/scripts/fresh-machine/specs/kit-test-backlogrun-python.json +2 -2
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +2 -2
- package/scripts/gate/busy-average.ts +34 -2
- package/scripts/gate/check-related-pinned.ts +43 -0
- package/scripts/gate/check-related-reuse.ts +64 -0
- package/scripts/gate/check-related-section.ts +57 -0
- package/scripts/gate/check-related-unplanned.ts +34 -0
- package/scripts/gate/check-related.ts +265 -0
- package/scripts/gate/command-memory.ts +1 -1
- package/scripts/gate/core-admission.ts +24 -6
- package/scripts/gate/core-budget-timing.ts +20 -6
- package/scripts/gate/core-budget.ts +40 -11
- package/scripts/gate/core-wait-record.ts +3 -2
- package/scripts/gate/core-wait.ts +25 -2
- package/scripts/gate/core-weights.ts +15 -7
- package/scripts/gate/gate-labels.ts +46 -0
- package/scripts/gate/gate-ledger.ts +14 -6
- package/scripts/gate/gate-plan.ts +103 -58
- package/scripts/gate/gate-report.ts +9 -7
- package/scripts/gate/gate-run-steps.ts +26 -3
- package/scripts/gate/gate-skip.ts +45 -6
- package/scripts/gate/gate-static-group.ts +60 -0
- package/scripts/gate/gate-steps.ts +2 -1
- package/scripts/gate/gate-tree.ts +4 -2
- package/scripts/gate/hook-gate-reuse.ts +19 -2
- package/scripts/gate/metrics-totals.ts +59 -0
- package/scripts/gate/scoped-green.ts +68 -15
- package/scripts/gate/since-green.ts +14 -6
- package/scripts/gate/structural-checks.ts +96 -0
- package/scripts/gate/verification-gate.ts +51 -16
- package/scripts/gate/verification-inputs.ts +21 -6
- package/scripts/gate/verification-tail.ts +52 -0
- package/scripts/gh/gh-author-association.ts +23 -2
- package/scripts/gh/git-ai-review-scan.ts +1 -1
- package/scripts/gh/git-gh-api-path.ts +12 -3
- package/scripts/gh/git-gh-comments-unreadable.ts +36 -0
- package/scripts/gh/git-gh-exec.ts +32 -2
- package/scripts/gh/git-gh-issue-read.ts +4 -2
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +8 -2
- package/scripts/gh/git-gh-issue.ts +12 -5
- package/scripts/gh/git-gh-pr-auto-merge.ts +13 -6
- package/scripts/gh/git-gh-pr-graphql-state.ts +56 -0
- package/scripts/gh/git-gh-pr-read.ts +74 -13
- package/scripts/gh/git-gh-pr-rest.ts +3 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +22 -7
- package/scripts/gh/git-gh-pr-too-large.ts +20 -0
- package/scripts/gh/git-gh-pr.ts +21 -7
- package/scripts/gh/git-gh-retry.ts +141 -0
- package/scripts/gh/git-pr-ai-review.ts +15 -6
- package/scripts/gh/git-pr-checks-eval.ts +3 -0
- package/scripts/gh/git-pr-checks.ts +5 -5
- package/scripts/git/base-tree.ts +30 -0
- package/scripts/git/change-base.ts +4 -10
- package/scripts/git/changed-paths-sync.ts +63 -0
- package/scripts/git/changed-paths.ts +16 -1
- package/scripts/git/git-common-directory.ts +11 -1
- package/scripts/git/git-diff-reads.ts +66 -20
- package/scripts/git/git-error.ts +9 -2
- package/scripts/git/git-schemas.ts +13 -0
- package/scripts/git/git-worktree.ts +13 -0
- package/scripts/git/gone-branch.ts +4 -1
- package/scripts/git/main-merge-budget-conflict.ts +89 -0
- package/scripts/git/main-merge-guard.ts +55 -18
- package/scripts/git/main-merge-regenerate.ts +59 -25
- package/scripts/git/main-merge.ts +53 -5
- package/scripts/git/no-base-checkout.ts +127 -0
- package/scripts/git/stash/git-stash.ts +11 -2
- package/scripts/git/stash/stash-push-cli.ts +10 -0
- package/scripts/hooks/batch-guard.ts +40 -21
- package/scripts/hooks/edited-cspell.ts +37 -11
- package/scripts/hooks/format-edited-file.ts +22 -2
- package/scripts/hooks/lane-plan-guard.ts +50 -0
- package/scripts/hooks/pre-commit-lint-switch.ts +9 -0
- package/scripts/hooks/pre-commit-lint.ts +14 -1
- package/scripts/hooks/pre-push-related-switch.ts +10 -0
- package/scripts/hooks/pre-push-unit.ts +76 -10
- package/scripts/hooks/pretool-guard.ts +2 -0
- package/scripts/hooks/reserved-run.ts +14 -1
- package/scripts/hooks/run-hook.sh +23 -8
- package/scripts/hooks/step-zero-notice.ts +6 -1
- package/scripts/hooks/stop-actions.ts +3 -15
- package/scripts/hooks/stop-guard.ts +7 -6
- package/scripts/init/distributed-paths.ts +1 -0
- package/scripts/init/hook-command-rewrite.ts +5 -1
- package/scripts/init/hook-launch.ts +4 -2
- package/scripts/issue/aggregation-split.ts +52 -0
- package/scripts/issue/defect-origin-line.ts +19 -1
- package/scripts/issue/defect-rate-cli.ts +5 -102
- package/scripts/issue/defect-report.ts +4 -4
- package/scripts/issue/effect-audit-cli.ts +178 -0
- package/scripts/issue/effect-audit.ts +185 -0
- package/scripts/issue/expected-effect-lint.ts +64 -9
- package/scripts/issue/git-next-issues.ts +5 -0
- package/scripts/issue/issue-body-or-comment.ts +38 -4
- package/scripts/issue/issue-cite-cli.ts +1 -3
- package/scripts/issue/issue-classification.ts +1 -0
- package/scripts/issue/issue-closing-pr.ts +8 -1
- package/scripts/issue/issue-evidence-exit.ts +4 -2
- package/scripts/issue/issue-file-cap.ts +58 -0
- package/scripts/issue/issue-file-cli.ts +111 -38
- package/scripts/issue/issue-file-deferral.ts +52 -0
- package/scripts/issue/issue-file-fold.ts +29 -10
- package/scripts/issue/issue-file-interrupt.ts +85 -0
- package/scripts/issue/issue-file-lane-hint.ts +30 -0
- package/scripts/issue/issue-file.ts +43 -6
- package/scripts/issue/issue-labels.ts +19 -2
- package/scripts/issue/issue-lint-cli.ts +27 -2
- package/scripts/issue/issue-measured-cli.ts +13 -35
- package/scripts/issue/issue-measured-close.ts +58 -0
- package/scripts/issue/issue-not-before-label.ts +2 -2
- package/scripts/issue/issue-not-before.ts +4 -1
- package/scripts/issue/issue-priority-cli.ts +60 -0
- package/scripts/issue/issue-priority-raise.ts +55 -0
- package/scripts/issue/issue-priority.ts +174 -43
- package/scripts/issue/issue-rank.ts +21 -4
- package/scripts/issue/issue-read-cli.ts +32 -6
- package/scripts/issue/issue-read.ts +37 -12
- package/scripts/issue/issue-sample-gate.ts +95 -74
- package/scripts/issue/issue-sample-prime.ts +127 -0
- package/scripts/issue/issue-sample-required.ts +57 -0
- package/scripts/issue/issue-sample-source.ts +12 -11
- package/scripts/issue/issue-search.ts +124 -0
- package/scripts/issue/issue-state.ts +13 -1
- package/scripts/issue/issue-template-section.ts +43 -0
- package/scripts/issue/issue-watch-diff.ts +31 -1
- package/scripts/issue/issue-watch-hook.ts +11 -2
- package/scripts/issue/issue-watch.ts +55 -12
- package/scripts/issue/markdown-section.ts +1 -0
- package/scripts/issue/measure-declaration.ts +121 -0
- package/scripts/issue/measure-rerun-cli.ts +7 -70
- package/scripts/issue/plan-consumers-section.ts +22 -1
- package/scripts/issue/reproduction-measure.ts +3 -1
- package/scripts/issue/size-estimate.ts +90 -0
- package/scripts/issue/trusted-measure.ts +84 -0
- package/scripts/josh/command-usage.ts +3 -2
- package/scripts/josh/durable-state-migrate.ts +105 -0
- package/scripts/josh/durable-state.ts +112 -0
- package/scripts/josh/josh-aliases.ts +95 -0
- package/scripts/josh/josh-command-map.ts +1 -82
- package/scripts/josh/josh-commands-agent-hooks.ts +6 -6
- package/scripts/josh/josh-commands-ai.ts +5 -5
- package/scripts/josh/josh-commands-development.ts +59 -58
- package/scripts/josh/josh-commands-issue-write.ts +23 -4
- package/scripts/josh/josh-commands-issue.ts +32 -0
- package/scripts/josh/josh-commands-lane.ts +87 -4
- package/scripts/josh/josh-commands-lint.ts +16 -3
- package/scripts/josh/josh-commands-maintenance.ts +15 -0
- package/scripts/josh/josh-commands-review.ts +41 -6
- package/scripts/josh/josh-commands-ship.ts +56 -8
- package/scripts/josh/josh-commands-test-check.ts +80 -0
- package/scripts/josh/josh-commands-workflow.ts +1 -1
- package/scripts/josh/josh-environment-file.ts +43 -3
- package/scripts/josh/josh-in-process.ts +2 -2
- package/scripts/josh/josh-logic.ts +5 -3
- package/scripts/josh/josh-run.ts +19 -1
- package/scripts/josh/run-record-path.ts +15 -0
- package/scripts/josh/stamp-file.ts +11 -2
- package/scripts/lane/lane-adopt-cli.ts +98 -0
- package/scripts/lane/lane-adopt.ts +208 -0
- package/scripts/lane/lane-await.ts +5 -8
- package/scripts/lane/lane-baseline.ts +123 -0
- package/scripts/lane/lane-breakdown-cli.ts +64 -0
- package/scripts/lane/lane-breakdown-implement.ts +170 -0
- package/scripts/lane/lane-breakdown-laps.ts +107 -0
- package/scripts/lane/lane-breakdown-pinned.ts +76 -0
- package/scripts/lane/lane-breakdown-text.ts +145 -0
- package/scripts/lane/lane-breakdown.ts +239 -0
- package/scripts/lane/lane-check-stats.ts +29 -8
- package/scripts/lane/lane-child-invocation.ts +9 -2
- package/scripts/lane/lane-child-mark-keys.ts +12 -0
- package/scripts/lane/lane-child-marker.ts +20 -1
- package/scripts/lane/lane-ci-path-stats.ts +73 -0
- package/scripts/lane/lane-claim-stats.ts +84 -0
- package/scripts/lane/lane-close.ts +8 -3
- package/scripts/lane/lane-dispatch-log.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +2 -2
- package/scripts/lane/lane-gap-stats.ts +7 -6
- package/scripts/lane/lane-guard-policy.ts +7 -1
- package/scripts/lane/lane-implement-stats.ts +207 -0
- package/scripts/lane/lane-implement-subagents.ts +90 -0
- package/scripts/lane/lane-investigation-switch.ts +16 -0
- package/scripts/lane/lane-ledger-kind.ts +31 -0
- package/scripts/lane/lane-ledger-schema-ship.ts +49 -0
- package/scripts/lane/lane-ledger-schema.ts +119 -36
- package/scripts/lane/lane-ledger-write.ts +257 -0
- package/scripts/lane/lane-ledger.ts +31 -177
- package/scripts/lane/lane-load.ts +1 -1
- package/scripts/lane/lane-measure-cli.ts +176 -59
- package/scripts/lane/lane-net-read.ts +44 -0
- package/scripts/lane/lane-net-time.ts +212 -0
- package/scripts/lane/lane-open.ts +16 -7
- package/scripts/lane/lane-output.ts +2 -4
- package/scripts/lane/lane-overrun-prompt.ts +147 -0
- package/scripts/lane/lane-overrun.ts +274 -0
- package/scripts/lane/lane-paths.ts +24 -1
- package/scripts/lane/lane-pause-cli.ts +4 -1
- package/scripts/lane/lane-paused-spans.ts +97 -0
- package/scripts/lane/lane-plan-check.ts +207 -0
- package/scripts/lane/lane-plan-cli.ts +41 -0
- package/scripts/lane/lane-plan.ts +144 -0
- package/scripts/lane/lane-registry.ts +14 -1
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-round-one-stats.ts +51 -0
- package/scripts/lane/lane-sampler.ts +23 -4
- package/scripts/lane/lane-session-action.ts +93 -18
- package/scripts/lane/lane-session-broker.ts +49 -21
- package/scripts/lane/lane-session-reread-main.ts +14 -0
- package/scripts/lane/lane-session-reread.ts +51 -0
- package/scripts/lane/lane-ship-lap-stats.ts +74 -0
- package/scripts/lane/lane-sleep.ts +58 -0
- package/scripts/lane/lane-spent.ts +1 -1
- package/scripts/lane/lane-split-stats.ts +28 -0
- package/scripts/lane/lane-stage-stats.ts +13 -1
- package/scripts/lane/lane-state.ts +41 -9
- package/scripts/lane/lane-stats-tables.ts +58 -0
- package/scripts/lane/lane-stats.ts +21 -5
- package/scripts/lane/lane-stop-stats.ts +51 -19
- package/scripts/lane/lane-tail-stats.ts +32 -0
- package/scripts/lane/lane-transcript-calls.ts +67 -10
- package/scripts/lane/lane-transcript-stats.ts +44 -12
- package/scripts/lane/lane-value-cell.ts +72 -0
- package/scripts/lane/lane-value.ts +118 -0
- package/scripts/lane/lane-withdraw-closed.ts +124 -0
- package/scripts/lane/lane-withdraw.ts +108 -31
- package/scripts/lane/lane-yield.ts +85 -0
- package/scripts/lane/openai-lane-ship.ts +12 -11
- package/scripts/lane/openai-lane-supervisor-decision.ts +6 -8
- package/scripts/lane/openai-lane-supervisor-owner.ts +5 -8
- package/scripts/lane/openai-lane-supervisor.ts +5 -4
- package/scripts/lib/poll.ts +38 -9
- package/scripts/lib/settled-together.ts +10 -0
- package/scripts/lib/shell-quote.ts +21 -0
- package/scripts/lib/token-shape.ts +111 -0
- package/scripts/lint/eslint-daemon-sources.ts +79 -0
- package/scripts/lint/eslint-daemon.ts +45 -6
- package/scripts/lint/eslint-warm-cli.ts +7 -0
- package/scripts/lint/eslint-warm.ts +66 -0
- package/scripts/lint/import-graph.ts +141 -11
- package/scripts/lint/lint-gate-scope.ts +2 -2
- package/scripts/lint/lint-parallel.ts +54 -6
- package/scripts/lint/lint-related.ts +154 -33
- package/scripts/lint/rename-cli.ts +179 -0
- package/scripts/lint/rename-identifier.ts +192 -0
- package/scripts/lint/type-only-imports.ts +58 -0
- package/scripts/notify/telegram-notify.ts +12 -3
- package/scripts/observations/observation-record.ts +42 -16
- package/scripts/observations/observations-flush.ts +32 -9
- package/scripts/overrides/overrides-check.ts +9 -1
- package/scripts/release/release-approval-prune.ts +7 -1
- package/scripts/repo/required-checks-logic.ts +4 -1
- package/scripts/repo/ruleset-check.ts +4 -3
- package/scripts/report/markdown-shape.ts +28 -0
- package/scripts/report/report-format-reference.ts +15 -1
- package/scripts/report/report-labels.ts +12 -1
- package/scripts/report/report-lint-child-summary.ts +94 -0
- package/scripts/report/report-lint-cli.ts +26 -7
- package/scripts/report/report-lint.ts +2 -20
- package/scripts/review/prose-stale-cli.ts +88 -0
- package/scripts/review/prose-stale-scan.ts +152 -0
- package/scripts/review/review-attest.ts +73 -23
- package/scripts/review/review-brief-cli.ts +68 -19
- package/scripts/review/review-brief-paths.ts +22 -0
- package/scripts/review/review-brief.ts +14 -7
- package/scripts/review/review-comment-carry.ts +47 -0
- package/scripts/review/review-comment-round.ts +85 -22
- package/scripts/review/review-finding-ledger.ts +109 -7
- package/scripts/review/review-finding-text.ts +43 -0
- package/scripts/review/review-interaction.ts +11 -0
- package/scripts/review/review-lane-handover.ts +68 -0
- package/scripts/review/review-lint-cli.ts +57 -0
- package/scripts/review/review-lint-findings.ts +92 -0
- package/scripts/review/review-lint-sections.ts +80 -0
- package/scripts/review/review-lint.ts +221 -0
- package/scripts/review/review-prior-findings.ts +102 -0
- package/scripts/review/review-readers-scan.ts +4 -2
- package/scripts/review/review-record-cli.ts +177 -54
- package/scripts/review/review-record-code-round.ts +55 -0
- package/scripts/review/review-record-comment.ts +60 -0
- package/scripts/review/review-record-interaction.ts +35 -0
- package/scripts/review/review-record-pinned.ts +108 -0
- package/scripts/review/review-record.ts +25 -1
- package/scripts/review/review-reviewed-tree.ts +307 -0
- package/scripts/review/review-round-one-closure.ts +62 -0
- package/scripts/review/review-round-reuse.ts +106 -0
- package/scripts/review/review-round2-cli.ts +91 -29
- package/scripts/review/review-round2-skip-comment.ts +55 -0
- package/scripts/review/review-round2.ts +24 -8
- package/scripts/review/review-stamps.ts +7 -3
- package/scripts/review/review-stop-log.ts +20 -6
- package/scripts/review/review-stops-cli.ts +2 -1
- package/scripts/review/review-submit-cli.ts +101 -0
- package/scripts/rules/agent-model.ts +1 -1
- package/scripts/rules/bash-triggers.ts +3 -3
- package/scripts/rules/concise-reply.ts +88 -0
- package/scripts/rules/credential-body.ts +77 -0
- package/scripts/rules/decision-oracle.ts +1 -1
- package/scripts/rules/delivered-rules.ts +36 -17
- package/scripts/rules/destructive-command.ts +3 -11
- package/scripts/rules/direct-issue-comment.ts +34 -12
- package/scripts/rules/direct-issue-read.ts +191 -0
- package/scripts/rules/direct-pr-create.ts +4 -24
- package/scripts/rules/early-heartbeat.ts +2 -0
- package/scripts/rules/edit-tool.ts +27 -0
- package/scripts/rules/file-edit-rows.ts +17 -0
- package/scripts/rules/file-rewrite.ts +146 -0
- package/scripts/rules/firing-point.ts +3 -2
- package/scripts/rules/gh-api.ts +128 -7
- package/scripts/rules/gh-repo-selector.ts +84 -0
- package/scripts/rules/git-force.ts +2 -2
- package/scripts/rules/guard-remedy.ts +14 -5
- package/scripts/rules/implementation-cut.ts +61 -28
- package/scripts/rules/investigator-foreground.ts +231 -0
- package/scripts/rules/issue-citation.ts +15 -60
- package/scripts/rules/issue-comments.ts +9 -4
- package/scripts/rules/josh-git-bare.ts +1 -1
- package/scripts/rules/lane-background.ts +41 -13
- package/scripts/rules/lane-direct-tool.ts +107 -9
- package/scripts/rules/lane-interactive-ask.ts +4 -1
- package/scripts/rules/lane-park.ts +4 -2
- package/scripts/rules/lane-spilled-read.ts +90 -0
- package/scripts/rules/lane-split-park.ts +1 -1
- package/scripts/rules/lane-switch-main.ts +4 -4
- package/scripts/rules/last-prompt.ts +20 -47
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/permission-guards.ts +5 -1
- package/scripts/rules/piped-verification-shapes.ts +110 -0
- package/scripts/rules/piped-verification.ts +67 -17
- package/scripts/rules/poll-loop.ts +72 -9
- package/scripts/rules/pr-merge.ts +5 -5
- package/scripts/rules/pre-gate-cut.ts +3 -3
- package/scripts/rules/protected-files.ts +88 -24
- package/scripts/rules/reply-language.ts +3 -17
- package/scripts/rules/reply-prose.ts +34 -0
- package/scripts/rules/repo-admin.ts +132 -0
- package/scripts/rules/reviewer-foreground.ts +88 -0
- package/scripts/rules/round-one-check-related.ts +120 -0
- package/scripts/rules/rule-body-guard.ts +5 -15
- package/scripts/rules/rule-value-cache.ts +53 -5
- package/scripts/rules/rule-value-candidates.ts +84 -0
- package/scripts/rules/rule-value-cli.ts +59 -11
- package/scripts/rules/rule-value.ts +17 -4
- package/scripts/rules/run-tail-rule.ts +1 -1
- package/scripts/rules/sed-in-place.ts +196 -0
- package/scripts/rules/shell-segments.ts +10 -2
- package/scripts/rules/stop-rule-rows.ts +1 -13
- package/scripts/rules/stop-rules.ts +33 -58
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +110 -23
- package/scripts/rules/timed-rerun.ts +1 -1
- package/scripts/rules/turn-filings.ts +90 -0
- package/scripts/rules/worktree-guard.ts +22 -7
- package/scripts/run/board/run-board-ending-reason.ts +6 -2
- package/scripts/run/board/run-board-fit.ts +24 -1
- package/scripts/run/board/run-board-found.ts +134 -0
- package/scripts/run/board/run-board-header.ts +8 -0
- package/scripts/run/board/run-board-labels.ts +11 -1
- package/scripts/run/board/run-board-lane-time.ts +1 -0
- package/scripts/run/board/run-board-link.ts +15 -2
- package/scripts/run/board/run-board-notes.ts +7 -1
- package/scripts/run/board/run-board-operation.ts +4 -2
- package/scripts/run/board/run-board-phase.ts +2 -5
- package/scripts/run/board/run-board-plan.ts +1 -1
- package/scripts/run/board/run-board-read.ts +46 -1
- package/scripts/run/board/run-board-reason.ts +20 -8
- package/scripts/run/board/run-board-render-checks.ts +3 -2
- package/scripts/run/board/run-board-render-drawn.ts +11 -0
- package/scripts/run/board/run-board-render-found.ts +157 -0
- package/scripts/run/board/run-board-render-lead.ts +9 -0
- package/scripts/run/board/run-board-render-legend.ts +19 -0
- package/scripts/run/board/run-board-render-tail.ts +1 -1
- package/scripts/run/board/run-board-render.ts +82 -18
- package/scripts/run/board/run-board-spin.ts +1 -3
- package/scripts/run/board/run-board-status.ts +2 -0
- package/scripts/run/board/run-board-tick.ts +39 -10
- package/scripts/run/carry/run-carry-ended.ts +3 -2
- package/scripts/run/carry/run-carry.ts +3 -2
- package/scripts/run/cut/run-cut-cli.ts +33 -133
- package/scripts/run/cut/run-cut-digest.ts +152 -0
- package/scripts/run/cut/run-cut-handoff.ts +52 -8
- package/scripts/run/cut/run-cut-report.ts +24 -3
- package/scripts/run/cut/run-cut-resume.ts +129 -0
- package/scripts/run/cut/run-cut-review.ts +105 -0
- package/scripts/run/cut/run-cut.ts +18 -7
- package/scripts/run/detached-launch.ts +1 -1
- package/scripts/run/entry/run-entry-cli.ts +88 -19
- package/scripts/run/entry/run-entry-spill.ts +83 -0
- package/scripts/run/entry/run-entry-stop.ts +5 -1
- package/scripts/run/entry/run-entry-trust.ts +91 -0
- package/scripts/run/event/run-event-baseline.ts +56 -0
- package/scripts/run/event/run-event-filed.ts +9 -3
- package/scripts/run/event/run-event-overrun.ts +197 -0
- package/scripts/run/event/run-event-render.ts +4 -0
- package/scripts/run/event/run-event-stream.ts +25 -3
- package/scripts/run/hold/run-stop-notify.ts +3 -8
- package/scripts/run/merge/run-merge-cap.ts +57 -0
- package/scripts/run/merge/run-merge-cli.ts +66 -23
- package/scripts/run/merge/run-merge-outcome.ts +2 -0
- package/scripts/run/merge/run-merge-ship.ts +13 -3
- package/scripts/run/merge/run-merge-signals.ts +40 -23
- package/scripts/run/merge/run-merge-steps.ts +56 -36
- package/scripts/run/merge/run-merge-usage-limit.ts +53 -0
- package/scripts/run/merge/run-merge-withdrawn.ts +53 -0
- package/scripts/run/merge/run-merge.ts +41 -14
- package/scripts/run/review/run-review-cli.ts +306 -20
- package/scripts/run/review/run-review-early-push.ts +121 -0
- package/scripts/run/review/run-review-join-read.ts +94 -0
- package/scripts/run/review/run-review-pinned-accepted.ts +126 -0
- package/scripts/run/review/run-review-pinned-join.ts +216 -0
- package/scripts/run/review/run-review-pinned-steps.ts +383 -0
- package/scripts/run/review/run-review-pinned-tree.ts +37 -0
- package/scripts/run/review/run-review-pinned.ts +53 -0
- package/scripts/run/review/run-review-steps.ts +70 -34
- package/scripts/run/review/run-review.ts +26 -6
- package/scripts/run/run-parent-cut-hook.ts +3 -4
- package/scripts/run/run-prep.ts +1 -0
- package/scripts/run/run-stage-read.ts +2 -6
- package/scripts/run/run-step-cli.ts +17 -5
- package/scripts/run/run-step-lane-plan.ts +27 -0
- package/scripts/run/run-step-section.ts +26 -7
- package/scripts/run/run-step.ts +5 -2
- package/scripts/run/ship/run-ship-args.ts +19 -0
- package/scripts/run/ship/run-ship-brokered-review.ts +106 -0
- package/scripts/run/ship/run-ship-cli.ts +131 -39
- package/scripts/run/ship/run-ship-conflict-probe.ts +59 -0
- package/scripts/run/ship/run-ship-detach.ts +10 -4
- package/scripts/run/ship/run-ship-handover.ts +106 -0
- package/scripts/run/ship/run-ship-infra-retry.ts +16 -1
- package/scripts/run/ship/run-ship-lap.ts +63 -0
- package/scripts/run/ship/run-ship-next.ts +27 -26
- package/scripts/run/ship/run-ship-overlap.ts +8 -3
- package/scripts/run/ship/run-ship-place.ts +9 -2
- package/scripts/run/ship/run-ship-planned.ts +92 -0
- package/scripts/run/ship/run-ship-pre-detach-pinned.ts +197 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +7 -8
- package/scripts/run/ship/run-ship-pre-detach.ts +77 -23
- package/scripts/run/ship/run-ship-preflight.ts +16 -4
- package/scripts/run/ship/run-ship-probe.ts +23 -9
- package/scripts/run/ship/run-ship-relaunch-cap.ts +43 -7
- package/scripts/run/ship/run-ship-relaunch.ts +51 -0
- package/scripts/run/ship/run-ship-return.ts +103 -29
- package/scripts/run/ship/run-ship-review-reason.ts +24 -0
- package/scripts/run/ship/run-ship-review-steps.ts +230 -59
- package/scripts/run/ship/run-ship-review.ts +171 -51
- package/scripts/run/ship/run-ship-reviewer.ts +138 -42
- package/scripts/run/ship/run-ship-scoped.ts +39 -10
- package/scripts/run/ship/run-ship-stage.ts +49 -13
- package/scripts/run/ship/run-ship-steps.ts +24 -4
- package/scripts/run/ship/run-ship-stop-cause.ts +43 -2
- package/scripts/run/ship/run-ship-stop-context.ts +50 -13
- package/scripts/run/ship/run-ship-sync.ts +171 -30
- package/scripts/run/ship/run-ship-synced-scope.ts +178 -0
- package/scripts/run/ship/run-ship-wait-cli.ts +145 -0
- package/scripts/run/ship/run-ship-waiter.ts +114 -0
- package/scripts/run/ship/run-ship.ts +16 -2
- package/scripts/run/wake/run-wake-caffeinate.ts +48 -0
- package/scripts/run/wake/run-wake-cli.ts +6 -113
- package/scripts/run/wake/run-wake-code.ts +53 -11
- package/scripts/run/wake/run-wake-driver.ts +5 -3
- package/scripts/run/wake/run-wake-finish.ts +137 -0
- package/scripts/run/wake/run-wake-loop.ts +5 -3
- package/scripts/run/wake/run-wake-ports.ts +11 -3
- package/scripts/run/wake/run-wake-session.ts +2 -0
- package/scripts/run/wake/run-wake.ts +3 -2
- package/scripts/safe-chain/ci-installer-pin.ts +49 -8
- package/scripts/safe-chain/project-config.ts +3 -2
- package/scripts/security/secretlint-scan.ts +42 -9
- package/scripts/security/security-audit-provision-main.ts +9 -1
- package/scripts/security/security-audit-provision.ts +1 -1
- package/scripts/security/security-audit.ts +21 -1
- package/scripts/security/sonar-file.ts +10 -5
- package/scripts/split/split-assess.ts +12 -3
- package/scripts/split/split-early-notice.ts +116 -0
- package/scripts/split/split-measure.ts +20 -2
- package/scripts/split/split-resolution.ts +107 -0
- package/scripts/test/direct-importers.ts +185 -0
- package/scripts/test/pure-files-entries.ts +83 -0
- package/scripts/test/related-heavy-tests.ts +81 -0
- package/scripts/test/test-no-base.ts +88 -0
- package/scripts/test/test-pinned-cache-logic.ts +363 -0
- package/scripts/test/test-pinned-cache.ts +337 -0
- package/scripts/test/test-pinned-emit.ts +49 -0
- package/scripts/test/test-pinned-functions.ts +116 -0
- package/scripts/test/test-pinned-ledger.ts +80 -0
- package/scripts/test/test-pinned-logic.ts +208 -20
- package/scripts/test/test-pinned-main.ts +84 -18
- package/scripts/test/test-pinned-pool.ts +73 -0
- package/scripts/test/test-pinned-probe.ts +254 -0
- package/scripts/test/test-pinned-prune-logic.ts +118 -0
- package/scripts/test/test-pinned-reach.ts +194 -0
- package/scripts/test/test-pinned-record.ts +196 -0
- package/scripts/test/test-pinned-rewire.ts +148 -0
- package/scripts/test/test-pinned-spawn.ts +81 -0
- package/scripts/test/test-pinned-stage.ts +70 -0
- package/scripts/test/test-pinned.ts +258 -47
- package/scripts/test/test-reach-cli.ts +61 -0
- package/scripts/test/test-read-map.ts +35 -11
- package/scripts/test/test-read-recording.ts +17 -5
- package/scripts/test/test-read-trace.ts +26 -8
- package/scripts/test/test-red-logic.ts +46 -7
- package/scripts/test/test-red.ts +34 -14
- package/scripts/test/test-related-claim.ts +37 -0
- package/scripts/test/test-related-main.ts +4 -1
- package/scripts/test/test-related-moved.ts +91 -0
- package/scripts/test/test-related-record.ts +43 -23
- package/scripts/test/test-related-scope.ts +99 -34
- package/scripts/test/test-related-synced.ts +135 -0
- package/scripts/test/test-related-touched.ts +84 -0
- package/scripts/test/test-related.ts +167 -83
- package/scripts/test/test-unit-guard.ts +28 -5
- package/scripts/test/unit-durations.ts +41 -0
- package/scripts/test/unit-worker-share.ts +5 -4
- package/scripts/test/vitest-cache-directory.ts +19 -0
- package/scripts/test/vitest-cli-excludes.ts +14 -0
- package/scripts/test/vitest-failure-summary.ts +111 -0
- package/scripts/test/whole-suite-files.ts +12 -1
- package/scripts/time-runtime/time-batch-guard.ts +42 -4
- package/scripts/time-runtime/time-bundle-call.ts +1 -1
- package/scripts/time-runtime/time-bundles.ts +36 -5
- package/scripts/time-runtime/time-markers.ts +2 -2
- package/scripts/time-runtime/time-search-call.ts +38 -0
- package/scripts/time-runtime/time-shell.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +17 -5
- package/scripts/version/development-engines-verdict.ts +124 -0
- package/scripts/version/latest-corepack.ts +2 -0
- package/templates/gitignore +2 -0
- package/templates/workflows/ci.yml +41 -0
- package/dist/hooks/chunk-AZX4FGQ3.js +0 -207
- package/dist/hooks/chunk-PT5R6UJD.js +0 -7131
- package/dist/hooks/chunk-TUIFS5E7.js +0 -72
- package/dist/hooks/chunk-YCDOIR3I.js +0 -3456
- package/scripts/cost-runtime/context-cut-threshold.ts +0 -11
- package/scripts/rules/filing-cap.ts +0 -139
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process'
|
|
2
|
+
import { gh_author_association } from '#scripts/gh/gh-author-association'
|
|
3
|
+
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
4
|
+
import { parse_json_object_or_undefined } from '#scripts/git/parse-json-array'
|
|
5
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
6
|
+
import { z } from 'zod'
|
|
7
|
+
import { session_cite } from './session-cite'
|
|
8
|
+
|
|
9
|
+
// Running a command an Issue body names — `josh measure:rerun`'s baselines and the drive's measurement
|
|
10
|
+
// declaration (`measure-declaration.ts`) alike.
|
|
11
|
+
//
|
|
12
|
+
// **The command is shell, and the body is written by whoever filed the Issue**.
|
|
13
|
+
// A baseline needs pipes and loops (`git log … | wc -l`, `for d in $(ls …)`), so an allow-list of
|
|
14
|
+
// commands cannot make it safe; what can is who wrote it. The input is therefore the Issue number, not
|
|
15
|
+
// a file, so the author's `author_association` arrives with the body from the same REST read, and only
|
|
16
|
+
// a body written by someone with write access to the repository is run.
|
|
17
|
+
|
|
18
|
+
const ISSUE_FIELDS = `body,${gh_author_association.AUTHOR_FIELDS}`
|
|
19
|
+
const UNKNOWN_ASSOCIATION = 'unknown'
|
|
20
|
+
// One command's budget — the same minute `josh-harness.ts` gives one command it spawns. A measurement
|
|
21
|
+
// is a count or a digest that answers in seconds, so a command still running after a minute is stuck,
|
|
22
|
+
// and without a bound it would hold the whole re-measurement open with nothing printed.
|
|
23
|
+
const MEASURE_TIMEOUT_MS = 60_000
|
|
24
|
+
const issue_schema = z.object({
|
|
25
|
+
body: z.string().nullish(),
|
|
26
|
+
...gh_author_association.author_fields_schema,
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
type IssueFields = z.infer<typeof issue_schema>
|
|
30
|
+
type BodyRead = { kind: 'trusted'; body: string } | { kind: 'refused'; reason: string }
|
|
31
|
+
type CommandRun = { kind: 'ok'; output: string } | { kind: 'failed'; message: string }
|
|
32
|
+
|
|
33
|
+
// The command's stdout, trimmed, or the message a failing or timed-out command threw.
|
|
34
|
+
function run_command(command: string): CommandRun {
|
|
35
|
+
try {
|
|
36
|
+
return {
|
|
37
|
+
kind: 'ok',
|
|
38
|
+
output: execSync(command, { encoding: 'utf8', timeout: MEASURE_TIMEOUT_MS }).trim(),
|
|
39
|
+
}
|
|
40
|
+
} catch (error) {
|
|
41
|
+
return { kind: 'failed', message: error_text.message_of(error) }
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// The run as one printable value: a failure is spelled in place of the output.
|
|
46
|
+
function text_of(run: CommandRun): string {
|
|
47
|
+
return run.kind === 'ok' ? run.output : `(command failed: ${run.message})`
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function read_issue(issue_number: string): Promise<IssueFields | undefined> {
|
|
51
|
+
const json = await git_gh_issue_read.issue_view_json(issue_number, ISSUE_FIELDS)
|
|
52
|
+
|
|
53
|
+
return json === undefined ? undefined : parse_json_object_or_undefined(json, issue_schema)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function untrusted(issue_number: string, issue: IssueFields): BodyRead {
|
|
57
|
+
const association = issue.author_association ?? UNKNOWN_ASSOCIATION
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
kind: 'refused',
|
|
61
|
+
reason: `refusing to run the baseline of ${session_cite.issue(issue_number)}: its author (${association}) is not ${gh_author_association.TRUSTED_LIST}`,
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// The body, only when its author can write to the repository. A read that fails is refused as well:
|
|
66
|
+
// an unknown author is not a trusted one.
|
|
67
|
+
async function read_trusted_body(issue_number: string): Promise<BodyRead> {
|
|
68
|
+
const issue = await read_issue(issue_number)
|
|
69
|
+
|
|
70
|
+
if (issue === undefined) {
|
|
71
|
+
return { kind: 'refused', reason: `could not read issue ${session_cite.issue(issue_number)}` }
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (!(await gh_author_association.is_trusted(gh_author_association.author_of(issue)))) {
|
|
75
|
+
return untrusted(issue_number, issue)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return { kind: 'trusted', body: issue.body ?? '' }
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const trusted_measure = { read_trusted_body, run_command, text_of }
|
|
82
|
+
|
|
83
|
+
export type { BodyRead, CommandRun }
|
|
84
|
+
export { trusted_measure }
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { canonical_command
|
|
1
|
+
import { canonical_command } from './josh-aliases'
|
|
2
|
+
import { COMMAND_MAP } from './josh-command-map'
|
|
2
3
|
import type { CommandUsage } from './josh-command-types'
|
|
3
4
|
|
|
4
5
|
// The single renderer of a command's usage. `josh help <command>` prints it and
|
|
5
|
-
// `
|
|
6
|
+
// `josh command:derive` writes it between a reference page's usage markers,
|
|
6
7
|
// so the terminal and the page are one text (#3932). The usage itself sits on each command's entry
|
|
7
8
|
// (#4185); which page renders it is the page's own `<!-- usage: <command> -->` span.
|
|
8
9
|
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { constants, copyFileSync, lstatSync, readdirSync, rmSync, writeFileSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
4
|
+
|
|
5
|
+
// The two upkeep jobs of the durable run-state directory (`durable-state.ts`), each run at most once
|
|
6
|
+
// per process per directory rather than on every record lookup.
|
|
7
|
+
//
|
|
8
|
+
// **A legacy record is copied once per directory.** A run that is going when
|
|
9
|
+
// this lands wrote its records to `/tmp`, and reading only the new place would end it as a reboot
|
|
10
|
+
// did. Copying on every lookup instead brought back a record a run removed on purpose — an ended
|
|
11
|
+
// carry, a stopped launch, a failed ship's result — from the `/tmp` original. The original is left
|
|
12
|
+
// in place: a lane or parent still on the code before this change reads `/tmp` until it merges main.
|
|
13
|
+
// A copy rather than a rename because `/tmp` is often another filesystem. A record an old-code
|
|
14
|
+
// process writes to `/tmp` after the copy is not picked up.
|
|
15
|
+
//
|
|
16
|
+
// **A log not written for two weeks is removed.** `/tmp` used to clear them on every boot; the common
|
|
17
|
+
// git directory never does, and a log is the only record here that grows without an owner ending it.
|
|
18
|
+
|
|
19
|
+
const COPIED_MARKER = '.legacy-copied'
|
|
20
|
+
const MARKER_MODE = 0o600
|
|
21
|
+
const LOG_RETENTION_DAYS = 14
|
|
22
|
+
const DAY_MS = 86_400_000
|
|
23
|
+
const LOG_SUFFIX = '.log'
|
|
24
|
+
// What a record is. A lock or a staged write beside a record carries its prefix but means nothing
|
|
25
|
+
// past the process that made it.
|
|
26
|
+
const RECORD_SUFFIXES = ['.json', '.jsonl', LOG_SUFFIX] as const
|
|
27
|
+
|
|
28
|
+
function is_record_name(name: string, prefixes: ReadonlyArray<string>): boolean {
|
|
29
|
+
const has_prefix = prefixes.some((prefix) => name.startsWith(prefix))
|
|
30
|
+
|
|
31
|
+
return has_prefix && RECORD_SUFFIXES.some((suffix) => name.endsWith(suffix))
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function list_names(directory: string): Array<string> {
|
|
35
|
+
try {
|
|
36
|
+
return readdirSync(directory)
|
|
37
|
+
} catch {
|
|
38
|
+
return []
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function copy_record(from: string, to: string): void {
|
|
43
|
+
try {
|
|
44
|
+
if (!stamp_file.is_own_regular_file(from)) return
|
|
45
|
+
|
|
46
|
+
copyFileSync(from, to, constants.COPYFILE_EXCL)
|
|
47
|
+
} catch {
|
|
48
|
+
// Another process wrote it first, or the copy failed; either way nothing is overwritten.
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function copy_legacy(from: string, to: string, prefixes: ReadonlyArray<string>): void {
|
|
53
|
+
if (from === to) return
|
|
54
|
+
|
|
55
|
+
for (const name of list_names(from)) {
|
|
56
|
+
if (is_record_name(name, prefixes)) copy_record(path.join(from, name), path.join(to, name))
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// The marker is created exclusively, so one process wins the copy. A marker rather than whether
|
|
61
|
+
// `mkdirSync` made the directory: a lane on this code can create the shared directory before the run
|
|
62
|
+
// that owns the `/tmp` records switches over, and that run still needs its copy.
|
|
63
|
+
function claim_copy(directory: string): boolean {
|
|
64
|
+
try {
|
|
65
|
+
writeFileSync(path.join(directory, COPIED_MARKER), '', { flag: 'wx', mode: MARKER_MODE })
|
|
66
|
+
|
|
67
|
+
return true
|
|
68
|
+
} catch {
|
|
69
|
+
return false
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function copy_once(from: string, to: string, prefixes: ReadonlyArray<string>): void {
|
|
74
|
+
if (claim_copy(to)) copy_legacy(from, to, prefixes)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function is_stale(target: string, now_ms: number): boolean {
|
|
78
|
+
const age_ms = now_ms - lstatSync(target).mtimeMs
|
|
79
|
+
|
|
80
|
+
return age_ms > LOG_RETENTION_DAYS * DAY_MS && stamp_file.is_own_regular_file(target)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function prune_log(target: string, now_ms: number): void {
|
|
84
|
+
try {
|
|
85
|
+
if (is_stale(target, now_ms)) rmSync(target, { force: true })
|
|
86
|
+
} catch {
|
|
87
|
+
// Gone already, or not ours to remove.
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function prune_stale_logs(
|
|
92
|
+
directory: string,
|
|
93
|
+
prefixes: ReadonlyArray<string>,
|
|
94
|
+
now_ms: number,
|
|
95
|
+
): void {
|
|
96
|
+
for (const name of list_names(directory)) {
|
|
97
|
+
if (name.endsWith(LOG_SUFFIX) && is_record_name(name, prefixes)) {
|
|
98
|
+
prune_log(path.join(directory, name), now_ms)
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const durable_state_migrate = { LOG_RETENTION_DAYS, copy_once, is_record_name, prune_stale_logs }
|
|
104
|
+
|
|
105
|
+
export { durable_state_migrate }
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { mkdirSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
4
|
+
import { durable_state_migrate } from '#scripts/josh/durable-state-migrate'
|
|
5
|
+
import { PLATFORM_TEMP_ROOT, platform_temporary } from '#scripts/josh/platform-temporary'
|
|
6
|
+
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
7
|
+
|
|
8
|
+
// **Which record goes where — the one place this is decided.** A record a run has to read again after
|
|
9
|
+
// the machine restarts lives here, in the common git directory: the carry and ended records, the event
|
|
10
|
+
// stream, the lane state and ledger, the wake log, the backlogrun launch record and log, the detached
|
|
11
|
+
// ship's log and result, and a lane child's dispatch log. macOS empties `/tmp` on every boot, and losing them
|
|
12
|
+
// there left the open lanes stateless, the merge statistics empty and a parked ship's failure
|
|
13
|
+
// unreadable. Everything that means nothing past the process that wrote it — a lock, a pid, a socket,
|
|
14
|
+
// a per-process cache — stays in `PLATFORM_TEMP_ROOT`, where a reboot clearing it is the right answer.
|
|
15
|
+
//
|
|
16
|
+
// **The common git directory rather than the home directory**, because a Codex lane's sandbox reads
|
|
17
|
+
// `$HOME` but may write the common git directory (`codex-agent-argv.ts`), and every lane of one
|
|
18
|
+
// repository shares it. A repository's own clone is also where `review-stops.jsonl` already lives.
|
|
19
|
+
// Outside a repository there is no such directory, and the record falls back to the temp root.
|
|
20
|
+
//
|
|
21
|
+
// **Records a run left in `/tmp` are copied in once per directory, and a log not written for two
|
|
22
|
+
// weeks is removed** (`durable-state-migrate.ts`).
|
|
23
|
+
//
|
|
24
|
+
// **`JOSH_TEMP_ROOT` moves this root too**, into a directory of its own beneath the override, so the unit
|
|
25
|
+
// suite's network guard keeps every record of a test run out of the live one exactly as before.
|
|
26
|
+
const RUN_STATE_DIRECTORY = 'run-state'
|
|
27
|
+
const OVERRIDE_STATE_DIRECTORY = 'josh-state'
|
|
28
|
+
const STATE_DIRECTORY_MODE = 0o700
|
|
29
|
+
|
|
30
|
+
function state_root(override: string | undefined, common: string | undefined): string {
|
|
31
|
+
if (override !== undefined && override !== '') {
|
|
32
|
+
return path.join(override, OVERRIDE_STATE_DIRECTORY)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (common === undefined) return PLATFORM_TEMP_ROOT
|
|
36
|
+
|
|
37
|
+
return path.join(common, git_common_directory.STATE_DIRECTORY, RUN_STATE_DIRECTORY)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Read once at import, as `PLATFORM_TEMP_ROOT` is, so both roots answer for the same override.
|
|
41
|
+
const STATE_ROOT_OVERRIDE = process.env[platform_temporary.TEMP_ROOT_KEY]
|
|
42
|
+
|
|
43
|
+
// The root for a named common git directory — what a launcher grants a sandboxed child before it runs.
|
|
44
|
+
function root_for(common: string | undefined): string {
|
|
45
|
+
return state_root(STATE_ROOT_OVERRIDE, common)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function root(): string {
|
|
49
|
+
return root_for(git_common_directory.repository())
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Every record kept here, by the prefix of its file name — the list the one-time copy from `/tmp`
|
|
53
|
+
// walks, so a record added here is carried over with the rest.
|
|
54
|
+
const PREFIX = {
|
|
55
|
+
CARRY: 'josh-run-carry-',
|
|
56
|
+
ENDED: 'josh-run-ended-',
|
|
57
|
+
EVENTS: 'josh-run-events-',
|
|
58
|
+
LANE_STATE: 'josh-lane-state-',
|
|
59
|
+
LANE_LEDGER: 'josh-lane-ledger-',
|
|
60
|
+
WAKE_LOG: 'josh-run-wake-log-',
|
|
61
|
+
BACKLOGRUN_LAUNCH: 'josh-backlogrun-launch-',
|
|
62
|
+
BACKLOGRUN_LOG: 'josh-backlogrun-log-',
|
|
63
|
+
SHIP_LOG: 'josh-ship-log-',
|
|
64
|
+
SHIP_RESULT: 'josh-ship-result-',
|
|
65
|
+
LANE_DISPATCH: 'josh-lane-dispatch-',
|
|
66
|
+
LANE_PLAN: 'josh-lane-plan-',
|
|
67
|
+
} as const
|
|
68
|
+
|
|
69
|
+
const PREFIXES: ReadonlyArray<string> = Object.values(PREFIX)
|
|
70
|
+
|
|
71
|
+
// Directories this process has already made ready, so the upkeep runs once rather than per lookup.
|
|
72
|
+
const ensured = new Set<string>()
|
|
73
|
+
|
|
74
|
+
function prepare(directory: string): void {
|
|
75
|
+
mkdirSync(directory, { recursive: true, mode: STATE_DIRECTORY_MODE })
|
|
76
|
+
durable_state_migrate.copy_once(PLATFORM_TEMP_ROOT, directory, PREFIXES)
|
|
77
|
+
durable_state_migrate.prune_stale_logs(directory, PREFIXES, Date.now())
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// **A directory that cannot be created answers the temp root rather than throwing** — a sandbox that
|
|
81
|
+
// may not write the common git directory still runs, with the records `/tmp` always held.
|
|
82
|
+
function ensure(directory: string): string {
|
|
83
|
+
if (ensured.has(directory)) return directory
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
prepare(directory)
|
|
87
|
+
} catch {
|
|
88
|
+
return PLATFORM_TEMP_ROOT
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
ensured.add(directory)
|
|
92
|
+
|
|
93
|
+
return directory
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// The durable counterpart of `stamp_file.stamp_path`: the same per-account, per-key file name, in the
|
|
97
|
+
// directory above. The directory is created on the way, private to the account.
|
|
98
|
+
function durable_path(prefix: string, key_root: string, suffix?: string): string {
|
|
99
|
+
return path.join(ensure(root()), stamp_file.stamp_name(prefix, key_root, suffix))
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const durable_state = {
|
|
103
|
+
PREFIX,
|
|
104
|
+
STATE_DIRECTORY_MODE,
|
|
105
|
+
ensure,
|
|
106
|
+
path: durable_path,
|
|
107
|
+
root,
|
|
108
|
+
root_for,
|
|
109
|
+
state_root,
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export { durable_state }
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// The `josh` subcommand aliases, in a leaf of their own (joshuafolkken/kit#5128).
|
|
2
|
+
//
|
|
3
|
+
// **A reader that only expands an alias imports no command table.** The table (`josh-command-map.ts`)
|
|
4
|
+
// imports every command module, so a module that imported it for `canonical_command` alone — the shell
|
|
5
|
+
// and bundle readers of `josh time` — carried every command module into each test that reached it, and
|
|
6
|
+
// a one-line change to any command table re-ran hundreds of unrelated tests under `josh test:related`.
|
|
7
|
+
|
|
8
|
+
const ALIASES: Record<string, string> = {
|
|
9
|
+
ga: 'gate',
|
|
10
|
+
l: 'lint',
|
|
11
|
+
lr: 'lint:related',
|
|
12
|
+
cr: 'check:related',
|
|
13
|
+
ln: 'lines',
|
|
14
|
+
by: 'bytes',
|
|
15
|
+
mt: 'metrics',
|
|
16
|
+
f: 'format',
|
|
17
|
+
sd: 'cspell:dot',
|
|
18
|
+
bh: 'behavior',
|
|
19
|
+
eu: 'exports:unused',
|
|
20
|
+
t: 'test',
|
|
21
|
+
tu: 'test:unit',
|
|
22
|
+
tr: 'test:related',
|
|
23
|
+
td: 'test:declared',
|
|
24
|
+
trd: 'test:red',
|
|
25
|
+
tpn: 'test:pinned',
|
|
26
|
+
te: 'test:e2e',
|
|
27
|
+
c: 'check',
|
|
28
|
+
pt: 'port',
|
|
29
|
+
i: 'init',
|
|
30
|
+
pf: 'profile',
|
|
31
|
+
st: 'start',
|
|
32
|
+
sy: 'sync',
|
|
33
|
+
un: 'uninstall',
|
|
34
|
+
g: 'git',
|
|
35
|
+
gp: 'pr',
|
|
36
|
+
ms: 'main:sync',
|
|
37
|
+
mm: 'main:merge',
|
|
38
|
+
bp: 'bump',
|
|
39
|
+
re: 'release',
|
|
40
|
+
v: 'version',
|
|
41
|
+
r: 'ranges',
|
|
42
|
+
dr: 'doctor',
|
|
43
|
+
rc: 'ruleset:check',
|
|
44
|
+
pg: 'propagate',
|
|
45
|
+
ad: 'adopt',
|
|
46
|
+
ov: 'overrides',
|
|
47
|
+
a: 'audit',
|
|
48
|
+
rt: 'reconcile-templates',
|
|
49
|
+
cdv: 'command:derive',
|
|
50
|
+
u: 'latest',
|
|
51
|
+
lc: 'latest:corepack',
|
|
52
|
+
lu: 'latest:update',
|
|
53
|
+
tm: 'time',
|
|
54
|
+
tmd: 'time:density',
|
|
55
|
+
rtr: 'retrospective',
|
|
56
|
+
ca: 'cost:audit',
|
|
57
|
+
rvf: 'review:findings',
|
|
58
|
+
rvs: 'review:stops',
|
|
59
|
+
ruv: 'rule:value',
|
|
60
|
+
ev: 'eval',
|
|
61
|
+
fr: 'fresh:run',
|
|
62
|
+
as: 'auth:setup',
|
|
63
|
+
lsm: 'lane:sample',
|
|
64
|
+
lst: 'lane:stats',
|
|
65
|
+
lva: 'lane:value',
|
|
66
|
+
lnt: 'lane:net',
|
|
67
|
+
lbd: 'lane:breakdown',
|
|
68
|
+
lli: 'lane:limit',
|
|
69
|
+
lrs: 'lane:restart',
|
|
70
|
+
lwd: 'lane:withdraw',
|
|
71
|
+
lps: 'lane:pause',
|
|
72
|
+
lru: 'lane:resume',
|
|
73
|
+
lad: 'lane:adopt',
|
|
74
|
+
blr: 'backlogrun',
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The canonical name of a `josh` subcommand: an alias expands, and anything else passes through
|
|
78
|
+
// unchanged.
|
|
79
|
+
//
|
|
80
|
+
// **The expansion is one rule, so it lives beside the table it reads.** Two readers had each written
|
|
81
|
+
// their own `ALIASES[name] ?? name` — the layer report and the gate-run count — and a third, the run
|
|
82
|
+
// measurement's command key, had not, so `pnpm josh ga` and `pnpm josh gate` were measured as two
|
|
83
|
+
// different commands. A lookup is small enough to copy and exactly the kind of copy that drifts: the
|
|
84
|
+
// two that had it disagreed with the one that did not about whether a call was the gate.
|
|
85
|
+
//
|
|
86
|
+
// **`Object.hasOwn` rather than a bare lookup**, because a subcommand spelled like a member of
|
|
87
|
+
// `Object.prototype` — `constructor`, `toString` — would otherwise come back as that member instead
|
|
88
|
+
// of as itself, and the caller would key a call by something that is not a command name at all.
|
|
89
|
+
function canonical_command(name: string): string {
|
|
90
|
+
if (!Object.hasOwn(ALIASES, name)) return name
|
|
91
|
+
|
|
92
|
+
return ALIASES[name] ?? name
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export { ALIASES, canonical_command }
|
|
@@ -31,86 +31,5 @@ const COMMAND_MAP: Record<string, CommandEntry> = {
|
|
|
31
31
|
...CLONE_COMMANDS,
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
const ALIASES: Record<string, string> = {
|
|
35
|
-
ga: 'gate',
|
|
36
|
-
l: 'lint',
|
|
37
|
-
lr: 'lint:related',
|
|
38
|
-
ln: 'lines',
|
|
39
|
-
by: 'bytes',
|
|
40
|
-
mt: 'metrics',
|
|
41
|
-
f: 'format',
|
|
42
|
-
sd: 'cspell:dot',
|
|
43
|
-
bh: 'behavior',
|
|
44
|
-
eu: 'exports:unused',
|
|
45
|
-
t: 'test',
|
|
46
|
-
tu: 'test:unit',
|
|
47
|
-
tr: 'test:related',
|
|
48
|
-
td: 'test:declared',
|
|
49
|
-
trd: 'test:red',
|
|
50
|
-
tpn: 'test:pinned',
|
|
51
|
-
te: 'test:e2e',
|
|
52
|
-
c: 'check',
|
|
53
|
-
pt: 'port',
|
|
54
|
-
i: 'init',
|
|
55
|
-
pf: 'profile',
|
|
56
|
-
st: 'start',
|
|
57
|
-
sy: 'sync',
|
|
58
|
-
un: 'uninstall',
|
|
59
|
-
g: 'git',
|
|
60
|
-
gp: 'pr',
|
|
61
|
-
ms: 'main:sync',
|
|
62
|
-
mm: 'main:merge',
|
|
63
|
-
bp: 'bump',
|
|
64
|
-
re: 'release',
|
|
65
|
-
v: 'version',
|
|
66
|
-
r: 'ranges',
|
|
67
|
-
dr: 'doctor',
|
|
68
|
-
rc: 'ruleset:check',
|
|
69
|
-
pg: 'propagate',
|
|
70
|
-
ad: 'adopt',
|
|
71
|
-
ov: 'overrides',
|
|
72
|
-
a: 'audit',
|
|
73
|
-
rt: 'reconcile-templates',
|
|
74
|
-
u: 'latest',
|
|
75
|
-
lc: 'latest:corepack',
|
|
76
|
-
lu: 'latest:update',
|
|
77
|
-
tm: 'time',
|
|
78
|
-
tmd: 'time:density',
|
|
79
|
-
rtr: 'retrospective',
|
|
80
|
-
ca: 'cost:audit',
|
|
81
|
-
rvf: 'review:findings',
|
|
82
|
-
rvs: 'review:stops',
|
|
83
|
-
ruv: 'rule:value',
|
|
84
|
-
ev: 'eval',
|
|
85
|
-
fr: 'fresh:run',
|
|
86
|
-
as: 'auth:setup',
|
|
87
|
-
lsm: 'lane:sample',
|
|
88
|
-
lst: 'lane:stats',
|
|
89
|
-
lli: 'lane:limit',
|
|
90
|
-
lrs: 'lane:restart',
|
|
91
|
-
lwd: 'lane:withdraw',
|
|
92
|
-
lps: 'lane:pause',
|
|
93
|
-
lru: 'lane:resume',
|
|
94
|
-
blr: 'backlogrun',
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// The canonical name of a `josh` subcommand: an alias expands, and anything else passes through
|
|
98
|
-
// unchanged.
|
|
99
|
-
//
|
|
100
|
-
// **The expansion is one rule, so it lives beside the table it reads.** Two readers had each written
|
|
101
|
-
// their own `ALIASES[name] ?? name` — the layer report and the gate-run count — and a third, the run
|
|
102
|
-
// measurement's command key, had not, so `pnpm josh ga` and `pnpm josh gate` were measured as two
|
|
103
|
-
// different commands. A lookup is small enough to copy and exactly the kind of copy that drifts: the
|
|
104
|
-
// two that had it disagreed with the one that did not about whether a call was the gate.
|
|
105
|
-
//
|
|
106
|
-
// **`Object.hasOwn` rather than a bare lookup**, because a subcommand spelled like a member of
|
|
107
|
-
// `Object.prototype` — `constructor`, `toString` — would otherwise come back as that member instead
|
|
108
|
-
// of as itself, and the caller would key a call by something that is not a command name at all.
|
|
109
|
-
function canonical_command(name: string): string {
|
|
110
|
-
if (!Object.hasOwn(ALIASES, name)) return name
|
|
111
|
-
|
|
112
|
-
return ALIASES[name] ?? name
|
|
113
|
-
}
|
|
114
|
-
|
|
115
34
|
export type { CommandCategory, CommandEntry } from './josh-command-types'
|
|
116
|
-
export {
|
|
35
|
+
export { CATEGORY_ORDER, COMMAND_MAP }
|
|
@@ -26,17 +26,17 @@ const AGENT_HOOK_COMMANDS: Record<string, CommandEntry> = {
|
|
|
26
26
|
category: 'Development',
|
|
27
27
|
reference: ['', 'automation', ['none']],
|
|
28
28
|
usage: { examples: [{ arguments: '', note: PRE_TOOL_USE }] },
|
|
29
|
-
// **No `tsx_arguments`, deliberately.** `
|
|
30
|
-
//
|
|
31
|
-
// `
|
|
32
|
-
// in-process dispatch (`josh-in-process.ts`), and this is the one PreToolUse hook consumers run
|
|
29
|
+
// **No `tsx_arguments`, deliberately.** The guards read `.env` for their other values, as other
|
|
30
|
+
// commands do through `OPTIONAL_ENV_FILE_FLAGS`; the guard switches themselves come from the
|
|
31
|
+
// launch environment alone (`josh-environment-file.ts`). But declaring any `tsx_arguments`
|
|
32
|
+
// disqualifies a command from in-process dispatch (`josh-in-process.ts`), and this is the one PreToolUse hook consumers run
|
|
33
33
|
// before every guarded call, where a second ~0.16 s tsx start is not affordable. Each guard it
|
|
34
34
|
// composes loads `.env` through the shared loader instead.
|
|
35
35
|
},
|
|
36
36
|
'stop:guard': {
|
|
37
37
|
script: 'scripts/hooks/stop-guard.ts',
|
|
38
38
|
description:
|
|
39
|
-
'Claude Code Stop hook: send the hold notify
|
|
39
|
+
'Claude Code Stop hook: send the hold notify and release the hold itself; block on the rules that need the model (reads the Stop payload on stdin)',
|
|
40
40
|
category: 'Development',
|
|
41
41
|
reference: ['', 'automation', ['none']],
|
|
42
42
|
usage: {
|
|
@@ -59,7 +59,7 @@ const AGENT_HOOK_COMMANDS: Record<string, CommandEntry> = {
|
|
|
59
59
|
},
|
|
60
60
|
// **No `tsx_arguments`, deliberately**, the same as `pretool:guard` above: this runs on every
|
|
61
61
|
// `UserPromptSubmit`, so it must stay eligible for in-process dispatch rather than pay a second
|
|
62
|
-
// tsx start each turn. It
|
|
62
|
+
// tsx start each turn. It loads `.env` itself through the shared loader.
|
|
63
63
|
},
|
|
64
64
|
'codex:hook-adapter': {
|
|
65
65
|
script: 'scripts/hooks/codex-hook-adapter.ts',
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { core_weights } from '#scripts/gate/core-weights'
|
|
2
2
|
import type { CommandEntry } from './josh-command-types'
|
|
3
3
|
import { BACKLOG_COMMANDS } from './josh-commands-backlog'
|
|
4
4
|
import { DOCUMENT_COMMANDS } from './josh-commands-document'
|
|
@@ -82,7 +82,7 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
|
|
|
82
82
|
examples: [
|
|
83
83
|
{
|
|
84
84
|
arguments: '--cut',
|
|
85
|
-
note: 'compare billed input per request with the
|
|
85
|
+
note: 'compare billed input per request with the context-cut threshold priced at the session model',
|
|
86
86
|
},
|
|
87
87
|
{ arguments: '--over <tokens>', note: 'compare with an explicit limit' },
|
|
88
88
|
{ arguments: `--cut ${PATH_DIR}`, note: 'Anthropic project or current OpenAI worktree' },
|
|
@@ -179,7 +179,7 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
|
|
|
179
179
|
{
|
|
180
180
|
names: [PATH_DIR],
|
|
181
181
|
description:
|
|
182
|
-
"read another project's lane transcripts, as `josh time` does. Run
|
|
182
|
+
"read another project's lane transcripts, as `josh time` does. Run from a lane, it reads its main checkout's lanes.",
|
|
183
183
|
},
|
|
184
184
|
],
|
|
185
185
|
},
|
|
@@ -190,8 +190,8 @@ const AI_COMMANDS: Record<string, CommandEntry> = {
|
|
|
190
190
|
"Aggregate a finished run's cost, review findings, observation ledger and events into one digest",
|
|
191
191
|
category: 'AI tools',
|
|
192
192
|
reference: ['', 'maintainer', ['none']],
|
|
193
|
-
core_weight:
|
|
194
|
-
memory_mb:
|
|
193
|
+
core_weight: core_weights.CORE_WEIGHTS.retrospective,
|
|
194
|
+
memory_mb: core_weights.MEMORY_MB.retrospective,
|
|
195
195
|
// Kit-only: it reads kit's own development run — the transcript store, the review ledger and the
|
|
196
196
|
// run event stream — so it means nothing in a consumer project and is dropped from a consumer's
|
|
197
197
|
// help, through the same declaration `josh time` uses for the same reason.
|